Memahami perilaku autovacuum dengan database yang tidak valid - Layanan Basis Data Relasional Amazon

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memahami perilaku autovacuum dengan database yang tidak valid

Nilai -2 baru diperkenalkan ke datconnlimit kolom dalam pg_database katalog untuk menunjukkan database yang telah terputus di tengah operasi DROP DATABASE sebagai tidak valid.

Nilai baru ini tersedia dari

  • 15.4 dan semua versi yang lebih tinggi

  • 14.9 dan versi yang lebih tinggi

  • 13.12 dan versi yang lebih tinggi

  • 12.16 dan versi yang lebih tinggi

  • 11.21 dan versi yang lebih tinggi

Database yang tidak valid tidak memengaruhi kemampuan autovacuum untuk membekukan fungsionalitas untuk database yang valid. Autovacuum mengabaikan database yang tidak valid. Akibatnya, operasi vakum reguler akan terus berfungsi dengan baik dan efisien untuk semua database yang valid di lingkungan PostgreSQL Anda.

Memantau ID transaksi

age(datfrozenxid)Fungsi ini biasa digunakan untuk memantau usia transaksi ID (XID) database untuk mencegah pembungkus ID transaksi.

Karena database yang tidak valid dikecualikan dari autovacuum, penghitung ID transaksi (XID) mereka dapat mencapai nilai maksimum2 billion, membungkus, dan melanjutkan siklus ini tanpa batas waktu. - 2 billion Kueri khas untuk memantau sampul ID Transaksi mungkin terlihat seperti:

SELECT max(age(datfrozenxid)) FROM pg_database;

Namun, dengan diperkenalkannya nilai -2 untukdatconnlimit, database yang tidak valid dapat memiringkan hasil kueri ini. Karena database ini tidak valid dan tidak boleh menjadi bagian dari pemeriksaan pemeliharaan rutin, mereka dapat menyebabkan positif palsu, membuat Anda percaya bahwa age(datfrozenxid) itu lebih tinggi daripada yang sebenarnya.

Menyesuaikan kueri pemantauan

Untuk memastikan pemantauan yang akurat, Anda harus menyesuaikan kueri pemantauan untuk mengecualikan database yang tidak valid. Ikuti kueri yang disarankan ini:

SELECT max(age(datfrozenxid)) FROM pg_database WHERE datconnlimit <> -2;

Kueri ini memastikan bahwa hanya database yang valid yang dipertimbangkan dalam age(datfrozenxid) perhitungan, memberikan refleksi sebenarnya dari usia ID transaksi di seluruh lingkungan PostgreSQL Anda.

Menyelesaikan masalah database yang tidak valid

Saat mencoba menyambung ke database yang tidak valid, Anda mungkin menemukan pesan galat yang mirip dengan berikut ini:

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

Selain itu, jika log_min_messages parameter disetel ke DEBUG2 atau lebih tinggi, Anda mungkin melihat entri log berikut yang menunjukkan bahwa proses autovacuum melewatkan database yang tidak valid:

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"

Untuk mengatasi masalah ini, ikuti yang HINT disediakan selama upaya koneksi. Connect ke database yang valid menggunakan akun master RDS Anda atau akun database dengan rds_superuser peran tersebut, dan jatuhkan database yang tidak valid.

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