Postgresql

pg_xlog 不回收從伺服器上的 WAL 文件

  • May 21, 2017

我已經使用 Postgres 9.3 設置了流複製

我的問題是,在從屬伺服器上,pg_xlog文件夾變得越來越滿,而 WAL 文件沒有被回收。

從伺服器在 中具有以下(相關)值postgresql.conf

wal_keep_segments = 150
hot_standby = on
checkpoint_segments = 32
checkpoint_completion_target = 0.9
archive_mode = off
#archive_command = ''

我最初的複制命令是:

pg_basebackup  --xlog-method=stream -h <master-ip> -D .  --username=replication --password

所以我想我的 WAL 文件沒問題。

這是我的從伺服器啟動日誌:

2017-05-08 09:55:31 IDT LOG:  database system was shut down in recovery at 2017-05-08 09:55:19 IDT
2017-05-08 09:55:31 IDT LOG:  entering standby mode
2017-05-08 09:55:31 IDT LOG:  redo starts at 361/C76DD3E8
2017-05-08 09:55:31 IDT LOG:  consistent recovery state reached at 361/C89A8278
2017-05-08 09:55:31 IDT LOG:  database system is ready to accept read only connections
2017-05-08 09:55:31 IDT LOG:  record with zero length at 361/C89A8278
2017-05-08 09:55:31 IDT LOG:  started streaming WAL from primary at 361/C8000000 on timeline 1
2017-05-08 09:55:32 IDT LOG:  incomplete startup packet
2017-05-08 09:58:34 IDT LOG:  received SIGHUP, reloading configuration files
2017-05-08 09:58:34 IDT LOG:  parameter "checkpoint_completion_target" changed to "0.9"

我什至嘗試手動將舊的 WAL 文件從主伺服器複製到從伺服器,但這也沒有幫助。

我究竟做錯了什麼?如何阻止pg_xlog文件夾無限增長?

是否與“不完整的啟動數據包”日誌消息有關?

最後一件事:在pg_xlog\archive_status文件夾下所有的 WAL 文件都帶有.done後綴。

感謝我能得到的任何幫助。

編輯:

我啟用log_checkpointspostgresql.conf.

以下是我啟用後的相關日誌條目:

2017-05-12 08:43:11 IDT LOG:  parameter "log_checkpoints" changed to "on"
2017-05-12 08:43:24 IDT LOG:  checkpoint complete: wrote 2128 buffers (0.9%); 0 transaction log file(s) added, 0 removed, 9 recycled; write=189.240 s, sync=0.167 s, total=189.549 s; sync files=745, longest=0.010 s, average=0.000 s
2017-05-12 08:45:15 IDT LOG:  checkpoint starting: time
2017-05-12 08:48:46 IDT LOG:  checkpoint complete: wrote 15175 buffers (6.6%); 0 transaction log file(s) added, 0 removed, 1 recycled; write=209.078 s, sync=1.454 s, total=210.617 s; sync files=769, longest=0.032 s, average=0.001 s
2017-05-12 08:50:15 IDT LOG:  checkpoint starting: time
2017-05-12 08:53:45 IDT LOG:  checkpoint complete: wrote 2480 buffers (1.1%); 0 transaction log file(s) added, 0 removed, 1 recycled; write=209.162 s, sync=0.991 s, total=210.253 s; sync files=663, longest=0.076 s, average=0.001 s

問題似乎已經解決了。

顯然我在主伺服器上遇到了硬體問題。

我能夠執行完整的 pg_dump 並重新索引我的數據庫,所以我很確定我沒有任何數據完整性問題。

但是,當我在配置中啟用 log_checkpoints 後查看主伺服器日誌時 - 在從伺服器停止執行檢查點前幾分鐘,我看到以下消息:

IDT ERROR:  failed to re-find parent key in index "<table_name>_id_udx" for split pages 17/18

看到之後 - 我決定切換託管服務提供商並將我的數據庫移動到新伺服器。從那時起(現在差不多一個星期) - 一切都在順利執行複制和檢查點按預期執行。

我真的希望這對其他人有所幫助——但是當發生這樣的事情時——總是被告知這個問題可能是由數據完整性/硬體問題引起的。

引用自:https://dba.stackexchange.com/questions/173129