Миграция между разными базами данных в Drupal

Движки БД MySQL и Postgres отличаются значительно. Поэтому нет прямого способа сконвертировать Drupal-сайт из MySQL в Postgres.

Способ в лоб - мощный модуль migrate. Он позволяет творить чудеса. Однако, чтобы его использовать, нужно изрядно потрудиться, изучить документацию, написать классы миграции в своём модуле, потренироваться на крысах и только после этого с n-цатой итерации попытаться залить сконвертированные данные. Из минусов migrate - невозможность сохранения nid для нод. Хотя, вроде решение есть, но не могу утрвеждать, что оно работает - я его не пробовал.

В процессе подчитывания документации, обнаружил модуль dbtng_migrator. Документация у него суровая. Можно сказать, что она отсутствует. Имеется лишь традиционный README.txt и всё. Подружиться с этим модулем у меня получилось не сразу.

Для того, чтобы всё заработало правильно, нужно:

  • установить Postgres;
  • установить драйвер pgsql (pdo_pgsql). Так же, нужно включить поддержку расширения в PHP. Перезагрузить веб-сервер;
  • создать пользователя, базу данных в Postgres;
  • прописать в settings.php настройки коннекта к новой пустой базе данных. Имя нового конфига должно быть отлично от default. При этом, подключение к исходной, mysql-базе данных, должно остаться.

Теперь стоит устанавить и включить модуль dbtng_migrator. Переходим на страницу настроек модуля (admin/structure/dbtng-migrator). Там две вкладки (Migrator, Migrator database check) и небольшая иструкция. Инструкция предлагает прописать дополнительную БД в файле settings.php (это я описал уже чуть выше). После этого, обе базы видны на странице мигратора.

Повторюсь, в настройках модуля две страницы: для миграции (Migrator) и для проверки (Migrator database check). Сперва я ушел в проверку и мне вывалилась целая пачка ошибок. Это меня изрядно огорчило. Я потратил некоторое время, пытаясь побороть ошибки, но конструктива не вышло.

В качестве эксперимента я попробовал запустить мигратор. И, о чудо! Буквально за какие-то пол минуты вся моя MySQL база данных перенонвертировалась в базу данных Postgres. Без ошибок. Я отключил БД MySQL и продолжил полёт на Postgres, как ни в чем не бывало :). Все многочисленные модули подмены не почувствовали.

Некоторые микроособенности данного модуля:

  1. модуль может мигрировать данные только в пустую базу данных. Если есть совпадающие по именам таблицы, мигратор не перезапишет их, а остановит работу. Поэтому мигрировать нужно в пустую базу данных;
  2. проверка базы данных (Migrator database check) не работает. Мне не удалось заставить её заработать корректно;
  3. мигрировать/конвертировать таким образом можно любые базы данных, с которыми только умеет работать Drupal: MySQL, MSSQL, Oracle, MongoDB, SQLite, Postgres, ...
  4. конвертируются только те таблицы, которые породили модули, включенные в данный момент. Если модуль выключен в момент миграции, в новую базу данных его таблицы не попадут. Так происходит ввиду специфики модуля - он пробегает по всем включенным модулям, собирает схемы (schema) таблиц и создает их в новой БД. Затем, переносит данные.

После переконвертации базы данных, модуль можно выключить и удалить. Убрать подключение к MySQL из файла settings.php. А новую базу данных сделать базой по умолчанию.

На закуску предлагаю поглядеть кусок из Drupal-Cafe как раз про миграцию из одной БД в другую:

 

Комментарии

> Из минусов migrate - невозможность сохранения nid для нод

$this->addFieldMapping('nid', 'nid');
$this->addFieldMapping('is_new')->defaultValue(TRUE);

Спасибо!
Встречал такую конструкцию, но еще не использовал её.

Добавить комментарий

x

Статья оказалась полезной?

Поделитесь в любимой сети:
Орфографическая ошибка в тексте:
Чтобы сообщить об ошибке автору, нажмите кнопку "Отправить сообщение об ошибке". Вы также можете отправить свой комментарий.