了解使用無效數據庫自動真空的行為 - Amazon Relational Database Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

了解使用無效數據庫自動真空的行為

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