从MySQL导出到PostgreSQL
2016-07-13 23:35
477 查看
摘要: 异构数据库的导入、导出是一个大难题。从MySQL到PG目前没有特别完善的工具,还需要人工的参与。本文将简单介绍下如何利用一些工具,手工将MySQL导出数据到PostgreSQL。 导出、转换、导入 数据导出、导入的思路是: 导出结构 导出数据 对结构进行转换 对数据进行转换 ...
异构数据库的导入、导出是一个大难题。从MySQL到PG目前没有特别完善的工具,还需要人工的参与。本文将简单介绍下如何利用一些工具,手工将MySQL导出数据到PostgreSQL。
数据导出、导入的思路是:
导出结构
导出数据
对结构进行转换
对数据进行转换
导入结构
导入数据
这里的想法是将结构和数据分开处理,这样有很多好处。首先DDL的语句的差别相比DML要大一些,比如各种类型的转换、符号的变化等,分开之后可以针对性的处理;其次,DDL和DML分开更好做批量的处理;其他好处……
当前的开源转换工具,尚没有一个完善的。不同的工具分别做了些不同的转换,因此本文将会利用多个工具互相配合使用,可以达到较好的效果。主要用到的工具有:
mysql-postgresql-converter
单个python脚本,依赖较少。对文件內容、格式的转换,比较好的是enum类型改写等。
my2pg.pl
单个perl脚本,依赖较少,会对数据类型做不错的转换。
SED、VIM, 文本编辑神器,你懂得~
导出主要采用的是mysql自带的mysqldump,导出成sql文件的形式。这里只给出直接的例子,更多的参数请参考文档(mysqldump --help)。
/usr/local/mysql/bin/mysqldump --skip-opt --compatible=postgresql --compact --no-data --default-character-set=utf8 --skip-dump-date -u cvusr -p -h mysqlhostaddress cvdb > schm.sql
--no-data,故名思议,就是不带数据
--compatible=postgresql, 尽量兼容PostgreSQL的语法的方式,至少能减少后面一部分工作量
--default-character-set=utf8,编码尽量与目标库保持一致
这里有更多的说明
/usr/local/mysql/bin/mysqldump --skip-opt --compatible=postgresql --compact --no-create-info --default-character-set=utf8 --skip-comments --skip-dump-date -u cvusr -p -h mysqlhost cvdb > data.sql
--no-create-info,去除了结构信息,只是数据
这里有更多的说明
数据的导出是比较容易的,麻烦的地方在于将数据文件转换成另一种数据库可以采用的方式。在这个过程中,至少需要处理以下几个问题,这里有详细的MySQL与PG的对比。
类型
如mediumint、char等,其实PG是可以自定义类型,这个应该是细节的处理,现有工具已经能做的不错。my2pg.pl工具可以完成得较好
语义转换
典型的,在MySQL中可以create table的时候对字段采用enum类型,在PG中就需要抽出来先建个enum数据类型。另外如UK、default value等。 这方面,mysql-postgresql-converter可以满足部分需求。
其他地方
格式
'与"
默认值
其他地方
可以在PG上做如下设置:
backslash_quote = on
escape_string_warning = off
standard_conforming_strings = off
在mysqldump的时候,在建表语句中会有注释,但发现几个工具都去不掉,mysqldump的"--skip-comments"选项也没起作用,百思不得姐之后决定手动处理:
sed -i "s/ COMMENT '.*',/ ,/g" schm.dump
sed -i "s/ COMMENT '.*',/ ,/g" data.dump
经过多次尝试,发现没有一个工具能够将导出的结构处理的比较完善,使得可以直接在PG中导入。开了脑洞后尝试工具的合作,主要是因为懒,不想手动改:
// 一些数据类型的修改,读者可以自行作个对比。目前my2pg.pl做得比其他工具要好一些。 (但其将blob类型转换成了text,需要注意,可以将脚本my2pg.pl中的“s/\w*blob$chareg/text/i; ”改为“s/\w*blob$chareg/bytea/i; ”)
// enum类型改写等,这个是上面的工具没有处理的,还有一些其他的
这里需要注意的是,这两个工具的顺序不能变,变了之后结果就不认识了。如果有兴趣,可以尝试下与其他工具的配合。
这还不是结束!这个时候,并不一定所有的类型都修改完全,可能还有一些需要手工处理,如:
特殊字符的处理:
SHELL$ vim mysql2pgsql-data.dump
:%s /\E'/E\'/g
——这里是去除一些地方转换出的问题,在插入语句中,"insert into tbl values(0, E\'0\')"会被处理成了"insert into tbl values(0, \E'0\')"。幸好只是少数!
日期默认值:
'0000-00-00' 改为CURRENT_DATE,或者某固定日期等
——在MySQL中,日期'0000-00-00'值为空、或者无效,但这个日期不是正确日期,因此在PG中不支持。CURRENT_DATE是指当前时间。
其他的修改,也只能见招拆招了。
在转换处理完成了之后,剩下的也就简单了。依次导入结构和数据就好,如果有问题,只能具体问题具体分析了。
结构导入
~/Workspace/pg94/bin/psql -h pghost -p 3432 -U cvusr -d cvdb -f schm.dump
数据导入
~/Workspace/pg94/bin/psql -h pghost -p 3432 -U cvusr -d cvdb -f data.dump
数据导进来了,不代表就结束了。因为不确定中间是否出了什么幺蛾子。需要做一些验证:
表结构、类型
记录数
抽样记录
存储过程就算了
编码、乱码的问题
其他差异地方的对比,如blob、clob等
针对这些做过检查无误之后,需要应用做相应的全面的测试。
mysql-to-postgresql-migration-tips
Converting_from_other_Databases_to_PostgreSQL
Converting_MySQL_to_PostgreSQL
mysql-postgresql-converter
py-mysql2pgsql
py-mysql2pgsql源码
mysqldump参数解释
Migrating from MySQL to PostgreSQL
异构数据库的导入、导出是一个大难题。从MySQL到PG目前没有特别完善的工具,还需要人工的参与。本文将简单介绍下如何利用一些工具,手工将MySQL导出数据到PostgreSQL。
导出、转换、导入
数据导出、导入的思路是:导出结构
导出数据
对结构进行转换
对数据进行转换
导入结构
导入数据
这里的想法是将结构和数据分开处理,这样有很多好处。首先DDL的语句的差别相比DML要大一些,比如各种类型的转换、符号的变化等,分开之后可以针对性的处理;其次,DDL和DML分开更好做批量的处理;其他好处……
当前的开源转换工具,尚没有一个完善的。不同的工具分别做了些不同的转换,因此本文将会利用多个工具互相配合使用,可以达到较好的效果。主要用到的工具有:
mysql-postgresql-converter
单个python脚本,依赖较少。对文件內容、格式的转换,比较好的是enum类型改写等。
my2pg.pl
单个perl脚本,依赖较少,会对数据类型做不错的转换。
SED、VIM, 文本编辑神器,你懂得~
导出
导出主要采用的是mysql自带的mysqldump,导出成sql文件的形式。这里只给出直接的例子,更多的参数请参考文档(mysqldump --help)。
导出结构
/usr/local/mysql/bin/mysqldump --skip-opt --compatible=postgresql --compact --no-data --default-character-set=utf8 --skip-dump-date -u cvusr -p -h mysqlhostaddress cvdb > schm.sql--no-data,故名思议,就是不带数据
--compatible=postgresql, 尽量兼容PostgreSQL的语法的方式,至少能减少后面一部分工作量
--default-character-set=utf8,编码尽量与目标库保持一致
这里有更多的说明
导出数据
/usr/local/mysql/bin/mysqldump --skip-opt --compatible=postgresql --compact --no-create-info --default-character-set=utf8 --skip-comments --skip-dump-date -u cvusr -p -h mysqlhost cvdb > data.sql--no-create-info,去除了结构信息,只是数据
这里有更多的说明
转换
数据的导出是比较容易的,麻烦的地方在于将数据文件转换成另一种数据库可以采用的方式。在这个过程中,至少需要处理以下几个问题,这里有详细的MySQL与PG的对比。
在结构上
类型如mediumint、char等,其实PG是可以自定义类型,这个应该是细节的处理,现有工具已经能做的不错。my2pg.pl工具可以完成得较好
语义转换
典型的,在MySQL中可以create table的时候对字段采用enum类型,在PG中就需要抽出来先建个enum数据类型。另外如UK、default value等。 这方面,mysql-postgresql-converter可以满足部分需求。
其他地方
在数据上:
格式'与"
默认值
其他地方
可以在PG上做如下设置:
backslash_quote = on
escape_string_warning = off
standard_conforming_strings = off
在mysqldump的时候,在建表语句中会有注释,但发现几个工具都去不掉,mysqldump的"--skip-comments"选项也没起作用,百思不得姐之后决定手动处理:
sed -i "s/ COMMENT '.*',/ ,/g" schm.dump
sed -i "s/ COMMENT '.*',/ ,/g" data.dump
自动转换
经过多次尝试,发现没有一个工具能够将导出的结构处理的比较完善,使得可以直接在PG中导入。开了脑洞后尝试工具的合作,主要是因为懒,不想手动改:// 一些数据类型的修改,读者可以自行作个对比。目前my2pg.pl做得比其他工具要好一些。 (但其将blob类型转换成了text,需要注意,可以将脚本my2pg.pl中的“s/\w*blob$chareg/text/i; ”改为“s/\w*blob$chareg/bytea/i; ”)
perl my2pg.pl schm.dump > my2pg-schm.dump
// enum类型改写等,这个是上面的工具没有处理的,还有一些其他的
python mysql-postgresql-converter/db_converter.py schm.dump > db_cvtr-my2pg-schm.dump
这里需要注意的是,这两个工具的顺序不能变,变了之后结果就不认识了。如果有兴趣,可以尝试下与其他工具的配合。
这还不是结束!这个时候,并不一定所有的类型都修改完全,可能还有一些需要手工处理,如:
特殊字符的处理:
SHELL$ vim mysql2pgsql-data.dump
:%s /\E'/E\'/g
——这里是去除一些地方转换出的问题,在插入语句中,"insert into tbl values(0, E\'0\')"会被处理成了"insert into tbl values(0, \E'0\')"。幸好只是少数!
日期默认值:
'0000-00-00' 改为CURRENT_DATE,或者某固定日期等
——在MySQL中,日期'0000-00-00'值为空、或者无效,但这个日期不是正确日期,因此在PG中不支持。CURRENT_DATE是指当前时间。
其他的修改,也只能见招拆招了。
数据导入
在转换处理完成了之后,剩下的也就简单了。依次导入结构和数据就好,如果有问题,只能具体问题具体分析了。结构导入
~/Workspace/pg94/bin/psql -h pghost -p 3432 -U cvusr -d cvdb -f schm.dump
数据导入
~/Workspace/pg94/bin/psql -h pghost -p 3432 -U cvusr -d cvdb -f data.dump
检查、验证
数据导进来了,不代表就结束了。因为不确定中间是否出了什么幺蛾子。需要做一些验证:表结构、类型
记录数
抽样记录
存储过程就算了
编码、乱码的问题
其他差异地方的对比,如blob、clob等
针对这些做过检查无误之后,需要应用做相应的全面的测试。
参考
mysql-to-postgresql-migration-tipsConverting_from_other_Databases_to_PostgreSQL
Converting_MySQL_to_PostgreSQL
mysql-postgresql-converter
py-mysql2pgsql
py-mysql2pgsql源码
mysqldump参数解释
Migrating from MySQL to PostgreSQL
相关文章推荐
- mysql优化--博森瑞
- MySQL索引原理及慢查询优化
- MySQL 5.7 双主复制+keepalived,常规业务一般够用了
- MySQL 随机取数据效率问题
- MySQL常用函数及注意(ing)
- MySQL中文乱码修改
- mysql中用int来表示时间
- 采用MySQL_upgrade升级授权表方式升级
- 升级MySQL 5.7版本遇到的一些小问题(转)
- 知数堂MySQL DBA在线培训第八期招生中
- 知数堂培训在线免费分享《MySQL 5.7 Replication新特性》
- MySQL5.7绿色版安装
- mysql 常用函数(二)
- Lost connection to MySQL server at ‘reading initial communication packet', system error: 0
- 从mysql中取出TimeStamp格式转换
- mysql 5.6.30
- mysql -- 一些最近看到的写的很好的博客 以及自己的总结
- mysql索引详解
- MySQL技术内幕InnoDB存储引擎学习笔记(第一章)
- Mysql数据类型