Menyelesaikan penghambat vakum yang dapat diidentifikasi untuk Postgre RDS SQL - 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.

Menyelesaikan penghambat vakum yang dapat diidentifikasi untuk Postgre RDS SQL

Autovacuum melakukan vakum agresif dan menurunkan usia transaksi IDs hingga di bawah ambang batas yang ditentukan oleh parameter instans Anda. autovacuum_freeze_max_age RDS Anda dapat melacak usia ini menggunakan CloudWatch metrik AmazonMaximumUsedTransactionIDs.

Untuk menemukan pengaturan autovacuum_freeze_max_age (yang memiliki default 200 juta transaksiIDs) untuk RDS instans Amazon 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 RDS autovacuum adaptif Amazon 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:

Pernyataan aktif

Dalam PostgreSQL, pernyataan aktif adalah SQL pernyataan yang saat ini sedang dijalankan oleh database. Ini termasuk kueri, transaksi, atau operasi apa pun yang sedang berlangsung. Saat memantau viapg_stat_activity, kolom negara menunjukkan bahwa proses dengan yang PID 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 RDS master) 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 (akun RDS master) Anda atau pengguna dengan hak pg_terminate_backend() 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

Postgre SQL memungkinkan transaksi yang merupakan bagian dari strategi komit dua fase yang disebut transaksi siap. Ini diaktifkan dengan mengatur 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, Postgre SQL 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, ia tetap berada di server, yang mengarah ke penyimpanan WAL file 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 LSN informasi 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:

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'

Replika baca

Saat hot_standby_feedback pengaturan diaktifkan untuk replika RDS baca Amazon, pengaturan ini mencegah autovacuum pada database utama menghapus baris mati yang mungkin masih diperlukan oleh kueri yang berjalan pada replika baca. Ini mempengaruhi semua jenis replika baca fisik termasuk yang dikelola dengan atau tanpa slot replikasi. Perilaku ini diperlukan karena kueri yang berjalan pada replika siaga mengharuskan baris tersebut tetap tersedia di primer yang mencegah konflik dan pembatalan kueri.

Baca replika dengan slot replikasi fisik

Membaca replika dengan slot replikasi fisik secara signifikan meningkatkan keandalan dan stabilitas replikasi untuk Postgre. RDS SQL Slot ini memastikan database utama menyimpan file Write-Ahead Log penting sampai replika memprosesnya, menjaga konsistensi data bahkan selama gangguan jaringan.

Dimulai dengan RDS untuk Postgre SQL versi 14, semua replika menggunakan slot replikasi. Pada versi sebelumnya, hanya replika lintas wilayah yang menggunakan slot replikasi.

postgres_get_av_diag()Fungsi ini menampilkan output yang mirip dengan berikut ini ketika menemukan replika baca dengan slot replikasi fisik sebagai pemblokir.

blocker | Read replica with physical replication slot database | blocker_identifier | rds_us_west_2_db_xxxxxxxxxxxxxxxxxxxxx wait_event | Not applicable autovacuum_lagging_by | 554,080,689 suggestion | Run the following query on the replica "rds_us_west_2_db_xxxxxxxxxxxxxxxxxxxx" to find the long running query: | SELECT * FROM pg_catalog.pg_stat_activity WHERE backend_xmin::text::bigint = 757989377; | Review carefully and you may consdier terminating the query on read replica using suggested_action. For more information, see Working with PostgreSQL autovacuum in the Amazon RDS User Guide. + | suggested_action | {"SELECT pg_terminate_backend(pid) FROM pg_catalog.pg_stat_activity WHERE backend_xmin::text::bigint = 757989377;"," + | [OR] + | ","Disable hot_standby_feedback"," + | [OR] + | ","Delete the read replica if not needed"}
Baca replika dengan replikasi streaming

Amazon RDS memungkinkan pengaturan replika baca tanpa slot replikasi fisik di versi yang lebih lama, hingga versi 13. Pendekatan ini mengurangi overhead dengan memungkinkan primer untuk mendaur ulang WAL file lebih agresif, yang menguntungkan di lingkungan dengan ruang disk terbatas dan dapat mentolerir sesekali. ReplicaLag Namun, tanpa slot, siaga harus tetap sinkron untuk menghindari WAL file yang hilang. Amazon RDS menggunakan WAL file yang diarsipkan untuk membantu replika catch up jika tertinggal, tetapi proses ini membutuhkan pemantauan yang cermat dan bisa lambat.

postgres_get_av_diag()Fungsi ini menampilkan output yang mirip dengan berikut ini ketika menemukan replika baca streaming sebagai pemblokir.

blocker | Read replica with streaming replication slot database | Not applicable blocker_identifier | xx.x.x.xxx/xx wait_event | Not applicable autovacuum_lagging_by | 610,146,760 suggestion | Run the following query on the replica "xx.x.x.xxx" to find the long running query: + | SELECT * FROM pg_catalog.pg_stat_activity WHERE backend_xmin::text::bigint = 348319343; + | Review carefully and you may consdier terminating the query on read replica using suggested_action. For more information, see Working with PostgreSQL autovacuum in the Amazon RDS User Guide. + | suggested_action | {"SELECT pg_terminate_backend(pid) FROM pg_catalog.pg_stat_activity WHERE backend_xmin::text::bigint = 348319343;"," + | [OR] + | ","Disable hot_standby_feedback"," + | [OR] + | ","Delete the read replica if not needed"}

Tindakan yang disarankan

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 meninjau dengan cermat 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 RDS master) atau pengguna dengan hak istimewa pg_terminate_backend () yang diperlukan.

    Anda dapat menjalankan SQL perintah 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;
  • Nonaktifkan umpan balik siaga panas - Pertimbangkan untuk menonaktifkan hot_standby_feedback parameter jika menyebabkan penundaan vakum yang signifikan.

    hot_standby_feedbackParameter memungkinkan replika baca untuk menginformasikan primer tentang aktivitas kuerinya, mencegah primer menyedot debu tabel atau baris yang digunakan pada siaga. Meskipun ini memastikan stabilitas kueri pada siaga, ini dapat secara signifikan menunda penyedotan debu pada primer. Menonaktifkan fitur ini memungkinkan primer untuk melanjutkan dengan menyedot debu tanpa menunggu siaga untuk mengejar ketinggalan. Namun, ini dapat menyebabkan pembatalan kueri atau kegagalan pada siaga jika mencoba mengakses baris yang telah disedot oleh primer.

  • Hapus replika baca jika tidak diperlukan — Jika replika baca tidak lagi diperlukan, Anda dapat menghapusnya. Ini akan menghapus overhead replikasi terkait dan memungkinkan primer untuk mendaur ulang log transaksi tanpa ditahan oleh replika.

Tabel sementara

Tabel sementara, dibuat menggunakan TEMPORARY 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 SQL autovacuum Postgre 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;