本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
了解使用無效數據庫自動真空的行為
pg_database
目錄中-2
的資料datconnlimit
欄會引入新值,以指出DROPDATABASE作業中間已中斷的資料庫無效。
這個新值可從以下 版本中SQLRDS獲得 SQL:
15.4 及所有更高版本
14.9 和更新版本
13.12 及更高版本
12.16 及更高版本
11.21 及更高版本
無效的資料庫不會影響 auto真空凍結有效資料庫功能的能力。自動真空忽略無效的資料庫。因此,定期真空操作將繼續為 Postgre SQL 環境中的所有有效數據庫正常有效地運行。
監督交易 ID
該age(datfrozenxid)
函數通常用於監視數據庫的事務 ID (XID) 時間,以防止事務 ID 環繞。
由於無效的資料庫已排除在 auto真空之外,因此其交易 ID (XID) 計數器可以達到的最大值2 billion
、換行- 2 billion
,並無限期地繼續此週期。監視交易 ID 環繞的典型查詢可能如下所示:
SELECT max(age(datfrozenxid)) FROM pg_database;
不過,隨著的引入 -2 值datconnlimit
,無效的資料庫可能會扭曲此查詢的結果。由於這些資料庫無效,而且不應該是定期維護檢查的一部分,因此可能會導致誤判,導致您相信資料庫高age(datfrozenxid)
於實際維護檢查。
調整監控查詢
為了確保正確的監控,您應該調整監視查詢以排除無效的資料庫。請遵循以下建議的查詢:
SELECT max(age(datfrozenxid)) FROM pg_database WHERE datconnlimit <> -2;
此查詢可確保age(datfrozenxid)
計算中僅考慮有效的資料庫,從而真實反映 Postgre SQL 環境中的交易 ID 年齡。
解決無效資料庫問題
嘗試連線到無效的資料庫時,您可能會遇到類似下列內容的錯誤訊息:
postgres=> \c db1 connection to server at "mydb.xxxxxxxxxx.us-west-2.rds.amazonaws.com" (xx.xx.xx.xxx), port xxxx failed: FATAL: cannot connect to invalid database "db1" HINT: Use DROP DATABASE to drop invalid databases. Previous connection kept
此外,如果log_min_messages
參數設定為DEBUG2
或更高,您可能會注意到下列記錄項目,指出 auto真空處理作業正在略過無效的資料庫:
2024-07-30 05:59:00 UTC::@:[32000]:DEBUG: autovacuum: skipping invalid database "db6" 2024-07-30 05:59:00 UTC::@:[32000]:DEBUG: autovacuum: skipping invalid database "db1"
若要解決此問題,請依照連線嘗試期間HINT
提供的指示執行。使用您的RDS主帳戶或具有該rds_superuser
角色的資料庫帳戶 Connect 到任何有效的資料庫,然後刪除無效的資料庫。
SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' FROM pg_database WHERE datconnlimit = -2 \gexec