MySql到PostgreSql的迁移

And*_*kov 21 mysql migration postgresql dump

我的PostgreSQL安装在Windows上.如何将数据从MySQL数据库迁移到PostgreSQL?我读过大量的aricles.什么都没有帮助:(

谢谢.

我的行动:

  1. mysql转储:

    mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在pgsql上创建db同步器

  3. 进口转储:

    psql -h 192.168.0.100 -d synchronizer -U postgres -f C:\dump.sql
    
    Run Code Online (Sandbox Code Playgroud)
  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','','???????? ...
    
    Run Code Online (Sandbox Code Playgroud)

Max*_*yko 9

我对MySQL的经验 - > Postgresql迁移并不是很愉快,所以我不得不提出Daniel关于CSV文件的建议.

在我的例子中,我手工重新创建了模式,然后使用mysqldump和pg_restore逐个导入所有表.

因此,虽然此转储/恢复可能适用于数据,但您很可能对架构不满意.我没有尝试过任何商业解决方案,所以看看其他人说的话......祝你好运!

更新:我查看了流程留下的代码,这是我实际上是如何做到的.

我的PostgreSQL数据库中有一个不同的模式,因此一些表被连接,一些表被拆分.这就是为什么直接导入不是一个选项,我的情况可能比你描述的更复杂,这个解决方案可能是一个矫枉过正的原因.

对于PG数据库中的每个表,我写了一个查询,从MySQL数据库中选择相关数据.如果两个数据库中的表基本相同,并且没有连接,则可以像这样简单

select * from mysql_table_name
Run Code Online (Sandbox Code Playgroud)

然后我将此查询的结果导出到XML,为此,您需要像这样运行它:

echo "select * from mysql_table_name" | mysql [CONNECTION PARAMETERS] -X --default-character-set=utf8 > mysql_table_name.xml
Run Code Online (Sandbox Code Playgroud)

这将创建一个具有以下结构的简单XML文件:

<resultset statement="select * from mysql_table_name">
  <row>
    <field name="some_field">field_value</field>
    ...
  </row>
  ...
</resultset>
Run Code Online (Sandbox Code Playgroud)

然后,我编写了一个脚本,为该XML文件中的每个行元素生成INSERT语句.表的名称,插入数据的位置作为此脚本的命令行参数给出.Python脚本,以备您需要时使用.

这些sql语句被写入一个文件,然后像这样提供给psql:

psql [CONNECTION PARAMETERS] -f FILENAME -1
Run Code Online (Sandbox Code Playgroud)

XML中唯一的技巧 - > SQL转换是识别数字,并取消引用它们.

总结一下:mysql可以将查询结果生成为XML,您可以使用它.


Pet*_*aut 8

这比那复杂一点.这里有大量文档:

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

在那里,您还可以找到转换脚本.


sup*_*ary 8

在我相当简单的情况下(30个表,10000个记录),我使用了一个perl脚本:

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

它通过mysql转储文件并生成了一个pg转储文件,但存在以下问题.

我正在导入Heroku所以我使用了他们的pgbackups插件,它几乎完美无缺.

需要注意的问题

  1. 布尔数据类型.MySQL将它们存储为0和1. PostGreSQL将它们存储为t和f.注意布尔值不会作为整数迁移.
  2. 自动递增ID.你可能会发现你的id从1开始重新计数.你会得到这样的错误:"重复键值违反了唯一约束......".它很容易修复,但请注意它.