無効なデータベースでの自動バキュームの動作を理解する - Amazon Relational Database Service

無効なデータベースでの自動バキュームの動作を理解する

新しい値 -2pg_database カタログの datconnlimit 列に導入され、DROP DATABASE 操作の途中で中断されたデータベースが無効であることが示されます。

この新しい値は、次の RDS for PostgreSQL バージョンで使用できます。

  • 15.4 以降のすべてのバージョン

  • 14.9 以降のバージョン

  • 13.12 以降のバージョン

  • 12.16 以降のバージョン

  • 11.21 以降のバージョン

無効なデータベースは、有効なデータベースに対する自動バキュームのフリーズ機能には影響しません。自動バキュームは無効なデータベースを無視します。そのため、通常のバキューム操作は、PostgreSQL 環境内のすべての有効なデータベースに対して正常かつ効率的に機能し続けます。

トランザクション ID のモニタリング

age(datfrozenxid) 関数は、通常、トランザクション ID のラップアラウンドを防ぐため、データベースのトランザクション ID (XID) の経過時間をモニタリングするために使用されます。

無効なデータベースは自動バキュームから除外されるため、そのトランザクション ID (XID) カウンターは最大値 2 billion に達すると、- 2 billion にラップアラウンドして、このサイクルを無限に続けることができます。トランザクション ID のラップアラウンドをモニタリングする一般的なクエリは次のようになります。

SELECT max(age(datfrozenxid)) FROM pg_database;

ただし、datconnlimit に -2 値を導入した場合、無効なデータベースによってこのクエリの結果が歪む可能性があります。これらのデータベースは有効ではなく、定期的なメンテナンスチェックの一部に含めるべきではないため、誤検出が発生し、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 ロールを持つデータベースアカウントを使用して有効なデータベースに接続し、無効なデータベースを削除します。

SELECT 'DROP DATABASE ' || quote_ident(datname) || ';' FROM pg_database WHERE datconnlimit = -2 \gexec