全部产品
Search
文档中心

ApsaraDB RDS:DDL Online (rds_online_ddl)

更新时间:Nov 10, 2025

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:

  1. Buat tabel sementara dengan skema yang sama seperti tabel asli.

  2. Jalankan operasi ALTER COLUMN TYPE yang ditentukan pada tabel sementara.

  3. Impor data historis dari tabel asli ke tabel sementara secara efisien.

  4. Buat semua indeks dari tabel asli pada tabel sementara.

  5. Gunakan dekode logis untuk menyinkronkan data inkremental yang dihasilkan selama langkah-langkah sebelumnya ke tabel sementara, memastikan konsistensi data akhir.

  6. Ambil kunci eksklusif pada tabel asli dan ubah skemanya.

  7. Tukar file dasar dari tabel asli dan tabel sementara, termasuk indeksnya.

  8. 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.

  • Akun istimewa telah dibuat.

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 USING dari ALTER TABLE mungkin 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

Penting

Gunakan akun istimewa untuk menjalankan perintah berikut.

  • Buat ekstensi

    CREATE EXTENSION rds_online_ddl;
    Catatan

    Untuk 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.

  1. 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;
  2. 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 TABLE standar.

    SELECT rds_online_ddl.alter_table('public.test', 'ALTER COLUMN id TYPE int8');
  3. (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.