Как преобразовать дамп базы данных в другую СУБД

Занимаясь разработкой форумного движка Intellect Board, я столкнулся с двумя задачами:

  • нужно отслеживать изменения в структуре БД для выпуска обновлений
  • преобразовывать скрипт с SQL-операторами создания таблиц для MySQL в SQL для Postgres, SQLite, и, возможно, других СУБД.

И то, и другое — задачи весьма рутинные, и хотелось бы их автоматизировать. Довольно долго я искал решения для этого, но попалась только утилита mysqldiff (весьма неудобная и с множеством ограничений) и ряд платных программ, использование которых для меня неприемлемо.

Недавно я нашел модуль для Perl и набор готовых утилит к нему, который помог мне решить эти задачи. Модуль называется SQL::Translator.

Установить его можно через cpan:

cpan install SQL::Translator
Далее можно либо сделать скрипт на языке Perl, который будет выполнять необходимые преобразования, либо использовать одну из готовых утилит: sqlt и sqlt-diff.
Утилита sqlt позволяет преобразовать файл из одного формата в другой. Исходный формат указывается после ключа -f, кончный — после -t. Например, конвертация из MySQL в SQLite выглядит так:
sqlt -f MySQL -t SQLtie исходный_файл.sql > конечный_файл.sql

Преобразование из PostgreSQL в MySQL — так:

sqlt -f PostgreSQL -t MySQL исходный_файл.sql > конечный_файл.sql

Кроме различных SQL-диалектов, поддерживаются еще JSON, Yaml, XML и ряд других.

Отслеживать изменения в структуре БД можно с помощью sqlt-diff. К сожалению, работает она только с дампами, а сравнивать дамп и то, что есть на сервере, не может.
Работать с ней весьма просто:

sqlt-diff файл1.sql=СУБД файл2.sql=СУБД > файл_изменний.sql

В результате выполнения будет создан файл с SQL-операторами ALTER TABLE, CREATE TABLE и DROP TABLE, позволяющий привести структуру базы данных из файла1 к структуре файла2.