PostgreSQL 如何在启用 WAL 的备份中间处理检查点?

reg*_*ero 17 postgresql backup

在 PostgreSQL v9.0 上,我有一个 WAL 归档系统在工作。因此 WAL 文件定期存档(当创建 3 个 WAL 或 WAL 超过 15 分钟时)。

现在我添加 PG_DATA 目录(不包括 pg_xlog 子目录)的二进制包。为此,我执行了pg_start_backup(),二进制副本和pg_stop_backup().

我想我很清楚 pg_start_backup 和 pg_stop_backup 在做什么,第一个创建检查点,最后一个确保最后一个 WAL 文件被存档。

官方文档中我们可以看到对于二进制数据副本我们应该:

使用任何方便的文件系统备份工具执行备份,例如 tar 或 cpio(不是 pg_dump 或 pg_dumpall)。在执行此操作时停止数据库的正常操作既不必要也不可取。

所以我很困惑。这意味着在我们制作副本时可以执行检查点。我看到很多文档说明复制命令应该允许在执行复制时更改数据,我对此没意见,只是找到合适的工具的问题。但我的问题是postgreSQL 将如何处理包含一些不一致文件(一些来自检查点之前,一些来自检查点之后)的 pg_data 内容的恢复

通过重放事务日志 Postgresql 能够将所有这些文件置于正确的状态吗?我看到在执行备份时创建表和删除操作是危险的,是不是有一些像vacuum命令这样的危险操作?pg_backup 是否暂停真空操作?我应该在二进制复制过程开始时复制 global/pg_control 文件吗?我应该使用启用快照的文件系统(如使用 xfs-freeze)来获得更快的恢复过程吗?

我看到备份脚本崩溃不会自动启动 pg_stop_backup,所以我的备份状态有可能会持续很长时间(直到我的 nagios 打电话给某人修复 pg_stop_backup() )。因此,如果这两个命令在 PostgreSQL 中有任何不同,我想知道它,以了解它可能产生的影响。

请赐教。

小智 7

你问:

postgreSQL 将如何处理包含一些不一致文件的 pg_data 内容的恢复。

pg_start_backup()确保数据文件至少与检查点一样新。在恢复时,应用日志。

如果数据是旧的,日志会更新它..

如果数据是新的,日志将具有相同的内容。再写一遍也无妨。

数据永远不会比日志更新,因为日志是提前写入 (WAL)。


你问:

... xfs-freeze...

xfs-freeze类似于pg_start_backup(),它不拍摄快照。你需要一个卷管理器来做到这一点。


你问:

...如果 WAL 可以重放所有内容,为什么不支持创建表空间和创建数据库语句?

它受到支持,只是一些小问题。请参阅http://www.postgresql.org/docs/8.1/static/backup-online.html

23.3.5. 注意事项

CREATE TABLESPACE 命令使用文字绝对路径进行 WAL 记录,因此将作为具有相同绝对路径的表空间创建重放。如果日志正在不同的机器上重放,这可能是不受欢迎的。即使日志在同一台机器上重放,但在新的数据目录中也可能是危险的:重放仍然会覆盖原始表空间的内容。为避免此类潜在问题,最佳做法是在创建或删除表空间后进行新的基本备份。