Сравнение схем двух баз данных
Предположим у вас есть prod и test базы данных. В какой момент разработчик внес изменения в тестовую базу, но забыл внести эти изменения в боевую базу. Если это часто используемая таблица, то ситуация очень быстро становится очевидной, так как в логах появятся ошибки в SQL-запросах и вам ничинает звонить начальник с упреками «какого @#$%».
Но иногда изменения затрагивают редко используемые таблицы, либо изменения на первый взгляд не совсем очевидны (например кто-то изменил длину поля VARCHAR и у вас стали обрезаться строки, или кто-то добавил индекс, из-за которого запросы на тестовой базе выполняются на порядок быстрее).
Еще вариант — вы провели обновление ПО и у вас все перестало работать. Куча непонятных ошибок на пустом месте, приложение лежит, пользователи не довольны.
В таких случаях бывает очень полезно посмотреть чем же отличаются базы и сделать соответствующие выводы.
Что приходит на ум? Делаем dump структуры одной базы, потом другой. Запускаем diff-утилиту и она показывает строки, которые отличаются в двух дампах. Для небольших изменений это может сработать. Но во-первых это несколько утомительно, во-вторых, может получится ситуация как на скриншоте, когда в одной базе отсутствует таблица и diff начинает сравнивать разные таблицы.
Столкнувшись с указанными проблемами я написал небольшой 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/
Должна отобразиться схема сравнение, состоящая из двух колонок, в соответствии с указанными параметрами баз данных.
Назначения элементов изображено на схеме.