All Products
Search
Document Center

Hologres:Migrasi dari tabel partisi fisik ke tabel partisi logis

Last Updated:Jun 04, 2026

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

  1. Hentikan tugas write untuk tabel partisi fisik, buat tabel partisi logis baru, dan salin data yang ada.

  2. Buat tugas write untuk tabel baru dan aktifkan penulisan ganda ke kedua tabel.

  3. Verifikasi tabel partisi logis baru.

  4. Arahkan kueri bisnis dan tugas write ke tabel baru.

  5. 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.

Penting

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.

Penting

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.

  1. Buat tabel partisi logis. Lihat Table schema conversion untuk perubahan DDL yang diperlukan.

  2. 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:

Peringatan

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)

Peringatan

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.

  1. Hentikan tugas write untuk tabel partisi fisik.

  2. 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.

  3. Perbarui tugas write dan restart.

  4. Adaptasi tugas kueri ke tabel partisi logis baru.

  5. 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 LOGICAL sebelum PARTITION BY.

  • Tambahkan NOT NULL ke 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

Catatan

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

hg_dump_script function

No difference

Query parent table properties

hologres.hg_table_properties

No difference

Query partition list

Query all child tables

hologres.hg_list_logical_partition

Query partition properties

hologres.hg_table_properties

hologres.hg_logical_partitioned_table_properties

Query parent table storage

hg_table_storage_status

hg_partition_file_status

Pemetaan properti dan parameter

Tabel berikut memetakan parameter partisi otomatis dan properti tabel lainnya antara tabel partisi fisik dan logis.

Catatan

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

auto_partitioning_enable

No equivalent parameter

Time unit

auto_partitioning_time_unit

No separate configuration; only time partitions are supported

Time zone

auto_partitioning_time_zone

No equivalent parameter

Pre-created partitions

auto_partitioning_num_precreate

No equivalent parameter

Partitions to retain

auto_partitioning_num_retention

partition_expiration_time

Hot partitions to retain

auto_partitioning_num_hot

partition_keep_hot_window

Scheduling time

auto_partitioning_schd_start_time

No equivalent parameter

Partition date/time format

auto_partitioning_time_format

No equivalent parameter

Partition management

Retain partition

keep_alive

keep_alive

Hot/cold storage

storage_mode

storage_mode

Binary log

Enable (parent table)

binlog_level

binlog_level

Lifecycle (parent table)

binlog_ttl

binlog_ttl

Dynamic binary log by partition

Not supported

partition_generate_binlog_window

Enable (partitions)

Inherits from parent; modification not supported

generate_binlog

Lifecycle (partitions)

Partitions support modification

Inherits from parent; modification not supported

Indexes and table properties

bitmap_columns

Partitions support modification

Inherits from parent; modification not supported

dictionary_encoding_columns

Partitions support modification

Inherits from parent; modification not supported

orientation, table_group, and other properties

Inherits from parent; modification not supported

Inherits from parent; modification not supported

Primary key, distribution_key, clustering_key, and other indexes

Inherits from parent; modification not supported

Inherits from parent; modification not supported