All Products
Search
Document Center

PolarDB:Arsipkan data dalam format CSV atau ORC

Last Updated:Aug 11, 2026

Fitur Data Lifecycle Management (DLM) memungkinkan Anda mengarsipkan data dingin dari PolarStore ke penyimpanan OSS yang hemat biaya dalam format CSV atau ORC secara otomatis dan berkala, sehingga mengurangi biaya serta meningkatkan efisiensi.

Prasyarat

  • Kluster Anda harus menjalankan PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.34.1 atau lebih baru.

    Catatan
    • Lihat Query the engine version untuk memeriksa versi kluster Anda.

    • Jika kluster Anda menjalankan PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.11.1 atau lebih baru, fitur DLM tidak mencatat operasi dalam binary logs.

  • Anda harus mengaktifkan pengarsipan data dingin sebelum menggunakan kebijakan DLM.

    Catatan

    Jika pengarsipan data dingin tidak diaktifkan, sistem akan menampilkan error berikut:

    ERROR 8158 (HY000): [Data Lifecycle Management] DLM storage engine is not support. The value of polar_dlm_storage_mode is OFF.

Batasan

  • Fitur DLM hanya mendukung tabel partisi yang menggunakan metode partisi RANGE COLUMN dan tidak memiliki subpartisi.

  • Anda tidak dapat menggunakan fitur DLM pada tabel partisi yang memiliki global secondary index (GSI).

  • PolarDB for MySQL tidak mendukung modifikasi kebijakan DLM. Untuk melakukan perubahan, hapus kebijakan yang ada dan buat yang baru.

  • Jika sebuah tabel memiliki kebijakan DLM aktif, hindari operasi DDL yang menyebabkan ketidakkonsistenan antara tabel sumber dan tabel arsip, seperti menambah atau menghapus kolom atau mengubah tipe data kolom. Ketidakkonsistenan tersebut dapat membuat data arsip selanjutnya tidak dapat diparse. Sebelum melakukan operasi DDL ini, Anda harus menghapus kebijakan DLM. Untuk melanjutkan pengarsipan otomatis, buat kebijakan DLM baru dan tentukan nama baru untuk tabel arsip yang tidak boleh sama dengan nama tabel arsip yang pernah digunakan sebelumnya.

  • Kami merekomendasikan Anda menggunakan INTERVAL RANGE partitioning untuk memperluas partisi secara otomatis dan menggunakan fitur DLM untuk mengarsipkan data dari partisi yang jarang digunakan ke OSS.

    Catatan

    INTERVAL RANGE partitioning hanya didukung untuk kluster yang menjalankan PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.0 atau lebih baru.

  • Anda harus menentukan kebijakan DLM saat menjalankan pernyataan CREATE TABLE atau ALTER TABLE.

  • Pernyataan SHOW CREATE TABLE tidak menampilkan kebijakan DLM. Anda dapat melihat semua kebijakan DLM di tabel mysql.dlm_policies.

Perhatian

  • Setelah data dingin diarsipkan, tabel arsip di OSS bersifat read-only, dan performa kuerinya mungkin menurun. Anda harus melakukan pengujian terlebih dahulu untuk memastikan performa kueri memenuhi kebutuhan Anda.

  • Setelah partisi dari tabel partisi diarsipkan ke OSS, data dalam partisi yang diarsipkan menjadi read-only.

  • Tabel partisi hibrida mendukung Copy DDL dan INPLACE DDL untuk membuat atau menghapus indeks sekunder, tetapi tidak mendukung Instant DDL.

  • Backup tidak mencakup data yang diarsipkan ke OSS. Data di OSS tidak mendukung pemulihan pada titik waktu (point-in-time recovery).

Sintaks

Buat kebijakan DLM

  • Buat kebijakan DLM dengan CREATE TABLE

    CREATE TABLE [IF NOT EXISTS] tbl_name
        (create_definition,...)
        [table_options]
        [partition_options]
        [dlm_add_options]
    
    dlm_add_options:
        DLM ADD
            [(dlm_policy_definition [, dlm_policy_definition] ...)]
    
    dlm_policy_definition:
        POLICY policy_name
        [TIER TO TABLE/TIER TO PARTITION/TIER TO NONE]
        [ENGINE [=] engine_name]
        [STORAGE SCHEMA_NAME [=] storage_schema_name]
        [STORAGE TABLE_NAME [=] storage_table_name]
        [STORAGE [=] OSS]
        [READ ONLY]
        [COMMENT 'comment_string']
        [EXTRA_INFO 'extra_info']
        ON [(PARTITIONS OVER num)]           
  • Buat kebijakan DLM dengan ALTER TABLE

    ALTER TABLE tbl_name
        [alter_option [, alter_option] ...]
        [partition_options]
        [dlm_add_options]
    
    dlm_add_options:
        DLM ADD
            [(dlm_policy_definition [, dlm_policy_definition] ...)]
    
    dlm_policy_definition:
        POLICY policy_name
        [TIER TO TABLE/TIER TO PARTITION/TIER TO NONE]
        [ENGINE [=] engine_name]
        [STORAGE SCHEMA_NAME [=] storage_schema_name]
        [STORAGE TABLE_NAME [=] storage_table_name]
        [STORAGE [=] OSS]
        [READ ONLY]
        [COMMENT 'comment_string']
        [EXTRA_INFO 'extra_info']
        ON [(PARTITIONS OVER num)]      

Parameter kebijakan DLM

Parameter

Wajib

Deskripsi

tbl_name

Ya

Nama tabel.

policy_name

Ya

Nama kebijakan.

TIER TO TABLE

Ya

Mengarsipkan data ke tabel eksternal OSS.

Catatan

Hanya format CSV yang didukung untuk pengarsipan ke tabel eksternal OSS.

TIER TO PARTITION

Ya

Mengarsipkan partisi dalam format CSV, ORC, atau X-Engine, yaitu membuat tabel partisi hibrida.

Catatan
  • Untuk mengarsipkan partisi dari tabel partisi sebagai tabel partisi hibrida, kondisi berikut harus dipenuhi:

    • MySQL 8.0.2 dan versi minor adalah 8.0.2.2.34.1 atau lebih baru. Anda harus mengatur parameter loose_allow_create_hybrid_partition ke ON.

    • MySQL 8.0.2 dan versi minor lebih lama dari 8.0.2.2.34.1. Lakukan upgrade ke versi minor yang lebih baru.

  • Saat menggunakan fitur ini, pastikan jumlah total partisi dalam tabel partisi tidak melebihi 8.192.

TIER TO NONE

Ya

Menghapus data dingin alih-alih mengarsipkannya.

engine_name

Tidak

Mesin penyimpanan untuk data yang diarsipkan. Nilai yang valid: CSV, ORC, dan X-Engine.

storage_schema_name

Tidak

Saat mengarsipkan ke tabel, parameter ini menentukan database yang berisi tabel tersebut. Nilai default adalah database tabel sumber.

storage_table_name

Tidak

Saat mengarsipkan ke tabel, parameter ini menentukan nama tabel arsip. Nilai default adalah <source_table_name>_<current_dlm_policy_name>.

STORAGE [=] OSS

Tidak

Data yang diarsipkan disimpan di engine OSS. Ini adalah pengaturan default.

READ ONLY

Tidak

Data yang diarsipkan bersifat read-only. Ini adalah pengaturan default.

comment_string

Tidak

Komentar untuk kebijakan DLM.

extra_info

Tidak

Informasi OSS_FILE_FILTER untuk tabel OSS tujuan.

Catatan
  • Anda hanya dapat mengarsipkan partisi dari tabel partisi ke OSS jika kluster Anda menjalankan Edisi Perusahaan PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.25 atau lebih baru.

  • Parameter ini hanya berlaku jika tabel tujuan belum ada. Dalam kasus ini, sistem secara otomatis menghasilkan atribut FILE_FILTER berdasarkan nilai OSS_FILE_FILTER dalam parameter EXTRA_INFO dan menghasilkan data filter selama pengarsipan. Jika tabel tujuan sudah ada, file filter yang sudah ada akan digunakan.

Format EXTRA_INFO adalah {"oss_file_filter":"field_filter[,field_filter]"}, dengan field_filter menggunakan format berikut:

field_filter := field_name[:filter_type]
filter_type := bloom

ON (PARTITIONS OVER num)

Ya

Mengarsipkan data ketika jumlah partisi melebihi num.

Kelola kebijakan DLM

  • Aktifkan kebijakan DLM.

    ALTER TABLE table_name DLM ENABLE POLICY [(dlm_policy_name [, dlm_policy_name] ...)]
  • Nonaktifkan kebijakan DLM.

    ALTER TABLE table_name DLM DISABLE POLICY [(dlm_policy_name [, dlm_policy_name] ...)]
  • Hapus kebijakan DLM.

    ALTER TABLE table_name DLM DROP POLICY [(dlm_policy_name [, dlm_policy_name] ...)]

Dalam pernyataan di atas, table_name menentukan nama tabel, dan dlm_policy_name menentukan nama kebijakan yang akan dikelola. Anda dapat menentukan beberapa nama kebijakan.

Jalankan kebijakan DLM

  • Jalankan semua kebijakan DLM pada semua tabel di kluster saat ini.

    CALL dbms_dlm.execute_all_dlm_policies();
  • Jalankan kebijakan DLM pada tabel tertentu.

    CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');

    Dalam pernyataan di atas, database_name menentukan nama database, dan table_name menentukan nama tabel.

Anda dapat menggunakan fitur mysql event untuk menjalankan kebijakan DLM selama jendela pemeliharaan kluster Anda. Hal ini menghindari dampak terhadap performa database selama jam sibuk dan secara berkala memindahkan data yang telah kedaluwarsa untuk mengurangi biaya penyimpanan. Sintaks untuk membuat event tersebut adalah sebagai berikut:

CREATE
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [COMMENT 'comment']
    DO event_body;

schedule: {
  EVERY interval
  [STARTS timestamp [+ INTERVAL interval] ...]
}

interval:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

event_body: {
      CALL dbms_dlm.execute_all_dlm_policies();
    | CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');
}

Tabel berikut menjelaskan parameter-parameter tersebut.

Parameter

Wajib

Deskripsi

event_name

Ya

Nama event.

schedule

Ya

Waktu dan frekuensi event dijalankan.

comment

Tidak

Komentar untuk event.

event_body

Ya

Pernyataan yang dijalankan oleh event. Ini harus berupa pernyataan eksekusi kebijakan DLM.

Catatan
  • Jika Anda menentukan CALL dbms_dlm.execute_all_dlm_policies(), event tersebut akan menjalankan semua kebijakan DLM pada kluster. Oleh karena itu, Anda harus membuat satu event untuk setiap kluster.

  • Jika Anda menentukan CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');, event tersebut hanya akan menjalankan semua kebijakan DLM pada tabel tertentu. Oleh karena itu, Anda harus membuat event yang sesuai untuk setiap tabel yang memiliki kebijakan DLM untuk mengarsipkan datanya pada waktu tertentu.

interval

Ya

Interval eksekusi event.

timestamp

Ya

Waktu mulai menjalankan event.

database_name

Ya

Nama database.

table_name

Ya

Nama tabel.

Untuk informasi lebih lanjut tentang fitur MySQL EVENT, lihat dokumentasi resmi MySQL untuk event.

Untuk contoh penggunaan, lihat Archive cold data to OSS.

Contoh

Arsipkan data ke tabel eksternal OSS

  1. Buat kebijakan DLM

    Contoh berikut membuat tabel partisi bernama sales. Tabel ini menggunakan kolom order_time sebagai kunci partisi dan dipartisi berdasarkan interval waktu. Tabel ini memiliki kebijakan INTERVAL dan kebijakan DLM:

    • Kebijakan INTERVAL: Saat data yang dimasukkan berada di luar rentang partisi yang ada, partisi baru dibuat secara otomatis. Interval waktunya adalah satu tahun.

    • Kebijakan DLM: Tabel hanya menyimpan tiga partisi. Saat jumlah partisi melebihi tiga, kebijakan DLM dipicu dan melakukan salah satu tindakan berikut:

      • Jika tabel eksternal OSS sales_history belum ada, buat tabel eksternal OSS baru sales_history, dan dump data dingin ke tabel eksternal sales_history.

      • Jika tabel eksternal sales_history sudah ada, dan tabel sales_history berada di ruang OSS bawaan, data dingin langsung di-dump ke tabel eksternal sales_history.

    Catatan

    Membuat tabel partisi INTERVAL RANGE memiliki prasyarat. Untuk informasi lebih lanjut tentang penggunaan INTERVAL, lihat INTERVAL RANGE partitioning.

    1. Buat tabel sales dengan kebijakan DLM.

      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 test_policy TIER TO TABLE ENGINE=CSV STORAGE=OSS READ ONLY
      STORAGE TABLE_NAME = 'sales_history' EXTRA_INFO '{"oss_file_filter":"id,name:bloom"}' ON (PARTITIONS OVER 3);

      Kebijakan DLM untuk tabel ini bernama test_policy. Saat jumlah partisi melebihi tiga, data dingin dari tabel sumber diarsipkan ke OSS dalam format CSV. Tabel arsip bernama sales_history dan bersifat read-only. Jika tabel OSS tujuan belum ada, sistem secara otomatis membuatnya dan menambahkan OSS_FILE_FILTER pada kolom id dan name.

    2. Kebijakan DLM untuk tabel saat ini disimpan di tabel sistem mysql.dlm_policies. Anda dapat melihat detail kebijakan DLM di tabel ini. Untuk detail tentang tabel mysql.dlm_policies, lihat Schema Description. Lihat skema tabel mysql.dlm_policies.

      mysql> SELECT * FROM mysql.dlm_policies\G

      Hasil berikut dikembalikan:

      *************************** 1. row ***************************
                         Id: 3
               Table_schema: test
                 Table_name: sales
                Policy_name: test_policy
                Policy_type: TABLE
               Archive_type: PARTITION COUNT
               Storage_mode: READ ONLY
             Storage_engine: CSV
              Storage_media: OSS
        Storage_schema_name: test
         Storage_table_name: sales_history
            Data_compressed: OFF
       Compressed_algorithm: NULL
                    Enabled: ENABLED
            Priority_number: 10300
      Tier_partition_number: 3
             Tier_condition: NULL
                 Extra_info: {"oss_file_filter": "id,name:bloom,order_time"}
                    Comment: NULL
      1 row in set (0.03 sec)      

      Saat ini, tabel sales memiliki tiga partisi, sehingga belum ada data yang diarsipkan.

    3. Masukkan 3.000 baris data uji ke tabel partisi sales. Memasukkan data di luar rentang partisi yang ada memicu kebijakan INTERVAL untuk membuat partisi baru secara otomatis.

      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');
    4. Kebijakan INTERVAL secara otomatis membuat partisi baru, meningkatkan jumlah partisi tabel sales. Skema tabel sekarang:

      mysql> 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
      /*!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) */
      1 row in set (0.03 sec)

      Tabel sekarang memiliki lebih dari tiga partisi, yang memenuhi kondisi eksekusi kebijakan DLM. Pengarsipan data sekarang dapat dilanjutkan.

  2. Jalankan kebijakan DLM

    1. Anda dapat menjalankan kebijakan DLM langsung dengan pernyataan SQL atau menjadwalkan eksekusi berkala menggunakan fitur MySQL EVENT. Misalnya, jika jendela pemeliharaan kluster Anda dimulai pukul 01.00 setiap hari mulai 11 Oktober 2022, Anda dapat membuat event berikut untuk menjalankan kebijakan DLM setiap hari pukul 01.00:

      CREATE EVENT dlm_system_base_event
             ON SCHEDULE EVERY 1 DAY
          STARTS '2022-10-11 01:00:00'
          do CALL 
      dbms_dlm.execute_all_dlm_policies();

      Setelah pukul 01.00, event ini menjalankan semua kebijakan DLM pada semua tabel.

    2. Jalankan perintah berikut untuk melihat skema tabel sales:

      mysql> 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
      /*!50500 PARTITION BY RANGE  COLUMNS(order_time) */ 
      /*!99990 800020200 INTERVAL(YEAR, 1) */
      /*!50500 (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) */
      1 row in set (0.03 sec)

      Tabel sekarang hanya menyimpan tiga partisi.

    3. Anda dapat melihat catatan eksekusi kebijakan DLM di tabel mysql.dlm_progress. Untuk informasi tentang skema tabel dlm_progress, lihat System table schemas. Jalankan perintah berikut untuk melihat informasi di tabel mysql.dlm_progress :

      mysql> SELECT * FROM mysql.dlm_progress\G

      Hasil berikut dikembalikan:

      *************************** 1. row ***************************;
                        Id: 1
              Table_schema: test
                Table_name: sales
               Policy_name: test_policy
               Policy_type: TABLE
            Archive_option: PARTITIONS OVER 3
            Storage_engine: CSV
             Storage_media: OSS
           Data_compressed: OFF
      Compressed_algorithm: NULL
        Archive_partitions: p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, _p20250101000000
             Archive_stage: ARCHIVE_COMPLETE
        Archive_percentage: 0
        Archived_file_info: null
                Start_time: 2024-07-26 17:56:20
                  End_time: 2024-07-26 17:56:50
                Extra_info: null
      1 row in set (0.00 sec)

      Partisi yang menyimpan data dingin yang jarang diakses, termasuk p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000, telah diarsipkan ke tabel eksternal OSS.

    4. Jalankan perintah berikut untuk melihat skema tabel eksternal OSS:

      mysql> SHOW CREATE TABLE sales_history\G

      Hasil berikut dikembalikan:

      *************************** 1. row ***************************;
             Table: sales_history
      Create Table: CREATE TABLE `sales_history` (
        `id` int(11) DEFAULT NULL,
        `name` varchar(20) DEFAULT NULL,
        `order_time` datetime DEFAULT NULL,
         PRIMARY KEY (`order_time`)
      ) /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */ /*!99990 800020224 OSS_FILE_FILTER='id,name:bloom,order_time' */
      1 row in set (0.15 sec)

      Tabel sekarang merupakan tabel CSV dengan datanya disimpan di OSS. Anda dapat mengkuerinya seperti tabel lokal. Sistem menambahkan kolom yang ditentukan ke OSS_FILE_FILTER. Karena order_time adalah kunci partisi, OSS_FILE_FILTER juga dibuat secara otomatis untuknya.

    5. Kueri data di tabel sales dan sales_history masing-masing.

      SELECT COUNT(*) FROM sales;
      +----------+
      | count(*) |
      +----------+
      |      984 |
      +----------+
      1 row in set (0.01 sec)
      
      SELECT COUNT(*) FROM sales_history;
      +----------+
      | count(*) |
      +----------+
      |     2016 |
      +----------+
      1 row in set (0.57 sec)           

      Jumlah total baris adalah 3.000, yang sesuai dengan jumlah data yang awalnya dimasukkan ke tabel sales.

    6. Kueri tabel eksternal OSS menggunakan OSS_FILE_FILTER. Anda harus mengaktifkan switch OSS_FILE_FILTER terlebih dahulu.

      mysql> explain select * from sales_history where id = 9;
      +----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------------------------+
      | id | select_type | table         | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                                                       |
      +----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------------------------+
      |  1 | SIMPLE      | sales_history | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 2016 |    10.00 | Using where; With pushed engine condition (`test`.`sales_history`.`id` = 9) |
      +----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------------------------+
      1 row in set, 1 warning (0.59 sec)
      
      mysql>  select * from sales_history where id = 9;
      +------+----------------+---------------------+
      | id   | name           | order_time          |
      +------+----------------+---------------------+
      |    9 | 2531826@stiven | 2019-07-04 00:00:00 |
      +------+----------------+---------------------+
      1 row in set (0.19 sec)

Arsipkan partisi ke OSS

Arsipkan dalam format CSV

  1. Buat kebijakan DLM

    Contoh berikut membuat tabel partisi bernama sales. Tabel ini menggunakan kolom order_time sebagai kunci partisi dan dipartisi berdasarkan interval waktu. Tabel ini memiliki kebijakan INTERVAL dan kebijakan DLM:

    • Kebijakan INTERVAL: Saat data yang dimasukkan berada di luar rentang partisi yang ada, partisi baru dibuat secara otomatis. Interval waktunya adalah satu tahun.

    • Kebijakan DLM: Tabel hanya menyimpan tiga partisi. Saat jumlah partisi melebihi tiga, kebijakan DLM langsung mengarsipkan partisi yang lebih lama ke OSS.

    1. Buat tabel sales.

      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=CSV STORAGE=OSS READ ONLY ON (PARTITIONS OVER 3);

      Kebijakan DLM untuk tabel ini bernama policy_part2part. Saat jumlah partisi melebihi tiga, partisi yang lebih lama diarsipkan ke OSS.

    2. Lihat kebijakan DLM di tabel mysql.dlm_policies.

      SELECT * FROM mysql.dlm_policies\G

      Hasil berikut dikembalikan:

      *************************** 1. row ***************************
                         Id: 2
               Table_schema: test
                 Table_name: sales
                Policy_name: policy_part2part
                Policy_type: PARTITION
               Archive_type: PARTITION COUNT
               Storage_mode: READ ONLY
             Storage_engine: CSV
              Storage_media: OSS
        Storage_schema_name: NULL
         Storage_table_name: NULL
            Data_compressed: OFF
       Compressed_algorithm: NULL
                    Enabled: ENABLED
            Priority_number: 10300
      Tier_partition_number: 3
             Tier_condition: NULL
                 Extra_info: null
                    Comment: NULL
      1 row in set (0.03 sec)
    3. Gunakan prosedur tersimpan proc_batch_insert untuk memasukkan data uji ke tabel partisi sales guna memicu kebijakan INTERVAL untuk membuat partisi baru secara otomatis.

      CALL proc_batch_insert(1, 3000, 'sales');

      Hasil berikut menunjukkan bahwa data berhasil dimasukkan:

      Query OK, 1 row affected, 1 warning (0.99 sec)
    4. Jalankan perintah berikut untuk melihat skema tabel sales:

      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 DEFAULT 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) */
      1 row in set (0.03 sec)
  2. Jalankan kebijakan DLM

    1. Jalankan perintah berikut untuk menjalankan kebijakan DLM:

      CALL dbms_dlm.execute_all_dlm_policies();
    2. Lihat catatan eksekusi DLM di tabel mysql.dlm_progress.

      SELECT * FROM mysql.dlm_progress \G

      Hasil berikut dikembalikan:

      *************************** 1. row ***************************
                        Id: 4
              Table_schema: test
                Table_name: sales
               Policy_name: policy_part2part
               Policy_type: PARTITION
            Archive_option: PARTITIONS OVER 3
            Storage_engine: CSV
             Storage_media: OSS
           Data_compressed: OFF
      Compressed_algorithm: NULL
        Archive_partitions: p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, _p20250101000000
             Archive_stage: ARCHIVE_COMPLETE
        Archive_percentage: 100
        Archived_file_info: null
                Start_time: 2023-09-11 18:04:39
                  End_time: 2023-09-11 18:04:40
                Extra_info: null
      1 row in set (0.02 sec)
    3. Jalankan perintah berikut untuk melihat skema tabel sales:

      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 DEFAULT NULL,
         PRIMARY KEY (`order_time`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci CONNECTION='default_oss_server'
      /*!99990 800020205 PARTITION BY RANGE  COLUMNS(order_time) */ /*!99990 800020200 INTERVAL(YEAR, 1) */
      /*!99990 800020205 (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = CSV,
       PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = CSV,
       PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = CSV,
       PARTITION _p20230101000000 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = CSV,
       PARTITION _p20240101000000 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = CSV,
       PARTITION _p20250101000000 VALUES LESS THAN ('2025-01-01 00:00:00') ENGINE = CSV,
       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) */
      1 row in set (0.03 sec)

      Informasi skema menunjukkan bahwa partisi p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000 dari tabel partisi sales telah diarsipkan ke OSS. Hanya tiga partisi data panas _p20260101000000, _p20270101000000, dan _p20280101000000 yang tersisa di engine InnoDB. Tabel sales sekarang merupakan tabel partisi hibrida. Untuk informasi tentang cara mengkueri data di tabel partisi hibrida, lihat Query a hybrid partitioned table.

Arsipkan dalam format ORC

  1. Buat kebijakan DLM

    Contoh berikut membuat tabel partisi sales_orc yang menggunakan kolom order_time sebagai kunci partisi dan mempartisi data berdasarkan interval waktu. Tabel ini memiliki kebijakan INTERVAL dan DLM:

    • Kebijakan INTERVAL: Saat data yang dimasukkan melebihi rentang partisi, partisi baru dibuat secara otomatis dengan interval 1 tahun.

    • Kebijakan DLM: Saat tabel memiliki lebih dari 3 partisi, kebijakan DLM mengarsipkan partisi lama dalam format ORC ke OSS. Tabel menjadi tabel partisi hibrida.

    Buat tabel sales_orc dengan kebijakan DLM yang menggunakan TIER TO PARTITION ENGINE=ORC untuk mengarsipkan partisi lama ke OSS.

    CREATE TABLE `sales_orc` (
      `id` int DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `order_time` datetime NOT NULL,
       PRIMARY KEY (`order_time`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    -- Create RANGE COLUMN partitions on order_time with a 1-year INTERVAL (automatic partition creation)
    PARTITION BY RANGE  COLUMNS(order_time) INTERVAL(YEAR, 1)
    -- Pre-create 3 initial partitions that hold data before 2020 / 2021 / 2022
    (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 policy: when the partition count exceeds 3, archive old partitions in ORC format to OSS
    -- TIER TO PARTITION: partition-level archiving. The table becomes a hybrid partitioned table
    --                    (hot InnoDB partitions coexist with cold ORC partitions)
    DLM ADD POLICY policy_orc TIER TO PARTITION ENGINE=ORC STORAGE=OSS READ ONLY
    ON (PARTITIONS OVER 3);

    Kebijakan DLM bernama policy_orc. Saat jumlah partisi melebihi 3, partisi lama diarsipkan dalam format ORC ke OSS. Tabel menjadi tabel partisi hibrida yang berisi partisi InnoDB panas dan partisi ORC dingin.

  2. Jalankan kebijakan DLM

    Masukkan data uji ke tabel partisi sales_orc untuk memicu INTERVAL membuat partisi baru secara otomatis sehingga jumlah partisi melebihi 3 dan kondisi kebijakan DLM terpenuhi.

    CALL proc_batch_insert(1, 3000, 'sales_orc');

    Jalankan kebijakan DLM:

    CALL dbms_dlm.execute_all_dlm_policies();
  3. Lihat hasil pengarsipan

    Jalankan perintah berikut untuk melihat catatan eksekusi kebijakan DLM di tabel mysql.dlm_progress:

    SELECT * FROM mysql.dlm_progress\G

    Partisi yang menyimpan data dingin yang jarang diakses telah diarsipkan ke OSS. Jalankan perintah berikut untuk melihat skema tabel sales_orc:

    SHOW CREATE TABLE sales_orc\G

    Hasilnya sebagai berikut:

    *************************** 1. row ***************************
           Table: sales_orc
    CREATE TABLE `sales_orc` (
      `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 800020223 OSS META=1 */ CONNECTION='default_oss_server'
    /*!99990 800020205 PARTITION BY RANGE  COLUMNS(order_time) */ /*!99990 800020200 INTERVAL(YEAR, 1) */
    /*!99990 800020205 (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = ORC,
     PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = ORC,
     PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = ORC,
     PARTITION _p20230101000000 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = ORC,
     PARTITION _p20240101000000 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = ORC,
     PARTITION _p20250101000000 VALUES LESS THAN ('2025-01-01 00:00:00') ENGINE = ORC,
     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) */
    1 row in set (0.03 sec)

    Seperti yang ditunjukkan dalam hasil kueri, partisi p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000 dari tabel partisi sales_orc telah diarsipkan ke OSS. Hanya tiga partisi data panas _p20260101000000, _p20270101000000, dan _p20280101000000 yang tersisa di engine InnoDB. Tabel sales_orc sekarang merupakan tabel partisi hibrida. Untuk informasi tentang cara mengkueri data di tabel partisi hibrida, lihat Query a hybrid partitioned table.

Hapus data dingin secara langsung

  1. Buat kebijakan DLM

    Contoh berikut membuat tabel partisi bernama sales. Tabel ini menggunakan kolom order_time sebagai kunci partisi dan dipartisi berdasarkan interval waktu. Tabel ini memiliki dua kebijakan: INTERVAL dan DLM:

    • Kebijakan INTERVAL: Saat data yang dimasukkan berada di luar rentang partisi yang sudah ada, partisi baru akan dibuat secara otomatis. Interval waktunya adalah satu tahun.

    • Kebijakan DLM: Tabel hanya menyimpan tiga partisi. Jika jumlah partisi melebihi tiga, kebijakan DLM akan dipicu untuk menghapus data dingin secara langsung.

    1. Buat tabel sales dengan kebijakan DLM.

      CREATE TABLE `sales` (
        `id` int DEFAULT NULL,
        `name` varchar(20) DEFAULT NULL,
        `order_time` datetime DEFAULT 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 test_policy TIER TO NONE ON (PARTITIONS OVER 3);

      Kebijakan DLM untuk tabel ini bernama test_policy, dan dijalankan ketika jumlah partisi melebihi tiga. Saat kebijakan ini dijalankan, data dingin akan dihapus secara langsung.

    2. Jalankan perintah berikut untuk melihat tabel mysql.dlm_policies:

      SELECT * FROM mysql.dlm_policies\G

      Hasil berikut dikembalikan:

      *************************** 1. row ***************************
                         Id: 4
               Table_schema: test
                 Table_name: sales
                Policy_name: test_policy
                Policy_type: NONE
               Archive_type: PARTITION COUNT
               Storage_mode: NULL
             Storage_engine: NULL
              Storage_media: NULL
        Storage_schema_name: NULL
         Storage_table_name: NULL
            Data_compressed: OFF
       Compressed_algorithm: NULL
                    Enabled: ENABLED
            Priority_number: 50000
      Tier_partition_number: 3
             Tier_condition: NULL
                 Extra_info: null
                    Comment: NULL
      1 row in set (0.01 sec)
    3. Masukkan data uji ke dalam tabel partisi sales untuk memicu kebijakan INTERVAL agar secara otomatis membuat partisi baru. Gunakan prosedur tersimpan proc_batch_insert untuk memasukkan data baru tersebut.

      CALL proc_batch_insert(1, 3000, 'sales');
      Query OK, 1 row affected, 1 warning (0.99 sec)
    4. Jalankan perintah berikut untuk melihat skema tabel sales:

      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 DEFAULT 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) */
      1 row in set (0.03 sec)
  2. Jalankan kebijakan DLM

    1. Jalankan perintah berikut untuk menjalankan kebijakan DLM secara langsung:

      CALL dbms_dlm.execute_all_dlm_policies();
    2. Saat kebijakan DLM sedang dijalankan, lihat data dalam tabel mysql.dlm_progress.

      SELECT * FROM mysql.dlm_progress \G

      Hasil dalam tabel adalah sebagai berikut:

      *************************** 1. row ***************************
                        Id: 1
              Table_schema: test
                Table_name: sales
               Policy_name: test_policy
               Policy_type: NONE
            Archive_option: PARTITIONS OVER 3
            Storage_engine: NULL
             Storage_media: NULL
           Data_compressed: OFF
      Compressed_algorithm: NULL
        Archive_partitions: p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, _p20250101000000
             Archive_stage: ARCHIVE_COMPLETE
        Archive_percentage: 100
        Archived_file_info: null
                Start_time: 2023-01-09 17:31:24
                  End_time: 2023-01-09 17:31:24
                Extra_info: null
      1 row in set (0.03 sec)

      Partisi yang menyimpan data dingin yang jarang diakses, termasuk p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000, telah dihapus.

    3. Skema tabel sales sekarang adalah sebagai berikut:

      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 DEFAULT 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 _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) */
      1 row in set (0.02 sec)

Manage policies with ALTER TABLE

  • Buat kebijakan DLM menggunakan ALTER TABLE.

    ALTER TABLE t DLM ADD POLICY test_policy TIER TO TABLE ENGINE=CSV STORAGE=OSS READ ONLY
    STORAGE TABLE_NAME = 'sales_history' ON (PARTITIONS OVER 3);

    Kebijakan DLM untuk tabel t diberi nama test_policy. Kebijakan ini dijalankan ketika jumlah partisi melebihi tiga. Ketika kondisi ini terpenuhi, data dari partisi yang lebih lama pada tabel t diarsipkan ke OSS ke dalam tabel bernama sales_history.

  • Aktifkan kebijakan DLM test_policy pada tabel t.

    ALTER TABLE t DLM ENABLE POLICY test_policy;
  • Nonaktifkan kebijakan DLM test_policy pada tabel t.

    ALTER TABLE t DLM DISABLE POLICY test_policy;
  • Hapus kebijakan DLM test_policy dari tabel t.

    ALTER TABLE t DLM DROP POLICY test_policy;

Atasi kesalahan eksekusi

Konfigurasi yang salah dapat menyebabkan error saat kebijakan DLM dijalankan. Catatan error tersebut disimpan dalam tabel mysql.dlm_progress. Jalankan perintah berikut untuk melihatnya:

SELECT * FROM mysql.dlm_progress WHERE Archive_stage = "ARCHIVE_ERROR";

Periksa bidang Extra_info untuk detail error guna mengidentifikasi penyebabnya. Kemudian, hapus catatan tersebut atau ubah Archive_stage-nya menjadi ARCHIVE_COMPLETE. Terakhir, jalankan kembali kebijakan tersebut secara manual dengan perintah call dbms_dlm.execute_all_dlm_policies;, atau tunggu hingga eksekusi terjadwal berikutnya.

Catatan

Demi keamanan data, jika suatu kebijakan memiliki catatan eksekusi dalam status ARCHIVE_ERROR, kebijakan tersebut tidak akan dijalankan kembali secara otomatis. Anda harus mengidentifikasi penyebab kegagalan dan memodifikasi catatan tersebut sebelum kebijakan dapat dijalankan lagi.