Di RDS for PostgreSQL, beberapa operasi bahasa definisi data (DDL) tidak kompatibel secara biner, seperti mengubah tipe kolom dari INT menjadi BIGINT. Operasi ALTER COLUMN TYPE asli menulis ulang seluruh tabel, yang mengunci tabel untuk waktu lama dan mengganggu operasi baca-tulis. Untuk mengatasi masalah ini, RDS for PostgreSQL menyediakan ekstensi rds_online_ddl. Ekstensi ini mendukung perubahan tipe kolom secara online, memungkinkan Anda mengubah skema tabel tanpa mengganggu kelangsungan bisnis.
Ikhtisar fitur
Banyak operasi DDL di PostgreSQL, seperti CREATE INDEX CONCURRENTLY, mendukung eksekusi bersamaan. Namun, mengubah tipe kolom yang tidak kompatibel secara biner tetap memerlukan penulisan ulang tabel dengan kunci. Ini adalah skenario umum dan berdampak tinggi dalam operasi dan pemeliharaan database (O&M).
Ekstensi rds_online_ddl menghindari penguncian jangka panjang dengan membuat tabel sementara dan menyinkronkan data secara online. Prosesnya adalah sebagai berikut:
Buat tabel sementara dengan skema yang sama seperti tabel asli.
Jalankan operasi
ALTER COLUMN TYPEyang ditentukan pada tabel sementara.Impor data historis dari tabel asli ke tabel sementara secara efisien.
Buat semua indeks dari tabel asli pada tabel sementara.
Gunakan dekode logis untuk menyinkronkan data inkremental yang dihasilkan selama langkah-langkah sebelumnya ke tabel sementara, memastikan konsistensi data akhir.
Ambil kunci eksklusif pada tabel asli dan ubah skemanya.
Tukar file dasar dari tabel asli dan tabel sementara, termasuk indeksnya.
Hapus tabel sementara dan commit transaksi untuk menyelesaikan proses DDL online.
Prasyarat
Instans target RDS for PostgreSQL harus memenuhi persyaratan berikut:
Versi Mesin Utama: PostgreSQL 12 atau lebih baru.
Versi Mesin Minor: 20250830 atau lebih baru.
Parameter Instans: Parameter wal_level disetel ke logical.
Skema Tabel: Tabel asli harus memiliki kunci utama (PRIMARY KEY) atau kendala UNIK.
Catatan
Verifikasi dan Cadangan: Sebelum menggunakan fitur ini di lingkungan produksi, uji secara menyeluruh di lingkungan pengujian. Pastikan Anda memiliki cadangan yang valid.
Ruang Penyimpanan: Operasi ini memerlukan ruang penyimpanan tambahan, sekitar dua kali dari total ukuran tabel asli dan indeksnya. Pastikan instans Anda memiliki cukup ruang kosong.
Keterbatasan Tabel:
Fitur ini tidak mendukung tabel dengan kendala kunci asing.
Fitur ini hanya mendukung tabel biasa, bukan tabel partisi.
Klausa
USINGdariALTER TABLEmungkin tidak sepenuhnya didukung karena keterbatasan replikasi logis. Uji klausa ini sebelum menggunakannya.Seluruh operasi bersifat atomik. Jika operasi gagal atau terganggu, tabel dikembalikan ke skema aslinya, mencegah korupsi data.
Penagihan
Ekstensi ini gratis.
Membuat dan menghapus ekstensi
Gunakan akun istimewa untuk menjalankan perintah berikut.
Buat ekstensi
CREATE EXTENSION rds_online_ddl;CatatanUntuk melihat ekstensi yang telah diinstal, jalankan
SELECT * FROM pg_extension;.Hapus ekstensi
DROP EXTENSION rds_online_ddl;
Contoh penggunaan
Contoh ini menunjukkan cara mengubah kolom id dari tabel test dari int4 menjadi int8.
Jalankan perintah berikut untuk membuat tabel uji bernama test dan menyisipkan data uji.
CREATE TABLE test(id int4 PRIMARY KEY, info TEXT); INSERT INTO test SELECT x, repeat(x::text, 2) FROM generate_series(1, 1000000) AS x;Panggil fungsi rds_online_ddl.alter_table untuk melakukan operasi DDL online. Parameter pertama dari fungsi ini adalah nama tabel target, dan parameter kedua adalah perintah
ALTER TABLEstandar.SELECT rds_online_ddl.alter_table('public.test', 'ALTER COLUMN id TYPE int8');(Opsional) Periksa kemajuan.
Untuk tabel besar, operasi ini bisa memakan waktu lama. Untuk memantau kemajuan pekerjaan, kueri tampilan berikut:
SELECT * FROM rds_online_ddl.pg_stat_progress_online_ddl;Bidang kunci dalam tampilan dijelaskan di bawah ini:
insert_initial: Jumlah baris data historis yang telah diimpor.
nindexes_built: Jumlah indeks yang telah dibangun.
nindexes_total: Jumlah total indeks.
insert_applied/update_applied/delete_applied: Jumlah perubahan data inkremental yang diterapkan untuk jenis operasi yang sesuai.
insert_decoded/update_decoded/delete_decoded: Jumlah perubahan data inkremental yang didekode untuk jenis operasi yang sesuai.