全部产品
Search
文档中心

Hologres:REBUILD

更新时间:Feb 07, 2026

Hologres mendukung sintaksis ALTER TABLE untuk memodifikasi skema tabel tertentu, properti tabel, dan properti kolom. Namun, ALTER TABLE tidak mendukung modifikasi properti yang memengaruhi penyimpanan tabel. Mulai dari Hologres V3.1, Anda dapat menggunakan sintaksis REBUILD untuk memodifikasi berbagai parameter tabel secara fleksibel. Topik ini menjelaskan cara menggunakan REBUILD di Hologres.

Sintaksis

Format perintah

ASYNC REBUILD TABLE [ IF EXISTS ] <table_name>
    [ WITH ( <rebuild_parameter> [= <value>] [, ... ] )]  
    <action> [, ... ];
    
WHERE action IS ONE OF:
    ADD [ COLUMN ] <column_name> <data_type> [ column_constraint [ ... ] ]
    ALTER [ COLUMN ] <column_name> [ SET DATA ] TYPE <data_type> [ USING <expression> ]
    ALTER [ COLUMN ] <column_name> SET DEFAULT <expression>
    ALTER [ COLUMN ] <column_name> DROP DEFAULT
    ALTER [ COLUMN ] <column_name> { SET | DROP } NOT NULL
    ALTER PRIMARY KEY (<column_name> [, ...])
    TO [LOGICAL] PARTITION [BY LIST(<column_name> [, <column_name>])]
    SET ( <parameter> [= <value>] [, ... ] )

WHERE rebuild_parameter IS ONE OF:
    keep_source
    binlog_mode
    rebuild_guc_<guc_name> = '<guc_value>'

Deskripsi parameter

Parameter

Subkey

Deskripsi

ASYNC

Menentukan bahwa task REBUILD dijalankan secara asinkron. Setelah Anda menjalankan perintah, query_id task tersebut dikembalikan. Anda dapat menggunakan query_id ini untuk memantau status task. Eksekusi sinkron tidak didukung.

table_name

Nama tabel target yang akan direbuild.

column_name

Nama kolom dalam tabel target.

data_type

Tipe data kolom tersebut.

action

ADD COLUMN

Menambahkan kolom. Anda dapat menambahkan kolom NOT NULL dan menetapkan nilai default.

ALTER COLUMN TYPE

Mengubah tipe data kolom.

ALTER COLUMN SET/DROP DEFAULT

Menetapkan atau menghapus nilai default untuk kolom. Nilai NULL pada data yang sudah ada tidak diubah.

ALTER COLUMN SET/DROP NOT NULL

Menetapkan atau menghapus kendala NOT NULL untuk kolom.

ALTER PRIMARY KEY

Mengubah primary key tabel. Jika primary key baru menyebabkan konflik data, error dilaporkan selama eksekusi asinkron. Pantau status eksekusi task tersebut.

TO [LOGICAL] PARTITION

Mengonversi tabel menjadi tabel partisi logis atau fisik. Skenario berikut didukung:

  • Mengonversi tabel standar menjadi tabel partisi fisik. Anda harus menentukan kunci partisi.

  • Mengonversi tabel standar menjadi tabel partisi logis. Anda harus menentukan kunci partisi.

  • Mengubah kunci partisi tabel partisi fisik.

  • Mengonversi tabel partisi fisik menjadi tabel partisi logis. Anda dapat secara opsional mengubah kunci partisi.

  • Mengonversi tabel partisi logis menjadi tabel partisi fisik tidak didukung.

SET ( <parameter> [= <value>])

Memodifikasi properti tabel. Skenario umum meliputi hal-hal berikut:

  • Mengubah kunci distribusi (distribution_key).

  • Mengubah kunci segmen (event_time_column).

  • Mengubah kunci pengelompokan (clustering_key).

  • Mengubah format penyimpanan tabel (orientation): mengonversi antara row store, column store, dan row-column hybrid store.

  • Mengubah table_group tempat tabel tersebut berada.

  • Semua properti tabel lainnya dapat dimodifikasi.

  • Anda tidak perlu menggunakan `REBUILD` untuk memodifikasi indeks bitmap (bitmap_columns) atau kolom dengan encoding kamus (dictionary_encoding_columns). Gunakan sintaksis `ALTER TABLE` sebagai gantinya.

WITH (<rebuild_parameter> [= <value>])

Menyetel parameter untuk task REBUILD. Parameter umum meliputi hal-hal berikut:

  • `keep_source`: Tidak memerlukan nilai. Setelah konversi, tabel sumber tidak dihapus. Tabel sumber diganti namanya menjadi tmp_rebuild_old_<query_id>_<unique_id>_<table_name>.

  • `binlog_mode`: Tidak memerlukan nilai. Anda dapat menjalankan REBUILD pada tabel yang telah mengaktifkan binary logging. Untuk informasi lebih lanjut, lihat bagian Contoh penggunaan untuk menghindari kehilangan data binary logging.

  • rebuild_guc_hg_computing_resource='serverless': Menggunakan sumber daya Serverless untuk menjalankan task REBUILD. Ini mencegah task tersebut menggunakan sumber daya instans Anda dan meningkatkan stabilitas task.

  • rebuild_guc_<guc_name>='<guc_value>': Anda dapat menyetel parameter GUC lainnya di sini. Untuk informasi lebih lanjut, lihat Parameter GUC.

Catatan penggunaan

  • Hanya eksekusi asinkron yang didukung guna mencegah koneksi terblokir dalam waktu lama.

  • Setelah mengirimkan task REBUILD, proses pengiriman segera selesai dan mengembalikan query_id task tersebut. Anda dapat menggunakan query_id ini untuk melihat status eksekusi task REBUILD. Jika pengiriman tidak selesai, kemungkinan karena banyak task penjadwalan asinkron sedang berjalan di instans saat ini. Dalam kasus ini, tunggu hingga query_id dikembalikan sebelum memeriksa status eksekusi task.

  • Memodifikasi parameter tabel dengan REBUILD melibatkan redistribusi data dan mengonsumsi sumber daya komputasi. Jalankan task REBUILD selama jam sepi atau gunakan sumber daya komputasi Serverless untuk memastikan stabilitas bisnis.

  • Selama eksekusi task REBUILD, tabel berada dalam status read-only untuk periode tertentu sehingga data tidak dapat ditulis ke dalamnya. Mulai dari Hologres V4.1, pembaruan inkremental berbasis teknologi Dynamic Table secara signifikan mengurangi durasi read-only selama rebuild. Tabel target harus memenuhi persyaratan berikut; jika tidak, operasi tulis akan ditangguhkan dalam waktu lama:

    • Tabel target memiliki primary key sebelum rebuild, dan primary key baru mencakup primary key asli.

    • Tabel target merupakan tabel column-store atau row-column hybrid store sebelum rebuild.

    • Tabel target tidak mengandung kolom generated setelah rebuild.

    • Jika tabel target merupakan tabel partisi fisik sebelum rebuild, kunci partisi harus tetap tidak berubah setelah rebuild.

    • Jika tabel target menjadi tabel partisi logis setelah rebuild, tabel tersebut hanya boleh memiliki satu kunci partisi.

  • Untuk mengurangi overhead, modifikasi beberapa parameter dalam satu task REBUILD.

  • Setelah tabel partisi fisik direbuild, properti untuk manajemen partisi dinamis tidak diwariskan. Anda harus menyetelnya kembali setelah task REBUILD selesai. Properti tersebut meliputi hal-hal berikut:

    • Properti auto_partitioning dari tabel induk.

    • Properti tabel anak, seperti keep_alive.

    • Setelah tabel partisi fisik direbuild, properti yang sebelumnya disetel secara independen untuk tabel anak tidak diwariskan. Properti tabel anak menjadi konsisten dengan properti tabel induk, contohnya termasuk bitmap_columns dan dictionary_encoding_columns.

  • Anda tidak dapat menjalankan REBUILD pada tabel dalam kasus-kasus berikut:

    • Tabel dengan properti kolom tertentu, seperti optimasi column-store untuk kolom JSONB, atau kendala kolom, seperti bidang vektor.

    • Tabel dengan indeks teks penuh atau indeks secondary global.

    • Tabel yang mengandung kolom bertipe Serial atau Bigserial.

    • Tabel yang memiliki dependensi Dynamic Table atau Tampilan yang di-materialisasi tidak didukung. Tabel yang memiliki dependensi Tampilan standar didukung.

Contoh penggunaan

Jalankan REBUILD pada tabel tanpa binary logging yang diaktifkan

-- Buat tabel dan impor data
CREATE TABLE rebuild_test (
    a TEXT,
    b TEXT,
    ds TEXT
);

INSERT INTO rebuild_test VALUES ('1', '1', '2025-04-01'), ('2', '2', '2025-04-02'), ('3', '3', '2025-04-03');

-- Tambahkan kolom NOT NULL dan tetapkan nilai default
ASYNC REBUILD TABLE rebuild_test ADD COLUMN c text NOT NULL DEFAULT 'a';

-- Ubah primary key menjadi kolom a
ASYNC REBUILD TABLE rebuild_test ALTER PRIMARY KEY (a);

-- Gunakan sumber daya Serverless untuk menjalankan task Rebuild, tetapkan distribution_key dan clustering_key untuk tabel, dan ubah format penyimpanan menjadi row-column hybrid
ASYNC REBUILD TABLE rebuild_test 
WITH (
    rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
    distribution_key = 'a',
    clustering_key = 'a',
    orientation = 'row,column'
);

-- Konversi tabel non-partisi menjadi tabel partisi logis, tetapkan kunci partisi ke ds, dan tambahkan properti NOT NULL ke kolom ds
ASYNC REBUILD TABLE rebuild_test 
    ALTER COLUMN ds SET NOT NULL,
    TO LOGICAL PARTITION BY LIST(ds);

Jalankan REBUILD pada tabel dengan binary logging yang diaktifkan

REBUILD tidak menyimpan data binary logging historis. Secara default, Anda tidak dapat menjalankan REBUILD pada tabel yang telah mengaktifkan binary logging. Untuk menjalankan task tersebut, Anda harus menentukan parameter binlog_mode dan mengikuti langkah-langkah berikut guna memastikan bahwa client downstream telah sepenuhnya mengonsumsi semua data binary logging historis.

  1. Jalankan REBUILD.

    ASYNC REBUILD TABLE rebuild_test 
    WITH (
      binlog_mode
    )
    <YOUR_ACTION>;
  2. Untuk task REBUILD dengan parameter binlog_mode yang ditetapkan, task tersebut secara otomatis berhenti setelah langkah set_readonly selesai. Anda dapat memeriksa progres menggunakan pernyataan SQL berikut. Pada titik ini, sistem telah menyetel tabel ke status read-only sehingga data tidak dapat ditulis ke tabel dan tidak ada data binary logging baru yang dihasilkan.

    postgres=# SELECT step, status, progress FROM hologres.rebuild_progress('<query_id>');
                 step              | status | progress 
    -------------------------------+--------+----------
     prepare                       | done   | 1/1
     create_tmp_table              | done   | 1/1
     get_src_table_snapshot        | done   | 1/1
     insert                        | done   | 1/1
     set_readonly                  | done   | 1/1
     check_snapshot                |        | 0/1
     re-insert                     |        | -
     check_additional_child_table  |        | -
     create_additional_child_table |        | -
     insert_additional_child_table |        | -
     swap                          |        | 0/1
    (11 rows)
  3. Tunggu hingga client downstream selesai mengonsumsi data binary logging yang ada. Kemudian, jalankan secara manual pernyataan SQL berikut untuk melanjutkan task REBUILD. Saat task dilanjutkan, tabel sumber tetap dalam status read-only dan tidak ada data binary logging baru yang dihasilkan.

    RESUME '<query_id>';

    Setelah task REBUILD berhasil dijalankan, binary logging secara otomatis diaktifkan untuk tabel baru. Anda kemudian dapat merestart task konsumsi binary logging downstream dan mulai mengonsumsi log biner tabel baru dari lsn = 0.

Pemantauan dan O&M

Lihat status eksekusi task REBUILD

Task REBUILD dijalankan secara asinkron. Setelah task dikirimkan, sistem mengembalikan status sukses dan query_id. Anda harus melakukan kueri pada tabel sistem hologres.rebuild_progress untuk melihat status subtask asinkron. Tabel dianggap telah direbuild hanya setelah semua subtask berhasil. Perintahnya adalah sebagai berikut:

SELECT * FROM hologres.rebuild_progress('<rebuild_query_id>');

Kolom pada tabel sistem dan deskripsinya adalah sebagai berikut:

Nama kolom

Deskripsi

job_name

query_id dari task REBUILD.

step_id

ID langkah. Subtask task REBUILD dijalankan secara berurutan berdasarkan ID ini.

step

Nama langkah:

  • prepare: Persiapan task.

  • create_tmp_table: Membuat tabel temporary.

  • get_src_table_snapshot: Mendapatkan snapshot data dari tabel sumber.

  • insert: Mengimpor data yang ada ke tabel temporary.

  • set_readonly: Menyetel tabel yang akan direbuild menjadi read-only dan menghentikan penulisan data.

  • check_snapshot: Memeriksa apakah snapshot data tabel saat ini sama dengan snapshot yang diperoleh pada langkah ketiga. Jika tidak, langkah re-insert dilakukan.

  • re-insert: Mengimpor data inkremental.

  • check_additional_child_table: Memeriksa apakah tabel anak baru telah dibuat oleh pengguna sejak task REBUILD dimulai. Hanya berlaku untuk tabel partisi fisik.

  • create_additional_child_table: Membuat tabel anak baru potensial untuk tabel temporary. Hanya berlaku untuk tabel partisi fisik.

  • insert_additional_child_table: Mengimpor data yang ada ke tabel anak temporary baru. Hanya berlaku untuk tabel partisi fisik.

  • swap: Mengganti tabel sumber dengan tabel temporary.

status

Status subtask.

  • done: Selesai.

  • doing: Sedang berjalan.

  • NULL: Langkah ini tidak perlu dijalankan, atau belum diketahui apakah langkah ini perlu dijalankan.

  • error: Gagal. Periksa pesan error di kolom message.

progress

Progres subtask: m/n. `n` adalah jumlah sublangkah yang harus dijalankan (biasanya sebanding dengan jumlah partisi), dan `m` adalah jumlah sublangkah yang telah dijalankan.

start_time

Waktu mulai subtask.

end_time

Waktu selesai subtask.

queryid

query_id dari subtask.

pid

ID proses layanan.

message

Pesan subtask. Jika terjadi error pada subtask, pesan error dicatat di kolom ini.

Berikut adalah contoh hasilnya:

opopo

Hentikan dan mulai ulang tugas REBUILD

  • Hentikan task REBUILD asinkron.

    SUSPEND '<query_id>';
  • Lanjutkan task asinkron yang dibatalkan oleh CANCEL.

    RESUME '<query_id>';

Penanganan exception task REBUILD

Jika task REBUILD terganggu oleh error atau jika Anda menjalankan perintah SUSPEND secara manual untuk menjeda task, Anda dapat menjalankan perintah RESUME untuk melanjutkan task. Anda juga dapat mengikuti langkah-langkah berikut untuk mengakhiri task dan memulihkan tabel sumber.

  • Jalankan perintah berikut untuk membersihkan tabel temporary yang dihasilkan selama proses REBUILD.

    CALL hg_clean_rebuild_tmp_tables('<query_id>');
  • Jika tabel sumber telah diatur ke status read-only oleh task REBUILD sebelum task tersebut terganggu, jalankan perintah berikut untuk menghapus status read-only dan melanjutkan operasi tulis.

    ALTER TABLE <table_name> SET (readonly = false);