pgcopydb: 教程

三月 27, 2024

摘要:本节包含了一系列经典的 pgcopydb 用例。有关命令及其选项的详细信息,请参阅 pgcopydb 中每个命令的手册页。

本文包含以下部分:

  1. 复制 Postgres 数据库到新服务器
  2. 复制 Postgres 用户和扩展
  3. 复制数据库时如何编辑结构?
  4. 跟随模式或捕获数据更改
  5. 如何验证结构和数据迁移?

复制 Postgres 数据库到新服务器

使用 pgcopydb 的最简单方法是,仅使用 pgcopydb clone 命令,如以下示例所示。

$ export PGCOPYDB_SOURCE_PGURI="dbname=redrock"
$ export PGCOPYDB_TARGET_PGURI="postgres://user@target:5432/redrock"

$ pgcopydb clone

请注意,还可以使用选项--source--target,设置数据库的 Postgres 连接字符串。在使用 Docker 容器时,使用环境变量特别有用。

您可能还会注意到,源端 Postgres 数据库和目标 Postgres 数据库必须是存在的,pgcopydb 才能运行。

复制 Postgres 用户和扩展

要复制 Postgres 用户,必须与目标数据库建立特权连接,如果要包含密码,还必须与源端数据库建立特权连接。有时希望将这些特权连接限制在最小范围内,这时可以使用如下所示的方法:

$ coproc ( pgcopydb snapshot --source ... )

# first two commands would use a superuser role
$ pgcopydb copy roles --source ... --target ...
$ pgcopydb copy extensions --source ... --target ...

# now it's possible to use a non-superuser role
$ pgcopydb clone --skip-extensions --source ... --target ...

$ kill -TERM ${COPROC_PID}
$ wait ${COPROC_PID}

复制数据库时如何编辑结构?

可以对 pgcopydb 操作进行拆分,一次运行一个操作。

请注意,与主命令pgcopydb clone相比,依赖于并发的并发能力和高性能表现会受到限制,因为主命令的不同部分彼此并发运行。

能够对不同步骤进行更多控制,来运行操作,仍然是有需要的。一个有趣的用例是,在复制数据之前对结构进行更改:

#
# pgcopydb uses the environment variables
#
$ export PGCOPYDB_SOURCE_PGURI=...
$ export PGCOPYDB_TARGET_PGURI=...

#
# we need to export a snapshot, and keep it while the indivual steps are
# running, one at a time
#
$ coproc ( pgcopydb snapshot )

$ pgcopydb dump schema --resume
$ pgcopydb restore pre-data --resume

#
# Here you can implement your own SQL commands on the target database.
#
$ psql -d ${PGCOPYDB_TARGET_PGURI} -f schema-changes.sql

# Now get back to copying the table-data, indexes, constraints, sequences
$ pgcopydb copy data --resume
$ pgcopydb restore post-data --resume

$ kill -TERM ${COPROC_PID}
$ wait ${COPROC_PID}

$ pgcopydb list progress --summary

请注意,为了确保操作的一致性,使用了pgcopydb snapshot命令。有关详细信息,请参阅恢复操作(快照)。

跟随模式或捕获数据更改

在实现数据变更捕获时,pgcopydb 和应用程序之间需要更多的同步点,才能实现一次干净的直接转换。

从初始副本和复制设置开始:

$ export PGCOPYDB_SOURCE_PGURI="dbname=redrock"
$ export PGCOPYDB_TARGET_PGURI="postgres://user@target:5432/redrock"

$ pgcopydb clone --follow

在命令运行时,使用 Postgres 的 pg_stat_replication 视图,检查 pgcopydb 进行的复制进度。

当滞后时间足够接近维护时段的规范时,就可以断开应用程序与源端数据库的连接,完成迁移,然后将应用程序重新连接到目标数据库:

$ pgcopydb stream sentinel set endpos --current

此命令必须带上与主命令pgcopydb clone --follow相同的--dir,以便与正在运行的进程共享相同的内部目录。

迁移结束后,现在使用以下命令,清理在捕获数据变更时创建的资源:

$ pgcopydb stream cleanup

另请参阅使用 Postgres 逻辑解码捕获数据变更,了解更多详细信息和其他操作模式。

如何验证结构和数据迁移?

命令 pgcopydb compare schema 仅限于比较 pgcopydb 当前抓取的有关 Postgres 模式的元数据。这意味着比较一组表、它们的属性、它们的索引和约束,以及序列值。

命令 pgcopydb compare data 运行一个 SQL 查询,该查询在每个 Postgres 实例上,计算每个表的数据的校验和,然后仅比较它们的校验和。这不是数据集的完整比较,可能存在校验和相同但数据不同的情况。

$ pgcopydb compare schema
$ pgcopydb compare data

了解更多

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