Миграция между разными базами данных в 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, как ни в чем не бывало :). Все многочисленные модули подмены не почувствовали.
Некоторые микроособенности данного модуля:
- модуль может мигрировать данные только в пустую базу данных. Если есть совпадающие по именам таблицы, мигратор не перезапишет их, а остановит работу. Поэтому мигрировать нужно в пустую базу данных;
- проверка базы данных (Migrator database check) не работает. Мне не удалось заставить её заработать корректно;
- мигрировать/конвертировать таким образом можно любые базы данных, с которыми только умеет работать Drupal: MySQL, MSSQL, Oracle, MongoDB, SQLite, Postgres, ...
- конвертируются только те таблицы, которые породили модули, включенные в данный момент. Если модуль выключен в момент миграции, в новую базу данных его таблицы не попадут. Так происходит ввиду специфики модуля - он пробегает по всем включенным модулям, собирает схемы (schema) таблиц и создает их в новой БД. Затем, переносит данные.
После переконвертации базы данных, модуль можно выключить и удалить. Убрать подключение к MySQL из файла settings.php. А новую базу данных сделать базой по умолчанию.
На закуску предлагаю поглядеть кусок из Drupal-Cafe как раз про миграцию из одной БД в другую:
Комментарии
Гость
06.05.2015
Постоянная ссылка (Permalink)
> Из минусов migrate -
> Из минусов migrate - невозможность сохранения nid для нод
$this->addFieldMapping('nid', 'nid');
$this->addFieldMapping('is_new')->defaultValue(TRUE);
Лозовицкий Петр
06.05.2015
Постоянная ссылка (Permalink)
Спасибо!
Спасибо!
Встречал такую конструкцию, но еще не использовал её.
Добавить комментарий