Postgres 請求的 WAL 段已被刪除(但它實際上在從站的目錄中)
我正在
repmgr
用作我的複制工具。在從站上,我不斷收到錯誤消息:請求的 WAL 段已被刪除
當我檢查大師時,它確實不在那裡;但是,它在從屬目錄中
pg_xlogs
和pg_xlogs/archive_status
. 我不明白如果它已經在從伺服器中,為什麼它會尋找這個文件?事實上,它已經
xlogs
超出了請求的範圍。What to do with WAL files for Postgres Slave reset中的解決方案是針對稍微不同的問題。它們似乎適用於主伺服器在從伺服器接收到日誌文件之前刪除它的場景。在我的情況下,它非常存在於從屬文件和請求文件之後的序列中的其他幾個文件中。這也告訴我我不需要增加 keep wal 段選項,因為它似乎沒有落後?
我只是賭了一把,將一個文件複製回失去的主文件。它有效,我仍然不知道是什麼導致了這個問題。
從 PostgreSQL 文件中的流複製:
如果您在沒有基於文件的連續歸檔的情況下使用流複製,則伺服器可能會在備用伺服器收到舊 WAL 段之前回收它們。如果發生這種情況,備用數據庫將需要從新的基本備份重新初始化。您可以通過將 wal_keep_segments 設置為足夠大的值以確保不會過早回收 WAL 段,或為備用數據庫配置複製槽來避免這種情況。如果您設置了可從備用數據庫訪問的 WAL 存檔,則不需要這些解決方案,因為備用數據庫始終可以使用存檔來追趕,只要它保留足夠的段。
要解決此問題,您必須重新初始化來自主伺服器的數據。刪除從站上的數據目錄:
root@replica:~# su postgres postgres@replica:~# mv /var/lib/postgresql/12/main /var/lib/postgresql/12/main_old
從主伺服器複製所有數據:
sudo -u postgres pg_basebackup -h [PRIMARY_IP] -D /var/lib/postgresql/12/main -U replication -P -v
如果版本是12,則創建standby.signal文件,否則配置replica.conf:
touch /var/lib/postgresql/12/main/standby.signal
從站配置:
listen_addresses = 'localhost,[IP_ADDRESS_OF_REPLIACA_ON_LAN]' # what IP address(es) to listen on; max_connections = 100 # Ensure that this value is the same as the primary's wal_level = 'replica' archive_mode = on archive_command = 'cd .' primary_conninfo = 'host=[PRIMARY_IP] port=5432 user=replication password=[REPLICATION PASSWORD]' hot_standby = on max_wal_senders = 48
pg_basebackup 需要多長時間?請記住,段大約每 5 分鐘生成一次,因此如果備份需要一個小時,您至少需要儲存 12 個段。在 2 小時,您需要 24 等,我將值設置為大約 12.2 段/小時的備份。