Saya ingin mempartisi tabel dengan 1M + baris berdasarkan rentang tanggal. Bagaimana ini biasanya dilakukan tanpa memerlukan banyak downtime atau risiko kehilangan data? Berikut adalah strategi yang saya pertimbangkan, tetapi terbuka untuk saran:
Tabel yang ada adalah master dan anak-anak mewarisi darinya. Seiring waktu memindahkan data dari master ke anak, tetapi akan ada periode waktu di mana beberapa data ada di tabel master dan beberapa di anak-anak.
Buat tabel master dan anak baru. Buat salinan data di tabel yang ada di tabel anak (jadi data akan berada di dua tempat). Setelah tabel anak memiliki data terbaru, ubah semua sisipan ke depan untuk menunjuk ke tabel master baru dan menghapus tabel yang ada.
postgresql
optimization
partitioning
Evan Appleby
sumber
sumber
DELETE FROM ONLY master_table
adalah solusinya.Jawaban:
Karena # 1 memerlukan menyalin data dari master ke anak ketika sedang dalam lingkungan produksi aktif, saya pribadi pergi dengan # 2 (membuat master baru). Ini mencegah gangguan ke tabel asli saat sedang aktif digunakan dan jika ada masalah, saya dapat dengan mudah menghapus master baru tanpa masalah dan terus menggunakan tabel asli. Berikut langkah-langkah untuk melakukannya:
Buat tabel master baru.
Buat anak-anak yang mewarisi dari tuan.
Salin semua data historis ke tabel master baru
Jeda untuk sementara waktu sisipan / pembaruan baru ke basis data produksi
Salin data terbaru ke tabel master baru
Ganti nama tabel sehingga new_master menjadi basis data produksi.
Tambahkan fungsi untuk pernyataan INSERT ke old_master sehingga data diteruskan ke partisi yang benar.
Tambah pemicu sehingga fungsinya dipanggil pada INSERTS
Tetapkan pengecualian kendala ke ON
Aktifkan kembali UPDAT dan INSER pada basis data produksi
Atur pemicu atau cron agar partisi baru dibuat dan fungsinya diperbarui untuk menetapkan data baru ke partisi yang benar. Referensi artikel ini untuk contoh kode
Hapus old_master_backup
sumber
vacuum
tidak mengejar atau dicegah karena sesi "menganggur dalam transaksi".Ada alat baru bernama pg_pathman ( https://github.com/postgrespro/pg_pathman ) yang akan melakukan ini untuk Anda secara otomatis.
Jadi sesuatu seperti yang berikut ini akan melakukannya.
sumber