MySql到PostgreSql的迁移

MySql到PostgreSql的迁移,mysql,postgresql,migration,dump,Mysql,Postgresql,Migration,Dump,我的PostgreSQL安装在Windows上。如何将数据从MySQL数据库迁移到PostgreSQL? 我读过很多书。没有任何帮助:( 谢谢 我的行动: mysql转储: mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql 在pgsql上创建数据库同步器 导入转储: psql -h 192.168.0.100 -d synchroniz

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

谢谢

我的行动:

  • mysql转储:

    mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql
    
  • 在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','','???????? ...
    

  • 我在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
    
    psql [CONNECTION PARAMETERS] -f FILENAME -1
    
    这将创建具有以下结构的简单XML文件:

    <resultset statement="select * from mysql_table_name">
      <row>
        <field name="some_field">field_value</field>
        ...
      </row>
      ...
    </resultset>
    
    XML->SQL转换中唯一的技巧是识别数字,并将其取消引号


    总而言之:mysql可以生成XML形式的查询结果,您也可以使用它。

    比这要复杂一些。这里有大量文档:

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

    在我相当简单的例子(30个表,10000条记录)中,我使用了一个perl脚本:

    它通过mysql转储文件,生成了一个pg转储文件,有以下问题

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

    关注的问题
  • 布尔数据类型。MySQL将它们存储为0和1。PostGreSQL将它们存储为t和f。注意布尔值不会作为整数迁移
  • 自动递增的ID。您可能会发现您的ID从1开始再次计数。您将得到如下错误:“重复的键值违反了唯一约束…”。修复很容易,但请注意

  • 我使用py-mysql2pgsql将一个大型MySQL数据库转换为Postgres。它可以很好地处理大多数情况。不过,我不得不根据自己的需要对其进行修补

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

    您可以使用 这是在PHP convertor上编写的

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


    这个项目的原始fork已经过时了。对我来说,使用这个脚本一切都运行得很好。

    最好使用一些自动化迁移过程的程序。 即使您熟悉所有的gotchas,手动完成每一步也可能需要很多时间,尤其是当您的db“很大”时

    试试看

    此工具功能强大,易于使用。 它映射数据类型,迁移约束、索引、PK和FK,与MySQL数据库中的完全相同。
    在后台,它使用PostgreSQL COPY,因此数据传输非常快。

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


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

    您能将mysql中的数据备份到csv或类似的sql文件吗?如果可以,您应该能够创建数据库,然后使用pgadminmak恢复脚本symko,我已经重新创建了shema。请您描述一下如何使用mysqldump和pg_restore一步一步地从表中复制数据。我尝试了这个方法,但出现了错误“FromMySqlToPostgreSql”-数据库迁移工具版权所有2015 Anatoly Khaytovich--迁移开始…--脚本终止。说明原因:--FromMySqlToPostgreSql::createSchema--无法创建新架构…--PDO异常代码:0--文件:/Users/admin/Downloads/FromMySqlToPostgreSql master/migration/FromMySqlToPostgreSql/FromMySqlToPostgreSql.php--第300行--消息:找不到驱动程序-------------------------------------------看起来您没有PDO驱动程序…安装它:MySQL:sudo apt get Install php5 MySQL或对于PostgreSQL:sudo apt get Install php5 pgsql