postgresql数据迁移工具pgcopydb
·
pgcopydb介绍
pgcopydb 是一个开源的 PostgreSQL 数据库迁移和复制工具,专为 零停机升级 和 跨版本数据同步 设计。它支持全量数据迁移和基于逻辑复制的增量同步,适用于 PostgreSQL 9.5 到 16 的版本间迁移。
以下是直接使用pg_dump、pg_restore和使用pgcopydb处理数据库复制时可用的功能的比较:
1.使用docker安装服务
在CentOS7等比较老的系统中实用源码编译安装会遇到很多依赖问题,所以建议使用docker服务
[root@postgres-02 opt]# docker pull ghcr.io/dimitri/pgcopydb:latest
[root@postgres-02 opt]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
ghcr.io/dimitri/pgcopydb latest f03e35bc3edf 8 weeks ago 192MB
[root@postgres-02 opt]# docker run --rm -it ghcr.io/dimitri/pgcopydb:latest pgcopydb --version

2.将镜像留存
避免以后想用下载不到
[root@postgres-02 opt]# docker save -o pgcopydb_v0.17.tar ghcr.io/dimitri/pgcopydb:latest
# 以后要用可以直接加载镜像
[root@postgres-02 opt]# docker load -i ./pgcopydb_v0.17.tar
3.使用选项
docker run --rm -it ghcr.io/dimitri/pgcopydb:latest pgcopydb --help
Available commands:
# 主命令
pgcopydb clone 将整个数据库从源端克隆到目标端
pgcopydb fork 功能同 clone,将整个数据库从源端复制到目标端
pgcopydb follow 从源数据库实时同步变更到目标数据库
pgcopydb snapshot 在源数据库上创建并导出快照
pgcopydb compare 比较源数据库和目标数据库的差异
pgcopydb copy 实现数据库的数据部分复制
pgcopydb dump 从 PostgreSQL 实例转储数据库对象
pgcopydb restore 将数据库对象恢复到 PostgreSQL 实例
pgcopydb list 列出 PostgreSQL 实例中的数据库对象
pgcopydb stream 从源数据库流式传输变更
pgcopydb ping 测试与源和目标数据库的连接
pgcopydb help 打印帮助信息
pgcopydb version 打印 pgcopydb 版本
4.在容器中执行迁移
迁移前确认源端的扩展,在目标端创建相同扩展
[postgres@postgres-01 data]$ psql -Atc "SELECT extname FROM pg_extension;" > extensions.list
[postgres@postgres-01 data]$ cat extensions.list
plpgsql
dblink
pg_stat_statements
pg_profile
pg_repack
pg_freespacemap
pgstattuple
4.1 运行容器
docker run -d \
--name pgcopydb \
ghcr.io/dimitri/pgcopydb:latest \
sleep infinity
# 查看容器内部ip地址,需要添加到源端与目标端的pg_hba.conf中
[root@postgres-02 local]# docker inspect pgcopydb | grep "IPAddress" | tail -1
"IPAddress": "172.17.0.2"
host all postgres 172.17.0.2/32 scram-sha-256
4.2 进入容器
docker exec -it pgcopydb /bin/bash
4.3 在容器中执行命令
pgcopydb clone \
--source postgres://postgres:123@10.0.0.41:5432/postgres \
--target postgres://postgres:123@10.0.0.42:5432/postgres \
--table-jobs 3 --index-jobs 2 --restore-jobs 2 \
--drop-if-exists --no-acl --verbose \
--skip-extensions --skip-ext-comments \
--dir /tmp/pgcopydb
5.常用操作
全量迁移
pgcopydb clone \
--source postgres://postgres:123@10.0.0.41:5432/postgres \
--target postgres://postgres:123@10.0.0.42:5432/postgres \
--table-jobs 8 --index-jobs 8 --restore-jobs 8 \
--drop-if-exists --no-acl --verbose \
--skip-extensions --skip-ext-comments --dir /tmp/pgcopydb
全量+增量迁移
pgcopydb clone --follow \
--source postgres://postgres:123@10.0.0.41:5432/postgres \
--target postgres://postgres:123@10.0.0.42:5432/postgres \
--table-jobs 3 --index-jobs 2 --restore-jobs 2 \
--drop-if-exists --no-acl --verbose \
--skip-extensions --skip-ext-comments \
--dir /tmp/pgcopydb
数据追平后断开程序
(1)源端停止业务
(2)查看pg_stat_replication是否还有增长
(3)pg_stat_replication无增长之后停止pgcopydb程序
pgcopydb stream sentinel set endpos --current \
--source postgres://postgres:123@10.0.0.41:5432/postgres \
--dir /tmp/pgcopydb

清理为捕获变更数据创建的资源
pgcopydb stream cleanup \
--source postgres://postgres:123@10.0.0.41:5432/postgres \
--target postgres://postgres:123@10.0.0.42:5432/postgres \
--dir /tmp/pgcopydb

对比表结构
pgcopydb compare schema \
--source postgres://postgres:123@10.0.0.41:5432/postgres \
--target postgres://postgres:123@10.0.0.42:5432/postgres \
--dir /tmp/pgcopydb

对比数据
pgcopydb compare data \
--source postgres://postgres:123@10.0.0.41:5432/postgres \
--target postgres://postgres:123@10.0.0.42:5432/postgres \
--dir /tmp/pgcopydb

查看迁移任务状态
pgcopydb stream sentinel get \
--source postgres://postgres:123@10.0.0.41:5432/postgres \
--dir /tmp/pgcopydb

更多推荐


所有评论(0)