三月 30, 2024
摘要:pgcopydb
程序是一个工具,可以将 PostgreSQL 数据库逻辑复制到目标 PostgreSQL 服务器。
本文包含以下部分:
pgcopydb 简介
pgcopydb 是一个能够自动将 PostgreSQL 数据库复制到另一台服务器的工具。pgcopydb 的主要应用场景是迁移到新的 Postgres 系统,无论是新硬件、新架构还是新的 Postgres 主要版本。
这个想法来自于在两个正在运行的 Postgres 服务器之间运行pg_dump -jN | pg_restore -jN
。为了尽快将数据库复制到另一台服务器,用户会希望使用pg_dump
的并行选项,并且仍然能够将数据流式传输到尽可能多的pg_restore
任务上。遗憾的是,这种方法无法直接使用 pg_dump 和 pg_restore 来实现,请参阅绕过 TABLE DATA 的中间文件。
使用pgcopydb
时,可以通过以下简单的命令行实现并行和流式处理:
$ export PGCOPYDB_SOURCE_PGURI="postgres://user@source.host.dev/dbname"
$ export PGCOPYDB_TARGET_PGURI="postgres://role@target.host.dev/dbname"
$ pgcopydb clone --table-jobs 4 --index-jobs 4
有关该命令实现原理以及许多其他支持选项的详细信息,请参阅 pgcopydb clone 的手册页。
特性矩阵
下面对直接使用 pg_dump 和 pg_restore,以及使用 pgcopydb 处理数据库复制,进行了比较并列出了可用的功能。
特性 | pgcopydb | pg_dump ; pg_restore |
---|---|---|
单命令操作 | ✓ | ✗ |
快照一致性 | ✓ | ✓ |
恢复部分运行的能力 | ✓ | ✗ |
高级筛选 | ✓ | ✓ |
表级并发 | ✓ | ✓ |
同表并发 | ✓ | ✗ |
索引并发 | ✓ | ✓ |
约束索引并发 | ✓ | ✗ |
模式 | ✓ | ✓ |
大对象 | ✓ | ✓ |
VACUUM ANALYZE | ✓ | ✗ |
复制时冻结(Copy Freeze) | ✓ | ✗ |
角色 | ✓ | ✗(需要 pg_dumpall) |
表空间 | ✗ | ✗(需要 pg_dumpall) |
跟随更改 | ✓ | ✗ |
请参阅有关 pgcopydb 和 pgcopydb 配置的文档,了解其高级筛选能力。
pgcopydb 使用 pg_dump 和 pg_restore
pgcopydb 的实现实际上调用了 pg_dump 和 pg_restore 二进制程序来处理大部分工作,例如数据前期和数据后期的部分。有关支持的三个部分的更多信息,请参阅 pg_dump 文档。
在使用 pg_dump 获取数据前期和数据后期的部分后,pgcopydb 会使用 pg_restore 将数据前期部分恢复到目标 Postgres 实例。
然后,pgcopydb 使用 SQL 命令和 COPY 流协议迁移表内容和大对象数据,并在数据迁移到目标实例后立即对表运行 VACUUM ANALYZE 操作。
然后,pgcopydb 会使用 SQL 命令在目标 Postgres 实例上构建索引,如设计文档中所述。对于每个表,并发构建所有索引。这允许在同时构建的索引列表中包含约束索引(如主键)。
数据更改捕获,或分支和跟随
还可以使用pgcopydb
实现数据更改捕获,将源端数据库上发生的数据修改重放到目标数据库。请参阅手册中的 pgcopydb follow 命令,和 pgcopydb clone 命令中的--follow
选项。
要使用 pgcopydb 进行在线迁移,在源端 Postgres 实例数据库所做的更改要在目标系统上同步重放,最简单的实现如下所示:
$ pgcopydb clone --follow &
# later when the application is ready to make the switch
$ pgcopydb stream sentinel set endpos --current
# later when the migration is finished, clean-up both source and target
$ pgcopydb stream cleanup