mysql版本 5.5.41
PG版本 12.6
首先了解一下两个数据库在数据处理上有哪些差异
创建表添加了只存储一个四位数字的字段,写入一个不正确的数据。但是mysq并不认为数据错误只是改变了数据。
同样的操作在PG中执行,PostgreSQL 将出错,因为我们试图在表中插入一个显然不允许的值。
更改字段定义
mysql数据库中修改字段类型后,它没有因为已经存储的数据而终止,而是数据再次被修改。
不过在PostgreSQL 会出错,它不允许对数据做不正确的事。
但是,PG也是人性话的,它这么做,可以在对原数据进行处理后修改字段类型。
处理空值
mysql中id字段是不允许为NULL,但是它却把要修改为NULL的值改为了0。
PG和MYSQL不一样,null就是null。
介绍这些目的是在迁移数据时,需要提前做好数据处理,以确保它符合数据模型的规则。
使用FDW进行数据迁移
mysql_fdw它提供了一种快速获取模式和数据并将其导入PostgreSQL 的方法。提供以下功能:写入MySQL 、连接池、WHERE 子句下推(这意味着应用于表的过滤器实际上可以在远程执行以获得更好的性能)、列下推(仅需要从远程端获取所需的列;旧版本用于获取所有列,这会导致更多的网络流量)、远程节点预编译语句。
要使用mysql_fdw首先下载代码:
git clone https://github.com/EnterpriseDB/mysql_fdw.git。
在PG服务端编译源码,在编译前需要安装mysql客户端,因为编译时需要使用mysql_config。
安装后需要指定环境变量,但是我选择直接修改Makefile文件指定绝对路径。
编译安装mysql_fdw.
编译代码后,把libmysqlclient.so文件拷贝到pg数据库的lib目录下,然后可以将FDW 添加到我们的数据库中。
在mysql环境创建两张表和一个存储过程。
下一步是创建我们要迁移的服务器。
创建服务器后,我们可以创建所需的用户映射。
创建临时模式存储mysql数据库架构信息。
运行 IMPORT FOREIGN SCHEMA 语句将mysql_schema模式用作将存储所有数据库链接的目标模式。在迁移后可以删除它。mytest为mysql数据库中的database,mysql_schema为PG数据库中模式。
查询一下数据,可以看到mysql数据库中数据作为外部表已经可以在PG中查询到。
但是这些表不是PG数据库内部表,只是外部表。
现在我们可以用 CREATE TABLE 子句提供的 LIKE 关键字。它允许我们复制表的结构并创建一个真实的本地 PostgreSQL 表,如果迁移的表很多我们可以把这个create table语句通过SQL拼接的方式把所有表的create语句写好并存储到一个SQL文件中批量执行。
我们可以看到表结构和数据都过来了,但是约束并没有同步过来,所以下面我们就应该部署所有约束,索引等,同时像存储过程、触发器和函数都需要人工处理。
总结:个人觉得mysql_fdw只作为一个导数据的工具还是不存错的,但是对表结构、存储过程等的支持还是不够友好的。
如果我迁移mysql数据到PG的话,我会这么做:
1.根据PG与MYSQL数据库的语法与数据类型特性,写一个脚本程序读取从mysql导出的表结构与存储过程等信息并输出成为PG可用SQL脚本。
2.使用mysql_fdw工具在PG中创建外部表,通过批量INSERT语句把数据写入到PG中。
3.或者在mysql中创建函数,通过函数处理把mysql中所有数据库中的数据导出为txt或者csv格式,然后在PG数据库中使用copy把数据导入。