刪除wal文件後如何解決postgresql問題?
我在我的 postgresql 配置上打開了 archive_mode 以測試備份伺服器。而且由於 wal 文件佔用了大量磁碟空間,因此在測試後我將其關閉並刪除了 wal 文件。當我嘗試重新啟動 postgresql 時,出現以下錯誤。
root@hooshang:/etc/postgresql/9.1/main# /etc/init.d/postgresql restart * Restarting PostgreSQL 9.1 database server * The PostgreSQL server failed to start. Please check the log output: 2014-10-16 13:15:28 IRST LOG: database system was shut down at 2014-10-15 15:51:53 IRST 2014-10-16 13:15:28 IRST LOG: could not open file "pg_xlog/00000001000007DC00000037" (log file 2012, segment 55): No such file or directory 2014-10-16 13:15:28 IRST LOG: invalid primary checkpoint record 2014-10-16 13:15:28 IRST LOG: could not open file "pg_xlog/00000001000007DC00000029" (log file 2012, segment 41): No such file or directory 2014-10-16 13:15:28 IRST LOG: invalid secondary checkpoint record 2014-10-16 13:15:28 IRST PANIC: could not locate a valid checkpoint record 2014-10-16 13:15:28 IRST LOG: startup process (PID 17467) was terminated by signal 6: Aborted 2014-10-16 13:15:28 IRST LOG: aborting startup due to startup process failure
我該如何解決這個問題?
您已通過從數據目錄中手動刪除文件而損壞了數據庫。切勿手動從數據目錄中刪除文件。
安全刪除 WAL
如果要刪除 WAL,要麼讓伺服器
CHECKPOINT
按時完成,要麼使用pg_archivecleanup
. 請注意,伺服器將不再需要自動刪除 WAL,除非:
archive_mode
已打開,但archive_command
失敗了,因此伺服器會繼續重試存檔嘗試,直到它們成功或管理員干預;- 它仍然保存在
wal_keep_segments
- (在 9.4 中)複製槽仍然需要它。
如果這些都不適用,則
CHECKPOINT
(自動或通過 SQL 手動發出)將刪除目前不需要的所有 WAL。所以你不必手動刪除它。在不尋常的情況下,您可能需要使用
pg_archivecleanup
,例如由於長時間歸檔失敗後由於 WAL 積累而導致磁碟空間不足。您可能決定接受您必須重新創建副本,因為丟棄了他們仍然需要的 WAL 並用於pg_archivecleanup
釋放空間以使主伺服器執行。但是你永遠不應該手動刪除 WAL 段。
使用歸檔的 WAL 進行恢復
如果您將存檔的 WAL 保存在其他地方,您可能只能將文件複製回
pg_xlog
,或recovery.conf
使用 a 創建一個restore_command
來執行此操作。有關詳細資訊,請參閱 PITR 和日誌傳送手冊。在沒有歸檔 WAL 的情況下恢復
如果您在其他地方沒有這些 WAL 文件的副本,那麼如果您有最近的備份,則應該從備份中恢復,因為您已經損壞了數據庫。
如果您沒有備份,請按照損壞 wiki 頁面中的說明進行操作,並且僅在您製作了數據庫目前狀態的完整副本後,僅作為最後的手段,用於
pg_resetxlog
丟棄事務日誌並強制數據庫從不完整的交易開始。然後,您必須
pg_dump
停止數據庫、停止它、initdb
創建一個新數據庫並恢復到它。不要繼續使用您損壞的數據庫*。**永遠不要*繼續使用你曾經使用過的數據庫pg_resetxlog
,除非萬不得已,否則永遠不要使用它。