毫无疑问,pg_dump / pg_restore是在 PostgreSQL 中执行逻辑备份和恢复的绝佳工具。我们已经在这里详细解释了 pg_dump/pg_restore 。
pgcopydb 是一个开源工具,可以在两个 PostgreSQL 服务器之间自动执行 pg_dump 和 pg_restore。它是 pg_dump 和 pg_restore 的包装器,以简化流程并提供更多功能。在这篇博文中,我们将详细介绍pgcopydb。
为什么我们需要考虑 pgcopydb?
pgcopydb 有助于实现直接使用 pg_dump/pg_restore 无法实现的两个重要的事情。
1.没有中间文件
为了使用 pg_dump/pg_restore 实现更快的转储和恢复,我们需要使用并行性。为了实现这一点,两者都必须使用 –jobs 参数。每当我们使用 –jobs 参数来支持并行性时,它都需要写入中间文件。
例如,我们计划将 1 TB 的数据从源复制到目标,我们需要先将转储文件存储在本地。这意味着我们在服务器上需要额外的磁盘空间来放置转储。所需的磁盘空间取决于数据的大小。
通过使用 pgcopydb,我们不需要任何额外的磁盘空间来放置转储,因为该工具将完全绕过表数据的中间文件并且它支持并行性。
这是通过在整个操作期间连接到源数据库来实现的,而对于 pg_restore,不需要总是连接到源数据库,因为它从磁盘中间文件恢复数据。

2.同时创建所有索引
pg_dump/pg_restore 直接使用 ALTER TABLE 命令来构建索引和约束。但是 ALTER TABLE .. ADD CONSTRAINT 命令需要 ACCESS EXCLUSIVE 锁来防止任何并发。
在 pgcopydb 中,它首先执行 CREATE UNIQUE INDEX 语句。完成后,它只需使用ALTER TABLE .. ADD CONSTRAINT .. PRIMARY KEY USING INDEX 添加约束。这是有助于同时在表中构建所有索引的方式。
安装
在 Ubuntu 中安装非常简单。以下是步骤
1. 导入仓库密钥
1 2 |
|
2. 创建 /etc/apt/sources.list.d/pgdg.list。
1 |
|
3.安装pgcopydb
1 2 |
|
对于其他发行版,请参阅此处。
以下是依赖项
- Source 和 Destination 应该可以从运行 pgcopydb 的主机访问。此外,在成功迁移的整个过程中,源和目标都应该可用。
- 尽管 pgcopydb 不需要任何存储来在本地存储数据文件,但它在运行 pgcopydb 的服务器上需要非常少量的存储。这是保留模式备份和一些临时文件以保持进度所必需的。这将是非常小的大小,因为它只包含模式对象的结构。默认情况下,它将使用路径 /tmp/pgcopydb。如果需要使用其他路径,我们可以使用 –dir 选项。
- pgcopydb 依赖于运行 pgcopydb 的服务器中的 pg_dump 和 pg_restore 工具。pg_dump 和 pg_restore 的工具版本应该与目标数据库的 PostgreSQL 版本相匹配。
工作流程
以下工作流程解释了如何在两个不同的 PostgreSQL 服务器之间使用 pgcopydb 进行数据库复制。
- pgcopydb 首先使用来自源服务器的自定义格式(不是纯文本)的 pg_dump 生成仅模式备份。它将在两个文件中 a) 前数据部分 b) 后数据部分
- pre-data 节文件将使用 pg_restore 命令在目标服务器中恢复。它在目标服务器中创建所有 PostgreSQL 对象。
- pgcopydb 从源服务器获取所有表的列表,并在专用子进程中为每个表执行从源到目标的复制过程。它将对所有表执行,直到所有数据都被复制过来。
- 一个辅助进程与第 3 点中提到的主复制进程同时启动。该进程负责将所有大对象从源复制到目标。
- 在第 3 点提到的每个复制表子过程中,只要复制表数据,pgcopydb 就会获取索引列表并在目标服务器中并行创建它们。
- 正如我们在上一节中讨论的那样,索引创建将并行执行。
- 一旦创建了数据和索引,就会对每个目标表执行 Vacuum 分析。
- 现在,pgcopydb 获取序列列表并在目标服务器中相应地更新值。
- 最后,将在目标数据库中创建包含外键约束的 post-data 部分。
- 最重要的是,成功完成使数据库从源恢复到目标成功。
演示
在这个演示中,让我们看看如何执行从源到目标的完整数据库复制,以及它与 pg_dump/pg_restore 的比较。
| 服务器类型 | 主机 IP |
| 资源 | 192.168.33.11 |
| 目的地 | 192.168.33.12 |
| pgcopydb | 192.168.33.13 |
在单独的服务器中运行 pgcopydb 不是强制性的。它也可以安装在源服务器或目标服务器中。
现在将完整的数据库演示从源复制到目标。
在 pgcopydb 服务器中设置连接字符串
1 2 |
|
启动 pgcopydb
|
总时间总结
|
将 25GB 的数据库从一台服务器复制到另一台服务器总共花费了 6 分 17 秒。让我们直接尝试使用 pg_dump/pg_restore 进行相同的数据复制。
|
备份总共耗时 2 分 34 秒,还原耗时 6 分 5 秒,清理耗时 22 秒。即)9分钟。两个测试都使用了 16 个并行线程。

| 方法 | 所用时间(秒) |
| pgcopydb | 377 |
| pgdump/pgrestore | 519 |
根据统计数据,我们可以看到 pgcopydb 在 PostgreSQL 中执行逻辑备份和恢复的效率如何。到目前为止,我们只讨论了如何执行从源到目标的完整数据库复制。pgcopydb 还支持其最新版本的过滤(复制特定对象)。在我们的下一篇博客文章中,我们将了解如何在 pgcopydb 中使用过滤。此功能对于日常数据库操作也非常有用。
原文标题:Faster Logical Backup/Restore using pgcopydb – PostgreSQL
原文作者:Aakash Muthuramalingam
原文地址:https://mydbops.wordpress.com/2022/05/24/faster-logical-backup-restore-using-pgcopydb-postgresql/




