【问题标题】:MySql to PostgreSql migrationMySql 到 PostgreSql 的迁移
【发布时间】:2011-06-13 00:16:55
【问题描述】:

我的 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','','???????? ...
    

【问题讨论】:

  • 您可以将数据从您的 mysql 备份到 csv 或类似的 sql 文件,如果可以,您应该能够创建数据库,然后使用 pgadmin 恢复脚本

标签: mysql postgresql migration dump


【解决方案1】:

我对 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 -> SQL 转换的唯一技巧是识别数字并取消引用它们。

总结一下:mysql可以产生XML形式的查询结果,你可以使用它。

【讨论】:

  • maksymko,我已经重新创建了 shema。能否请您描述一下您使用mysqldump和pg_restore一步步从表中复制数据的方式。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    它遍历了 mysql 转储文件并生成了一个 pg 转储文件,但存在以下问题。

    我正在导入 Heroku,所以我使用了他们的 pgbackups 插件,该插件几乎可以完美运行。

    需要注意的问题

    1. 布尔数据类型。 MySQL 将它们存储为 0 和 1。PostGreSQL 将它们存储为 t 和 f。注意布尔值不会作为整数迁移。
    2. 自动递增 ID。您可能会发现您的 ids 从 1 重新开始计数。您会收到如下错误:“重复键值违反唯一约束......”。这很容易解决,但要小心。

    【讨论】:

      【解决方案4】:

      我使用 py-mysql2pgsql 将大型 MySQL 数据库转换为 Postgres。它可以很好地处理大多数情况。不过,我必须针对特定于我的需求的几个案例对其进行修补。

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          该项目的原始分叉已过时。对我来说,使用这个脚本一切都很好。

          【讨论】:

            【解决方案7】:

            最好使用一些程序来自动化迁移过程。 即使您熟悉所有问题,手动完成每一步也可能会花费大量时间,尤其是当您的数据库“很大”时。

            试试FromMySqlToPostgreSql

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

            【讨论】:

            • 我试过这个,但我收到错误“FromMySqlToPostgreSql” - 数据库迁移工具 版权所有 2015 Anatoly Khaytovich -- 迁移开始... -- 脚本终止。
            • 说原因:-- FromMySqlToPostgreSql::createSchema -- 无法创建新模式... -- PDOException 代码:0 -- 文件:/Users/admin/Downloads/FromMySqlToPostgreSql-master/migration/ FromMySqlToPostgreSql/FromMySqlToPostgreSql.php -- Line: 300 -- Message: could not find driver -------------------------------- -----------------------
            • 看起来您没有 PDO 驱动程序...安装它: MySQL:sudo apt-get install php5-mysql 或对于 PostgreSQL:sudo apt-get install php5-pgsql
            【解决方案8】:

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

            https://github.com/ggarri/mysql2psql

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

            【讨论】:

              猜你喜欢
              • 2018-02-05
              • 2013-09-14
              • 2016-11-28
              • 2010-09-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-16
              • 2020-09-09
              相关资源
              最近更新 更多