Postgresql WAL archive_command 文件比较
Postgresql WAL archive_command file compare
我在 "PostgreSQL Replication by Hans-Jurgen Schonig" 和一些地方读到,在执行 archive_command 期间最好不要覆盖存档 WAL 文件 - 谁能详细说明原因这个?如果以下场景对 WAL 覆盖有效?
我已经编写了一个脚本,它将为单个 WAL 归档过程执行以下高级逻辑:
if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067)
exit with status 0
else
if (copy 00000001000000F700000067 to /archive/00000001000000F700000067 is successful)
if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067)
exit with status 0
else
exit with status non-zero
else
exit with status non-zero
简而言之,这种方法希望至少能够抵御原始 WAL 文件被错误归档的情况——副本具有有效的文件名但已损坏(例如由于硬件故障)。我对本实例WAL归档过程的理解:
- archive_command 将 return 在复制过程后的 byte-for-bye 比较期间非零退出状态(让我们假设复制过程有一个错误的成功响应)
- 根据文档,非零 exit_status WAL 归档将无限期地重新尝试 - 应该进行第二次 WAL 归档尝试
- archive_command会识别出现有的归档 WAL 与当前的 WAL 字节不匹配
- 将进行第二次复制过程,希望能覆盖损坏的文件
- exit_status 0 如果文件比较成功,否则将重复此过程
比较涉及到非常小的开销(我可能会更新到 md5 检查),任何人都可以看出这种方法可能产生的任何问题吗?或进一步推荐?
谢谢
如果我正确阅读了您的伪代码,如果存档中的 WAL 段与您当前要存档的 WAL 不同,您将覆盖它们。
问题是 WAL 档案是非常重要的信息,而您正在涂写某人以前写过的存档 WAL 段。如果存在两个 PostgreSQL 集群错误地写入同一个存档目录的错误配置,WAL 存档将被破坏。
在这种情况下最好停止归档并提醒管理员。
我在 "PostgreSQL Replication by Hans-Jurgen Schonig" 和一些地方读到,在执行 archive_command 期间最好不要覆盖存档 WAL 文件 - 谁能详细说明原因这个?如果以下场景对 WAL 覆盖有效?
我已经编写了一个脚本,它将为单个 WAL 归档过程执行以下高级逻辑:
if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067)
exit with status 0
else
if (copy 00000001000000F700000067 to /archive/00000001000000F700000067 is successful)
if (/archive/00000001000000F700000067 exists and is readable) and (00000001000000F700000067 is byte by byte equal to /archive/00000001000000F700000067)
exit with status 0
else
exit with status non-zero
else
exit with status non-zero
简而言之,这种方法希望至少能够抵御原始 WAL 文件被错误归档的情况——副本具有有效的文件名但已损坏(例如由于硬件故障)。我对本实例WAL归档过程的理解:
- archive_command 将 return 在复制过程后的 byte-for-bye 比较期间非零退出状态(让我们假设复制过程有一个错误的成功响应)
- 根据文档,非零 exit_status WAL 归档将无限期地重新尝试 - 应该进行第二次 WAL 归档尝试
- archive_command会识别出现有的归档 WAL 与当前的 WAL 字节不匹配
- 将进行第二次复制过程,希望能覆盖损坏的文件
- exit_status 0 如果文件比较成功,否则将重复此过程
比较涉及到非常小的开销(我可能会更新到 md5 检查),任何人都可以看出这种方法可能产生的任何问题吗?或进一步推荐?
谢谢
如果我正确阅读了您的伪代码,如果存档中的 WAL 段与您当前要存档的 WAL 不同,您将覆盖它们。
问题是 WAL 档案是非常重要的信息,而您正在涂写某人以前写过的存档 WAL 段。如果存在两个 PostgreSQL 集群错误地写入同一个存档目录的错误配置,WAL 存档将被破坏。
在这种情况下最好停止归档并提醒管理员。