Сравнение схем двух баз данных

Предположим у вас есть prod и test базы данных. В какой момент разработчик внес изменения в тестовую базу, но забыл внести эти изменения в боевую базу. Если это часто используемая таблица, то ситуация очень быстро становится очевидной, так как в логах появятся ошибки в SQL-запросах и вам ничинает звонить начальник с упреками «какого @#$%».

Но иногда изменения затрагивают редко используемые таблицы, либо изменения на первый взгляд не совсем очевидны (например кто-то изменил длину поля VARCHAR и у вас стали обрезаться строки, или кто-то добавил индекс, из-за которого запросы на тестовой базе выполняются на порядок быстрее).

Еще вариант — вы провели обновление ПО и у вас все перестало работать. Куча непонятных ошибок на пустом месте, приложение лежит, пользователи не довольны.

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

84f9024f291d4ffb8675532d361f5095.png

Что приходит на ум? Делаем dump структуры одной базы, потом другой. Запускаем diff-утилиту и она показывает строки, которые отличаются в двух дампах. Для небольших изменений это может сработать. Но во-первых это несколько утомительно, во-вторых, может получится ситуация как на скриншоте, когда в одной базе отсутствует таблица и diff начинает сравнивать разные таблицы.

b5188bc61d6841a19b364d4d267c8a15.png

Столкнувшись с указанными проблемами я написал небольшой php скрипт (https://github.com/dlevsha/compalex), который работает с MySQL, MS SQL Server, PostgreSQL (в планах поддержка Oracle) и позволяет сравнить две базы данных. Скрипт не тянет за собой никаких зависимостей, что упрощает его установку и поддержку.

Для работы необходимо установить сам скрипт (предполагается что php >= 5.4 с поддержкой PDO у вас уже установлен, если нет — то в debian / ubuntu это делается одной строчкой aptitude install php5, единственное — смотрите чтобы был установлен php версии не ниже 5.4)

$ git clone https://github.com/dlevsha/compalex.git
$ cd compalex

Открываем config.php в папке проекта и раcкоментируем строки с нужным драйвером. Например я хочу сравнить две mysql базы данных

// MySQL sample config
define('FIRST_DSN',  'mysql://login:password@localhost/compalex_test_1');
define('SECOND_DSN', 'mysql://login:password@localhost/compalex_test_2');

Для того, чтобы не запутаться где какая база данных — даем им имена

define('FIRST_DATABASE_NAME', 'Production database');
define('SECOND_DATABASE_NAME', 'Developer database');   

После этого находясь в папке проекта запускаем web-сервер

$ php -S localhost:8000

и открываем в браузере http://localhost:8000/

Должна отобразиться схема сравнение, состоящая из двух колонок, в соответствии с указанными параметрами баз данных.

53435d41fe8b4733aab671d0139d512b.png

Назначения элементов изображено на схеме.

© Habrahabr.ru