PG_RESETXLOG(1)

NAME
pg_resetxlog - 重置一個 PostgreSQL 數據庫集羣的預寫日誌以及其它控制內容

SYNOPSIS

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

DESCRIPTION 描述

pg_resetxlog 清理預寫日誌（WAL）並且可以選擇地重置其它一些控制信息（存儲在 pg_control 文件中）。 有時候，如果這些文件崩潰了，我們需要這個功能。 我們一定只把它用作最後的方法，就是說只有因爲這樣的崩潰導致服務器無法啓動的時候才使用。

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

 這個命令只能由安裝服務器的用戶運行，因爲它需要對數據目錄的讀寫權限。 出於安全考慮，你必須在命令行上聲明數據目錄。 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 而言，一個安全的數值是看看數據目錄裏的 /pg_clog 裏數值最大的文件名， 然後加一，然後再乘上 1048576。請注意那些文件名是十六進制的。通常我們也以十六進制的形式聲明開關值是最簡單得。 比如，如果 0011 是 pg_clog 裏 最大的記錄，-x 0x1200000 就可以了（後面的五個零提供了合適的乘積）。 WAL 的起始位置應該比目前存在於數據目錄裏得 /pg_xlog 裏面的任何文件號都大。它也是十六進制的，並且有兩部分。比如，如果 000000FF0000003A 是 pg_xlog 裏最大的條目， 那麼-l 0xFF,0x3B 就可以了。我們沒有很容易的辦法來判斷比數據庫中最大的 OID 大一號的下一個 OID， 不過很走運的是獲取正確的下一個 OID 並非非常關鍵。

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

NOTES 注意

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

譯者
Postgresql 中文網站 何偉平 <laser@pgsqldb.org>

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh