Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Autovacuum melakukan penyedot debu agresif dan menurunkan usia transaksi IDs hingga di bawah ambang batas yang ditentukan oleh parameter instans RDS Anda. autovacuum_freeze_max_age
Anda dapat melacak usia ini menggunakan CloudWatch metrik AmazonMaximumUsedTransactionIDs
.
Untuk menemukan pengaturan autovacuum_freeze_max_age
(yang memiliki default 200 juta transaksi IDs) untuk instans Amazon RDS Anda, Anda dapat menggunakan kueri berikut:
SELECT TO_CHAR(setting::bigint, 'FM9,999,999,999') autovacuum_freeze_max_age FROM pg_settings WHERE name = 'autovacuum_freeze_max_age';
Perhatikan bahwa postgres_get_av_diag()
hanya memeriksa penghambat vakum agresif ketika usia melebihi ambang batas autovacuum adaptif Amazon RDS sebesar 500 juta transaksi. IDs postgres_get_av_diag()
Untuk mendeteksi pemblokir, pemblokir harus berusia setidaknya 500 juta transaksi.
postgres_get_av_diag()
Fungsi ini mengidentifikasi jenis blocker berikut:
Topik
Pernyataan aktif
Dalam PostgreSQL, pernyataan aktif adalah pernyataan SQL yang saat ini sedang dijalankan oleh database. Ini termasuk kueri, transaksi, atau operasi apa pun yang sedang berlangsung. Saat memantau viapg_stat_activity
, kolom status menunjukkan bahwa proses dengan PID yang sesuai aktif.
postgres_get_av_diag()
Fungsi ini menampilkan output yang mirip dengan berikut ketika mengidentifikasi pernyataan yang merupakan pernyataan aktif.
blocker | Active statement database | my_database blocker_identifier | SELECT pg_sleep(20000); wait_event | Timeout:PgSleep autovacuum_lagging_by | 568,600,871 suggestion | Connect to database "my_database", review carefully and you may consider terminating the process using suggested_action. For more information, see Working with PostgreSQL autovacuum in the Amazon RDS User Guide. suggested_action | {"SELECT pg_terminate_backend (29621);"}
Tindakan yang disarankan
Mengikuti panduan di suggestion
kolom, pengguna dapat terhubung ke database di mana pernyataan aktif hadir dan, seperti yang ditentukan dalam suggested_action
kolom, disarankan untuk hati-hati meninjau opsi untuk mengakhiri sesi. Jika penghentian aman, Anda dapat menggunakan pg_terminate_backend()
fungsi untuk mengakhiri sesi. Tindakan ini dapat dilakukan oleh administrator (seperti akun master RDS) atau pengguna dengan pg_terminate_backend()
hak istimewa yang diperlukan.
Awas
Sesi yang dihentikan akan membatalkan (ROLLBACK
) perubahan yang dibuatnya. Tergantung pada kebutuhan Anda, Anda mungkin ingin menjalankan kembali pernyataan tersebut. Namun, disarankan untuk melakukannya hanya setelah proses autovacuum menyelesaikan operasi vakum agresifnya.
Idle pada transaksi
Pernyataan transaksi yang menganggur mengacu pada setiap sesi yang telah membuka transaksi eksplisit (seperti dengan mengeluarkan BEGIN
pernyataan), melakukan beberapa pekerjaan, dan sekarang menunggu klien untuk melewati lebih banyak pekerjaan atau memberi sinyal akhir transaksi dengan mengeluarkanCOMMIT
,ROLLBACK
, atau END
(yang akan menghasilkan implisit). COMMIT
postgres_get_av_diag()
Fungsi ini menampilkan output yang mirip dengan berikut ketika mengidentifikasi idle in transaction
pernyataan sebagai pemblokir.
blocker | idle in transaction database | my_database blocker_identifier | INSERT INTO tt SELECT * FROM tt; wait_event | Client:ClientRead autovacuum_lagging_by | 1,237,201,759 suggestion | Connect to database "my_database", review carefully and you may consider terminating the process using suggested_action. For more information, see Working with PostgreSQL autovacuum in the Amazon RDS User Guide. suggested_action | {"SELECT pg_terminate_backend (28438);"}
Tindakan yang disarankan
Seperti yang ditunjukkan dalam suggestion
kolom, Anda dapat terhubung ke database tempat idle dalam sesi transaksi hadir dan mengakhiri sesi menggunakan fungsi. pg_terminate_backend()
Pengguna dapat menjadi pengguna admin Anda (akun master RDS) atau pengguna dengan pg_terminate_backend()
hak istimewa.
Awas
Sesi yang dihentikan akan membatalkan (ROLLBACK
) perubahan yang dibuatnya. Tergantung pada kebutuhan Anda, Anda mungkin ingin menjalankan kembali pernyataan tersebut. Namun, disarankan untuk melakukannya hanya setelah proses autovacuum menyelesaikan operasi vakum agresifnya.
Transaksi yang disiapkan
PostgreSQL memungkinkan transaksi yang merupakan bagian dari strategi komit dua fase yang disebut transaksi siap.max_prepared_transactions
parameter ke nilai bukan nol. Transaksi yang disiapkan dirancang untuk memastikan bahwa transaksi tahan lama dan tetap tersedia bahkan setelah database crash, restart, atau pemutusan klien. Seperti transaksi reguler, mereka diberi ID transaksi dan dapat memengaruhi autovacuum. Jika dibiarkan dalam keadaan siap, autovacuum tidak dapat melakukan freeezing dan dapat menyebabkan penutupan ID transaksi.
Ketika transaksi dibiarkan dipersiapkan tanpa batas waktu tanpa diselesaikan oleh manajer transaksi, mereka menjadi transaksi yang disiapkan yatim piatu. Satu-satunya cara untuk memperbaikinya adalah dengan melakukan atau mengembalikan transaksi menggunakan ROLLBACK
PREPARED
perintah COMMIT PREPARED
atau, masing-masing.
catatan
Ketahuilah bahwa cadangan yang diambil selama transaksi yang disiapkan akan tetap berisi transaksi tersebut setelah restorasi. Lihat informasi berikut tentang cara menemukan dan menutup transaksi tersebut.
postgres_get_av_diag()
Fungsi ini menampilkan output berikut ketika mengidentifikasi pemblokir yang merupakan transaksi yang disiapkan.
blocker | Prepared transaction database | my_database blocker_identifier | myptx wait_event | Not applicable autovacuum_lagging_by | 1,805,802,632 suggestion | Connect to database "my_database" and consider either COMMIT or ROLLBACK the prepared transaction using suggested_action. For more information, see Working with PostgreSQL autovacuum in the Amazon RDS User Guide. suggested_action | {"COMMIT PREPARED 'myptx';",[OR],"ROLLBACK PREPARED 'myptx';"}
Tindakan yang disarankan
Seperti disebutkan di kolom saran, sambungkan ke database tempat transaksi yang disiapkan berada. Berdasarkan suggested_action
kolom, hati-hati meninjau apakah akan melakukan salah satu COMMIT
atauROLLBACK
, dan menyetujui tindakan.
Untuk memantau transaksi yang disiapkan secara umum, PostgreSQL menawarkan tampilan katalog yang disebut. pg_prepared_xacts
Anda dapat menggunakan kueri berikut untuk menemukan transaksi yang disiapkan.
SELECT gid, prepared, owner, database, transaction AS oldest_xmin FROM pg_prepared_xacts ORDER BY age(transaction) DESC;
Slot replikasi logis
Tujuan dari slot replikasi adalah untuk menahan perubahan yang tidak dikonsumsi sampai mereka direplikasi ke server target. Untuk informasi lebih lanjut, lihat Replikasi Logis PostgreSQL.
Ada dua jenis slot replikasi logis.
Slot replikasi logis tidak aktif
Ketika replikasi dihentikan, log transaksi yang tidak dikonsumsi tidak dapat dihapus, dan slot replikasi menjadi tidak aktif. Meskipun slot replikasi logis yang tidak aktif saat ini tidak digunakan oleh pelanggan, itu tetap di server, yang mengarah ke retensi file WAL dan mencegah penghapusan log transaksi lama. Ini dapat meningkatkan penggunaan disk dan secara khusus memblokir autovacuum dari membersihkan tabel katalog internal, karena sistem harus menjaga informasi LSN agar tidak ditimpa. Jika tidak ditangani, hal ini dapat mengakibatkan kembung katalog, penurunan kinerja, dan peningkatan risiko kekosongan sampul, yang berpotensi menyebabkan downtime transaksi.
Slot replikasi logis aktif tapi lambat
Terkadang penghapusan tupel mati katalog tertunda karena penurunan kinerja replikasi logis. Keterlambatan replikasi ini memperlambat pembaruan catalog_xmin
dan dapat menyebabkan katalog kembung dan vakum sampul.
postgres_get_av_diag()
Fungsi ini menampilkan output yang mirip dengan berikut ini ketika menemukan slot replikasi logis sebagai pemblokir.
blocker | Logical replication slot database | my_database blocker_identifier | slot1 wait_event | Not applicable autovacuum_lagging_by | 1,940,103,068 suggestion | Ensure replication is active and resolve any lag for the slot if active. If inactive, consider dropping it using the command in suggested_action. For more information, see Working with PostgreSQL autovacuum in the Amazon RDS User Guide. suggested_action | {"SELECT pg_drop_replication_slot('slot1') FROM pg_replication_slots WHERE active = 'f';"}
Tindakan yang disarankan
Untuk mengatasi masalah ini, periksa konfigurasi replikasi untuk masalah dengan skema target atau data yang mungkin menghentikan proses penerapan. Alasan paling umum adalah sebagai berikut:
-
Kolom hilang
-
Tipe data yang tidak kompatibel
-
Ketidakcocokan data
-
Tabel hilang
Jika masalah terkait dengan masalah infrastruktur:
-
Masalah jaringan - Bagaimana cara mengatasi masalah dengan Amazon RDS DB dalam status jaringan yang tidak kompatibel?
. -
Database atau instans DB tidak tersedia karena alasan berikut:
-
Instans replika kehabisan penyimpanan - Tinjau instans Amazon RDS DB kehabisan penyimpanan
untuk informasi tentang menambahkan penyimpanan. -
Parameter Tidak Kompatibel - Tinjau Bagaimana cara memperbaiki instans Amazon RDS DB yang macet dalam status parameter yang tidak kompatibel?
untuk informasi lebih lanjut tentang bagaimana Anda dapat menyelesaikan masalah.
-
Jika instans Anda berada di luar AWS jaringan atau aktif AWS EC2, konsultasikan dengan administrator Anda tentang cara mengatasi masalah ketersediaan atau terkait infrastruktur.
Menjatuhkan slot yang tidak aktif
Awas
Perhatian: Sebelum menjatuhkan slot replikasi, pastikan dengan hati-hati bahwa ia tidak memiliki replikasi yang sedang berlangsung, tidak aktif, dan dalam keadaan tidak dapat dipulihkan. Menjatuhkan slot sebelum waktunya dapat mengganggu replikasi atau menyebabkan kehilangan data.
Setelah memastikan bahwa slot replikasi tidak lagi diperlukan, jatuhkan untuk memungkinkan autovacuum melanjutkan. Kondisi ini active = 'f'
memastikan bahwa hanya slot yang tidak aktif yang dijatuhkan.
SELECT pg_drop_replication_slot('slot1') WHERE active ='f'
Contoh pembaca
Ketika pengaturan hot_standby_feedback diaktifkan, ini mencegah autovacuum pada instance penulis menghapus baris mati yang mungkin masih diperlukan oleh kueri yang berjalan pada instance pembaca. Perilaku ini diperlukan karena kueri yang berjalan pada instance pembaca (juga berlaku untuk instance pembaca di Aurora Global Database) mengharuskan baris tersebut tetap tersedia pada instance penulis yang mencegah konflik dan pembatalan kueri.
catatan
hot_standby_feedback
diaktifkan secara default dan tidak dapat dimodifikasi di Aurora PostgreSQL.
postgres_get_av_diag()
Fungsi ini menampilkan output yang mirip dengan berikut ini ketika menemukan replika baca dengan slot replikasi fisik sebagai pemblokir.
blocker | Oldest query running on aurora reader database | Not applicable blocker_identifier | my-aurora-reader-2 wait_event | Not applicable autovacuum_lagging_by | 540,122,859 suggestion | Run the following query on the reader "my-aurora-reader-2" to find the long running query: | SELECT * FROM pg_catalog.pg_stat_activity WHERE backend_xmin::text::bigint = 523476310; | Review carefully and you may consider terminating the query on reader using suggested_action. suggested_action | {"SELECT pg_terminate_backend(pid) FROM pg_catalog.pg_stat_activity WHERE backend_xmin::text::bigint = 523476310;"," | [OR] | ","Delete the reader if not needed"}
Seperti yang direkomendasikan di suggested_action
kolom, tinjau opsi ini dengan cermat untuk membuka blokir autovacuum.
-
Mengakhiri kueri — Mengikuti panduan di kolom saran, Anda dapat terhubung ke replika baca, seperti yang ditentukan dalam kolom suggested_action, disarankan untuk hati-hati meninjau opsi untuk mengakhiri sesi. Jika penghentian dianggap aman, Anda dapat menggunakan
pg_terminate_backend()
fungsi ini untuk mengakhiri sesi. Tindakan ini dapat dilakukan oleh administrator (seperti akun master RDS) atau pengguna dengan hak istimewa pg_terminate_backend () yang diperlukan.Anda dapat menjalankan perintah SQL berikut pada replika baca untuk mengakhiri kueri yang mencegah vakum pada primer membersihkan baris lama. Nilai dilaporkan dalam output fungsi:
backend_xmin
SELECT pg_terminate_backend(pid) FROM pg_catalog.pg_stat_activity WHERE backend_xmin::text::bigint =
backend_xmin;
-
Hapus instance pembaca jika tidak diperlukan — Jika instance pembaca tidak lagi diperlukan, Anda dapat menghapusnya. Ini akan menghapus overhead replikasi terkait dan memungkinkan primer untuk mendaur ulang log transaksi tanpa ditahan oleh instance.
Tabel sementara
Tabel sementaraTEMPORARY
kata kunci, berada dalam skema temp, misalnya pg_temp_xxx, dan hanya dapat diakses oleh sesi yang membuatnya. Tabel sementara dijatuhkan saat sesi berakhir. Namun, tabel ini tidak terlihat oleh proses autovacuum PostgreSQL, dan harus disedot secara manual oleh sesi yang membuatnya. Mencoba menyedot tabel suhu dari sesi lain tidak berpengaruh.
Dalam keadaan yang tidak biasa, tabel sementara ada tanpa sesi aktif yang memilikinya. Jika sesi kepemilikan berakhir secara tak terduga karena kecelakaan fatal, masalah jaringan, atau peristiwa serupa, tabel sementara mungkin tidak dibersihkan, meninggalkannya sebagai tabel “yatim piatu”. Ketika proses autovacuum PostgreSQL mendeteksi tabel sementara yatim piatu, ia mencatat pesan berikut:
LOG: autovacuum: found orphan temp table \"%s\".\"%s\" in database \"%s\"
postgres_get_av_diag()
Fungsi ini menampilkan output yang mirip dengan berikut ketika mengidentifikasi tabel sementara sebagai pemblokir. Agar fungsi menampilkan output yang terkait dengan tabel sementara dengan benar, itu perlu dieksekusi dalam database yang sama di mana tabel tersebut ada.
blocker | Temporary table database | my_database blocker_identifier | pg_temp_14.ttemp wait_event | Not applicable autovacuum_lagging_by | 1,805,802,632 suggestion | Connect to database "my_database". Review carefully, you may consider dropping temporary table using command in suggested_action. For more information, see Working with PostgreSQL autovacuum in the Amazon RDS User Guide. suggested_action | {"DROP TABLE ttemp;"}
Tindakan yang disarankan
Ikuti instruksi yang diberikan di suggestion
kolom output untuk mengidentifikasi dan menghapus tabel sementara yang mencegah autovacuum berjalan. Gunakan perintah berikut untuk menjatuhkan tabel sementara yang dilaporkan olehpostgres_get_av_diag()
. Ganti nama tabel berdasarkan output yang disediakan oleh postgres_get_av_diag()
fungsi.
DROP TABLE
my_temp_schema
.my_temp_table
;
Kueri berikut dapat digunakan untuk mengidentifikasi tabel sementara:
SELECT oid, relname, relnamespace::regnamespace, age(relfrozenxid) FROM pg_class WHERE relpersistence = 't' ORDER BY age(relfrozenxid) DESC;