MySql到PostgreSql的迁移

时间:2011-01-21 08:37:08

标签: mysql postgresql migration dump

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

感谢。

我的行动:

  1. mysql dump:

    mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql
    
  2. 在pgsql创建db同步器

  3. import dump:

    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 个答案:

答案 0 :(得分:9)

我使用MySQL的经验 - > Postgresql迁移并不是很愉快,所以我不得不提出Daniel关于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>

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

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

psql [CONNECTION PARAMETERS] -f FILENAME -1

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

总结一下:mysql可以用XML生成查询结果,你可以使用它。

答案 1 :(得分:8)

比这复杂一点。这里有很多文档:

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

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

答案 2 :(得分: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开始重新计数。你会得到这样的错误:“重复键值违反了唯一约束......”。它很容易修复,但请注意它。

答案 3 :(得分:3)

我使用py-mysql2pgsql将大型MySQL数据库转换为Postgres。它可以很好地处理大多数情况。我不得不根据我的需要修补几个案例。

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

默认情况下,它从MySQL读取数据并写入Postgres。但是你可以让它在加载到Postgres之前将模式和/或数据写入文件进行检查。

答案 4 :(得分:1)

您可以使用https://github.com/mihailShumilov/mysql2postgresql 这是PHP转换器

的错误

答案 5 :(得分:0)

还有一个非常好的(fork of a)python转换器,由gitlab创建者维护:

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

这个项目的原始分叉是陈旧的。对我来说,使用这个脚本一切都很完美。

答案 6 :(得分:0)

这里有一个项目,它将当前MySQL数据库的几个命令迁移到Postgresql,包括索引和外键。它还允许定义名称,索引和列类型解析,以便您可以覆盖默认行为。

https://github.com/ggarri/mysql2psql

我希望对于有兴趣将当前项目迁移到PG的任何人都有用,在我们的案例中,我们获得了大约20%的性能提升。

答案 7 :(得分:-1)

使用一些自动化迁移过程的程序要好得多。 即使你熟悉所有的问题,每一步都可能需要花费很多时间,特别是当你的数据库是&#34;大&#34;。

尝试FromMySqlToPostgreSql

此工具功能齐全且易于使用。 它映射数据类型,迁移约束,索引,PK和FK,就像它们在MySQL数据库中一样。 它使用PostgreSQL COPY,因此数据传输速度非常快。