如何清理 Postgres WAL?

Gab*_*ich 9 postgresql postgresql-10

清理 WAL postgres 的正确方法是什么?我有一个超过 100 GB 的数据库,它在 pg_wal 中有大约 600 GB。我还设置了 2 个逻辑复制。

主从 - Postgres 10。

Master 和 Slaves 有评论wal_keep_segmentsmax_wal_size

pg_archivecleanup没有使用%r选项,然后我通过在pg_controldata最新检查点的 REDO WAL 文件中搜索并删除了日志来获取存档名称,但随后一个副本因错误而停止

无法从 WAL 流接收数据:致命:请求的 WAL 段 xxx 已被删除

为了解决这个问题,我删除并重新创建了副本。

jja*_*nes 14

“pg_wal”会自我清理。你几乎不应该用手触摸 pg_wal。如果它没有自行清理,您需要找出原因并解决根本问题。

一个可能的原因是您有一个复制槽阻碍了它。副本正在使用插槽并且无法跟上。或者你有一个没有连接复制品的插槽,例如你摧毁了复制品但没有丢弃它曾经占用的垃圾。您可以通过查询pg_replication_slots来查看您拥有哪些插槽,如有必要,使用pg_drop_replication_slot删除一个插槽,两者都在主服务器上运行。您将寻找具有“restart_lsn”的最旧非空值的插槽。

另一个原因是您打开了“archive_mode”,但您的“archive_command”不断失败或跟不上。如果失败,您将在服务器日志文件中看到有关此问题的警告。

"pg_archivecleanup" 用于清理 WAL存档。“pg_wal”不是存档,而是实时WAL 文件。你很幸运,你没有通过在那里胡闹而破坏你的数据库。