2025年9月25日: PostgreSQL 18 釋出!
支援版本:當前18)/ 17 / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10

pg_resetwal

pg_resetwal — 重置 PostgreSQL 資料庫叢集的預寫日誌(write-ahead log)和其他控制資訊

概要

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(force)選項。

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

如果 pg_resetwal 報告無法確定 pg_control 的有效資料,您可以透過指定 -f(force)選項來強制它繼續。在這種情況下,將為缺失的資料替換合理的預設值。大多數字段應該能匹配,但對於下一個 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。

可以檢索提交時間的,最舊事務 ID 的安全值(第一部分)可以透過查詢資料目錄下的 pg_commit_ts 目錄中數值最小的檔名來確定。反之,可以檢索提交時間的,最新事務 ID 的安全值(第二部分)可以透過查詢同一目錄中數值最大的檔名來確定。檔名是十六進位制的。

-e xid_epoch
--epoch=xid_epoch

手動設定下一個事務 ID 的 epoch。

事務 ID epoch 實際上並沒有儲存在資料庫的任何地方,除了由 pg_resetwal 設定的欄位中,因此就資料庫本身而言,任何值都可以。您可能需要調整此值以確保 Slony-ISkytools 等複製系統正常工作——如果需要,可以從下游複製資料庫的狀態中獲取適當的值。

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

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

下一個 WAL 段檔案的名稱應大於資料目錄下的 pg_wal 目錄中當前存在的任何 WAL 段檔名。這些名稱也是十六進位制的,並且有三個部分。第一部分是“時間線 ID”(timeline 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。

下一個多事務 ID 的安全值(第一部分)可以透過查詢資料目錄下的 pg_multixact/offsets 目錄中數值最大的檔名,加一,然後乘以 65536 (0x10000) 來確定。反之,最舊的多事務 ID 的安全值(-m 的第二部分)可以透過查詢同一目錄中數值最小的檔名並乘以 65536 來確定。檔名是十六進位制的,因此最簡單的方法是以十六進位制指定選項值並附加四個零。

-o oid
--next-oid=oid

手動設定下一個 OID。

沒有簡單的方法可以確定比資料庫中最大的 OID 還要大的下一個 OID,但幸運的是,設定下一個 OID 的值並不關鍵。

-O mxoff
--multixact-offset=mxoff

手動設定下一個多事務偏移量。

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

-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 將可用(五個零表示正確的乘數)。

--char-signedness=option

手動設定預設的 char 有符號性。可能的值是 signedunsigned

對於從 PostgreSQL 18 之前的版本透過 pg_upgrade 升級的資料庫叢集,安全值應該是升級前執行該叢集的平臺的預設 char 有符號性。對於所有其他叢集,signed 是安全值。但是,此選項僅用於 pg_upgrade,通常不應手動使用。

--wal-segsize=wal_segment_size

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

此選項也可用於更改現有資料庫叢集的 WAL 段大小,從而無需重新 initdb

注意

雖然 pg_resetwal 會將 WAL 起始地址設定為最新的現有 WAL 段檔案之後,但某些段大小的更改可能導致先前 WAL 檔名被重用。建議與此選項一起使用 -l 來手動設定 WAL 起始地址,如果 WAL 檔名重疊會影響您的歸檔策略。

環境變數

PG_COLOR

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

註釋

伺服器執行時不得使用此命令。pg_resetwal 如果在資料目錄中發現伺服器鎖檔案,將拒絕啟動。如果伺服器崩潰,則可能留下了鎖檔案;在這種情況下,您可以刪除鎖檔案以允許 pg_resetwal 執行。但在這樣做之前,請務必確保沒有伺服器程序仍在執行。

pg_resetwal 僅與同主版本的伺服器一起工作。

另請參閱

pg_controldata

提交更正

如果您在文件中發現任何不正確、與您在該功能上的實際經驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。