从MySQL导出到PostgreSQL

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:


异构
数据库的导入、导出是一个大难题。从MySQL到PG目前没有特别完善的工具,还需要人工的参与。本文将简单介绍下如何利用一些工具,手工将MySQL导出数据到PostgreSQL。

导出、转换、导入


数据导出、导入的思路是:

  1. 导出结构

  2. 导出数据

  3. 对结构进行转换

  4. 对数据进行转换

  5. 导入结构

  6. 导入数据

这里的想法是将结构和数据分开处理,这样有很多好处。首先DDL的语句的差别相比DML要大一些,比如各种类型的转换、符号的变化等,分开之后可以针对性的处理;其次,DDL和DML分开更好做批量的处理;其他好处……

当前的开源转换工具,尚没有一个完善的。不同的工具分别做了些不同的转换,因此本文将会利用多个工具互相配合使用,可以达到较好的效果。主要用到的工具有:

  1. mysql-postgresql-converter

    单个python脚本,依赖较少。对文件內容、格式的转换,比较好的是enum类型改写等。

  2. my2pg.pl

    单个perl脚本,依赖较少,会对数据类型做不错的转换。

  3. 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

转换


数据的导出是比较容易的,麻烦的地方在于将数据文件转换成另一种数据库可以采用的方式。在这个过程中,至少需要处理以下几个问题,这里有详细的MySQL与PG的对比

在结构上

  1. 类型

    如mediumint、char等,其实PG是可以自定义类型,这个应该是细节的处理,现有工具已经能做的不错。my2pg.pl工具可以完成得较好

  2. 语义转换

    典型的,在MySQL中可以create table的时候对字段采用enum类型,在PG中就需要抽出来先建个enum数据类型。另外如UK、default value等。 这方面,mysql-postgresql-converter可以满足部分需求。

  3. 其他地方

在数据上:

  1. 格式

  2. '与"

  3. 默认值

  4. 其他地方

可以在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

检查、验证


数据导进来了,不代表就结束了。因为不确定中间是否出了什么幺蛾子。需要做一些验证:

  1. 表结构、类型

  2. 记录数

  3. 抽样记录

  4. 存储过程就算了

  5. 编码、乱码的问题

  6. 其他差异地方的对比,如blob、clob等

针对这些做过检查无误之后,需要应用做相应的全面的测试。

参考


  1. mysql-to-postgresql-migration-tips

  2. Converting_from_other_Databases_to_PostgreSQL

  3. Converting_MySQL_to_PostgreSQL

  4. mysql-postgresql-converter

  5. py-mysql2pgsql

  6. py-mysql2pgsql源码

  7. mysqldump参数解释

  8. Migrating from MySQL to PostgreSQL

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
30天前
|
SQL 关系型数据库 MySQL
|
2月前
|
SQL NoSQL 关系型数据库
关系型数据库管理系统Mysql
关系型数据库管理系统Mysql
|
2月前
|
SQL 关系型数据库 MySQL
MySQL技能完整学习列表10、数据导入和导出——1、数据导入(LOAD DATA, mysqldump)——2、数据导出(SELECT ... INTO OUTFILE, mysqldump)
MySQL技能完整学习列表10、数据导入和导出——1、数据导入(LOAD DATA, mysqldump)——2、数据导出(SELECT ... INTO OUTFILE, mysqldump)
48 0
|
29天前
|
数据可视化 关系型数据库 MySQL
PolarDB常见问题之无法创建mysql的连接池如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
1月前
|
存储 关系型数据库 MySQL
TiDB与MySQL、PostgreSQL等数据库的比较分析
【2月更文挑战第25天】本文将对TiDB、MySQL和PostgreSQL等数据库进行详细的比较分析,探讨它们各自的优势和劣势。TiDB作为一款分布式关系型数据库,在扩展性、并发性能等方面表现突出;MySQL以其易用性和成熟性受到广泛应用;PostgreSQL则在数据完整性、扩展性等方面具有优势。通过对比这些数据库的特点和适用场景,帮助企业更好地选择适合自己业务需求的数据库系统。
|
1月前
|
关系型数据库 MySQL 分布式数据库
PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
【2月更文挑战第16天】PolarDB for MySQL数据库外网连接解析失败的原因可能有以下几点
23 1
|
1月前
|
关系型数据库 MySQL 测试技术
数据库专家带你体验PolarDB MySQL版 Serverless的极致弹性特性!
本次基于阿里云瑶池数据库解决方案体验馆,带你体验PolarDB MySQL Serverless形态下的性能压测环境,基于可选择的标准压测工具进行压测,构造弹性场景进行压测,实时动态展示弹性能力、价格和性价比结果,压测环境可开放定制修改、可重复验证。参与活动即有机会获得鼠标、小米打印机、卫衣等精美礼品。
数据库专家带你体验PolarDB MySQL版 Serverless的极致弹性特性!
|
2月前
|
关系型数据库 MySQL 测试技术
数据库专家带你体验PolarDB MySQL版 Serverless的极致弹性特性
本次基于阿里云瑶池数据库解决方案体验馆,带你体验PolarDB MySQL Serverless形态下的性能压测环境,基于可选择的标准压测工具进行压测,构造弹性场景进行压测,实时动态展示弹性能力、价格和性价比结果,压测环境可开放定制修改、可重复验证。参与活动即有机会获得鼠标、小米打印机、卫衣等精美礼品。
|
2月前
|
关系型数据库 MySQL 分布式数据库
PolarDB for MySQL数据库外网连接解析失败的原因
【2月更文挑战第5天】PolarDB for MySQL数据库外网连接解析失败的原因
63 8
|
2月前
|
安全 关系型数据库 MySQL
Mysql注入 -- 数据库导出及读文件
Mysql注入 -- 数据库导出及读文件
97 0

相关产品

  • 云数据库 RDS MySQL 版
  • 云原生数据库 PolarDB