All Products
Search
Document Center

Hologres:REBUILD

Last Updated:Sep 03, 2026

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

Sintaks

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

Pernyataan ini menentukan bahwa tugas REBUILD dieksekusi secara asinkron. Setelah tugas dieksekusi, sebuah query_id dikembalikan. 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 mengatur nilai default.

ALTER COLUMN TYPE

Memodifikasi tipe data kolom.

ALTER COLUMN SET/DROP DEFAULT

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

ALTER COLUMN SET/DROP NOT NULL

Mengatur atau menghapus kendala NOT NULL untuk kolom.

ALTER PRIMARY KEY

Memodifikasi primary key tabel. Jika terjadi konflik data dengan primary key baru, error akan dilaporkan 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 atau tidak.

  • 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). Anda dapat mengonversi antara penyimpanan berorientasi baris, penyimpanan berorientasi kolom, dan penyimpanan hibrida baris-kolom.

  • Memodifikasi table_group tempat tabel tersebut berada.

  • Semua properti tabel lainnya didukung untuk dimodifikasi.

  • Untuk memodifikasi indeks bitmap (bitmap_columns) atau kolom encoding kamus (dictionary_encoding_columns), gunakan pernyataan ALTER TABLE. REBUILD tidak diperlukan.

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

Mengatur parameter terkait tugas REBUILD. Parameter umum:

  • keep_source: Tidak memerlukan nilai. Jika ditentukan, tabel asli tidak dihapus. Sebagai gantinya, namanya diubah menjadi tmp_rebuild_old_<query_id>_<unique_id>_<table_name>.

  • binlog_mode: Tidak memerlukan nilai. Memungkinkan Anda merebuild tabel yang memiliki Binlog aktif. Untuk mencegah kehilangan data Binlog, Anda harus mengikuti langkah-langkah di bagian Contoh.

  • rebuild_guc_hg_computing_resource='serverless': Menggunakan sumber daya Serverless untuk mengeksekusi tugas REBUILD. Hal ini menghindari konsumsi sumber daya instans Anda dan meningkatkan stabilitas tugas.

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

Perhatian

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

  • Setelah mengirimkan tugas REBUILD, pernyataan tersebut mengembalikan query_id. Anda dapat menggunakan query_id ini untuk melihat status eksekusi tugas REBUILD. Jika pengiriman tidak segera mengembalikan query_id, kemungkinan banyak tugas asinkron sedang berjalan di instans tersebut. Disarankan untuk menunggu hingga query_id dikembalikan sebelum memeriksa status tugas.

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

  • Selama tugas REBUILD berlangsung, tabel sementara diatur ke status read-only dan penulisan diblokir. Mulai dari Hologres V4.1, REBUILD menggunakan teknologi Dynamic Table untuk pembaruan inkremental, yang secara signifikan mengurangi durasi status read-only. Optimasi ini hanya berlaku jika tabel memenuhi kondisi berikut; jika tidak, tabel tetap dalam status read-only selama seluruh durasi tugas.

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

    • Tabel target harus menggunakan penyimpanan berorientasi kolom atau penyimpanan hibrida baris-kolom sebelum rebuild.

    • Tabel target tidak boleh berisi kolom generated setelah rebuild.

    • Jika tabel target merupakan tabel partisi fisik sebelum rebuild, kunci partisinya 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, gabungkan beberapa perubahan ke dalam satu tugas REBUILD.

  • Setelah tabel partisi fisik direbuild, properti manajemen partisi dinamis-nya tidak diwariskan. Anda harus mengonfigurasi ulang properti tersebut setelah tugas selesai. Properti tersebut meliputi:

    • Properti auto_partitioning pada tabel partisi induk.

    • Properti partisi anak, seperti keep_alive.

    • Setelah tabel partisi fisik direbuild, semua properti yang sebelumnya diatur secara independen pada partisi anaknya tidak diwariskan. Partisi anak akan mewarisi semua properti dari tabel induk, seperti bitmap_columns dan dictionary_encoding_columns.

  • REBUILD tidak didukung untuk jenis tabel berikut:

    • Tabel dengan properti kolom tertentu (seperti optimasi penyimpanan kolom untuk kolom JSONB) atau kendala kolom (seperti kolom vektor).

    • Tabel dengan indeks teks penuh atau indeks secondary global.

    • Tabel yang berisi kolom bertipe data Serial atau Bigserial.

    • Tabel yang memiliki dependensi Dynamic Table atau materialized view. Tabel yang memiliki dependensi standard view didukung.

Contoh

Rebuild pada 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 NOT 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 sumber daya Serverless untuk menjalankan tugas REBUILD, atur distribution_key dan clustering_key, serta ubah ke penyimpanan 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 ke ds, dan tambahkan kendala NOT NULL ke kolom ds.
ASYNC REBUILD TABLE rebuild_test 
    ALTER COLUMN ds SET NOT NULL,
    TO LOGICAL PARTITION BY LIST(ds);

Rebuild pada tabel dengan Binlog

Pernyataan REBUILD tidak menyimpan data Binlog historis. Oleh karena itu, secara default Anda tidak dapat menjalankan REBUILD pada tabel yang memiliki Binlog aktif. Anda harus menentukan parameter binlog_mode dan mengikuti langkah-langkah berikut untuk memastikan bahwa konsumen downstream telah sepenuhnya memproses semua data Binlog yang ada.

  1. Jalankan pernyataan REBUILD.

    ASYNC REBUILD TABLE rebuild_test 
    WITH (
      binlog_mode
    )
    <YOUR_ACTION>;
  2. Untuk tugas REBUILD dengan parameter binlog_mode, tugas tersebut secara otomatis berhenti setelah langkah set_readonly selesai. Anda dapat memeriksa progresnya dengan menggunakan pernyataan SQL berikut. Pada titik ini, tabel dalam status read-only, sehingga tidak ada data yang dapat ditulis 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 data Binlog yang ada dan hentikan tugas konsumen tersebut. Kemudian, jalankan secara manual pernyataan SQL berikut untuk melanjutkan tugas REBUILD.

    RESUME '<query_id>';
  4. Setelah tugas REBUILD selesai, Binlog secara otomatis diaktifkan untuk tabel baru. Anda harus menjalankan ulang tugas konsumsi Binlog downstream secara tanpa status dan mengonsumsi Binlog tabel baru mulai dari lsn = 0.

Konversi tabel reguler menjadi liquid table

Mulai dari Hologres V4.2, Anda dapat menggunakan REBUILD untuk mengonversi tabel reguler menjadi liquid table, atau mengonversi liquid table kembali menjadi tabel reguler.

--- Konversi tabel reguler menjadi liquid table.
ASYNC REBUILD TABLE normal_table 
SET (
  liquid_table = 'true'
);

--- Konversi liquid table menjadi tabel reguler.
ASYNC REBUILD TABLE liquid_table 
SET (
  liquid_table = 'false'
);

Pemantauan dan O&M

Lihat status eksekusi tugas REBUILD

Tugas REBUILD berjalan secara asinkron. Ketika tugas berhasil dikirimkan, pernyataan tersebut mengembalikan status sukses dan query_id. Kueri tampilan sistem hologres.rebuild_progress untuk memantau status subtask asinkron. Operasi REBUILD hanya selesai ketika semua subtask berhasil. Jalankan perintah berikut:

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

Tabel berikut menjelaskan kolom pada tabel sistem tersebut.

Nama kolom

Deskripsi

job_name

query_id dari 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: Memeriksa apakah snapshot data saat ini cocok dengan snapshot dari langkah get_src_table_snapshot. Jika berbeda, langkah re-insert akan dilakukan.

  • 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, ditampilkan sebagai m/n, di mana m adalah jumlah sub-langkah yang telah selesai dan n adalah totalnya. Total (n) sering kali sesuai dengan jumlah partisi tabel.

start_time

Waktu mulai subtask.

end_time

Waktu selesai subtask.

queryid

query_id dari subtask.

pid

ID proses layanan.

message

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

Hentikan dan jalankan ulang tugas REBUILD

  • Menghentikan sementara tugas asinkron REBUILD.

    SUSPEND '<query_id>';
  • Menjalankan ulang tugas asinkron yang ditandai CANCEL.

    RESUME '<query_id>';

Pengecualian tugas bangun ulang

Jika tugas REBUILD terganggu oleh error atau dihentikan secara manual, Anda dapat melanjutkannya dengan perintah RESUME atau menghentikan tugas dan membersihkannya dengan mengikuti langkah-langkah berikut:

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

    CALL hg_clean_rebuild_tmp_tables('<query_id>');
  • Jika tabel diatur menjadi read-only, jalankan perintah yang sesuai untuk mengembalikan akses tulis.

    • Untuk versi Hologres sebelum V4.1, jalankan perintah berikut.

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

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