全部产品
Search
文档中心

Hologres:REBUILD (Beta)

更新时间:Dec 12, 2025

Di Hologres, Anda dapat menggunakan sintaks ALTER TABLE untuk memodifikasi struktur tabel tertentu, properti tabel, dan properti kolom. Namun, ALTER TABLE tidak dapat digunakan untuk mengubah properti yang memengaruhi penyimpanan tabel. Mulai versi V3.1 dan yang lebih baru, Hologres mendukung sintaks REBUILD yang memungkinkan modifikasi berbagai parameter tabel. Topik ini menjelaskan cara menggunakan perintah REBUILD di Hologres.

Sintaks

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

Parameter

Parameter

Sub-parameter

Deskripsi

ASYNC

Menentukan bahwa task REBUILD dijalankan secara asinkron. Perintah ini mengembalikan query_id. Gunakan query_id tersebut untuk memantau status task. Eksekusi sinkron tidak didukung.

table_name

Nama tabel target yang akan dibangun ulang.

column_name

Nama kolom dalam 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 yang sudah ada tidak diubah.

ALTER COLUMN SET/DROP NOT NULL

Menetapkan atau menghapus batasan NOT NULL untuk kolom.

ALTER PRIMARY KEY

Memodifikasi primary key tabel. Jika primary key baru menyebabkan konflik data, task asinkron akan melaporkan error. Pantau status 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.

  • Memodifikasi kunci partisi tabel partisi fisik.

  • Mengonversi tabel partisi fisik menjadi tabel partisi logis. Anda dapat memilih untuk memodifikasi kunci partisi.

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

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

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

  • Memodifikasi kunci distribusi (distribution_key).

  • Memodifikasi kunci segmen (event_time_column).

  • Memodifikasi indeks pengelompokan (clustering_key).

  • Memodifikasi format penyimpanan tabel (orientation): mengonversi antara penyimpanan baris, penyimpanan kolom, dan penyimpanan hibrida baris-kolom.

  • Memodifikasi 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 sintaks ALTER TABLE sebagai gantinya.

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

Menetapkan parameter untuk tugas REBUILD. Parameter umum meliputi hal-hal berikut:

  • keep_source: Tidak memerlukan nilai. Setelah konversi, tabel sumber tidak dihapus. Nama tabel tersebut diubah menjadi tmp_rebuild_old_<query_id>_<unique_id>_<table_name>.

  • binlog_mode: Tidak memerlukan nilai. Memungkinkan Anda menjalankan REBUILD pada tabel yang telah mengaktifkan binary logging (Binlog). Untuk menghindari kehilangan data, ikuti langkah-langkah di bagian Contoh penggunaan.

  • rebuild_guc_hg_computing_resource='serverless': Menggunakan sumber daya Serverless untuk menjalankan task REBUILD. Hal ini menghindari penggunaan sumber daya instans Anda dan meningkatkan stabilitas task.

  • rebuild_guc_<guc_name>='<guc_value>': Menetapkan parameter Grand Unified Configuration (GUC) lainnya. Untuk informasi selengkapnya, lihat Parameter GUC.

Catatan

  • Hanya eksekusi asinkron (ASYNC) yang didukung guna mencegah koneksi berjalan lama.

  • Saat Anda mengirimkan task REBUILD, sistem segera mengembalikan query_id. Anda dapat menggunakan query_id ini untuk memeriksa status task REBUILD. Jika pengiriman task tidak selesai, kemungkinan karena banyak task asinkron sedang berjalan di instans Anda. Dalam kasus ini, tunggu beberapa saat lalu periksa status task setelah query_id dikembalikan.

  • Memodifikasi parameter tabel dengan perintah REBUILD melibatkan redistribusi data dan mengonsumsi sumber daya komputasi. Untuk menjaga stabilitas bisnis, jalankan task REBUILD selama jam sepi atau gunakan sumber daya komputasi Serverless.

  • Selama task REBUILD berlangsung, salah satu langkahnya menetapkan tabel menjadi read-only. Selama periode tersebut, Anda tidak dapat menulis data ke tabel tersebut.

  • Perintah REBUILD tidak mendukung tabel yang bergantung pada tabel dinamis atau tampilan yang di-materialisasi, tetapi mendukung tabel yang bergantung pada tampilan standar.

  • Untuk memodifikasi beberapa parameter, lakukan dalam satu task REBUILD guna mengurangi overhead.

  • Setelah Anda merebuild tabel partisi fisik, properti manajemen partisi dinamis tidak diwariskan. Anda harus mengonfigurasi ulang properti-properti ini setelah task REBUILD selesai. Properti tersebut meliputi:

    • Properti auto_partitioning dari tabel induk.

    • Properti seperti keep_alive untuk tabel anak.

    • Setelah tabel partisi fisik direbuild, properti yang sebelumnya ditetapkan secara independen pada tabel anak—seperti bitmap_columns dan dictionary_encoding_columns—tidak diwariskan. Nilainya akan diselaraskan dengan tabel induk.

  • REBUILD saat ini tidak mendukung tabel-tabel berikut:

    • Tabel dengan properti kolom tertentu, seperti optimisasi penyimpanan kolom untuk kolom JSONB atau kendala kolom untuk kolom vektor.

    • Tabel dengan indeks teks penuh atau indeks secondary global.

    • Tabel dengan kolom Serial atau Bigserial.

Contoh penggunaan

Jalankan REBUILD pada tabel tanpa binary logging

-- 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, serta ubah orientasi menjadi 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 standar menjadi tabel partisi logis. 
-- Tetapkan 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);

Jalankan REBUILD pada tabel dengan binary logging

Perintah REBUILD tidak menyimpan data binary logging (Binlog) historis. Oleh karena itu, Anda tidak dapat menjalankan REBUILD pada tabel yang telah mengaktifkan binary logging secara default. Untuk melakukan operasi ini, Anda harus mengonfigurasi parameter binlog_mode dalam task REBUILD dan mengikuti langkah-langkah berikut. Proses ini memastikan bahwa client downstream telah mengonsumsi semua data Binlog historis sebelum tabel direbuild.

  1. Jalankan REBUILD.

    ASYNC REBUILD TABLE rebuild_test 
    WITH (
      binlog_mode
    )
    <your_action>;
  2. Untuk task REBUILD yang mencakup parameter binlog_mode, task tersebut secara otomatis berhenti setelah langkah set_readonly selesai. Anda dapat memeriksa progres dengan menjalankan perintah SQL berikut. Pada titik ini, sistem telah menetapkan tabel menjadi read-only. Anda tidak dapat menulis data ke tabel tersebut, 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 client downstream selesai mengonsumsi data Binlog yang ada. Kemudian, jalankan secara manual perintah SQL berikut untuk melanjutkan task REBUILD. Selama proses ini, tabel sumber tetap dalam mode read-only, dan tidak ada data Binlog baru yang dihasilkan.

    RESUME '<query_id>';

    Setelah task REBUILD berhasil diselesaikan, binary logging secara otomatis diaktifkan untuk tabel baru. Anda kemudian dapat merestart task konsumsi Binlog downstream. Konsumsi Binlog tabel baru harus dimulai dari lsn = 0.

Pemantauan dan O&M

Periksa status task REBUILD

Task REBUILD dijalankan secara asinkron. Saat Anda mengirimkan task, sistem mengembalikan status sukses untuk pengiriman dan query_id. Anda harus memeriksa status sub-task asinkron di tabel sistem hologres.rebuild_progress. Operasi REBUILD hanya dianggap selesai setelah semua sub-task berhasil. Anda dapat menggunakan perintah berikut untuk memeriksa status:

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

Kolom tabel sistem dan deskripsinya adalah sebagai berikut:

Kolom

Deskripsi

job_name

query_id dari tugas REBUILD.

step_id

ID langkah. Sub-task REBUILD dieksekusi secara berurutan sesuai ID ini.

step

Nama langkah:

  • prepare: Persiapan tugas.

  • create_tmp_table: Buat tabel sementara.

  • get_src_table_snapshot: Dapatkan snapshot data dari tabel sumber.

  • insert: Impor data yang ada ke tabel sementara.

  • set_readonly: Atur tabel yang akan dibangun ulang menjadi read-only dan hentikan penulisan data.

  • check_snapshot: Periksa apakah snapshot data saat ini dari tabel sama dengan yang diperoleh pada langkah ketiga. Jika tidak, lanjutkan ke langkah re-insert.

  • re-insert: Impor data tambahan.

  • check_additional_child_table: Memeriksa apakah ada tabel anak baru yang dibuat pengguna sejak REBUILD dimulai. Hanya berlaku untuk tabel partisi fisik.

  • create_additional_child_table: Buat tabel anak potensial baru untuk tabel sementara. Ini hanya berlaku untuk tabel partisi fisik.

  • insert_additional_child_table: Impor data yang ada ke tabel anak sementara baru. Ini hanya berlaku untuk tabel partisi fisik.

  • swap: Ganti tabel sumber dengan tabel sementara.

status

Status sub-task.

  • done: Selesai.

  • doing: Sedang berlangsung.

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

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

progress

Progres sub-task: m/n. n adalah jumlah sub-langkah yang harus dieksekusi (biasanya berkorelasi positif dengan jumlah partisi), dan m adalah jumlah sub-langkah yang telah dieksekusi.

start_time

Waktu mulai sub-task.

end_time

Waktu selesai sub-task.

queryid

query_id dari sub-task.

pid

ID proses layanan.

message

Pesan sub-task. Jika sub-task melaporkan error, pesan error tersebut dicatat di kolom ini.

Berikut adalah hasil sampel:

opopo

Hentikan dan mulai ulang tugas REBUILD

  • Jeda task REBUILD asinkron.

    SUSPEND '<query_id>';
  • Lanjutkan tugas asinkron yang dijeda dengan menggunakan perintah CANCEL.

    RESUME '<query_id>';

Tangani pengecualian tugas REBUILD

Jika task REBUILD terganggu oleh error atau dijeda secara manual dengan perintah SUSPEND, Anda dapat menggunakan perintah RESUME untuk melanjutkan task tersebut. Atau, Anda dapat mengikuti langkah-langkah berikut untuk mengakhiri task dan memulihkan tabel sumber.

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

    CALL hg_clean_rebuild_tmp_tables('<query_id>');
  • Jika task terganggu setelah tabel sumber ditetapkan menjadi read-only, gunakan perintah berikut untuk mengembalikan operasi tulis ke tabel tersebut.

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