All Products
Search
Document Center

Hologres:Rebuild

Last Updated:Apr 11, 2026

Hologres mendukung modifikasi beberapa struktur tabel, properti tabel, dan properti kolom melalui sintaksis ALTER TABLE. Namun, untuk properti yang memengaruhi penyimpanan tabel, sintaksis tersebut tidak didukung. Mulai dari Hologres V3.1, sintaksis REBUILD tersedia dan memungkinkan Anda mengubah berbagai parameter tabel secara fleksibel. Topik ini menjelaskan cara menggunakan REBUILD di Hologres.

Sintaksis

Format pernyataan

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>'

Parameter

Parameter

Sub-item

Deskripsi

ASYNC

Tugas REBUILD dieksekusi secara asinkron. Setelah tugas dieksekusi, sistem mengembalikan query_id. Anda dapat menggunakan query_id tersebut untuk memantau status eksekusi tugas. Eksekusi sinkron saat ini tidak didukung.

table_name

Nama tabel target yang akan direbuild.

column_name

Nama kolom pada tabel target.

data_type

Tipe data kolom.

action

ADD COLUMN

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

ALTER COLUMN TYPE

Memodifikasi tipe data kolom.

ALTER COLUMN SET/DROP DEFAULT

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

ALTER COLUMN SET/DROP NOT NULL

Menetapkan atau menghapus kendala NOT NULL untuk kolom.

ALTER PRIMARY KEY

Memodifikasi primary key tabel. Jika terjadi konflik data dengan primary key baru, sistem akan melaporkan error selama eksekusi asinkron. Pantau status eksekusi tugas segera.

TO [LOGICAL] PARTITION

Mengonversi tabel menjadi tabel partisi logis/fisik, mendukung skenario berikut:

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

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

  • Memodifikasi kunci partisi tabel partisi fisik.

  • Mengonversi tabel partisi fisik menjadi tabel partisi logis. Anda dapat menentukan apakah akan memodifikasi kunci partisi.

  • Anda tidak dapat mengonversi tabel partisi logis menjadi tabel partisi fisik.

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

Memodifikasi properti tabel. Skenario umum:

  • Memodifikasi kunci distribusi distribution_key.

  • Memodifikasi kunci segmen event_time_column.

  • Memodifikasi indeks pengelompokan clustering_key.

  • Memodifikasi format penyimpanan tabel orientation: Mengonversi antara penyimpanan berorientasi baris, penyimpanan berorientasi kolom, dan penyimpanan hibrida baris-kolom.

  • Memodifikasi table_group tabel.

  • Semua properti tabel lainnya didukung untuk dimodifikasi.

  • Anda tidak perlu menggunakan REBUILD untuk memodifikasi indeks bitmap bitmap_columns atau kolom encoding kamus dictionary_encoding_columns. Sebagai gantinya, gunakan sintaksis ALTER TABLE.

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

Menetapkan parameter terkait tugas REBUILD. Parameter umum:

  • keep_source: Anda tidak perlu menetapkan nilai. Setelah konversi, tabel asli tidak dihapus dan diganti namanya menjadi tmp_rebuild_old_<query_id>_<unique_id>_<table_name>.

  • binlog_mode: Memungkinkan REBUILD dijalankan pada tabel yang memiliki Binlog aktif. Untuk mencegah kehilangan data Binlog, Anda harus mengikuti prosedur dalam bagian Contoh.

  • rebuild_guc_hg_computing_resource='serverless': Menjalankan tugas REBUILD menggunakan resource serverless. Hal ini menghindari penggunaan resource instans Anda dan meningkatkan stabilitas tugas.

  • rebuild_guc_<guc_name>='<guc_value>': Menentukan parameter GUC lainnya untuk tugas. Untuk informasi lebih lanjut, lihat parameter GUC.

Perhatian

  • Hanya eksekusi asinkron (ASYNC) yang didukung, sehingga tidak memerlukan koneksi jangka panjang.

  • Setelah mengirimkan tugas REBUILD, tugas tersebut dieksekusi dengan cepat dan mengembalikan query_id. Anda dapat menggunakan query_id ini untuk memeriksa status eksekusi tugas REBUILD. Jika tugas tidak selesai dalam waktu lama setelah dikirim, hal ini mungkin disebabkan oleh banyaknya tugas penjadwalan asinkron yang sedang berjalan pada instans saat ini. Disarankan untuk menunggu beberapa saat dan memeriksa status eksekusi tugas setelah query_id dikembalikan.

  • Penggunaan fitur REBUILD untuk memodifikasi parameter tabel melibatkan redistribusi data tingkat dasar yang mengonsumsi sumber daya komputasi. Oleh karena itu, disarankan menjalankan tugas REBUILD pada jam non-puncak bisnis atau menggunakan sumber daya komputasi tanpa server untuk operasi ini guna memastikan stabilitas bisnis.

  • Selama tugas REBUILD, tabel bersifat read-only dan tidak dapat ditulis. Mulai dari Hologres V4.1, REBUILD menggunakan teknologi Dynamic Table untuk pembaruan inkremental, yang secara signifikan memperpendek jendela read-only. Agar menghindari downtime tulis yang lama, tabel target harus memenuhi persyaratan berikut:

    • Tabel harus memiliki primary key sebelum operasi REBUILD, dan primary key baru harus mencakup semua kolom dari primary key asli.

    • Tabel harus menggunakan penyimpanan berorientasi kolom atau penyimpanan hibrida baris-kolom sebelum operasi REBUILD.

    • Tabel tidak boleh berisi kolom generated apa pun setelah operasi REBUILD.

    • Jika tabel merupakan tabel partisi fisik sebelum operasi REBUILD, kunci partisinya harus tetap tidak berubah.

    • Jika tabel menjadi tabel partisi logis setelah operasi REBUILD, tabel hanya boleh memiliki satu kunci partisi.

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

  • Setelah tabel partisi fisik direbuild, properti manajemen partisi dinamis-nya tidak diwariskan. Anda harus menetapkan secara manual properti berikut setelah rebuild selesai:

    • Properti auto_partitioning pada tabel induk.

    • Atribut keep_alive dan atribut lainnya pada tabel anak.

    • Setelah merebuild tabel partisi fisik, semua properti yang sebelumnya ditetapkan secara independen pada tabel anak tidak diwariskan dan kembali ke pengaturan tabel induk, seperti bitmap_columns dan dictionary_encoding_columns.

  • REBUILD tidak didukung untuk tabel-tabel berikut:

    • Tabel dengan pengaturan properti kolom khusus, seperti optimasi penyimpanan kolom untuk kolom JSONB, atau kendala kolom, seperti kolom vektor.

    • Tabel dengan indeks teks penuh atau indeks sekunder global.

    • Tabel yang berisi kolom bertipe data Serial atau Bigserial.

    • Tabel yang direferensikan oleh Dynamic Table atau tampilan yang di-materialisasi. Tabel yang direferensikan oleh tampilan biasa didukung.

Contoh

Rebuild tabel tanpa Binlog

-- 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 non-null dengan 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 resource serverless untuk menjalankan tugas REBUILD, atur distribution_key dan clustering_key untuk tabel, dan ubah penyimpanan menjadi hibrida baris-kolom.
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, atur kunci partisi menjadi ds, dan tambahkan kendala NOT NULL pada kolom ds.
ASYNC REBUILD TABLE rebuild_test 
    ALTER COLUMN ds SET NOT NULL,
    TO LOGICAL PARTITION BY LIST(ds);

Rebuild tabel dengan Binlog

REBUILD tidak menyimpan data Binlog historis. Oleh karena itu, REBUILD secara default tidak didukung untuk tabel yang memiliki Binlog aktif. Anda harus menentukan parameter binlog_mode dan mengikuti langkah-langkah berikut untuk memastikan sistem downstream telah sepenuhnya mengonsumsi data Binlog historis.

  1. Jalankan perintah REBUILD.

    ASYNC REBUILD TABLE rebuild_test 
    WITH (
      binlog_mode
    )
    <YOUR_ACTION>;
  2. Jika parameter binlog_mode diatur untuk tugas REBUILD, tugas tersebut akan secara otomatis berhenti sementara setelah langkah set_readonly selesai. Anda dapat menjalankan kueri SQL untuk memeriksa progres. Pada tahap ini, sistem telah mengatur tabel menjadi read-only, sehingga data tidak dapat ditulis ke tabel dan tidak ada data Binlog 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 klien downstream selesai mengonsumsi semua data Binlog yang ada. Kemudian, lanjutkan secara manual tugas REBUILD dengan menjalankan pernyataan SQL berikut. Selama proses ini, tabel sumber tetap dalam mode read-only dan tidak menghasilkan data Binlog baru.

    RESUME '<query_id>';

    Setelah tugas REBUILD selesai, Binlog secara otomatis diaktifkan untuk tabel baru. Anda kemudian dapat memulai ulang tugas konsumsi Binlog downstream dan mulai mengonsumsi dari lsn = 0.

Pemantauan dan O&M

Lihat status eksekusi tugas REBUILD

Tugas REBUILD berjalan secara asinkron. Setelah tugas berhasil dikirim, sistem mengembalikan status sukses dan query_id. Untuk memantau status subtask asinkron, Anda perlu mengkueri tabel sistem hologres.rebuild_progress. Operasi REBUILD untuk tabel tersebut dianggap selesai hanya jika seluruh subtask berhasil. Perintahnya adalah sebagai berikut:

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

Tabel berikut menjelaskan kolom-kolom tabel sistem tersebut.

Nama kolom

Deskripsi

job_name

query_id tugas REBUILD.

step_id

ID langkah. Subtask REBUILD dieksekusi secara berurutan sesuai ID langkah.

step

Nama langkah:

  • prepare: Persiapan tugas.

  • create_tmp_table: Membuat tabel sementara.

  • get_src_table_snapshot: Mendapatkan snapshot data dari tabel asli.

  • insert: Mengimpor data historis ke tabel sementara.

  • set_readonly: Mengatur tabel yang akan direbuild menjadi read-only. Ini menghentikan penulisan data.

  • check_snapshot: Membandingkan snapshot data tabel saat ini dengan snapshot yang diperoleh pada Langkah 3. Jika berbeda, proses dilanjutkan ke langkah re-insert.

  • re-insert: Mengimpor data inkremental.

  • check_additional_child_table: Memeriksa apakah ada tabel anak baru yang dibuat pengguna sejak awal REBUILD hingga sekarang. Langkah ini hanya berlaku untuk tabel partisi fisik.

  • create_additional_child_table: Membuat tabel anak potensial baru untuk tabel sementara. Langkah ini hanya berlaku untuk tabel partisi fisik.

  • insert_additional_child_table: Mengimpor data historis ke tabel anak sementara baru. Langkah ini hanya berlaku untuk tabel partisi fisik.

  • swap: Mengganti tabel asli dengan tabel sementara.

status

Status subtask.

  • done: Selesai.

  • doing: Sedang berjalan.

  • NULL: Tidak perlu mengeksekusi langkah ini, atau saat ini belum dapat ditentukan apakah langkah ini perlu dieksekusi.

  • error: Eksekusi gagal. Periksa pesan error di kolom message.

progress

Progres subtask: m/n. Dalam format ini, n mewakili jumlah total sublangkah yang akan dieksekusi, dan m mewakili jumlah sublangkah yang telah dieksekusi. Jumlah total ini umumnya berkorelasi positif dengan jumlah partisi.

start_time

Waktu mulai subtask.

end_time

Waktu selesai subtask.

queryid

query_id subtask.

pid

ID proses layanan.

message

Pesan subtask. Jika subtask melaporkan error, pesan error dicatat di kolom ini.

Gambar berikut menunjukkan contoh hasilnya.

opopo

Hentikan dan jalankan ulang tugas REBUILD

  • Hentikan tugas asinkron REBUILD.

    SUSPEND '<query_id>';
  • Lanjutkan tugas asinkron yang sebelumnya dihentikan dengan status CANCEL.

    RESUME '<query_id>';

Menangani eksepsi tugas REBUILD

Jika tugas REBUILD terganggu oleh error atau Anda menghentikannya secara manual menggunakan perintah SUSPEND, Anda dapat melanjutkannya kembali dengan perintah RESUME atau mengikuti langkah-langkah berikut untuk menghentikan tugas dan memulihkan tabel sumber.

  • Jalankan perintah berikut untuk membersihkan tabel sementara yang dibuat selama proses REBUILD.

    CALL hg_clean_rebuild_tmp_tables('<query_id>');
  • Jika tugas terganggu setelah tabel sumber menjadi read-only, jalankan perintah yang sesuai untuk mengaktifkan kembali penulisan.

    • Untuk versi Hologres sebelum V4.1:

      ALTER TABLE <table_name> SET (readonly = false);
    • Untuk Hologres V4.1 dan versi setelahnya:

      ALTER TABLE <table_name> SET RESET (ddl_options,write_options);