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-I 和 Skytools 等複製系統正常工作——如果需要,可以從下游複製資料庫的狀態中獲取適當的值。
-l walfile
--next-wal-file=walfile
透過指定下一個 WAL 段檔案的名稱來手動設定 WAL 起始位置。
下一個 WAL 段檔案的名稱應大於資料目錄下的 pg_wal
目錄中當前存在的任何 WAL 段檔名。這些名稱也是十六進位制的,並且有三個部分。第一部分是“時間線 ID”(timeline ID),通常應保持不變。例如,如果 00000001000000320000004A
是 pg_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) 來確定一個安全值。請注意,檔名是十六進位制的。通常最簡單的方法是以十六進位制指定選項值。例如,如果 0007
是 pg_xact
中的最小值,那麼 -u 0x700000
將可用(五個零表示正確的乘數)。
-x xid
--next-transaction-id=xid
手動設定下一個事務 ID。
可以透過查詢資料目錄下的 pg_xact
目錄中數值最大的檔名,加一,然後乘以 1048576 (0x100000) 來確定一個安全值。請注意,檔名是十六進位制的。通常最簡單的方法是以十六進位制指定選項值。例如,如果 0011
是 pg_xact
中的最大值,那麼 -x 0x1200000
將可用(五個零表示正確的乘數)。
--char-signedness=option
手動設定預設的 char 有符號性。可能的值是 signed
和 unsigned
。
對於從 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
指定是否在診斷訊息中使用顏色。可能的值為 always
、auto
和 never
。
伺服器執行時不得使用此命令。pg_resetwal
如果在資料目錄中發現伺服器鎖檔案,將拒絕啟動。如果伺服器崩潰,則可能留下了鎖檔案;在這種情況下,您可以刪除鎖檔案以允許 pg_resetwal
執行。但在這樣做之前,請務必確保沒有伺服器程序仍在執行。
pg_resetwal
僅與同主版本的伺服器一起工作。
如果您在文件中發現任何不正確、與您在該功能上的實際經驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。