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:
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.
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).
Verifikasi tabel partisi logis baru.
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;
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:
Hentikan tugas impor data untuk tabel partisi fisik asli.
Gunakan sintaks REBUILD untuk memigrasikan data yang ada. Untuk informasi selengkapnya, lihat Sintaks REBUILD.
Modifikasi tugas impor dan mulai.
Sesuaikan tugas kueri.
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.
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.
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.
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:
Buat tabel.
Untuk informasi lebih lanjut, lihat Buat Tabel Partisi Logis dalam topik ini.
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
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 | Tidak ada perbedaan. | |
Kueri properti tabel induk | Tabel sistem | Tidak ada perbedaan. | |
Kueri daftar partisi | Tabel sistem | Berbeda. | |
Kueri properti partisi | Tabel sistem | Tabel sistem | Berbeda. |
Kueri penyimpanan tabel induk | Tabel sistem | Tabel sistem | Berbeda. |