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 |
|
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:
|
|
SET ( <parameter> [= <value>]) |
Memodifikasi properti tabel. Skenario umum:
|
|
WITH (<rebuild_parameter> [= <value>]) |
Menetapkan parameter terkait tugas REBUILD. Parameter umum:
|
|
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 menggunakanquery_idini 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 setelahquery_iddikembalikan. 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,REBUILDmenggunakan teknologiDynamic Tableuntuk 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_partitioningpada tabel induk. -
Atribut
keep_alivedan 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_columnsdandictionary_encoding_columns.
-
-
REBUILDtidak 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
SerialatauBigserial. -
Tabel yang direferensikan oleh
Dynamic Tableatau 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.
-
Jalankan perintah
REBUILD.ASYNC REBUILD TABLE rebuild_test WITH ( binlog_mode ) <YOUR_ACTION>; -
Jika parameter
binlog_modediatur untuk tugas REBUILD, tugas tersebut akan secara otomatis berhenti sementara setelah langkahset_readonlyselesai. 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) -
Tunggu hingga klien downstream selesai mengonsumsi semua data Binlog yang ada. Kemudian, lanjutkan secara manual tugas
REBUILDdengan 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
REBUILDselesai, Binlog secara otomatis diaktifkan untuk tabel baru. Anda kemudian dapat memulai ulang tugas konsumsi Binlog downstream dan mulai mengonsumsi darilsn = 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:
|
status | Status subtask.
|
progress |
Progres subtask: |
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.

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);
-