All Products
Search
Document Center

PolarDB:Arsipkan tabel partisi ke X-Engine

Last Updated:Jun 11, 2026

Saat volume data dalam tabel partisi meningkat, data historis lama (cold data) mengonsumsi ruang penyimpanan secara signifikan dan meningkatkan biaya penyimpanan. Untuk mengurangi biaya sekaligus mempertahankan akses data, Anda dapat menggunakan kebijakan Data Lifecycle Management (DLM) guna mengarsipkan partisi lama secara otomatis ke format engine kompresi tinggi (X-Engine). Fitur ini memungkinkan pemisahan data hot dan warm di tingkat partisi: data hot tetap berada di partisi InnoDB berkinerja tinggi, sedangkan data warm yang diarsipkan ke X-Engine secara signifikan menurunkan biaya penyimpanan namun tetap mendukung operasi DML writes serta perubahan Online DDL.

Cara kerja

Fitur arsip partisi otomatis menggunakan kebijakan Data Lifecycle Management (DLM) yang Anda definisikan pada suatu tabel. Cara kerjanya sebagai berikut:

  1. Definisikan kebijakan: Anda dapat menentukan kebijakan DLM saat membuat tabel dengan CREATE TABLE atau memodifikasi tabel dengan ALTER TABLE. Inti kebijakan ini adalah kondisi yang menentukan kapan arsip dilakukan. Misalnya, jika jumlah partisi melebihi ambang batas, partisi terlama akan ditandai untuk diarsipkan.

  2. Picu eksekusi: Kebijakan tidak dipicu secara otomatis. Anda harus memulai tugas arsip dengan salah satu dari dua cara berikut:

    • Eksekusi manual: Panggil prosedur tersimpan sistem untuk segera mengeksekusi semua kebijakan DLM yang telah didefinisikan.

    • Eksekusi terjadwal: Buat EVENT untuk secara otomatis memanggil prosedur tersimpan dan mengeksekusi kebijakan sesuai jadwal yang telah ditentukan, misalnya setiap hari selama jam sepi.

  3. Lakukan arsip: Saat kebijakan dieksekusi, sistem mengidentifikasi partisi tabel yang memenuhi kondisi arsip dan mengubah mesin penyimpanannya dari InnoDB ke X-Engine secara online untuk menyelesaikan proses arsip.

Prasyarat

Sebelum menggunakan fitur ini, pastikan kluster Anda memenuhi persyaratan berikut:

  • Edisi: Cluster Edition.

  • Versi kernel:

    • Untuk arsip ke format X-Engine berbasis baris (row-based):

      • MySQL 8.0.2, versi revisi 8.0.2.2.34.1 atau lebih baru.

    • Untuk arsip ke format tabel kolom (columnar table) X-Engine:

      • MySQL 8.0.2, versi revisi 8.0.2.2.34.1 atau lebih baru.

Konfigurasi dan lakukan arsip partisi

Bagian ini memandu Anda melalui pembuatan, eksekusi, dan verifikasi kebijakan arsip.

Ikhtisar proses

  1. Buat kebijakan arsip DLM: Tentukan aturan arsip pada tabel partisi target.

  2. Eksekusi kebijakan arsip DLM: Picu proses arsip secara manual atau melalui tugas terjadwal.

  3. Lihat status dan hasil arsip: Verifikasi bahwa partisi telah berhasil dikonversi ke engine X-Engine.

Langkah 1: Buat kebijakan arsip DLM

Anda dapat menentukan kebijakan arsip saat membuat tabel partisi atau menambahkannya ke tabel yang sudah ada.

  • Metode 1: Definisikan kebijakan saat membuat tabel baru

    Gunakan klausa DLM ADD POLICY di akhir pernyataan CREATE TABLE. Contoh berikut membuat tabel sales yang menggunakan kolom order_time sebagai kunci partisi. Tabel ini memiliki dua kebijakan: kebijakan INTERVAL dan kebijakan DLM.

    • Kebijakan INTERVAL: Secara otomatis membuat partisi baru untuk interval satu tahun ketika data yang dimasukkan berada di luar rentang partisi yang ada.

    • Kebijakan DLM: Menentukan kebijakan bernama policy_part2part. Kebijakan ini menyatakan bahwa ketika jumlah total partisi melebihi tiga, partisi terlama akan ditandai untuk diarsipkan ke X-Engine.

    CREATE TABLE `sales` (
      `id` int DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `order_time` datetime NOT NULL,
      primary key (order_time)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    PARTITION BY RANGE  COLUMNS(order_time) INTERVAL(YEAR, 1)
    (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = InnoDB)
    DLM ADD POLICY policy_part2part TIER TO PARTITION ENGINE=XENGINE READ WRITE ON (PARTITIONS OVER 3);
  • Metode 2: Tambahkan kebijakan ke tabel yang sudah ada

    Gunakan pernyataan ALTER TABLE untuk menambahkan kebijakan DLM ke tabel partisi yang sudah ada. Untuk informasi lebih lanjut, lihat Buat atau hapus kebijakan DLM dalam ALTER TABLE.

    ALTER TABLE sales
    DLM ADD POLICY policy_part2part TIER TO PARTITION ENGINE=XENGINE ON (PARTITIONS OVER 3);

    Penjelasan sintaksis: ON (PARTITIONS OVER N) merupakan inti kebijakan, di mana N adalah jumlah partisi terbaru yang dipertahankan dalam engine InnoDB. Ketika jumlah total partisi melebihi N, partisi terlama di luar jumlah tersebut akan ditandai untuk diarsipkan.

Masukkan data uji

  1. Gunakan prosedur tersimpan proc_batch_insert untuk memasukkan data uji ke tabel partisi sales. Hal ini memicu kebijakan INTERVAL untuk secara otomatis membuat partisi baru.

    DROP PROCEDURE IF EXISTS proc_batch_insert;
    delimiter $$
    CREATE PROCEDURE proc_batch_insert(IN begin INT, IN end INT, IN name VARCHAR(20))
    BEGIN
    SET @insert_stmt = concat('INSERT INTO ', name, ' VALUES(? , ?, ?);');
    PREPARE stmt from @insert_stmt;
    WHILE begin <= end DO
    SET @ID1 = begin;
    SET @NAME = CONCAT(begin+begin*281313, '@stiven');
    SET @TIME = from_days(begin + 737600);
    EXECUTE stmt using @ID1, @NAME, @TIME;
    SET begin = begin + 1;
    END WHILE;
    END;
    $$
    delimiter ;
    
    CALL proc_batch_insert(1, 3000, 'sales');

    Hasil berikut menunjukkan bahwa data berhasil dimasukkan:

    Query OK, 1 row affected (0.50 sec)
  2. Jalankan perintah berikut untuk melihat struktur tabel sales.

    SHOW CREATE TABLE sales \G

    Output menunjukkan struktur tabel, di mana semua partisi saat ini menggunakan engine InnoDB.

    mysql> SHOW CREATE TABLE sales \G
    *************************** 1. row ***************************
           Table: sales
    Create Table: CREATE TABLE `sales` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `order_time` datetime NOT NULL,
      PRIMARY KEY (`order_time`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    /*!50500 PARTITION BY RANGE  COLUMNS(order_time) */ /*!99990 800020200 INTERVAL(YEAR, 1) */
    /*!50500 (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20230101000000 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20240101000000 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20250101000000 VALUES LESS THAN ('2025-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20260101000000 VALUES LESS THAN ('2026-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20270101000000 VALUES LESS THAN ('2027-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20280101000000 VALUES LESS THAN ('2028-01-01 00:00:00') ENGINE = InnoDB) */

Langkah 2: Eksekusi kebijakan arsip DLM

Picu kebijakan arsip yang telah didefinisikan untuk memulai proses konversi engine partisi. Anda dapat memilih untuk mengeksekusinya secara manual atau mengatur tugas terjadwal sesuai kebutuhan bisnis Anda.

  • Metode 1: Eksekusi terjadwal (Direkomendasikan): Untuk lingkungan produksi yang memerlukan arsip data rutin, kami merekomendasikan penggunaan fitur EVENT MySQL untuk menjalankan tugas secara otomatis selama jam sepi, misalnya dini hari. Pendekatan ini mengotomatiskan tugas tersebut.

    Contoh berikut membuat event yang dimulai pada 2026-02-01 dan dijalankan setiap hari pukul 01.00 untuk mengeksekusi semua kebijakan DLM.

    CREATE EVENT dlm_system_base_event
           ON SCHEDULE EVERY 1 DAY
        STARTS '2026-02-01 01:00:00'
        do CALL 
    dbms_dlm.execute_all_dlm_policies();
  • Metode 2: Eksekusi manual: Metode ini cocok untuk tugas arsip satu kali atau untuk mencoba ulang tugas secara manual setelah troubleshooting.

    Panggil prosedur tersimpan berikut untuk segera memicu semua kebijakan DLM yang telah didefinisikan.

    CALL dbms_dlm.execute_all_dlm_policies();

Langkah 3: Lihat status dan hasil arsip

Monitor progres tugas arsip. Setelah tugas selesai, verifikasi bahwa engine partisi telah berubah.

  1. Lihat definisi kebijakan

    Kueri tabel sistem mysql.dlm_policies untuk memastikan kebijakan telah dibuat.

    SELECT * FROM mysql.dlm_policies WHERE Table_schema = 'your_database' AND Table_name = 'sales'\G

    Hasil berikut dikembalikan:

    *************************** 1. row ***************************
                       Id: 1
             Table_schema: your_database
               Table_name: sales
              Policy_name: policy_part2part
              Policy_type: PARTITION
             Archive_type: PARTITION COUNT
             Storage_mode: READ WRITE
           Storage_engine: XENGINE
            Storage_media: DISK
      Storage_schema_name: NULL
       Storage_table_name: NULL
          Data_compressed: ON
     Compressed_algorithm: Zstandard
                  Enabled: ENABLED
          Priority_number: 200
    Tier_partition_number: 3
           Tier_condition: NULL
               Extra_info: {"oss_file_filter": "order_time"}
                  Comment: NULL

    Penjelasan bidang utama:

    Bidang

    Deskripsi

    Table_schema, Table_name

    Database dan tabel tempat kebijakan diterapkan.

    Policy_name

    Nama kustom kebijakan.

    Storage_engine

    Engine penyimpanan target untuk partisi yang diarsipkan. Pada contoh ini, nilainya adalah XENGINE.

    Tier_partition_number

    Kebijakan menentukan jumlah partisi InnoDB yang dipertahankan. Ini adalah nilai N dalam PARTITIONS OVER N.

  2. Lihat progres eksekusi

    Selama atau setelah eksekusi kebijakan, Anda dapat mengkueri tabel sistem mysql.dlm_progress untuk melacak status tugas.

    SELECT * FROM mysql.dlm_progress WHERE Table_schema = 'your_database' AND Table_name = 'sales' ORDER BY Id DESC LIMIT 1\G

    Hasil berikut dikembalikan:

    *************************** 1. row ***************************
                      Id: 1
            Table_schema: your_database
              Table_name: sales
             Policy_name: policy_part2part
             Policy_type: PARTITION
          Archive_option: PARTITIONS OVER 3
          Storage_engine: XENGINE
           Storage_media: DISK
         Data_compressed: ON
    Compressed_algorithm: Zstandard
      Archive_partitions: p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, _p20250101000000
           Archive_stage: ARCHIVE_COMPLETE
      Archive_percentage: 100
      Archived_file_info: null
              Start_time: 2026-02-06 10:50:00
                End_time: 2026-02-06 10:50:00
              Extra_info: null

    Penjelasan bidang utama:

    Bidang

    Deskripsi

    Archive_partitions

    Partisi yang diarsipkan dalam tugas ini.

    Archive_stage

    Status saat ini dari tugas arsip. ARCHIVE_COMPLETE menunjukkan keberhasilan, dan ARCHIVE_ERROR menunjukkan kegagalan.

    Archive_percentage

    Presentase penyelesaian tugas.

    Start_time, End_time

    Waktu mulai dan selesai tugas.

    Extra_info

    Informasi tambahan. Jika Archive_stage bernilai ARCHIVE_ERROR, bidang ini berisi detail error.

  3. Verifikasi struktur tabel

    Setelah tugas arsip selesai, gunakan perintah SHOW CREATE TABLE untuk melihat struktur tabel dan memastikan bahwa ENGINE partisi yang diarsipkan telah berubah menjadi XENGINE.

    SHOW CREATE TABLE sales\G

    Hasil berikut dikembalikan:

    *************************** 1. row ***************************
           Table: sales
    Create Table: CREATE TABLE `sales` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `order_time` datetime NOT NULL,
      PRIMARY KEY (`order_time`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    /*!99990 800020216 PARTITION BY RANGE  COLUMNS(order_time) */ /*!99990 800020200 INTERVAL(YEAR, 1) */
    /*!99990 800020216 (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION _p20230101000000 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION _p20240101000000 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION _p20250101000000 VALUES LESS THAN ('2025-01-01 00:00:00') ENGINE = XENGINE,
     PARTITION _p20260101000000 VALUES LESS THAN ('2026-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20270101000000 VALUES LESS THAN ('2027-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION _p20280101000000 VALUES LESS THAN ('2028-01-01 00:00:00') ENGINE = InnoDB) */

Pertimbangan untuk lingkungan produksi

  • Desain kebijakan: Pilih nilai N yang sesuai dalam PARTITIONS OVER N berdasarkan skenario bisnis Anda. Misalnya, untuk data pesanan, Anda mungkin ingin menyimpan data enam bulan terakhir di partisi InnoDB untuk memastikan kinerja kueri. Untuk data log, Anda mungkin hanya perlu menyimpan data 30 hari terakhir.

  • Monitoring dan peringatan: Monitor bidang Archive_stage di tabel mysql.dlm_progress. Saat statusnya ARCHIVE_ERROR, picu peringatan segera untuk intervensi tepat waktu.