среда, 20 мая 2020 г.

Изучение неизвестного SQL-сервера базы данных


Данная заметка Алекса Чана (Alex Chan – на фото) была опубликована на его сайте ( https://alexwlchan.net/ ) 26 апреля 2020 года, и представляет собой, с моей точки зрения, любопытный образчик «электронной археологии».

Недавно я помогал в работе по выводу из эксплуатации старого приложения, и частью этого процесса была проверка того, что мы извлекли из него все важные данные. Все данные хранились в базе данных под управлением Microsoft SQL Server, размещенной на площадке нашей ИТ-службы. Извлечение их должно было быть достаточно простым делом, верно?

Проблема заключалась в том, что мы почти ничего не знали об этой базе данных. Приложение была написано третьей стороной, которой мы больше не платили за техническую поддержку. Помимо нескольких имевшихся запросов к базе данных, которые отвечавших на очень конкретные вопросы, мы не знали, как извлечь данные из базы.

Все, что у нас было, - это точка входа на сервере базы данных, дававшая возможность доступа только для чтения. Таким образом, мы столкнулись со следующим вопросом:

Как понять, что собой представляет база данных SQL, о которой Вы ничего не знаете?

«Покопав» как следует, я в конце концов нашёл нужные нам данные. Сейчас проект завершён, и мы скоро отключим эту базу данных. Я не буду делиться подробностями об этой конкретной базы данных, но хочу описать общий подход, при помощи которого я выискивал полезные данные:

1. Выясните, какие таблицы находятся в базе данных

Соответствующий запрос позволил мне получить список всех таблиц в базе данных – всего их было 138. У всех у них были довольно-таки разумные названия, и я смог догадаться о назначении по крайней мере некоторых. Это позволило мне отобрать несколько таблиц для более глубокого изучения.

2. Изучите устройство таблиц с интересными названиями

Соответствующие запросы выдали мне список столбцов для каждой таблицы, подсказывая, какие данные таблица может содержать. Это помогло мне понять, есть ли в таблице данные, которые будут полезны.

Хорошие ниточки, за которую стоит потянуть, - это изучить столбцы с внешними ключами, то есть те, что указывают на строки в другой таблице базы данных. Например, если таблица Shapes содержит столбец ColourID («индекс цвета»), это намёк на то, что мне стоит просмотреть таблицу Colors («Цвета»).

Подобный анализ помог мне понять, как таблицы были взаимосвязаны друг с другом, и найти таблицы с интересными данными, которые я первоначально упустил. В конце концов я смог набросать схему того, как интересующие меня данные распределялись по разным таблицам:


3. Взгляните на данные в таблицах.

Определив, какие таблицы представляют интерес, я вытащил из них все строки и выгрузил данные на свой локальный диск в виде CSV-файлов. Это позволило мне работать с данными с использованием более привычных мне инструментов, и начать объединять данные из нескольких таблиц.

Несомненно, то же самое можно было бы сделать, применяя соответствующим образом сформированную команду JOIN, но мне больше по душе использовать инструменты Python и Jupyter Notebook.

Как только я с этим разобрался, данный подход очень хорошо сработал для извлечения необходимых нам данных: сначала угадать некоторые нужные таблицы, затем использовать внешние ключи для установления связей с другими таблицами, а затем выгрузить все данные и начать их «просеивать».

Я не знаю, придётся ли мне когда-либо снова решать аналогичную задачу, но накопленный опыт и подобранный типовой подход должно ускорить её выполнение в следующий раз. Синтаксис SQL может отличаться, но выполняемые шаги будут теми же.

Алекс Чан (Alex Chan)

Источник: сайт Алекса Чана
https://alexwlchan.net/2020/04/exploring-an-unknown-sql-server/

Комментариев нет:

Отправка комментария