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.
Topik
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