Tabel partisi fisik dapat mengalami dua masalah stabilitas saat diskalakan: pembengkakan metadata ketika kelompok tabel melebihi 10.000 tabel anak (partisi) dan penurunan performa akibat operasi DDL berfrekuensi tinggi saat partisi baru ditambahkan setiap hari. Hologres V3.1 memperkenalkan tabel partisi logis untuk mengatasi kedua isu tersebut. Topik ini menjelaskan cara melakukan migrasi tabel partisi fisik yang sudah ada ke tabel partisi logis.
Kapan harus migrasi
Lakukan migrasi ke tabel partisi logis jika tabel partisi fisik Anda memenuhi salah satu kondisi berikut:
-
Kelompok tabel berisi lebih dari 10.000 tabel anak, menyebabkan skala metadata yang besar.
-
Partisi baru ditambahkan setiap hari, mengakibatkan operasi DDL yang sering.
Pilih pendekatan migrasi
|
Approach |
When to use |
Downtime |
Risk |
|
Dual-write verification (direkomendasikan) |
Setiap migrasi di mana kelangsungan bisnis menjadi prioritas |
Minimal — tabel lama dan baru berjalan secara paralel |
Rendah |
|
REBUILD (tidak direkomendasikan) |
Dapat menerima jendela perubahan yang lebih panjang dan memungkinkan terjadinya beberapa kegagalan baca/tulis |
Lebih lama — tugas write berhenti selama migrasi |
Tinggi — tugas mungkin gagal sebelum adaptasi selesai |
Migrasi menggunakan dual-write verification (direkomendasikan)
Pendekatan ini menjaga tabel lama dan baru tetap berjalan secara paralel selama migrasi sehingga meminimalkan dampak terhadap bisnis.
Ikhtisar
-
Hentikan tugas write untuk tabel partisi fisik, buat tabel partisi logis baru, dan salin data yang ada.
-
Buat tugas write untuk tabel baru dan aktifkan penulisan ganda ke kedua tabel.
-
Verifikasi tabel partisi logis baru.
-
Arahkan kueri bisnis dan tugas write ke tabel baru.
-
Adaptasi tugas O&M ke tabel baru.
Langkah 1: Buat tabel partisi logis dan muat data yang ada
Pilih salah satu metode berikut berdasarkan situasi Anda.
Metode 1: CLONE (direkomendasikan untuk volume data sedang tanpa perubahan skema)
hg_clone_to_logical_partition secara otomatis membuat tabel partisi logis baru dan menyalin semua data dari tabel asli. Tabel partisi fisik asli tidak dihapus.
Hentikan tugas write real-time sebelum menjalankan CLONE. Setelah CLONE selesai, buat tugas write baru yang menulis ke kedua tabel secara simultan agar data tetap sinkron. Setelah migrasi selesai, verifikasi kedua tabel secara menyeluruh, selesaikan adaptasi tugas impor, tugas kueri, dan tugas O&M, lalu bersihkan tabel partisi fisik asli.
CALL hg_clone_to_logical_partition('user_profile', 'user_profile_logical');
Untuk volume data besar, jalankan CLONE secara asinkron untuk menghindari timeout. Setelah dikirim, gunakan query_id yang dikembalikan untuk memeriksa progres di Get query insights.
SET statement_timeout = 0;
ASYNC CALL hg_clone_to_logical_partition('user_profile', 'user_profile_logical');
Metode 2: Migrasi manual (untuk perubahan skema atau volume data besar)
Migrasi manual memungkinkan Anda mengoptimalkan skema tabel dan mengontrol kecepatan migrasi.
Hentikan tugas write real-time sebelum mengimpor data. Setelah impor selesai, buat tugas write baru yang menulis ke kedua tabel secara simultan. Setelah migrasi selesai, verifikasi kedua tabel secara menyeluruh, selesaikan adaptasi tugas impor, tugas kueri, dan tugas O&M, lalu bersihkan tabel partisi fisik asli.
-
Buat tabel partisi logis. Lihat Table schema conversion untuk perubahan DDL yang diperlukan.
-
Impor data historis menggunakan
hg_insert_overwrite:CALL hg_insert_overwrite('logical_partition_table', '{20250601, 20250602}'::text[], 'SELECT * FROM tb');
Langkah 2: Aktifkan dual writing
Buat tugas write baru untuk tabel partisi logis dan jalankan bersama tugas write yang ada untuk tabel partisi fisik. Hal ini memastikan kedua tabel tetap sinkron selama periode verifikasi.
Langkah 3: Verifikasi tabel baru
Jalankan kueri bisnis Anda terhadap tabel partisi logis dan pastikan data serta perilakunya sesuai dengan tabel partisi fisik.
Langkah 4: Alihkan bisnis ke tabel baru
Gunakan salah satu metode berikut:
Opsi A (direkomendasikan): Perbarui nama tabel dalam tugas kueri agar mengarah ke tabel partisi logis baru dan tambahkan kondisi filter partisi jika diperlukan.
Opsi B: Gunakan RENAME untuk menukar nama tabel secara atomik:
Operasi ini mengganti nama tabel yang ada. Pastikan tugas write dan kueri Anda siap mengarah ke tabel induk sebelum mengeksekusi.
BEGIN;
ALTER TABLE <source_table_name> RENAME TO <source_table_name_archive>;
ALTER TABLE <target_table_name> RENAME TO <source_table_name>;
COMMIT;
Setelah beralih, perbarui tugas write dan kueri yang sebelumnya mengarah ke tabel anak agar menggunakan tabel induk, dan tambahkan kondisi filter partisi.
Langkah 5: Adaptasi tugas O&M
Perbarui tugas O&M apa pun yang berbeda antara tabel partisi fisik dan logis. Lihat O&M task adaptation untuk detailnya.
Migrasi menggunakan REBUILD (tidak direkomendasikan)
Selama migrasi REBUILD, beberapa tugas baca dan tulis mungkin gagal. Gunakan pendekatan ini hanya jika jendela perubahan yang lebih panjang dapat diterima dan kegagalan tugas singkat masih dapat ditoleransi. Metode ini tidak direkomendasikan untuk migrasi tabel partisi.
Saat REBUILD selesai, tabel partisi fisik akan diganti namanya menjadi tmp_rebuild_old_<query_id>_<unique_id>_<table_name>. Tugas terkait mungkin menghasilkan error hingga Anda menyelesaikan adaptasi tugas.
-
Hentikan tugas write untuk tabel partisi fisik.
-
Jalankan REBUILD untuk mengonversi tabel:
-- Tambahkan kendala NOT NULL ke bidang partisi. ASYNC REBUILD TABLE user_profile ALTER ds SET NOT NULL; -- Konversi tabel partisi fisik ke tabel partisi logis (mempertahankan aslinya). ASYNC REBUILD TABLE user_profile WITH (keep_source) TO logical partition;Untuk informasi lebih lanjut, lihat REBUILD.
-
Perbarui tugas write dan restart.
-
Adaptasi tugas kueri ke tabel partisi logis baru.
-
Adaptasi tugas O&M ke tabel partisi logis baru.
Konversi skema tabel
Saat membuat tabel partisi logis dari DDL tabel partisi fisik yang ada, lakukan perubahan berikut:
-
Tambahkan kata kunci
LOGICALsebelumPARTITION BY. -
Tambahkan
NOT NULLke kolom kunci partisi. -
(Opsional) Tambahkan kunci partisi kedua. Tabel partisi fisik mendukung satu kunci partisi; tabel partisi logis mendukung hingga dua.
Tabel partisi fisik:
BEGIN;
CREATE TABLE user_profile (
a TEXT,
b TEXT,
ds TEXT
)
PARTITION BY LIST (ds);
CREATE TABLE user_profile_202503 PARTITION OF user_profile FOR VALUES IN ('202503');
CREATE TABLE user_profile_202504 PARTITION OF user_profile FOR VALUES IN ('202504');
COMMIT;
Tabel partisi logis — satu kunci partisi:
CREATE TABLE user_profile_lp_1 (
a TEXT,
b TEXT,
ds TEXT NOT NULL)
LOGICAL PARTITION BY LIST (ds);
Tabel partisi logis — dua kunci partisi (memisahkan ds menjadi yy untuk tahun dan mm untuk bulan):
CREATE TABLE user_profile_lp_2 (
a TEXT,
b TEXT,
yy TEXT NOT NULL,
mm TEXT NOT NULL)
LOGICAL PARTITION BY LIST (yy, mm);
Adaptasi tugas impor
Jika tugas impor Anda menulis ke tabel partisi fisik melalui Fixed Plan: tidak perlu perubahan.
Jika tugas impor Anda menulis ke tabel anak (partisi): lakukan perubahan berikut:
-
Hapus pernyataan yang membuat tabel anak. Tabel partisi logis tidak memiliki partisi fisik.
-
Ubah nama tabel target dari nama tabel anak ke nama tabel induk.
Skenario 1: Buat tabel anak dan impor data
-- Tugas asli: impor data ke tabel partisi fisik
CREATE TABLE user_profile_202505 PARTITION OF user_profile FOR VALUES IN ('202505');
INSERT INTO user_profile_202505 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';
-- Tugas diperbarui: impor data ke tabel partisi logis
INSERT INTO user_profile_lp_1 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';
Skenario 2: Insert overwrite partisi
Jika tugas asli menggunakan hg_insert_overwrite untuk menimpa beberapa partisi sekaligus, pisahkan penimpaan berdasarkan partisi, jalankan secara serial, dan gunakan sintaks native INSERT OVERWRITE setelah migrasi ke tabel partisi logis.
-- Asli: tabel partisi fisik (metode temporary table)
CREATE TABLE tmp_user_profile_202505(a text, b text, ds text);
INSERT INTO tmp_user_profile_202505 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';
BEGIN;
DROP TABLE IF EXISTS user_profile_202505;
ALTER TABLE tmp_user_profile_202505 RENAME TO user_profile_202505;
ALTER TABLE user_profile ATTACH PARTITION user_profile_202505 FOR VALUES IN ('202505');
COMMIT;
-- Asli: tabel partisi fisik (metode hg_insert_overwrite)
CALL hg_insert_overwrite('user_profile', '202505', $$SELECT a, b, mm FROM <source_table> WHERE ds='202505'$$);
-- Diperbarui: tabel partisi logis (native INSERT OVERWRITE)
INSERT OVERWRITE user_profile_lp_1 PARTITION (ds = '202505') SELECT a, b, ds FROM <source_table> WHERE ds='202505';
Adaptasi tugas kueri
Jika kueri Anda mengarah ke tabel induk: tidak perlu perubahan.
Jika kueri Anda mengarah ke tabel anak: ubah agar mengkueri tabel induk dan tambahkan kondisi filter partisi.
-- Asli: tabel partisi fisik
SELECT * FROM user_profile_202504;
-- Diperbarui: tabel partisi logis
SELECT * FROM user_profile_lp_1 WHERE ds = '202504';
Adaptasi tugas O&M
Beberapa operasi O&M menggunakan tabel sistem atau fungsi yang berbeda untuk tabel partisi logis.
|
Operation |
Physical partitioned table |
Logical partitioned table |
|
Query parent table DDL |
|
No difference |
|
Query parent table properties |
|
No difference |
|
Query partition list |
|
|
|
Query partition properties |
|
|
|
Query parent table storage |
|
|
Pemetaan properti dan parameter
Tabel berikut memetakan parameter partisi otomatis dan properti tabel lainnya antara tabel partisi fisik dan logis.
Jika tabel partisi fisik asli menggunakan bidang non-waktu (seperti TEXT) sebagai kunci partisi dan menggunakan manajemen partisi otomatis, Hologres V4.2 dan versi lebih baru mendukung partition_expiration_time dan partition_keep_hot_window pada tabel partisi logis. Anda juga harus mengatur partition_time_format untuk menentukan format waktu. Versi sebelum V4.2 tidak mendukung konfigurasi ini.
|
Module |
Feature |
Physical partitioned table |
Logical partitioned table |
|
Automatic partitioning |
Enable |
|
No equivalent parameter |
|
Time unit |
|
No separate configuration; only time partitions are supported |
|
|
Time zone |
|
No equivalent parameter |
|
|
Pre-created partitions |
|
No equivalent parameter |
|
|
Partitions to retain |
|
|
|
|
Hot partitions to retain |
|
|
|
|
Scheduling time |
|
No equivalent parameter |
|
|
Partition date/time format |
|
No equivalent parameter |
|
|
Partition management |
Retain partition |
|
|
|
Hot/cold storage |
|
|
|
|
Binary log |
Enable (parent table) |
|
|
|
Lifecycle (parent table) |
|
|
|
|
Dynamic binary log by partition |
Not supported |
|
|
|
Enable (partitions) |
Inherits from parent; modification not supported |
|
|
|
Lifecycle (partitions) |
Partitions support modification |
Inherits from parent; modification not supported |
|
|
Indexes and table properties |
|
Partitions support modification |
Inherits from parent; modification not supported |
|
|
Partitions support modification |
Inherits from parent; modification not supported |
|
|
|
Inherits from parent; modification not supported |
Inherits from parent; modification not supported |
|
|
Primary key, |
Inherits from parent; modification not supported |
Inherits from parent; modification not supported |