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归档过程的理解:

比较涉及到非常小的开销(我可能会更新到 md5 检查),任何人都可以看出这种方法可能产生的任何问题吗?或进一步推荐?

谢谢

如果我正确阅读了您的伪代码,如果存档中的 WAL 段与您当前要存档的 WAL 不同,您将覆盖它们。

问题是 WAL 档案是非常重要的信息,而您正在涂写某人以前写过的存档 WAL 段。如果存在两个 PostgreSQL 集群错误地写入同一个存档目录的错误配置,WAL 存档将被破坏。

在这种情况下最好停止归档并提醒管理员。