全部产品
Search
文档中心

PolarDB:Arsipkan tabel partisi dalam format CSV

更新时间:Feb 11, 2026

Fitur Data Lifecycle Management (DLM) secara otomatis mengarsipkan data dingin dengan memindahkan data yang jarang digunakan dari PolarStore ke Object Storage Service (OSS) berbiaya rendah secara berkala. Hal ini mengurangi biaya penyimpanan dan meningkatkan efisiensi database.

Penerapan

  • Kluster Anda harus menjalankan PolarDB for MySQL 8.0.2 dengan versi minor 8.0.2.2.9 atau lebih baru.

    Untuk memeriksa versi kluster Anda, lihat Kueri nomor versi.

    Catatan

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

  • Sebelum menggunakan kebijakan DLM, Anda harus terlebih dahulu mengaktifkan pengarsipan data dingin.

    Catatan

    Jika Anda tidak mengaktifkan pengarsipan data dingin, error berikut akan dilaporkan:

    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 mengandung 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 mengubah kebijakan, hapus kebijakan yang ada dan buat yang baru.

  • Jika kebijakan DLM sudah ada pada suatu tabel, jangan lakukan operasi Data Definition Language (DDL) yang menyebabkan skema tabel arsip dan tabel sumber menjadi tidak konsisten. Contohnya termasuk menambah atau menghapus kolom serta mengubah tipe kolom. Operasi semacam itu dapat mencegah data yang diarsipkan selanjutnya untuk diurai. Sebelum melakukan operasi DDL tersebut, hapus kebijakan DLM dari tabel tersebut. Untuk menggunakan pengarsipan data otomatis di kemudian hari, buat kebijakan DLM baru dan tentukan nama tabel arsip yang berbeda dari semua nama yang pernah digunakan sebelumnya.

  • Kami merekomendasikan penggunaan fitur interval range partitioning untuk memperluas partisi secara otomatis. Secara bersamaan, gunakan fitur DLM untuk mengarsipkan data dari partisi yang jarang digunakan ke OSS.

    Catatan

    Hanya kluster yang menjalankan PolarDB for MySQL 8.0.2 dengan versi minor 8.0.2.2.0 atau lebih baru yang mendukung interval range partitioning.

  • Tentukan fitur DLM saat Anda menggunakan CREATE TABLE atau ALTER TABLE.

  • Kebijakan DLM tidak ditampilkan saat Anda menjalankan SHOW CREATE TABLE. Anda dapat melihat informasi semua kebijakan DLM pada tabel Anda di tabel mysql.dlm_policies.

Catatan

  • Setelah data dingin diarsipkan, tabel arsip di OSS bersifat read-only dan memiliki performa kueri yang buruk. Uji data yang diarsipkan terlebih dahulu untuk memastikan performa kueri memenuhi kebutuhan Anda.

  • Setelah suatu partisi dari tabel partisi diarsipkan ke OSS, data dalam partisi yang diarsipkan tersebut bersifat read-only. Anda tidak dapat melakukan operasi DDL pada tabel partisi tersebut.

  • Saat Anda melakukan operasi backup, data yang telah dipindahkan ke OSS tidak dibackup. Data di OSS tidak mendukung point-in-time restore (PITR).

Sintaksis

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

Arsipkan ke tabel.

TIER TO PARTITION

Ya

Arsipkan partisi ke OSS.

Catatan
  • Fitur ini sedang dalam rilis canary. Untuk menggunakan fitur ini, buka Quota Center, temukan kuota dengan ID polardb_mysql_hybrid_partition, lalu klik Request di kolom Actions untuk mengaktifkannya.

  • Anda hanya dapat mengarsipkan partisi dari tabel partisi di kluster yang menjalankan PolarDB for MySQL 8.0.2 dengan revisi 8.0.2.2.17 atau lebih baru ke OSS.

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

TIER TO NONE

Ya

Langsung menghapus data yang perlu diarsipkan.

engine_name

Tidak

Engine tempat data arsip disimpan. Saat ini, Anda hanya dapat mengarsipkan data ke Mesin penyimpanan CSV.

storage_schema_name

Tidak

Saat mengarsipkan ke tabel, ini adalah database tempat tabel tersebut berada. Nilai default-nya adalah database tabel saat ini.

storage_table_name

Tidak

Saat mengarsipkan ke tabel, ini adalah nama tabel tersebut. Anda dapat menentukan nama tabel. Nilai default-nya adalah <current_table_name>_<current_DLM_policy_name>.

STORAGE [=] OSS

Tidak

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

READ ONLY

Tidak

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

comment_string

Tidak

Komentar untuk kebijakan DLM.

extra_info

Tidak

Informasi OSS_FILE_FILTER pada tabel OSS tujuan.

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

  • Fitur ini hanya berlaku jika tabel tujuan belum ada. Dalam kasus ini, sistem menggunakan parameter OSS_FILE_FILTER dalam EXTRA_INFO untuk secara otomatis menghasilkan properti FILE_FILTER saat membuat tabel OSS tujuan. Fitur ini juga secara otomatis menghasilkan data filter selama proses pengarsipan. Jika tabel tujuan sudah ada, file filter yang ada akan digunakan.

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

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

ON (PARTITIONS OVER num)

Ya

Mengarsipkan data ketika jumlah partisi lebih besar dari num.

Modifikasi 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 perintah-perintah ini, table_name adalah nama tabel saat ini, dan dlm_policy_name adalah nama kebijakan yang akan dimodifikasi. Anda dapat menentukan beberapa nama kebijakan.

Jalankan kebijakan DLM

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

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

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

    Dalam perintah ini, database_name adalah nama database tempat tabel tersebut berada, dan table_name adalah nama tabel tersebut.

Anda dapat menggunakan fitur mysql event untuk menjalankan kebijakan DLM selama jendela O&M kluster Anda. Hal ini menghindari dampak terhadap performa database akibat menjalankan DLM selama jam sibuk bisnis dan memungkinkan Anda memindahkan data kedaluwarsa secara berkala untuk mengurangi biaya penyimpanan database. Sintaksis untuk menjalankan kebijakan DLM dengan EVENT adalah:

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 saat ini.

schedule

Ya

Waktu eksekusi dan interval untuk EVENT saat ini.

comment

Tidak

Komentar untuk EVENT saat ini.

event_body

Ya

Konten yang dieksekusi oleh EVENT saat ini. Atur ini ke pernyataan yang menjalankan kebijakan DLM.

Catatan
  • Saat Anda menggunakan CALL dbms_dlm.execute_all_dlm_policies(), EVENT saat ini menjalankan semua kebijakan DLM di kluster. Oleh karena itu, Anda perlu membuat satu EVENT per kluster.

  • Saat Anda menggunakan CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');, EVENT saat ini hanya menjalankan kebijakan DLM pada tabel tertentu. Oleh karena itu, Anda perlu membuat EVENT yang sesuai untuk setiap tabel dengan kebijakan DLM agar datanya diarsipkan pada waktu yang ditentukan.

interval

Ya

Interval eksekusi untuk EVENT.

timestamp

Ya

Waktu mulai eksekusi EVENT.

database_name

Ya

Nama database.

table_name

Ya

Nama tabel.

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

Untuk contoh penggunaan, lihat Contoh pengarsipan data dingin ke OSS.

Contoh

Arsipkan data dari tabel partisi 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 membagi partisi berdasarkan interval waktu. Tabel ini memiliki dua kebijakan: INTERVAL dan DLM.

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

    • Kebijakan DLM: Tabel ini didefinisikan hanya memiliki tiga partisi. Ketika jumlah partisi melebihi tiga dan kebijakan DLM dijalankan:

      • Jika tabel eksternal OSS sales_history belum ada, tabel eksternal OSS baru bernama sales_history dibuat, dan data dingin dipindahkan ke tabel eksternal sales_history.

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

    Catatan

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

    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 saat ini dipindahkan ke OSS dalam format CSV. Tabel arsip bernama sales_history dan bersifat read-only. Jika tabel OSS arsip belum ada, tabel OSS dibuat secara otomatis, dan OSS_FILE_FILTER dibuat 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 informasi lebih lanjut tentang tabel mysql.dlm_policies, lihat Deskripsi skema tabel. Lihat informasi 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 pengarsipan data belum dilakukan.

    3. Masukkan 3.000 catatan uji ke tabel partisi sales untuk memastikan data melebihi definisi partisi saat ini. Hal ini 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. Pada titik ini, kebijakan INTERVAL dipicu untuk membuat partisi baru secara otomatis. Hal ini meningkatkan jumlah partisi di tabel sales, dan skema tabel berubah menjadi:

      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)

      Partisi baru telah dibuat, dan jumlah partisi lebih dari tiga. Hal ini memenuhi kondisi eksekusi kebijakan DLM, sehingga data dapat diarsipkan.

  2. Jalankan kebijakan DLM

    1. Anda dapat menjalankan kebijakan DLM langsung dengan pernyataan SQL, atau menjalankannya secara berkala menggunakan fitur EVENT MySQL. Misalnya, asumsikan bahwa mulai 11 Oktober 2022, jendela O&M kluster Anda dimulai pukul 01.00 setiap hari. Kebijakan DLM kemudian akan berjalan setiap hari pukul 01.00. Buat EVENT eksekusi yang sesuai sebagai berikut:

      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 kebijakan DLM pada semua tabel.

    2. Jalankan perintah berikut untuk melihat informasi 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 memiliki tiga partisi yang tersisa.

    3. Anda dapat melihat catatan eksekusi kebijakan DLM di tabel mysql.dlm_progress. Untuk definisi tabel dlm_progress, lihat Deskripsi skema tabel. Jalankan perintah berikut untuk melihat informasi skema 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 digunakan, termasuk p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000, telah dipindahkan 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 menjadi tabel CSV dengan data yang disimpan di engine OSS. Metode kuerinya sama seperti tabel lokal. Kolom yang ditentukan telah ditambahkan ke OSS_FILE_FILTER. Karena order_time adalah kunci partisi, OSS_FILE_FILTER juga dibuat secara otomatis untuknya.

    5. Kueri data pada tabel sales dan sales_history secara terpisah.

      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)           

      Anda dapat melihat bahwa jumlah total catatan adalah 3.000, yang sesuai dengan jumlah data yang awalnya dimasukkan ke tabel sales.

    6. Kueri tabel eksternal OSS menggunakan OSS_FILE_FILTER (switch OSS_FILE_FILTER harus diaktifkan):

      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 dari tabel partisi ke OSS

  1. Buat kebijakan DLM

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

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

    • Kebijakan DLM: Tabel ini didefinisikan hanya memiliki tiga partisi. Saat jumlah partisi melebihi tiga, menjalankan kebijakan DLM langsung memindahkan 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 lama dipindahkan 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. Hal ini 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 informasi 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 kebijakan DLM dengan perintah berikut.

      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 informasi 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 tabel yang dikueri menunjukkan bahwa partisi p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000 di tabel partisi sales semuanya telah dipindahkan ke OSS. Hanya tiga partisi data panas _p20260101000000, _p20270101000000, dan _p20280101000000 yang tetap berada di engine InnoDB. Tabel sales telah menjadi tabel partisi hibrida. Untuk informasi tentang cara mengkueri data di tabel partisi hibrida, lihat Kueri partisi hibrida.

Langsung hapus data dingin

  1. Buat kebijakan DLM

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

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

    • Kebijakan DLM: Tabel ini didefinisikan hanya memiliki tiga partisi. Saat jumlah partisi melebihi tiga dan kebijakan DLM dijalankan, data dingin langsung dihapus.

    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 kondisi eksekusinya adalah jumlah partisi lebih dari tiga. Saat kebijakan DLM dijalankan, data dingin langsung dihapus.

    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 tabel partisi sales untuk memicu kebijakan INTERVAL membuat partisi baru secara otomatis. Gunakan prosedur tersimpan proc_batch_insert untuk memasukkan data baru. Skema tabel adalah sebagai berikut:

      CALL proc_batch_insert(1, 3000, 'sales');
      Query OK, 1 row affected, 1 warning (0.99 sec)
    4. Jalankan perintah berikut untuk melihat informasi 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 kebijakan DLM langsung dengan perintah berikut.

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

      SELECT * FROM mysql.dlm_progress \G

      Tabel menunjukkan hasil 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 digunakan, termasuk p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000, telah dihapus.

    3. Skema tabel sales 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)

Buat atau hapus kebijakan DLM dengan ALTER TABLE

  • Buat kebijakan DLM dengan 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 bernama test_policy, dan kondisi eksekusinya adalah jumlah partisi lebih dari tiga. Saat kebijakan DLM ini dijalankan dan jumlah partisi lebih dari tiga, data dari partisi lama di tabel t diarsipkan ke OSS. Tabel arsip di OSS 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;

Penanganan error eksekusi

Kebijakan DLM mungkin gagal dieksekusi karena masalah konfigurasi. Saat hal ini terjadi, catatan error disimpan di tabel mysql.dlm_progress. Lihat catatan error dengan perintah berikut:

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

Temukan detail error di bidang Extra_info. Setelah Anda mengonfirmasi penyebab error, hapus catatan saat ini atau ubah Archive_stage catatan tersebut menjadi ARCHIVE_COMPLETE. Kemudian, jalankan secara manual kebijakan DLM dengan perintah call dbms_dlm.execute_all_dlm_policies;, atau tunggu hingga dijalankan secara otomatis pada siklus eksekusi berikutnya.

Catatan

Untuk keamanan data, jika status catatan eksekusi kebijakan adalah ARCHIVE_ERROR, kebijakan tersebut tidak akan berjalan otomatis lagi. Kebijakan hanya akan dilanjutkan setelah Anda mengonfirmasi penyebab kegagalan dan memodifikasi catatan yang sesuai.