2026-10-22 12:01:10
使用PGLoader将MySQL数据库迁移到PostgreSQL的步骤如下:
安装PGLoader
推荐源码安装:因为其他方式可能会遇到各种问题,而源码安装通常更为可靠。
具体步骤:
clone项目:
git clone进入项目目录并执行安装脚本:
cd pgloaderchmod +x ./bootstrap-centos7.sh./bootstrap-centos7.sh编译:
make pgloader检查安装是否成功:
./build/bin/pgloader --version./build/bin/pgloader --help编写迁移脚本
示例脚本(假设MySQL和PostgreSQL在同一台机器上):
vim pgload.load脚本内容如下:
LOAD DATABASE FROM mysql://root:password@localhost:3306/temp_db INTO pgsql://postgres:password@localhost:5432/target_db WITH include drop, create tables, create indexes, workers = 8, concurrency = 1ALTER SCHEMA 'temp_db' RENAME TO 'public';脚本解释:
LOAD DATABASE:指定从数据库加载。
FROM:源数据库连接信息。
INTO:目标数据库连接信息。
WITH:指定PGLoader的行为,如删除目标数据库中的同名表、创建新表、创建索引等。
ALTER SCHEMA:在迁移完成后,将源数据库的schema名称重命名为目标数据库的schema名称。
执行迁移脚本
./build/bin/pgloader pgload.load处理时间类型转换问题
问题描述:MySQL的datetime类型在迁移到PostgreSQL时,默认会转换为带时区的timestamp类型,这可能不符合需求。
解决方案:在脚本中添加类型转换指令。
LOAD DATABASE FROM mysql://root:MC+2020!@localhost:3306/taas_core INTO pgsql://postgres:jetlinks@localhost:5433/taas_core WITH include drop, create tables, create indexes, workers = 8, concurrency = 1 CAST type datetime to timestamp drop default drop not null using zero-dates-to-nullALTER SCHEMA 'taas_core' RENAME TO 'public';解释:
CAST type datetime to timestamp drop default drop not null using zero-dates-to-null:这行指令告诉PGLoader在迁移过程中,将MySQL的datetime类型转换为PostgreSQL的timestamp类型,并删除默认值、非空约束,同时处理零日期为NULL。
验证迁移结果
迁移完成后,应检查目标PostgreSQL数据库中的数据是否完整且准确。
可以通过查询表、比较记录数等方式进行验证。
参考文档