Миграция с MySQL на PostgreSQL в Linux (Kubuntu) - PullRequest
19 голосов
/ 14 мая 2010

Давным-давно в системе далеко-далеко ...

Попытка перенести базу данных из MySQL в PostgreSQL. Вся документация, которую я прочитал, очень подробно описывает, как перенести структуру. Я нашел очень мало документации по переносу данных. Схема содержит 13 таблиц (успешно перенесенных) и 9 ГБ данных.

Версия MySQL: 5.1.x
Версия PostgreSQL: 8.4.x

Я хочу использовать язык программирования R для анализа данных с помощью операторов выбора SQL; В PostgreSQL есть PL / R, но в MySQL ничего нет (насколько я могу судить).

Новая Надежда

Создайте расположение базы данных (/var недостаточно места; также не нравится везде иметь номер версии PostgreSQL - обновление повредит скрипты!):

  1. sudo mkdir -p /home/postgres/main
  2. sudo cp -Rp /var/lib/postgresql/8.4/main /home/postgres
  3. sudo chown -R postgres.postgres /home/postgres
  4. sudo chmod -R 700 /home/postgres
  5. sudo usermod -d /home/postgres/ postgres

Все хорошо здесь. Затем перезапустите сервер и настройте базу данных, используя инструкции по установке :

  1. sudo apt-get install postgresql pgadmin3
  2. sudo /etc/init.d/postgresql-8.4 stop
  3. sudo vi /etc/postgresql/8.4/main/postgresql.conf
  4. Изменить data_directory на /home/postgres/main
  5. sudo /etc/init.d/postgresql-8.4 start
  6. sudo -u postgres psql postgres
  7. \password postgres
  8. sudo -u postgres createdb climate
  9. pgadmin3

Используйте pgadmin3 для настройки базы данных и создания схемы.

Эпизод продолжается в удаленной оболочке, известной как bash, с запущенными базами данных и установкой набора инструментов с довольно необычным логотипом: SQL Fairy .

  1. perl Makefile.PL
  2. sudo make install
  3. sudo apt-get install perl-doc (странно, это не называется perldoc)
  4. perldoc SQL::Translator::Manual

Извлечение DDL, удобного для PostgreSQL, и всех данных MySQL:

  1. sqlt -f DBI --dsn dbi:mysql:climate --db-user user --db-password password -t PostgreSQL > climate-pg-ddl.sql
  2. Редактировать climate-pg-ddl.sql, преобразовать идентификаторы в нижний регистр и вставить ссылку на схему (используя VIM):
    • :%s/"\([A-Z_]*\)"/\L\1/g
    • :%s/ TABLE / TABLE climate./g
    • :%s/ on / on climate./g
  3. mysqldump --skip-add-locks --complete-insert --no-create-db --no-create-info --quick --result-file="climate-my.sql" --databases climate --skip-comments -u root -p

Возможно, стоит просто переименовать таблицы и столбцы в MySQL в нижний регистр:

  1. select concat( 'RENAME TABLE climate.', TABLE_NAME, ' to climate.', lower(TABLE_NAME), ';' ) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='climate';
  2. Выполнить команды из предыдущего шага.
  3. Вероятно, есть способ сделать то же самое для столбцов; Я изменил их вручную, потому что это было быстрее, чем выяснить, как написать запрос.

База данных наносит ответный удар

Воссоздайте структуру в PostgreSQL следующим образом:

  1. pgadmin3 (переключиться на него)
  2. Нажмите Выполнить произвольные SQL-запросы Значок
  3. Открыть climate-pg-ddl.sql
  4. Поиск TABLE " заменить на TABLE climate." (вставить имя схемы climate)
  5. Поиск on " заменить на on climate." (вставить имя схемы climate)
  6. Нажмите F5, чтобы выполнить

Результат:

Query returned successfully with no result in 122 ms.

Ответы джедаев

На данный момент я в тупике.

  • Куда мне обратиться (, какие шаги ), чтобы преобразовать climate-my.sql в climate-pg.sql, чтобы их можно было выполнять в PostgreSQL?
  • Как убедиться, что индексы копируются правильно (для обеспечения ссылочной целостности; у меня нет ограничений на данный момент для облегчения перехода)?
  • Как я могу гарантировать, что добавление новых строк в PostgreSQL начнёт перечислять с индекса последней вставленной строки (и не будет конфликтовать с существующим первичным ключом из последовательности)?
  • Как вы обеспечиваете имя схемы при преобразовании данных из MySQL в PostgreSQL-вставки?

Ресурсы

Достаточно немного информации было необходимо, чтобы получить это далеко:

Спасибо!

Ответы [ 4 ]

4 голосов
/ 14 мая 2010

То, что я обычно делаю для таких миграций, имеет два аспекта:

  • Извлечение всего определения базы данных из MySQL и адаптация его к синтаксису PostgreSQL.
  • Просмотрите определение базы данных и преобразуйте его, чтобы воспользоваться функциональностью PostgreSQL, которой нет в MySQL.

Затем выполните преобразование и напишите программу на любом языке, который вам наиболее удобен, который выполняет следующее:

  • Считывает данные из базы данных MySQL.
  • Выполняет любые необходимые преобразования для данных, которые будут храниться в базе данных PostgreSQL.
  • Сохраняет теперь преобразованные данные в базе данных PostgreSQL.

Перепроектируйте таблицы для PostgreSQL, чтобы воспользоваться его возможностями.

Если вы просто делаете что-то вроде использования sed сценария для преобразования дампа SQL из одного формата в другой, все, что вы делаете, - это помещаете базу данных MySQL на сервер PostgreSQL. Вы можете сделать это, и от этого все равно будет некоторая выгода, но если вы собираетесь мигрировать, мигрируйте полностью.

Это потребует немного больше времени, но я еще не сталкивался с ситуацией, когда оно того не стоит.

2 голосов
/ 14 мая 2010

Если вы конвертировали схему, перенос данных был бы простым:

  • дамп схемы из PostgreSQL (вы сказали, что вы конвертировали схему в postgres, поэтому мы сейчас ее дампируем, так как мы будем удалять и воссоздавать целевую базу данных, чтобы очистить ее):

    pg_dump dbname > /tmp/dbname-schema.sql
    
  • разбить схему на 2 части - /tmp/dbname-schema-1.sql, содержащую операторы создания таблицы, /tmp/dbname-schema-2.sql - остальные. PostgreSQL необходимо импортировать данные до импорта внешних ключей, триггеров и т. Д., Но после импорта определений таблиц.

  • воссоздать базу данных только с 1 частью схемы:

    drop database dbname
    create database dbname
    \i /tmp/dbname-schema-1.sql
    -- now we have tables without data, triggers, foreign keys etc.
    
  • данные импорта:

    (
       echo 'start transaction';
       mysqldump --skip-quote-names dbname | grep ^INSERT;
       echo 'commit'
    ) | psql dbname
    -- now we have tables with data, but without triggers, foreign keys etc.
    

    В * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1023* * * * * * --skip-quote-names опция добавлена ​​в MySQL 5.1.3, поэтому, если у вас более старая версия, тогда временно установите более новую версию mysql в /tmp/mysql (configure --prefix=/tmp/mysql && make install следует сделать) и используйте /tmp/mysql/bin/mysqldump.

  • импортировать остальную часть схемы:

    psql dbname
    start transaction
    \i /tmp/dbname-schema-2.sql
    commit
    -- we're done
    
2 голосов
/ 14 мая 2010

Преобразование файла mysqldump в PostgreSQL-дружественный формат

Преобразуйте данные следующим образом (не используйте mysql2pgsql.perl ):

  1. Кавычки.

    sed "s/\\\'/\'\'/g" climate-my.sql | sed "s/\\\r/\r/g" | sed "s/\\\n/\n/g" > escaped-my.sql

  2. Замените USE "climate"; путем поиска и прокомментируйте комментарии:

    sed "s/USE \"climate\";/SET search_path TO climate;/g" escaped-my.sql | sed "s/^\/\*/--/" > climate-pg.sql

  3. Подключение к базе данных.

    sudo su - postgres
    psql climate

  4. Установите кодировку (mysqldump игнорирует свой параметр кодирования) и затем выполните сценарий.

    \encoding iso-8859-1
    \i climate-pg.sql

Эта серия шагов, вероятно, не будет работать для сложных баз данных со многими смешанными типами. Однако он работает в течение integer с, varchar с и float с.

Индексы, первичные ключи и последовательности

Поскольку mysqldump включал первичные ключи при генерации операторов INSERT, они будут превосходить автоматическую последовательность таблицы. Последовательности для всех таблиц после проверки оставались равными 1.

Установить последовательность после импорта

Использование команды ALTER SEQUENCE установит для них любое необходимое значение.

Префикс схемы

Нет необходимости добавлять префикс таблиц к имени схемы. Использование:

SET search_path TO climate;
0 голосов
/ 22 июля 2016

Выезд Эталхимия . Он позволяет вам переходить с MySQL на PostgreSQL или между несколькими другими базами данных в 4 строки Python. Подробнее об этом можно прочитать здесь .

Для установки: pip install etlalchemy

Для запуска:

from etlalchemy import ETLAlchemySource, ETLAlchemyTarget
# Migrate from MySQL to PostgreSQL
src = ETLAlchemySource("mysql://user:passwd@hostname/dbname")
tgt = ETLAlchemyTarget("postgresql://user:passwd@hostname/dbname",
                          drop_database=True)
tgt.addSource(src)
tgt.migrate()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...