首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从MySql迁移到PostgreSql

从MySql迁移到PostgreSql
EN

Stack Overflow用户
提问于 2011-01-21 16:37:08
回答 8查看 43K关注 0票数 23

我的PostgreSQL安装在Windows上。如何将数据从MySQL数据库迁移到PostgreSQL?我读过很多文章。没有什么有用的:(

谢谢。

我的行为:

  1. mysql转储:

mysqldump -h 192.168.0.222 --端口3307 -u根-p -h=postgresql synchronizer >pgsql

  • 导入转储时的mysqldump数据库同步器:

C:\dump.sql

  • output:-h 192.168.0.100 -d同步器-U postgres -f psql

psql:C:/dump.sql:17:注意:表"Db_audit“不存在,跳过DROP表psql:C:/dump.sql:30: ERROR:在或附近出现语法错误"(”psql 2:"id“int(11) NOT NULL,^ psql:C:/dump.sql:37: ERROR:在" "Db_audit”“psql 1:LOCK TABLES”Db_audit“СТРОКА;^ psql:C:/dump.sql:39:错误:关系"Db_audit“不存在值1:插入到"Db_audit”值中(4068,4036,4,1,32,'2010-02-04 ... ^ psql:C:/dump.sql:40:错误:关系"Db_audit“不存在值1:插入到"Db_audit”СТРОКА(19730,2673,2,2,44,'2010-11-23...^ psql:C:/dump.sql:42: ERROR:语法错误在"UNLOCK“СТРОКА1:解锁表;^ psql:C:/dump.sql:48:注意:表"ZHNVLS“不存在,跳过DROP TABLE psql:C:/dump.sql:68: ERROR:语法错误"(”СТРОКА2:"id“int(10) unsigned NOT NULL,^ psql:C:/dump.sql:75: ERROR:语法错误在" "ZHNVLS”“СТРОКА1:LOCK TABLES”ZHNVLS“WRITE;^ psql:C:/dump.sql:77:警告:字符串文字СТРОКА1中转义的非标准用法:...?‘,'10','4607064820115','0','',’?- ??...^ПОДСКАЗКА:使用转义字符串语法进行转义,例如,E'\r\n‘。发送取消请求:C:/Dump.sql:77:警告:字符串文字СТРОКА1中的转义用法不是标准的:...?‘,'10','4602784001189','0','',’?...

EN

回答 8

Stack Overflow用户

发布于 2011-01-21 17:02:31

我使用MySQL -> Postgresql迁移的经历并不是很愉快,所以我不得不接受丹尼尔关于CSV文件的建议。

在我的示例中,我使用重新创建了模式,然后使用mysqldump和pg_restore逐个导入了所有表。

因此,虽然这种转储/恢复可能适用于数据,但您很可能不太熟悉模式。我还没有尝试过任何商业解决方案,所以看看其他人怎么说...祝好运!

更新:我查看了该过程留下的代码,以下是我实际是如何做到的。

我的PostgreSQL数据库中的模式稍有不同,因此一些表被联接,一些表被拆分。这就是为什么简单的导入不是一个选项,而我的案例可能比您所描述的更复杂,这个解决方案可能有点夸张。

对于PG数据库中的每个表,我编写了一个从MySQL数据库中选择相关数据的查询。如果两个数据库中的表基本相同,并且没有连接,则可以像下面这样简单

代码语言:javascript
运行
复制
select * from mysql_table_name

然后,我将此查询的结果导出为XML,为此,您需要像这样运行它:

代码语言:javascript
运行
复制
echo "select * from mysql_table_name" | mysql [CONNECTION PARAMETERS] -X --default-character-set=utf8 > mysql_table_name.xml

这将创建一个简单的XML文件,其结构如下:

代码语言:javascript
运行
复制
<resultset statement="select * from mysql_table_name">
  <row>
    <field name="some_field">field_value</field>
    ...
  </row>
  ...
</resultset>

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

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

代码语言:javascript
运行
复制
psql [CONNECTION PARAMETERS] -f FILENAME -1

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

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

票数 10
EN

Stack Overflow用户

发布于 2011-01-21 21:35:39

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

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

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

票数 8
EN

Stack Overflow用户

发布于 2013-01-22 18:02:26

在我的相当简单的例子中(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开始计数了。你会得到这样的错误:“重复的键值违反了唯一的约束...”。这很容易解决,但要当心。
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4756825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档