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

在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐