View a markdown version of this page

Merebut kembali ruang penyimpanan dengan menyedot debu - Amazon Aurora

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

Merebut kembali ruang penyimpanan dengan menyedot debu

PostgreSQL Multiversion Concurrency Control (MVCC) membantu menjaga integritas data dengan menyimpan salinan internal baris yang diperbarui atau dihapus hingga transaksi dilakukan atau dibatalkan. Salinan ini, juga disebut tupel, dapat menyebabkan kembung meja jika tidak dibersihkan secara teratur. PostgreSQL melakukan pemesanan transaksi berdasarkan ID transaksinya, dan PostgreSQL menggunakan MVCC berbasis ID transaksi untuk mengontrol visibilitas Tuple dan menyediakan isolasi transaksi. Setiap transaksi menetapkan snapshot data, dan setiap tuple memiliki versi. Baik snapshot maupun versi berbasis ID transaksi.

Untuk membersihkan data, VACUUM utilitas melakukan empat fungsi utama di PostgreSQL:

  • VACUUM— Menghapus versi baris kedaluwarsa, membuat ruang tersedia untuk digunakan kembali.

  • VACUUM FULL— Menyediakan defragmentasi lengkap dengan menghapus versi baris mati dan memadatkan tabel, mengurangi ukuran dan meningkatkan efisiensi.

  • VACUUM FREEZE— Melindungi dari masalah sampul ID transaksi dengan menandai versi baris yang lebih lama sebagai beku.

  • VACUUM ANALYZE— Menghapus versi baris mati dan memperbarui statistik perencanaan kueri database. Ini adalah kombinasi dari fungsi VACUUM dan ANALYZE fungsi. Untuk informasi lebih lanjut tentang cara ANALYZE kerja di Aurora PostgreSQL Limitless Database, lihat. MENGANALISA

Seperti halnya MVCC, menyedot debu di Aurora PostgreSQL berbasis ID transaksi. Jika ada transaksi yang sedang berlangsung saat penyedot debu dimulai, baris yang masih terlihat oleh transaksi tersebut tidak akan dihapus.

Untuk informasi lebih lanjut tentang VACUUM utilitas, lihat VACUUM dalam dokumentasi PostgreSQL. Untuk informasi selengkapnya tentang VACUUM dukungan di Aurora PostgreSQL Limitless Database, lihat. VAKUM

AUTOVACUUM

Aurora PostgreSQL menggunakan dan utilitas untuk menghapus tupel yang tidak dibutuhkan. VACUUM AUTOVACUUM Mekanisme yang mendasari AUTOVACUUM dan manual VACUUM adalah sama; satu-satunya perbedaan adalah otomatisasi.

AUTOVACUUMdi Aurora PostgreSQL dan Aurora PostgreSQL Limitless Database adalah kombinasi dari dan utilitas. VACUUM ANALYZE AUTOVACUUMmenentukan database dan tabel mana yang harus dibersihkan, sesuai dengan aturan yang telah ditentukan, seperti persentase tupel mati dan jumlah sisipan.

Misalnya, AUTOVACUUM “bangun” secara berkala untuk melakukan pembersihan. Interval dikendalikan oleh autovacuum_naptime parameter. Nilai default adalah 1 menit. Nilai default untuk AUTOVACUUM dan parameter VACUUM konfigurasi sama untuk Aurora PostgreSQL Limitless Database seperti untuk Aurora PostgreSQL.

AUTOVACUUMDaemon, jika diaktifkan, secara otomatis mengeluarkan ANALYZE perintah setiap kali konten tabel telah berubah secara memadai. Di Aurora PostgreSQL Limitless Database, masalah pada router dan pecahan. AUTOVACUUM ANALYZE

Untuk informasi selengkapnya tentang parameter penyimpanan AUTOVACUUM daemon dan tabel yang terkaitAUTOVACUUM, lihat Daemon Autovacuum dan Parameter Storage dalam dokumentasi PostgreSQL.

Time-based menyedot debu di Aurora PostgreSQL Limitless Database

Aurora PostgreSQL Limitless Database adalah sistem terdistribusi, yang berarti bahwa beberapa contoh dapat terlibat dalam transaksi. Oleh karena itu, visibilitas berbasis ID transaksi tidak berlaku. Sebaliknya, Aurora PostgreSQL Limitless Database menggunakan visibilitas berbasis waktu, karena ID transaksi tidak “disatukan” di seluruh instance, tetapi waktu dapat “disatukan” di seluruh instance. Setiap snapshot transaksi dan setiap versi Tuple mematuhi waktu, bukan ID transaksi. Untuk lebih spesifik, snapshot transaksi memiliki waktu mulai snapshot, dan Tuple memiliki waktu pembuatan (ketika INSERT atau UPDATE terjadi) dan waktu penghapusan (ketika terjadi). DELETE

Untuk menjaga konsistensi data di seluruh instance dalam grup pecahan DB, Aurora PostgreSQL Limitless Database harus memastikan bahwa penyedot debu tidak menghapus tupel apa pun yang masih terlihat oleh transaksi aktif apa pun dalam grup shard DB. Oleh karena itu, menyedot debu di Aurora PostgreSQL Limitless Database juga berbasis waktu. Aspek lain VACUUM tetap sama, termasuk bahwa untuk berjalan VACUUM pada tabel tertentu, pengguna harus memiliki akses ke tabel itu.

catatan

Kami sangat menyarankan agar Anda tidak membiarkan transaksi terbuka untuk jangka waktu yang lama.

Time-based menyedot debu mengkonsumsi lebih banyak memori daripada penyedot debu berbasis ID transaksi.

Contoh berikut menggambarkan cara kerja penyedot debu berbasis waktu.

  1. Tabel pelanggan didistribusikan di empat pecahan.

  2. Transaksi 1 dimulai dengan pembacaan berulang, dan menargetkan hanya satu pecahan (pecahan 1). Transaksi ini tetap terbuka.

    Transaksi 1 lebih tua dari transaksi lain yang dimulai setelahnya.

  3. Transaksi 2 dimulai kemudian, dan menghapus semua tupel dari tabel, lalu melakukan.

  4. Jika AUTOVACUUM atau manual VACUUM mencoba membersihkan tupel mati (mati karena transaksi 2), itu tidak menghapus apa pun.

    Hal ini berlaku tidak hanya untuk pecahan 1, tetapi juga untuk pecahan 2-4, karena transaksi 1 mungkin masih perlu mengakses tupel ini. Mereka masih terlihat untuk transaksi 1 karena MVCC.

Langkah terakhir dicapai melalui sinkronisasi, sehingga semua pecahan menyadari transaksi 1, meskipun transaksi 1 tidak menyentuh semuanya.

Menggunakan statistik database untuk menyedot debu

Untuk mendapatkan informasi tentang tupel yang mungkin perlu Anda bersihkan, gunakan tampilan limitless_stat_all_tables, yang bekerja mirip dengan pg_stat_all_tables. Contoh berikut menanyakan tampilan.

SELECT * FROM rds_aurora.limitless_stat_all_tables WHERE relname LIKE '%customer%';

Demikian pula, untuk statistik database gunakan limitless_stat_database alih-alih pg_stat_database, dan limitless_stat_activity alih-alih pg_stat_activity.

Untuk memeriksa penggunaan disk tabel, gunakan fungsi limitless_stat_relation_sizes, yang bekerja mirip dengan pg_relation_size. Contoh berikut query fungsi.

SELECT * FROM rds_aurora.limitless_stat_relation_sizes('public','customer');

Untuk melacak kemajuan VACUUM operasi pada Aurora PostgreSQL Limitless Database, gunakan tampilan limitless_stat_progress_vacuum alih-alih pg_stat_progress_vacuum. Contoh berikut menanyakan tampilan.

SELECT * FROM rds_aurora.limitless_stat_progress_vacuum;

Untuk informasi selengkapnya, lihat Tampilan Database Tanpa Batas Aurora PostgreSQL dan Fungsi Basis Data Tanpa Batas Aurora PostgreSQL.

Perbedaan perilaku menyedot debu antara Aurora PostgreSQL dan Aurora PostgreSQL Limitless Database

Beberapa perbedaan lain antara Aurora PostgreSQL dan Aurora PostgreSQL Limitless Database dalam cara kerja penyedot debu adalah sebagai berikut:

  • Aurora PostgreSQL melakukan VACUUM operasi pada ID transaksi hingga transaksi tertua yang sedang berlangsung. Jika tidak ada transaksi yang sedang berlangsung dalam databaseVACUUM, lakukan operasi hingga transaksi terakhir.

  • Aurora PostgreSQL Limitless Database menyinkronkan snapshot waktu tertua setiap 10 detik. Oleh karena itu, VACUUM mungkin tidak melakukan operasi pada setiap transaksi yang dijalankan dalam 10 detik terakhir.

Untuk informasi tentang dukungan VACUUM di Aurora PostgreSQL Limitless Database, lihat di. VAKUM Referensi Basis Data Tanpa Batas Aurora PostgreSQL