我的PostgreSQL安装在Windows上。如何将数据从MySQL数据库迁移到PostgreSQL? 我读过大量的aricles。没有任何帮助:(
感谢。
我的行动:
mysql dump:
mysqldump -h 192.168.0.222 --port 3307 -u root -p --compatible=postgresql synchronizer > c:\dump.sql
在pgsql创建db同步器
import dump:
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','','???????? ...
答案 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插件,它几乎完美无缺。
答案 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;。
此工具功能齐全且易于使用。 它映射数据类型,迁移约束,索引,PK和FK,就像它们在MySQL数据库中一样。 它使用PostgreSQL COPY,因此数据传输速度非常快。