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 baru -2 dimasukkan ke dalam datconnlimit kolom di pg_database katalog untuk menunjukkan database yang telah terputus di tengah DROP DATABASE operasi sebagai tidak valid.

Nilai baru ini tersedia dari RDS: SQL

  • 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 SQL Postgre Anda.

Memantau ID transaksi

age(datfrozenxid)Fungsi ini biasa digunakan untuk memantau usia ID transaksi (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 SQL Postgre 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 RDS master 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