pgcopydb: 简介

三月 30, 2024

摘要pgcopydb程序是一个工具,可以将 PostgreSQL 数据库逻辑复制到目标 PostgreSQL 服务器。

本文包含以下部分:

  1. pgcopydb 简介
  2. 特性矩阵
  3. pgcopydb 使用 pg_dump 和 pg_restore
  4. 数据更改捕获,或分支和跟随

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

了解更多

pgcopydb: 复制 PostgreSQL 数据库到目标服务器