PostgreSQL码农集散地

如果老板提出无理要求, 你会怎么应付?

如果老板提出这样的“无理”要求, 你会怎么应付? 

什么? 把PostgreSQL迁移到MySQL? 做梦去吧

为了生计, 我怎么可能被迫答应老板的无理要求: 把PostgreSQL迁移到MySQL. MySQL有啥好的, 虽然老板很喜欢没得办法, 没办法咋个弄? 弄个pi. 

找来找去, 终于找到了前阿里云数据库产品事业部负责人佛爷和普爷公司的产品NineData.  居然推出了社区免费版, 这是为老板请来的救兵吧, 太明显了. 

体验 NineData 社区版

“NineData 社区版”是最新发布的免费的、本地化部署(docker)版本。提供了数据库复制、数据库 DevOps 等产品能力,帮助小型企业、团队等更好的管理数据库。主要的产品功能包括:数据库全量迁移、增量迁移、数据库访问管理、流程权限等。

功能概述

当前版本支持的数据库复制包括:

  • MySQL->MySQL 结构、全量、增量迁移,以及数据对比
  • PostgreSQL -> PostgreSQL 结构、全量、增量迁移,以及数据对比
  • MySQL -> Doris 结构、全量、增量迁移,以及数据对比

支持的数据库访问管理,则包括了 MySQL、PostgreSQL、Oracle、SQL Server、MongoDB 等数十种数据库。

幸好目前Ninedata免费版仅支持PG 到 PG, 暂时还不能把PostgreSQL迁移到MySQL. 跟老板有交代了: 最牛逼的人搞的最牛逼的迁移工具NineData都不支持把PostgreSQL迁移到MySQL, 你作个啥子妖. 要不等他们把PG 到 MySQL免费了再找别人去搞, 反正我不弄. 

好开心,老板没有得逞

不过都拿到NineData社区版了, 那就体验一下怎么把PolarDB for PostgreSQL的大表转换成分区表, 毕竟这个也是很多小伙伴们都痛啊, 平滑转换还挺麻烦的.

我的想法是建一个分区表, 然后用NineData同步过去, 到业务低谷再换个表名, 有约束关系的再迁移一下约束关系, 这样能对业务的影响降低到最小.

部署 NineData 社区版

拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/ninedata_public/ninedata:latest  

启动容器

mkdir ~/ninedata  

# 目前仅支持x86架构  
docker run --net=host --privileged -v ~/ninedata:/u01 --name ninedata -d registry.cn-hangzhou.aliyuncs.com/ninedata_public/ninedata:latest  

打开WEB控制界面: http://127.0.0.1:30081 , 初始管理员账号与密码均为 admin



Image
pic

PolarDB 就用进阶课的环境吧:

  • 《穷鬼玩PolarDB RAC一写多读集群系列 | 在Docker容器中用loop设备模拟共享存储搭建PolarDB RAC》

为了支持增量复制, 需要把 PolarDB 参数 wal_level 改成 logical 后重启PolarDB.

建立测试库和测试用户

postgres=# create database db1;  
CREATE DATABASE  
postgres=# create role r1 login superuser encrypted password '123456';  
CREATE ROLE  

确认pg_hba.conf已允许NineData连接, 包括正常协议和流复制协议都要允许.

创建测试表, 写入一些测试数据, 假设tbl是大表

CREATE TABLE tbl (  
    id   int primary key,  
    info text,  
    ts timestamp not null  
) ;  

insert into tbl select generate_series(1,1000), 'test', now();  

创建分区表tbl1, 使用月份分区. 让NineData把tbl的数据增量同步到tbl1.

CREATE TABLE tbl1 (  
    id   int not null,  
    info text,  
    ts   timestamp not null  
) PARTITION BY RANGE (ts);  

ALTER TABLE tbl1 ADD PRIMARY KEY (ts, id);  

CREATE TABLE tbl1_202501 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-01-01') TO ('2025-02-01');  

CREATE TABLE tbl1_202502 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-02-01') TO ('2025-03-01');  

CREATE TABLE tbl1_202503 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-03-01') TO ('2025-04-01');  

CREATE TABLE tbl1_202504 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-04-01') TO ('2025-05-01');  

CREATE TABLE tbl1_202505 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-05-01') TO ('2025-06-01');  

CREATE TABLE tbl1_202506 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-06-01') TO ('2025-07-01');  

CREATE TABLE tbl1_202507 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-07-01') TO ('2025-08-01');  

CREATE TABLE tbl1_202508 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-08-01') TO ('2025-09-01');  

CREATE TABLE tbl1_202509 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-09-01') TO ('2025-10-01');  

CREATE TABLE tbl1_202510 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-10-01') TO ('2025-11-01');  

CREATE TABLE tbl1_202511 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-11-01') TO ('2025-12-01');  

CREATE TABLE tbl1_202512 PARTITION OF tbl1  
    FOR VALUES FROM ('2025-12-01') TO ('2026-01-01');  

create index on tbl1 (id);   

打开NineData控制台, 创建PolarDB数据源



Image
pic

新建同步任务(不需要同步结构, 因为我已经建好了)



Image
pic

选择tbl表作为源表



Image
pic

选择tbl1表作为目标表



Image
pic

启动任务



Image
pic

在数据库中可以看到NineData建立了逻辑复制槽, 用于同步全量和增量数据.



Image
pic

观察同步任务



Image
pic

检查全量数据同步完成



Image
pic

新增和修改数据



Image
pic

检查增量数据同步完成



Image
pic

任务的实时仪表盘



Image
pic

真的太方便了.

未来的期待: 如果结合AI 大模型, function call, tools调用, agent, 是不是AI就可以直接完成以上操作了! 以后的人可以享受生活了绝对不需要惯着老板的物理要求. 羡慕未来的人类可以做自己喜欢的事情不用为饱腹之欲弯腰.