Pgloader 是一个支持任意数据库迁移至 pgsql 的命令行工具。使用 COPY 流式传输协议将数据加载到 PostgreSQL 中,并使用单独的线程来读取和写入数据。
安装有多种方式,Docker 安装、安装包安装、源码安装等。
这里我推荐使用源码安装,因为其他方式都可能会遇到各式各样的问题,但是源码安装我一遍就成功了。
步骤:(本人系统为 Centos)
git clone https://github.com/dimitri/pgloader.git
cd pgloader
chmod +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 = 1
ALTER SCHEMA 'temp_db' RENAME TO 'public'
;
./build/bin/pgloader pgload.load
LOAD
DATABASE 指定从数据库加载FROM
源数据库INTO
目标数据库WITH
指定 PGLoader
行为include drop
,迁移过程中,PGLoader 会删除目标 PostgreSQL 数据库中在源数据库中同名的任何表。注意备份。create tables
, 配置 PGLoader 根据源数据库数据在目标数据库中创建新表,如果使用 create no - - tables,则需要手动在目标数据库中创建好对应的表。ALTER SCHEMA
, 在 WITH 语句之后,配置特定 SQL 来告诉 PGLoader 执行其他操作。详情见官方文档…
时间类型:MySQL 中是 datetime
,转换到 PostgreSQL 为 timestamp with time zone
,它变成带时区的时间了。
需求是不需要带上时区,因为转换会默认使用当前本机的时区,也可以指定时区。
这个问题在 github 找到了相关反馈。
https://github.com/dimitri/pgloader/issues/317
在脚本中加上指定的类型转换即可。
type datetime to timestamp drop default drop not null using zero-dates-to-null
完整脚本
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-null
ALTER SCHEMA 'taas_core' RENAME TO 'public'
;
官方文档:Migrating a MySQL Database to PostgreSQL
https://pgloader.readthedocs.io/en/latest/ref/mysql.html
空想具現化:pgloader 安装 & 使用
https://blog.homurax.com/2019/10/16/install-and-use-pgloader/
Ein Verne :从 MySQL 迁移到 PostgreSQL 方案调研
https://einverne.github.io/post/2019/09/migrate-from-mysql-to-postgresql.html
原文地址
https://rcbb.cc/archives/mysql-change-pg