Postgresql
pg_xlog 不回收從伺服器上的 WAL 文件
我已經使用 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_checkpoints
了postgresql.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
看到之後 - 我決定切換託管服務提供商並將我的數據庫移動到新伺服器。從那時起(現在差不多一個星期) - 一切都在順利執行複制和檢查點按預期執行。
我真的希望這對其他人有所幫助——但是當發生這樣的事情時——總是被告知這個問題可能是由數據完整性/硬體問題引起的。