我有两个服务器,一个主服务器和一个副本服务器,它们以异步复制模式一起工作;从服务器似乎运行良好,因为主服务器中的任何更改都会立即反映在从服务器中。此外,还有一个存档过程,可将wal文件从主文件复制到另一个文件系统,以确保它们的安全。我的疑问是,我可以通过pg_archivecleanup
删除哪些wal文件?我想我需要在主数据库中查找扩展名为.backup
的wal文件,然后才能删除比上次备份更早的wal文件。
例如,如果我在主服务器中有这些文件
000000010000000000000089
000000010000000000000088.00000028.backup
000000010000000000000088
000000010000000000000087
000000010000000000000086
...
我得出的结论是,可以安全删除000000010000000000000088
和较旧的文件,并保留最新的文件。
问题是我在任何地方都找不到.backup
文件:既不在主数据库中,也不在副本中,也没有在存档位置。
答案 0 :(得分:1)
如果您使用*.backup
或类似的进行在线备份,则会创建pg_basebackup
文件,并且您正在使用archive_command
归档WAL文件。
在这种情况下,可以将pg_archivecleanup
用作参数文件,以自动删除所有早于该备份的WAL存档。
您是否使用其他备份方法(pg_dump
?),或者您没有使用archive_command
。
使用pg_dump
不能进行存档恢复,因此根本不需要存档WAL。如果您使用的是pg_receivewal
之类的其他存档方法,则不会获得*.backup
文件,并且您必须考虑采用其他方法来删除旧的WAL存档。
清除旧的WAL归档文件的一种简单方法是简单地删除所有比保留时间早的文件。
答案 1 :(得分:1)
仍在生成和存档文件(除非您将其关闭)。它们也通过流传递到副本,并保存在pg_wal中,但是副本会在每个重新启动点自动清除它们。您可以通过在副本上始终设置archive_mode = always来使副本永久保留,但这听起来像您不想要那样。
如果归档文件(由主数据库)的唯一目的是保存文件以供副本使用,以防该文件用于流式传输(而不是用于灾难恢复或PITR),则可以使用“ pg_archivecleanup”自动清理它们。这是在副本数据库(不是主数据库)上调用的,但是必须具有对存档目录的写访问权。因此,您可以将其挂载为网络文件共享,可以将pg_archivecleanup封装在ssh中,以便它可以在主服务器上运行,而不是在副本服务器上运行。