And*_*kov 21 mysql migration postgresql dump
我的PostgreSQL安装在Windows上.如何将数据从MySQL数据库迁移到PostgreSQL?我读过大量的aricles.什么都没有帮助:(
谢谢.
我的行动:
mysql转储:
mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql
Run Code Online (Sandbox Code Playgroud)在pgsql上创建db同步器
进口转储:
psql -h 192.168.0.100 -d synchronizer -U postgres -f C:\dump.sql
Run Code Online (Sandbox Code Playgroud)输出:
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)我对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,您可以使用它.
这比那复杂一点.这里有大量文档:
http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#MySQL
在那里,您还可以找到转换脚本.
在我相当简单的情况下(30个表,10000个记录),我使用了一个perl脚本:
http://pgfoundry.org/frs/?group_id=1000198
它通过mysql转储文件并生成了一个pg转储文件,但存在以下问题.
我正在导入Heroku所以我使用了他们的pgbackups插件,它几乎完美无缺.
| 归档时间: |
|
| 查看次数: |
39002 次 |
| 最近记录: |