复制 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