Миграция с MySql на PostgreSql - PullRequest
21 голосов
/ 21 января 2011

Мой PostgreSQL установлен в Windows.Как я могу перенести данные из базы данных MySQL в PostgreSQL?Я прочитал тонны статей.Ничего не помогает: (

Спасибо.

Мои действия:

  1. MySQL дампа:

    mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql
    
  2. создать синхронизатор базы данных в pgsql

  3. дамп импорта:

    psql -h 192.168.0.100 -d synchronizer -U postgres -f C:\dump.sql
    
  4. вывод:

    psql:C:/dump.sql:17: NOTICE:  table "Db_audit" does not exist, skipping
    DROP TABLE
    psql:C:/dump.sql:30: ERROR:  syntax error at or near "("
    СТРОКА 2:  "id" int(11) NOT NULL,
               ^
    psql:C:/dump.sql:37: ERROR:  syntax error at or near ""Db_audit""
    СТРОКА 1:LOCK TABLES "Db_audit" WRITE;
                 ^
    psql:C:/dump.sql:39: ERROR:  relation "Db_audit" does not exist
    СТРОКА 1:INSERT INTO "Db_audit" VALUES (4068,4036,4,1,32,'2010-02-04 ...
                 ^
    psql:C:/dump.sql:40: ERROR:  relation "Db_audit" does not exist
    СТРОКА 1:INSERT INTO "Db_audit" VALUES (19730,2673,2,2,44,'2010-11-23...
                 ^
    psql:C:/dump.sql:42: ERROR:  syntax error at or near "UNLOCK"
    СТРОКА 1:UNLOCK TABLES;
     ^
    psql:C:/dump.sql:48: NOTICE:  table "ZHNVLS" does not exist, skipping
    DROP TABLE
    psql:C:/dump.sql:68: ERROR:  syntax error at or near "("
    СТРОКА 2:  "id" int(10) unsigned NOT NULL,
               ^
    psql:C:/dump.sql:75: ERROR:  syntax error at or near ""ZHNVLS""
    СТРОКА 1:LOCK TABLES "ZHNVLS" WRITE;
                 ^
    psql:C:/dump.sql:77: WARNING:  nonstandard use of escape in a string literal
    СТРОКА 1:...???????? ??? ???????','10','4607064820115','0','','??????-??...
                                                          ^
    ПОДСКАЗКА:  Use the escape string syntax for escapes, e.g., E'\r\n'.
    Cancel request sent
    psql:C:/dump.sql:77: WARNING:  nonstandard use of escape in a string literal
    СТРОКА 1:...??????????? ????????','10','4602784001189','0','','???????? ...
    

Ответы [ 8 ]

9 голосов
/ 21 января 2011

Мой опыт работы с MySQL -> миграция Postgresql была не очень приятной, поэтому мне пришлось бы поддержать предложение Дэниела о файлах CSV.

В моем случае я заново создал схему руками , а затем импортировал все таблицы, одну за другой, используя mysqldump и pg_restore.

Итак, хотя этот дамп / восстановление может работать для данных, вам, скорее всего, не повезло с схемой. Я не пробовал никаких коммерческих решений, так что посмотри, что говорят другие люди и ... удачи!

ОБНОВЛЕНИЕ : я посмотрел код, оставленный процессом, и вот как я это сделал.

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

Для каждой таблицы в базе данных PG я написал запрос, который выбирает соответствующие данные из базы данных MySQL. В случае, если таблица в обеих базах данных в основном одинакова, и нет соединений, это может быть так просто:

select * from mysql_table_name

Затем я экспортировал результаты этого запроса в XML, для этого вам нужно запустить его так:

echo "select * from mysql_table_name" | mysql [CONNECTION PARAMETERS] -X --default-character-set=utf8 > mysql_table_name.xml

Это создаст простой XML-файл со следующей структурой:

<resultset statement="select * from mysql_table_name">
  <row>
    <field name="some_field">field_value</field>
    ...
  </row>
  ...
</resultset>

Затем я написал скрипт, который создает оператор INSERT для каждого элемента строки в этом XML-файле. Имя таблицы, куда нужно вставить данные, было задано в качестве параметра командной строки для этого сценария. Python-скрипт , на случай, если он вам нужен.

Эти операторы sql были записаны в файл, а затем переданы в psql следующим образом:

psql [CONNECTION PARAMETERS] -f FILENAME -1

Единственный прием в XML -> преобразование SQL - это распознавать числа и заключать их в кавычки.

Подводя итог: mysql может выдавать результаты запроса в виде XML, и вы можете использовать его.

8 голосов
/ 22 января 2013

В моем довольно простом случае (30 таблиц, 10000 записей) я использовал скрипт perl:

http://pgfoundry.org/frs/?group_id=1000198

Он прошел через файл дампа mysql и создал файл дампа pgсо следующими проблемами.

Я импортировал в Heroku, поэтому использовал их плагин pgbackups, который работал почти безупречно.

Проблемы, которые нужно отслеживать для

  1. Булевых типов данных.MySQL хранит их как 0 и 1. PostGreSQL сохраняет их как t и f.Обратите внимание, что логические значения не переносятся как целые числа.
  2. Автоматически увеличивающиеся идентификаторы.Вы можете обнаружить, что ваши идентификаторы снова начинают считать с 1. Вы получите такие ошибки: «Дублирующее значение ключа нарушает уникальное ограничение ...».Это легко исправить, но следите за этим.
8 голосов
/ 21 января 2011

Это немного сложнее, чем это. Здесь много документации:

http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#MySQL

Там вы также найдете сценарии преобразования.

3 голосов
/ 10 июля 2013

Я использовал py-mysql2pgsql для преобразования большой базы данных MySQL в Postgres. Очень хорошо справляется с большинством случаев. Я должен был исправить это для пары случаев, определенных для моих потребностей все же.

https://pypi.python.org/pypi/py-mysql2pgsql

По умолчанию он читает данные из MySQL и записывает в Postgres. Но вы можете попросить его записать схему и / или данные в файл для проверки перед загрузкой в ​​Postgres.

1 голос
/ 06 февраля 2015

Вы можете использовать https://github.com/mihailShumilov/mysql2postgresql Это записано на PHP конвертере

0 голосов
/ 19 марта 2017

Здесь есть проект, который мигрирует парой команд вашей текущей базы данных MySQL в Postgresql, включая индексы и внешние ключи.Также он позволяет определять имена, индексы и типы столбцов, чтобы вы могли перезаписать поведение по умолчанию.

https://github.com/ggarri/mysql2psql

Я надеюсь, что это может быть полезно для любого из вас, кто заинтересован в миграции егоТекущий проект для PG, в нашем случае мы получили увеличение производительности примерно на 20%.

0 голосов
/ 06 ноября 2015

Гораздо лучше использовать какую-то программу, которая автоматизирует процесс миграции. Даже если вы знакомы со всеми сложностями, выполнение каждого шага вручную может занять много времени, особенно когда ваш БД "большой".

Попробуйте FromMySqlToPostgreSql .

Этот инструмент прост в использовании. Он отображает типы данных, переносит ограничения, индексы, PK и FK точно так, как они были в вашей базе данных MySQL. Под капотом используется PostgreSQL COPY, поэтому передача данных происходит очень быстро.

0 голосов
/ 12 августа 2015

Существует также очень хороший (разветвленный) конвертер python, который поддерживается создателями gitlab:

https://github.com/gitlabhq/mysql-postgresql-converter

Оригинальный форк для этого проекта устарел. Для меня все отлично работало с использованием этого скрипта.

...