pg_resetxlog

Name

pg_resetxlog -- 重置預寫日誌以及 pg_control 內容

Synopsis

pg_resetxlog [ -f ] [ -n ] [ -o oid ] [ -x xid ] [ -l fileid,seg ] datadir

描述

pg_resetxlog 清理預寫日誌並且可以選擇地 重置在 pg_control 文件中地一些欄位。 有時候,如果這些文件崩潰了,我們需要這個功能。 我們一定只把它用作最後的方法,就是說只有因為這樣的崩潰導致伺服器 無法啟動的時候才使用。

在運行這個命令之後,我們可能可以啟動伺服器了,但是,一定要記住 資料庫可能因為部分提交的事務而含有不完整的資料。 你應該馬上轉儲你的資料,運行 initdb,然後重新裝載。 在重新裝載之後,檢查不完整的部分然後根據需要進行修復。

這個命令只能由安裝伺服器的使用者運行,因為它需要對 datadir 的 讀寫權限。出於安全考慮,你必須在命令行上宣告資料目錄。 pg_resetxlog 不使用環境變數 PGDATA

如果 pg_resetxlog 抱怨說它無法判斷用於 pg_control 的有效資料,那麼你可以強制它繼續處理, 方法是宣告 -f (強制)開關。在這種情況下,那些丟失 了的資料的值將用模糊的近似數值代替。大多數位段都可以相符上, 但是下一個 OID,下一個事務 ID,WAL 開始位址以及資料庫區域欄位可能需要手動幫助, 前面三個可以用下面討論的開關設定。pg_resetxlog 自己的環境是猜測區域欄位的來源﹔看看 LANG 等等東西,它們 應該和 initdb 運行的環境相相符。如果你不能判斷所有 這些欄位的正確數值,那麼還是可以使用 -f,但是這樣恢復 過來的資料庫更叫要懷疑有問題 --- 立即轉儲和重置是必須的。 在轉儲之前不要執行任何修改資料的操作,因為任何這樣的 動作都可能把事情搞得更糟糕。

-o-x,和 -l 開關允許我們 手動設定下一個 OID,下一個事務 ID,以及 WAL 起始位置得數值。 只有在 pg_resetxlog 無法通過讀取 pg_control 判斷合適的數值的時候才需要它。對於下一個事務 ID 而言,一個安全的數值是看看 $PGDATA/pg_clog 裡最大的文件名,然後加一,然後再 乘上 1048576。請注意那些文件名是十六進制的。通常我們也以十六進制的形式 宣告開關值是最簡單得。比如,如果 0011pg_clog 裡 最大的記錄,-x 0x1200000 就可以了(後面的五個零提供了合適的乘積)。 WAL 的起始位置應該比目前存在於 $PGDATA/pg_xlog 裡面的任何文件號都大。它也是十六進制的,並且有兩部分。比如,如果 000000FF0000003Apg_xlog 裡最大的條目, 那麼-l 0xFF,0x3B 就可以了。我們沒有很容易的辦法來判斷比 資料庫中最大的 OID 大一號的下一個 OID,不過很走運的是獲取正確的下一個 OID 並非非常關鍵。

開關 -n (無操作)指示 pg_resetxlog 列印從 pg_control 重新構造的數值然後不修改任何值就退出。 這主要是一個除錯工具,但是在 pg_resetxlog 真正處理 前進行的整潔性檢查的時候可能會有用。

注意

postmaster 運行的時候一定不要運行這個命令。 如果發現在 datadir 目錄裡有鎖文件,那麼 pg_resetxlog 將拒絕啟動。如果 postmaster 崩潰,那麼可能會 剩下一個鎖文件﹔如果這樣,你可以刪除該鎖文件以便允許 pg_resetxlog 運行。但是在你這麼做之前,一定要確信沒有任何postmaster或者後端伺服器仍在運行。