Подтвердить что ты не робот

Переход MySql в PostgreSql

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

Спасибо.

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

  • mysql dump:

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

  • Импорт дампа:

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

    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','','???????? ...
    
4b9b3361

Ответ 1

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

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

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

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

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

Для каждой таблицы в базе данных 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>

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

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

psql [CONNECTION PARAMETERS] -f FILENAME -1

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

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

Ответ 3

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

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

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

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

Вопросы для просмотра

  • Булевы типы данных. MySQL хранит их как 0 и 1. PostGreSQL хранит их как t и f. Следите за тем, чтобы булевы не мигрировали как целые числа.
  • Автоматическое увеличение идентификаторов. Вы можете найти, что ваши идентификаторы начинают отсчет снова с 1. Вы получите такие ошибки: "дублирующее значение ключа нарушает уникальное ограничение...". Это легко исправить, но следите за этим.

Ответ 4

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

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

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

Ответ 6

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

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

Оригинальная вилка для этого проекта устарела. Для меня все отлично работало с помощью этого script.

Ответ 7

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

https://github.com/ggarri/mysql2psql

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

Ответ 8

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

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

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