支援的版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10

pg_resetwal

pg_resetwal — 重置 PostgreSQL 資料庫叢集的預寫式日誌和其他控制資訊

概要

pg_resetwal [ -f | --force ] [ -n | --dry-run ] [option...] [ -D | --pgdata ]datadir

說明

pg_resetwal 清除預寫式日誌 (WAL),並選擇性地重置儲存在 pg_control 檔案中的其他控制資訊。 如果這些檔案已損毀,有時需要此功能。 只有在由於此類損毀而導致伺服器無法啟動時,才應使用它作為最後手段。

一些選項,例如 --wal-segsize(見下文),也可用於修改資料庫叢集的某些全域設定,而無需重新執行 initdb。 如果沒有使用下面提到的任何危險模式,則可以在其他健全的資料庫叢集上安全地執行此操作。

如果在伺服器已乾淨關閉且控制檔案健全的資料目錄上使用 pg_resetwal,則它不會對資料庫系統的內容產生任何影響,只會清除不再使用的 WAL 檔案。 任何其他使用都可能存在危險,並且必須非常小心地進行。 pg_resetwal 將需要指定 -f(強制)選項,然後才能處理處於非乾淨關機狀態或具有損毀控制檔案的資料目錄。

在具有損毀的 WAL 或損毀的控制檔案的資料目錄上執行此命令後,應該可以啟動伺服器,但請記住,由於部分提交的交易,資料庫可能包含不一致的資料。 您應立即轉儲資料、執行 initdb,然後還原。 還原後,檢查不一致之處並根據需要進行修復。

如果 pg_resetwal 抱怨它無法確定 pg_control 的有效資料,您可以透過指定 -f(強制)選項來強制它繼續。 在這種情況下,將為遺失的資料替換合理的數值。 大部分欄位都可望匹配,但下一個 OID、下一個交易 ID 和 epoch、下一個多重交易 ID 和偏移以及 WAL 起始位置欄位可能需要手動協助。 這些欄位可以使用下面討論的選項進行設定。 如果您無法確定所有這些欄位的正確值,仍然可以使用 -f,但必須以比平常更懷疑的態度對待已復原的資料庫:立即轉儲和還原是必要的。 在您轉儲之前,請勿在資料庫中執行任何修改資料的操作,因為任何此類操作都可能使損毀情況變得更糟。

此公用程式只能由安裝伺服器的使用者執行,因為它需要對資料目錄的讀/寫存取權。

選項

datadir
-D datadir
--pgdata=datadir

指定資料庫目錄的位置。 基於安全考量,您必須在命令列上指定資料目錄。 pg_resetwal 不使用環境變數 PGDATA

-f
--force

強制 pg_resetwal 在即使可能存在危險的情況下也繼續執行,如上所述。 具體來說,如果伺服器尚未乾淨關機,或者 pg_resetwal 無法確定 pg_control 的有效資料,則需要此選項才能繼續。

-n
--dry-run

-n/--dry-run 選項指示 pg_resetwal 列印從 pg_control 重建的值和即將變更的值,然後退出而不修改任何內容。 這主要是一個除錯工具,但在允許 pg_resetwal 真正繼續執行之前,可以用作健全性檢查。

-V
--version

顯示版本資訊,然後退出。

-?
--help

顯示說明,然後退出。

只有當 pg_resetwal 無法透過讀取 pg_control 來確定適當的值時,才需要以下選項。 可以按照以下描述確定安全值。 對於採用數值引數的值,可以使用字首 0x 指定十六進位值。 請注意,這些指示僅適用於 8 kB 的標準區塊大小。

-c xid,xid
--commit-timestamp-ids=xid,xid

手動設定可以擷取提交時間的最舊和最新交易 ID。

可以透過在資料目錄下的 pg_commit_ts 目錄中尋找數值最小的檔案名稱來確定可以擷取提交時間的最舊交易 ID(第一部分)的安全值。 相反地,可以透過在相同目錄中尋找數值最大的檔案名稱來確定可以擷取提交時間的最新交易 ID(第二部分)的安全值。 檔案名稱以十六進位表示。

-e xid_epoch
--epoch=xid_epoch

手動設定下一個交易 ID 的世代 (epoch)。

交易 ID 世代實際上並未儲存在資料庫中的任何位置,除了由 pg_resetwal 設定的欄位之外,因此就資料庫本身而言,任何值都可以。您可能需要調整此值,以確保諸如 Slony-ISkytools 之類的複寫系統能夠正常工作 — 如果是這樣,則應可從下游複寫資料庫的狀態取得適當的值。

-l walfile
--next-wal-file=walfile

透過指定下一個 WAL 區段檔案的名稱來手動設定 WAL 的起始位置。

下一個 WAL 區段檔案的名稱應大於目前資料目錄下 pg_wal 目錄中存在的任何 WAL 區段檔案名稱。這些名稱也是十六進位的,並且有三個部分。第一部分是「時間軸 ID」,通常應保持不變。例如,如果 00000001000000320000004Apg_wal 中最大的條目,則使用 -l 00000001000000320000004B 或更高。

請注意,當使用非預設的 WAL 區段大小時,WAL 檔案名稱中的數字與系統函數和系統視圖回報的 LSN 不同。此選項採用 WAL 檔案名稱,而不是 LSN。

注意

pg_resetwal 本身會查看 pg_wal 中的檔案,並選擇一個超出最後一個現有檔案名稱的預設 -l 設定。因此,只有當您知道目前不存在於 pg_wal 中的 WAL 區段檔案(例如離線封存中的條目)時,或者當 pg_wal 的內容完全遺失時,才需要手動調整 -l

-m mxid,mxid
--multixact-ids=mxid,mxid

手動設定下一個和最舊的多重交易 ID。

可以透過在資料目錄下的 pg_multixact/offsets 目錄中尋找數值上最大的檔案名稱,加一,然後乘以 65536 (0x10000) 來確定下一個多重交易 ID(第一部分)的安全值。相反地,可以透過在同一目錄中尋找數值上最小的檔案名稱並乘以 65536 來確定最舊的多重交易 ID(-m 的第二部分)的安全值。檔案名稱是十六進位的,因此執行此操作的最簡單方法是以十六進位指定選項值並附加四個零。

-o oid
--next-oid=oid

手動設定下一個 OID。

沒有比較容易的方法來確定超出資料庫中最大 OID 的下一個 OID,但幸運的是,正確設定 next-OID 並不重要。

-O mxoff
--multixact-offset=mxoff

手動設定下一個多重交易偏移量。

可以透過在資料目錄下的 pg_multixact/members 目錄中尋找數值上最大的檔案名稱,加一,然後乘以 52352 (0xCC80) 來確定安全值。檔案名稱是十六進位的。沒有像其他選項那樣附加零的簡單方法。

--wal-segsize=wal_segment_size

設定新的 WAL 區段大小,以 MB 為單位。該值必須設定為 1 到 1024 (MB) 之間的 2 的冪。有關更多資訊,請參閱 initdb 的相同選項。

此選項也可以用於變更現有資料庫叢集的 WAL 區段大小,從而避免重新 initdb 的需要。

注意

雖然 pg_resetwal 會將 WAL 起始位址設定為超出最新的現有 WAL 區段檔案,但某些區段大小變更可能會導致先前的 WAL 檔案名稱被重複使用。建議將 -l 與此選項一起使用,以在 WAL 檔案名稱重疊會導致封存策略出現問題時,手動設定 WAL 起始位址。

-u xid
--oldest-transaction-id=xid

手動設定最舊的未凍結交易 ID。

可以透過在資料目錄下的 pg_xact 目錄中尋找數值上最小的檔案名稱,然後乘以 1048576 (0x100000) 來確定安全值。請注意,檔案名稱是十六進位的。通常最簡單的方法也是以十六進位指定選項值。例如,如果 0007pg_xact 中最小的條目,則 -u 0x700000 將起作用(五個尾隨零提供適當的乘數)。

-x xid
--next-transaction-id=xid

手動設定下一個交易 ID。

可以透過在資料目錄下的 pg_xact 目錄中尋找數值上最大的檔案名稱,加一,然後乘以 1048576 (0x100000) 來確定安全值。請注意,檔案名稱是十六進位的。通常最簡單的方法也是以十六進位指定選項值。例如,如果 0011pg_xact 中最大的條目,則 -x 0x1200000 將起作用(五個尾隨零提供適當的乘數)。

環境

PG_COLOR

指定是否在診斷訊息中使用顏色。可能的值為 alwaysautonever

備註

當伺服器正在執行時,不得使用此指令。pg_resetwal 如果在資料目錄中找到伺服器鎖定檔案,將拒絕啟動。如果伺服器崩潰,則可能會留下鎖定檔案;在這種情況下,您可以移除鎖定檔案以允許 pg_resetwal 執行。但在執行此操作之前,請務必仔細確認沒有伺服器處理程序仍在執行。

pg_resetwal 僅適用於相同主要版本的伺服器。

另請參閱

pg_controldata

提交更正

如果您在文件中發現任何不正確、與特定功能的體驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。