我正在尝试在Postgres中设置连续存档和时间点恢复(PITR)。当我通过documentation时,它说:
归档命令通常应设计为拒绝覆盖任何预先存在的归档文件。这是一个重要的安全功能,可在管理员出错时(例如将两个不同服务器的输出发送到同一存档目录)来保持存档的完整性。
但是当我打开一个连接并不时做一些更改时,我发现同一个WAL文件正在多次更改。因此,例如,当我第一次连接数据库并进行一些更改(如删除或插入某些行)时,它会创建一个名为 000000010000000000000090 的WAL文件,并立即运行我的archive_command。我的archive_command是
test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f
这是基于文档,该文档检查文件是否已存在于存档目录中(如果存在),仅当文件不存在时才复制和复制。因此第一次条件通过并复制文件,但是当我使用相同的连接进行更多更改时(我从同一台PC重新连接时甚至出现相同的问题)原始的WAL文件正在被更改。但下次复制不起作用,因为该文件已存在。
如果允许这种情况发生,我们可能会在备份中丢失一些更改。任何人都知道任何解决方案,所以它为每个更改创建一个新文件而不是修改旧文件?
我在本地计算机(Mac)上使用Postgres版本10.2。
答案 0 :(得分:0)
这真的发生在你身上吗?因为它不应该。
PostgreSQL将事务日志写入16MB大小的“WAL文件”(WAL for Write Ahead Log )。
每当WAL文件已满时,日志将切换到新的WAL文件,旧的WAL文件将以archive_command
存档。
如果archive_command
以退出状态0(成功)完成,则WAL文件将被回收,否则将重试归档,直到成功为止。将记录失败。
无论如何,只要没有错误,每个WAL文件只会存档一次。
您描述的行为不应该发生。
检查PostgreSQL日志,查看是否有archive_command
报告的错误。如果您修复了错误条件。正常运作将恢复。