пятница, 13 февраля 2009 г.

Перенос дампа большой базы с MySQL на PostgreSQL


Перенести большую базу (размер дампа около 10 Гб) с MySQL на PostgreSQL просто удалением несовместимостей в дампе, созданном mysqldump, и накатыванием его на psql не получается - процесс заливки дампа занимает несколько суток. Далее приводится пошаговое руководство по сокращению этого времени до пары часов.
  1. создаем дамп без данных (mysqldump -d --skip-opt --compatible=postgresql);
  2. накатывам этот дамп на psql;
  3. дампим полученнную базу - и делим полученный файл дампа на две части - в первой - только операторы CREATE TABLE, а ALTER TABLE ... ADD CONSTRAINT и CREATE INDEX - во второй. В файле дампа они расположены строго последовательно. Смысл этой операции в том, чтобы заливать данные в базу без индексов, а только потом создать индексы - так получится в разы быстрее;
  4. создаем базу заново - и накатываем на нее схему без индексов;
  5. для дампа данных придется писать скрипт. Смысл его такой: выбираем все поля table_name в таблице information_schema.tables, где table_schema равна имени нашей переносящейся базы - и для каждой из этих таблиц запускам select * into outfile;
  6. заливаем эти файлы в psql с помощью оператора copy from;
  7. накатываем вторую часть схемы - индексы - и наша база перенесена.

Комментариев нет: