本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
了解具有無效資料庫的自動清空行為
-2
系統會將新值引入pg_database
目錄中的 datconnlimit
欄,以指出在 DROP DATABASE 操作中中斷的資料庫無效。
此新值可從下列 RDS for PostgreSQL 版本取得:
-
15.4 和所有更高版本
-
14.9 和更新版本
-
13.12 和更新版本
-
12.16 和更新版本
-
11.21 和更新版本
無效的資料庫不會影響自動清空凍結有效資料庫功能的能力。自動清空會忽略無效的資料庫。因此,定期清空操作將繼續對 PostgreSQL 環境中的所有有效資料庫正常運作且有效率地運作。
監控交易 ID
age(datfrozenxid)
函數通常用於監控資料庫的交易 ID (XID) 存留期,以防止交易 ID 包圍。
由於自動清空會排除無效的資料庫,因此其交易 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)
計算中只會考慮有效的資料庫,提供 PostgreSQL 環境中交易 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
或更高版本,您可能會注意到下列日誌項目,指出自動清空程序正在略過無效的資料庫:
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
角色的資料庫帳戶 (RDS 主帳戶) 連線到任何有效的資料庫,並捨棄無效的資料庫。
SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' FROM pg_database WHERE datconnlimit = -2 \gexec