全部产品
Search
文档中心

Hologres:Migrasikan tabel partisi fisik ke tabel partisi logis

更新时间:Nov 11, 2025

Hologres V3.1 mendukung tabel partisi logis. Tabel partisi logis meningkatkan stabilitas dengan mengatasi masalah yang disebabkan oleh jumlah tabel yang berlebihan dan pembengkakan metadata—dua isu umum pada tabel partisi fisik. Topik ini menjelaskan cara memigrasikan tabel partisi fisik ke tabel partisi logis.

Skenario

Lakukan migrasi dari tabel partisi fisik ke tabel partisi logis dalam skenario berikut:

  • Kelompok tabel untuk tabel partisi fisik berisi banyak tabel anak, misalnya lebih dari 10.000, sehingga menyebabkan pembengkakan metadata.

  • Banyak partisi baru ditambahkan setiap hari, sehingga memerlukan operasi Data Definition Language (DDL) secara berkala.

Solusi migrasi

Solusi 1: Verifikasi dengan penulisan ganda sebelum Anda memigrasikan bisnis Anda

Solusi ini meminimalkan dampak terhadap bisnis dan memastikan stabilitas selama migrasi. Prosesnya adalah sebagai berikut:

  1. Hentikan tugas impor data untuk tabel partisi fisik asli, buat tabel partisi logis baru, lalu migrasikan data yang ada. Untuk informasi selengkapnya, lihat Migrasikan data yang ada.

    • Jika skema tabel tidak perlu diubah dan volume datanya sedang, gunakan sintaks CLONE.

    • Jika skema tabel perlu diubah, atau jika volume data besar dan beban migrasi tinggi, gunakan metode migrasi manual.

  2. Buat tugas impor data untuk tabel partisi logis baru, lalu jalankan tugas impor data untuk kedua tabel partisi (lama dan baru) secara bersamaan untuk menerapkan penulisan ganda (dual-writing).

  3. Verifikasi tabel partisi logis baru.

  4. Migrasikan bisnis Anda dengan salah satu dari dua cara berikut:

    • (Direkomendasikan) Arahkan kueri langsung ke tabel partisi logis baru. Untuk melakukannya, ubah nama tabel target dalam tugas kueri menjadi nama tabel partisi logis baru dan tambahkan kondisi filter partisi sesuai kebutuhan.

    • Ubah nama tabel partisi logis baru menjadi nama tabel partisi fisik asli. Kemudian, modifikasi tugas tulis dan kueri untuk tabel anak asli agar menulis ke dan mengkueri tabel induk, serta tambahkan kondisi filter partisi. Perintahnya adalah sebagai berikut:

      BEGIN;
      ALTER TABLE <source_table_name> RENAME TO <source_table_name_archive>;
      ALTER TABLE <target_table_name> RENAME TO <source_table_name>;
      COMMIT;
  5. Sesuaikan tugas operasi dan pemeliharaan (O&M).

Solusi 2: Migrasi cepat (tidak direkomendasikan)

Jika Anda dapat menerima jendela waktu perubahan yang lebih lama dan potensi kegagalan beberapa tugas baca-tulis, Anda dapat menggunakan sintaks REBUILD untuk migrasi. Prosesnya adalah sebagai berikut:

  1. Hentikan tugas impor data untuk tabel partisi fisik asli.

  2. Gunakan sintaks REBUILD untuk memigrasikan data yang ada. Untuk informasi selengkapnya, lihat Sintaks REBUILD.

  3. Modifikasi tugas impor dan mulai.

  4. Sesuaikan tugas kueri.

  5. Sesuaikan tugas O&M.

Migrasi tabel partisi

Konversi struktur tabel

Pernyataan untuk membuat tabel partisi logis berbeda dari pernyataan untuk membuat tabel partisi fisik dalam hal-hal berikut:

  • Tambahkan kata kunci LOGICAL ke pernyataan DDL dan tambahkan kendala NOT NULL untuk kunci partisi.

  • (Opsional) Tabel partisi fisik hanya mendukung satu kunci partisi, sedangkan tabel partisi logis mendukung hingga dua. Anda dapat menambahkan kunci partisi kedua jika diperlukan.

Pertimbangkan contoh berikut.

  • Buat 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;
  • Buat tabel partisi logis:

    • Pertahankan satu kunci partisi.

      CREATE TABLE user_profile_lp_1 (
          a TEXT,
          b TEXT,
          ds TEXT NOT NULL)
      LOGICAL PARTITION BY LIST (ds);
    • Ubah menjadi dua kunci partisi: tahun dan 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);

Pemetaan tabel

Tabel berikut menjelaskan pemetaan properti tabel dan partisi antara tabel partisi fisik dan tabel partisi logis.

Catatan

Jika tabel partisi fisik asli menggunakan tipe data non-waktu, seperti TEXT, untuk kunci partisinya dan memiliki manajemen partisi dinamis yang diaktifkan, pembersihan partisi otomatis (parameter partition_expiration_time) dan konversi otomatis ke penyimpanan dingin (parameter partition_keep_hot_window) tidak didukung setelah Anda mengonversi tabel tersebut menjadi tabel partisi logis.

Modul

Fitur

Tabel partisi fisik

Tabel partisi logis

Manajemen partisi dinamis untuk tabel induk

Aktifkan manajemen partisi dinamis

auto_partitioning_enable

Tidak berlaku.

Satuan waktu

auto_partitioning_time_unit

Tidak perlu konfigurasi terpisah. Hanya partisi berbasis waktu yang didukung.

Zona waktu

auto_partitioning_time_zone

Tidak berlaku.

Jumlah partisi yang dibuat sebelumnya

auto_partitioning_num_precreate

Tidak berlaku.

Jumlah partisi historis yang dipertahankan

auto_partitioning_num_retention

Pembersihan otomatis partisi kedaluwarsa diimplementasikan melalui parameter partition_expiration_time.

Jumlah partisi panas yang dipertahankan

auto_partitioning_num_hot

Konversi otomatis ke penyimpanan dingin untuk partisi kedaluwarsa diimplementasikan melalui parameter partition_keep_hot_window.

Waktu penjadwalan untuk manajemen partisi dinamis

auto_partitioning_schd_start_time

Tidak berlaku.

Format tanggal dan waktu tabel anak

auto_partitioning_time_format

Tidak berlaku.

Manajemen tabel anak/Subpartisi

Apakah akan mempertahankan partisi

keep_alive

keep_alive

Apakah akan menyimpan partisi di penyimpanan dingin/panas

storage_mode

storage_mode

Binary logging

Aktifkan binary logging untuk tabel induk

binlog_level

binlog_level

Siklus hidup binary logging untuk tabel induk

binlog_ttl

binlog_ttl

Kelola binary logging secara dinamis berdasarkan partisi

Tidak didukung.

partition_generate_binlog_window

Aktifkan binary logging untuk subpartisi

Diwariskan dari tabel induk. Tidak dapat dimodifikasi.

generate_binlog

Siklus hidup binary logging untuk subpartisi

Dapat dimodifikasi untuk tabel anak.

Diwariskan dari tabel induk. Tidak dapat dimodifikasi.

Indeks dan properti tabel lainnya

bitmap_columns untuk subpartisi

Dapat dimodifikasi untuk tabel anak.

Diwariskan dari tabel induk. Tidak dapat dimodifikasi.

dictionary_encoding_columns untuk subpartisi

Dapat dimodifikasi untuk tabel anak.

Diwariskan dari tabel induk. Tidak dapat dimodifikasi.

Properti tabel lainnya seperti orientasi dan table_group

Diwariskan dari tabel induk. Tidak dapat dimodifikasi.

Diwariskan dari tabel induk. Tidak dapat dimodifikasi.

Indeks lainnya seperti primary key, distribution_key, dan clustering_key

Diwariskan dari tabel induk. Tidak dapat dimodifikasi.

Diwariskan dari tabel induk. Tidak dapat dimodifikasi.

Migrasikan data yang ada

CLONE

Jika skema tabel tidak perlu diubah dan volume data sedang, Anda dapat menggunakan sintaks CLONE.

Catatan
  • Perintah ini secara otomatis membuat tabel partisi logis baru dan menyalin data dari tabel asli ke tabel baru. Skema tabel tetap identik. Tabel partisi fisik asli tidak dihapus.

  • Jika tabel asli memiliki tugas tulis real-time:

    • Sebelum menjalankan perintah CLONE, Anda harus menghentikan secara manual tugas tulis real-time tersebut.

    • Setelah operasi CLONE selesai, buat tugas tulis real-time baru untuk menulis data dari sumber data ke kedua tabel (lama dan baru). Hal ini memastikan bahwa data di kedua tabel tetap konsisten dan lengkap.

  • Setelah migrasi selesai, verifikasi secara menyeluruh data dan fitur dari kedua tabel partisi (lama dan baru). Setelah Anda menyesuaikan tugas impor, kueri, dan O&M, Anda dapat menghapus tabel partisi fisik asli.

Contoh:

CALL hg_clone_to_logical_partition('user_profile', 'user_profile_logical');

Jika Anda memigrasikan data dalam jumlah besar dan operasi diperkirakan memakan waktu lama, Anda dapat menggunakan perintah ASYNC untuk menjalankan tugas di latar belakang. Setelah perintah dikirimkan, query_id dari pernyataan CALL akan dikembalikan. Anda dapat menggunakan query_id ini untuk memeriksa status eksekusi tugas asinkron di Query Insight.

SET statement_timeout = 0;
ASYNC CALL hg_clone_to_logical_partition('user_profile', 'user_profile_logical');

Migrasi manual

Jika skema tabel perlu diubah, atau jika volume data besar dan beban migrasi tinggi, gunakan metode migrasi manual. Metode ini memberikan fleksibilitas lebih dalam mengontrol kecepatan migrasi.

Catatan
  • Dengan metode ini, Anda membuat secara manual tabel partisi logis baru dan menyalin data dari tabel asli ke tabel baru. Karena Anda membuat tabel secara manual, Anda memiliki fleksibilitas untuk mengoptimalkan properti tabel dan mengontrol kecepatan migrasi.

  • Jika tabel asli memiliki tugas tulis real-time:

    • Sebelum mengimpor data, Anda harus menghentikan secara manual tugas tulis real-time tersebut.

    • Setelah impor data selesai, buat tugas tulis real-time baru untuk menulis data dari sumber data ke kedua tabel (lama dan baru). Hal ini memastikan bahwa data di kedua tabel tetap konsisten dan lengkap.

  • Setelah migrasi selesai, verifikasi secara menyeluruh data dan fitur dari kedua tabel partisi (lama dan baru). Setelah Anda menyesuaikan tugas impor, kueri, dan O&M, Anda dapat menghapus tabel partisi fisik asli.

Langkah-langkah migrasi:

  1. Buat tabel.

    Untuk informasi lebih lanjut, lihat Buat Tabel Partisi Logis dalam topik ini.

  2. Impor data historis menggunakan prosedur tersimpan hg_insert_overwrite.

    CALL hg_insert_overwrite('logical_partition_table', '{20250601, 20250602}'::text[], 'SELECT * FROM tb');

Sintaks REBUILD (tidak direkomendasikan)

Jika Anda dapat menerima jendela waktu perubahan yang lebih lama dan potensi kegagalan beberapa tugas baca-tulis, Anda dapat menggunakan sintaks REBUILD untuk migrasi. Untuk informasi selengkapnya, lihat REBUILD (Beta).

Perhatikan hal berikut:

  • Saat Anda menggunakan fitur REBUILD untuk memigrasikan tabel partisi, nama tabel partisi logis baru sama dengan nama tabel asli. Tabel partisi fisik asli diubah namanya menjadi tmp_rebuild_old_<query_id>_<unique_id>_<table_name>.

  • Setelah migrasi selesai, Anda harus menyesuaikan tugas impor, kueri, dan O&M.

  • Sebelum penyesuaian selesai, tugas terkait mungkin gagal karena masalah kompatibilitas. Oleh karena itu, metode ini tidak direkomendasikan untuk memigrasikan tabel partisi.

Contoh:

-- Tambahkan kendala NOT NULL ke bidang partisi.
ASYNC REBUILD TABLE user_profile ALTER ds SET NOT NULL;

-- Konversi tabel partisi fisik menjadi tabel partisi logis dan pertahankan tabel partisi fisik asli.
ASYNC REBUILD TABLE user_profile WITH (keep_source) TO logical partition;

Adaptasi tugas impor

  • Jika tugas impor data untuk tabel partisi fisik asli mengimpor data ke tabel induk menggunakan Fixed Plan, Anda tidak perlu memodifikasi tugas tersebut.

  • Jika tugas impor data untuk tabel partisi fisik asli mengimpor data ke tabel anak, lakukan penyesuaian berikut:

    • Hapus pernyataan yang membuat tabel anak baru. Tabel partisi logis tidak memiliki tabel anak fisik dan tidak memerlukan pembuatan manual.

    • Dalam tugas impor, ubah nama tabel anak menjadi nama tabel induk dari tabel partisi logis.

Skenario 1: Tambahkan tabel anak atau subpartisi dan impor data

-- Tugas impor untuk tabel partisi fisik asli
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 impor untuk tabel partisi logis baru
INSERT INTO user_profile_lp_1 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';

Skenario 2: Segarkan data di tabel anak atau subpartisi

Catatan

Jika tabel partisi fisik asli menggunakan prosedur tersimpan hg_insert_overwrite untuk menyegarkan data di beberapa tabel anak sekaligus, Anda harus menyesuaikan tugas tersebut setelah migrasi. Pisahkan tugas berdasarkan partisi, jalankan tugas baru secara berurutan, dan gunakan sintaks INSERT OVERWRITE asli. Untuk informasi selengkapnya, lihat INSERT OVERWRITE.

-- Tugas segarkan untuk tabel partisi fisik asli (dengan membuat tabel sementara untuk mengimplementasikan INSERT OVERWRITE)
-- Buat tabel sementara dan impor data.
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';

-- Ubah nama tabel sementara dan sambungkan ke tabel induk.
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;

-- Tugas segarkan untuk tabel partisi fisik asli (menggunakan perintah hg_insert_overwrite)
CALL hg_insert_overwrite('user_profile' , '202505', $$SELECT a, b, mm FROM <source_table> WHERE ds='202505'$$);

-- Tugas segarkan untuk tabel partisi logis baru (menggunakan sintaks INSERT OVERWRITE asli)
INSERT OVERWRITE user_profile_lp_1 PARTITION (ds = '202505') SELECT a, b, ds FROM <source_table> WHERE ds='202505';

Adaptasi tugas kueri

  • Jika tugas kueri data untuk tabel partisi fisik asli mengkueri tabel induk, Anda tidak perlu memodifikasi tugas tersebut.

  • Jika tugas kueri data untuk tabel partisi fisik asli mengkueri tabel anak, ubah tugas tersebut untuk mengkueri tabel induk dan tambahkan kondisi filter partisi. Contohnya:

    -- Tugas kueri untuk tabel anak dari tabel partisi fisik asli
    SELECT * FROM user_profile_202504;
    
    -- Tugas kueri untuk tabel partisi logis
    SELECT * FROM user_profile_lp_1 WHERE ds = '202504';

Adaptasi tugas O&M

Tugas O&M harian juga mungkin berbeda antara tabel partisi fisik dan tabel partisi logis. Tabel berikut membandingkan beberapa skenario O&M umum.

Jenis kueri

Tabel partisi fisik

Tabel partisi logis

Deskripsi

Kueri DDL tabel induk

Fungsi hg_dump_script.

Tidak ada perbedaan.

Kueri properti tabel induk

Tabel sistem hologres.hg_table_properties.

Tidak ada perbedaan.

Kueri daftar partisi

Kueri semua tabel partisi anak.

Tabel sistem hologres.hg_list_logical_partition.

Berbeda.

Kueri properti partisi

Tabel sistem hologres.hg_table_properties.

Tabel sistem hologres.hg_logical_partitioned_table_properties.

Berbeda.

Kueri penyimpanan tabel induk

Tabel sistem hg_table_storage_status.

Tabel sistem hologres.hg_partition_file_status.

Berbeda.