全部产品
Search
文档中心

PolarDB:Penggunaan

更新时间:Jul 06, 2025

Untuk mengurangi biaya penyimpanan dan meningkatkan efisiensi, Anda dapat mengaktifkan pengarsipan otomatis data dingin dari PolarStore ke Object Storage Service (OSS) menggunakan kebijakan manajemen siklus hidup data (DLM).

Prasyarat

  • Kluster menjalankan PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.9 atau yang lebih baru.

    Untuk informasi tentang cara memeriksa versi mesin database kluster, lihat Kueri versi mesin.

    Catatan

    Jika kluster menjalankan PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.11.1 atau yang lebih baru, perubahan terkait DLM pada database tidak dicatat dalam log biner.

  • Sebelum menggunakan kebijakan DLM, aktifkan fitur pengarsipan data dingin. Untuk informasi lebih lanjut, lihat Aktifkan pengarsipan data dingin.

    Catatan

    Jika fitur pengarsipan data dingin dinonaktifkan saat menggunakan kebijakan DLM, kesalahan berikut dilaporkan:

    ERROR 8158 (HY000): [Data Lifecycle Management] Mesin penyimpanan DLM tidak didukung. Nilai polar_dlm_storage_mode adalah OFF.

Batasan

  • Anda hanya dapat menggunakan kebijakan DLM pada tabel partisi. Tabel partisi tersebut harus menggunakan metode partisi RANGE COLUMN dan tidak boleh berisi subpartisi.

  • Anda tidak dapat menggunakan kebijakan DLM pada tabel partisi tempat indeks sekunder global (GSIs) dibuat.

  • Anda tidak dapat langsung memodifikasi kebijakan DLM di kluster PolarDB for MySQL. Untuk memodifikasi kebijakan DLM, hapus kebijakan tersebut lalu buat kebijakan baru.

  • Setelah membuat kebijakan DLM pada tabel, data dingin diarsipkan sesuai kebijakan tersebut. Jika operasi DDL seperti menambahkan atau menghapus kolom serta memodifikasi tipe data menyebabkan skema tidak konsisten antara tabel asli dan tabel arsip, data yang diarsipkan selanjutnya tidak dapat diuraikan. Sebelum melakukan operasi DDL tersebut, hapus kebijakan DLM pada tabel. Untuk menggunakan fitur pengarsipan data dingin otomatis lagi nanti, buat ulang kebijakan DLM dan tentukan nama baru untuk tabel arsip. Nama baru tabel arsip tidak boleh sama dengan nama aslinya.

  • Kami merekomendasikan menggunakan INTERVAL RANGE partisi untuk mempartisi tabel secara otomatis dan menggunakan kebijakan DLM untuk mengarsipkan data partisi jarang diakses ke OSS.

    Catatan

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

  • Untuk menggunakan kebijakan DLM, konfigurasikan kebijakan tersebut dengan mengeksekusi pernyataan CREATE TABLE atau ALTER TABLE.

  • Kebijakan DLM tidak ditampilkan dalam keluaran pernyataan SHOW CREATE TABLE. Anda dapat melihat semua kebijakan DLM untuk tabel dalam kluster dari tabel mysql.dlm_policies.

Catatan Penggunaan

  • Setelah data dingin diarsipkan, tabel arsip di OSS menjadi hanya-baca dan memberikan kinerja kueri yang buruk. Periksa apakah tabel arsip dapat memenuhi persyaratan kinerja kueri bisnis Anda sebelumnya.

  • Setelah partisi dalam tabel partisi diarsipkan ke OSS, data dalam partisi menjadi hanya-baca. Pernyataan SQL tidak dapat dieksekusi pada tabel partisi.

  • Saat melakukan operasi cadangan, data yang ditransfer ke OSS tidak dicadangkan. Saat memulihkan data ke titik waktu sebelumnya, data yang disimpan di OSS tidak dipulihkan.

Sintaksis

Buat Kebijakan DLM

  • Create a DLM policy by executing the CREATE TABLE statement

    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)]           
  • Create a DLM policy by executing the ALTER TABLE statement

    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)]      

DLM policy parameters

Parameter

Diperlukan

Deskripsi

tbl_name

Ya

Nama tabel.

policy_name

Ya

Nama kebijakan DLM.

TIER TO TABLE

Ya

Mengarsipkan tabel ke OSS.

TIER TO PARTITION

Ya

Mengarsipkan partisi ke OSS.

Catatan
  • Fitur ini dalam rilis canary. Untuk menggunakan fitur ini, kunjungi Quota Center. Temukan nama kuota yang sesuai dengan ID kuota polardb_mysql_hybrid_partition dan klik Apply di kolom Aksi.

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

  • Jika Anda menggunakan fitur ini, pastikan bahwa jumlah total partisi dalam tabel partisi tidak melebihi 8.192.

TIER TO NONE

Ya

Menghapus data yang ingin Anda arsipkan.

engine_name

Tidak

Mesin penyimpanan tempat data diarsipkan. Data hanya dapat diarsipkan ke mesin penyimpanan CSV.

storage_schema_name

Tidak

Skema tabel arsip. Secara default, tabel arsip mempertahankan skema yang sama dengan tabel sumber.

storage_table_name

Tidak

Nama tabel arsip. Anda dapat menentukan nama tabel. Secara default, nama tabel dalam format berikut: <Nama tabel saat ini>_<Nama kebijakan DLM saat ini>.

STORAGE [=] OSS

Tidak

Menentukan bahwa data yang diarsipkan disimpan di OSS (default).

READ ONLY

Tidak

Menentukan bahwa data yang diarsipkan hanya-baca (default).

comment_string

Tidak

Komentar kebijakan DLM.

extra_info

Tidak

Menentukan informasi filter file OSS dari tabel OSS tujuan.

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

  • Fitur ini berlaku hanya jika tabel tujuan tidak ada. Jika tabel OSS tujuan tidak ada, sistem secara otomatis menghasilkan atribut FILE_FILTER berdasarkan nilai OSS_FILE_FILTER dalam parameter EXTRA_INFO, dan secara otomatis menghasilkan data filter selama pengarsipan. Jika tabel tujuan sudah ada, filter file yang ada akan diutamakan.

EXTRA_INFO format: {"oss_file_filter":"field_filter[,field_filter]"}. field_filter dalam format berikut:

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

ON (PARTITIONS OVER num)

Ya

Mengarsipkan data ketika jumlah partisi melebihi nilai num yang ditentukan.

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 sebelumnya, parameter table_name menentukan nama tabel, dan parameter dlm_policy_name menentukan nama kebijakan yang ingin Anda kelola. Anda dapat menentukan beberapa nama kebijakan.

Eksekusi Kebijakan DLM

  • Eksekusi kebijakan DLM pada semua tabel dalam kluster saat ini.

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

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

    Dalam pernyataan sebelumnya, parameter database_name menentukan nama database, dan parameter table_name menentukan nama tabel.

Anda dapat menggunakan fitur MySQL event untuk mengeksekusi kebijakan DLM selama pemeliharaan kluster O&M. Ini mencegah dampak pada kinerja database Anda selama jam sibuk. Anda juga dapat secara berkala mentransfer data yang kedaluwarsa untuk mengurangi biaya penyimpanan Anda. Sintaksis untuk mengeksekusi kebijakan DLM dengan membuat event:

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 dalam kode sampel sebelumnya.

Parameter

Diperlukan

Deskripsi

event_name

Ya

Nama event.

schedule

Ya

Jadwal eksekusi event.

comment

Tidak

Komentar untuk event.

event_body

Ya

Isi event. Isi tersebut harus berupa pernyataan yang mengeksekusi kebijakan DLM menggunakan event.

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

  • Jika Anda menentukan pernyataan CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');, event mengeksekusi semua kebijakan DLM hanya pada tabel yang ditentukan. Oleh karena itu, Anda harus membuat satu event untuk setiap tabel yang memiliki kebijakan DLM yang didefinisikan untuk mengarsipkan data dalam tabel pada waktu tertentu.

interval

Ya

Interval eksekusi event.

timestamp

Ya

Waktu mulai eksekusi event.

database_name

Ya

Nama database.

table_name

Ya

Nama tabel.

Untuk informasi tentang fitur event MySQL, lihat Dokumentasi event MySQL.

Untuk contoh cara mengarsipkan data tabel partisi ke OSS, lihat Contoh.

Contoh

Archive data in a partitioned table to an OSS foreign table

  1. Create a DLM policy

    In the following example, a partitioned table named sales is created. The table uses the order_time column as the partition key and adopts interval partitioning. An interval policy and a DLM policy are defined for the table.

    • Interval policy: When data inserted into the table falls outside the partitioning interval of one year, a new partition is automatically created.

    • DLM policy: If the number of partitions in the table exceeds 3, the DLM policy is triggered and performs the following actions:

      • If the sales_history foreign table does not exist, create the table and archive cold data to the table.

      • If the sales_history foreign table exists and resides in the built-in OSS space, directly archive cold data to the table.

    Catatan

    To create an INTERVAL RANGE partitioned table, make sure that the requirements are met. For more information, see Interval range partitioning.

    1. Create a table named sales with a DLM policy defined.

      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 diberi nama test_policy. Jika jumlah partisi dalam tabel melebihi 3, data dingin diarsipkan dari tabel saat ini ke OSS dalam format CSV. Tabel arsip diberi nama sales_history dan hanya-baca. Jika tabel asing OSS tidak ada, sistem secara otomatis membuat tabel dan filter file OSS pada kolom id dan name.

    2. Kebijakan DLM dari tabel saat ini disimpan dalam tabel sistem mysql.dlm_policies. Anda dapat melihat detail kebijakan DLM dalam tabel sistem tersebut. Untuk informasi lebih lanjut tentang tabel sistem mysql.dlm_policies, lihat Format tabel. Untuk melihat skema tabel sistem mysql.dlm_policies, eksekusi pernyataan berikut:

      mysql> SELECT * FROM mysql.dlm_policies\G

      Hasil sampel:

      *************************** 1. row ***************************
                         Id: 3
               Table_schema: gg
                 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: gg
         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)      

      Tabel sales berisi tiga partisi. Tidak ada data yang diarsipkan.

    3. Sisipkan 3.000 baris data uji ke dalam tabel sales untuk memicu pembuatan otomatis partisi interval.

      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. Dalam kasus ini, jumlah partisi dalam tabel sales melebihi tiga. Eksekusi pernyataan berikut untuk melihat skema tabel:

      mysql> SHOW CREATE TABLE sales\G

      Hasil sampel:

      *************************** 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 dibuat dalam tabel, dan jumlah partisi dalam tabel melebihi 3. Data dapat diarsipkan karena persyaratan eksekusi untuk kebijakan DLM terpenuhi.

  2. Execute the DLM policy

    1. Anda dapat mengeksekusi pernyataan SQL untuk langsung mengeksekusi kebijakan DLM atau menggunakan fitur event MySQL untuk secara berkala mengeksekusi kebijakan DLM. Jika waktu mulai pemeliharaan kluster Anda adalah pukul 01:00 setiap hari mulai 11 Oktober 2022, kebijakan DLM dieksekusi pada pukul 01:00 setiap hari. Anda dapat membuat event 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();

      Pada pukul 01:00 setiap hari, event mulai mengeksekusi kebijakan DLM pada semua tabel.

    2. Untuk melihat skema tabel sales, eksekusi pernyataan berikut:

      mysql> SHOW CREATE TABLE sales\G

      Hasil sampel:

      *************************** 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 saat ini hanya memiliki tiga partisi.

    3. Anda dapat melihat catatan eksekusi kebijakan DLM dalam tabel mysql.dlm_progress. Untuk informasi lebih lanjut tentang tabel mysql.dlm_progress, lihat Format tabel. Untuk melihat skema tabel mysql.dlm_progress, eksekusi pernyataan berikut:

      mysql> SELECT * FROM mysql.dlm_progress\G

      Hasil sampel:

      *************************** 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)

      Data dingin yang awalnya disimpan dalam partisi p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000 dipindahkan ke tabel asing OSS.

    4. Untuk melihat skema tabel asing OSS, eksekusi pernyataan berikut:

      mysql> SHOW CREATE TABLE sales_history\G

      Hasil sampel:

      *************************** 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 tersebut adalah tabel berformat CSV yang datanya disimpan di OSS. Kolom tertentu ditambahkan ke filter file OSS. Kolom order_time adalah kunci partisi. Oleh karena itu, filter file OSS secara otomatis dibuat pada kolom tersebut.

    5. Kueri data dalam tabel sales dan sales_history.

      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)           

      Hasil sebelumnya menunjukkan bahwa total jumlah baris data adalah 3.000, sama dengan jumlah baris data yang awalnya dimasukkan ke dalam tabel sales.

    6. Kueri data dalam tabel asing OSS menggunakan filter file OSS. Sebelum Anda melakukan operasi ini, pastikan filter file OSS 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)

Archive partitions in a partitioned table to OSS

  1. Create a DLM policy

    In the following example, a partitioned table named sales is created. The table uses the order_time column as the partition key and adopts interval partitioning. An interval policy and a DLM policy are defined for the table.

    • Interval policy: When data inserted into the table falls outside the partitioning interval of one year, a new partition is automatically created.

    • DLM policy: When the number of partitions in the table exceeds 3, the DLM policy is executed to transfer previous partitions to OSS.

    1. Create a table named 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);

      The DLM policy of the table is named policy_part2part. When the number of partitions in the table exceeds 3, previous partitions are transferred to OSS.

    2. View DLM policies in the mysql.dlm_policies table.

      SELECT * FROM mysql.dlm_policies\G

      Sample result:

      *************************** 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. Use the proc_batch_insert stored procedure to insert test data into the sales table and trigger the interval policy to create new partitions.

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

      The following results indicate that the data is inserted:

      Query OK, 1 row affected, 1 warning (0.99 sec)
    4. To view the schema of the sales table, execute the following statement:

      SHOW CREATE TABLE sales \G

      Sample result:

      *************************** 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. Execute the DLM policy

    1. Execute the following statement to execute the DLM policy:

      CALL dbms_dlm.execute_all_dlm_policies();
    2. View the execution records of the DLM policy in the mysql.dlm_progress table.

      SELECT * FROM mysql.dlm_progress \G

      Sample result:

      *************************** 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. To view the schema of the sales table, execute the following statement:

      SHOW CREATE TABLE sales \G

      Sample result:

      *************************** 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)

      The preceding results show that the p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, and _p20250101000000 partitions in the sales table are transferred to OSS. Only the _p20260101000000, _p20270101000000, and _p20280101000000 partitions that store hot data in the table are retained in InnoDB. The sales table becomes a hybrid partitioned table. For information about how to query data in a hybrid partitioned table, see Query data in a hybrid partitioned table.

Delete cold data

  1. Create a DLM policy

    In the following example, a partitioned table named sales is created. The table uses the order_time column as the partition key and adopts interval partitioning. An interval policy and a DLM policy are defined for the table.

    • Interval policy: When data inserted into the table falls outside the partitioning interval of one year, a new partition is automatically created.

    • DLM policy: When the number of partitions in the table exceeds 3, the DLM policy is executed to delete cold data.

    1. Create a table named sales with a DLM policy defined.

      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 tabel tersebut diberi nama test_policy. Kebijakan ini dieksekusi ketika jumlah partisi dalam tabel melebihi tiga. Dalam kasus ini, data dingin dihapus.

    2. Untuk melihat skema tabel mysql.dlm_policies, eksekusi pernyataan berikut:

      SELECT * FROM mysql.dlm_policies\G

      Hasil sampel:

      *************************** 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. Sisipkan data uji ke dalam tabel sales untuk memicu pembuatan otomatis partisi interval. Gunakan prosedur tersimpan proc_batch_insert untuk menyisipkan data baru. Tabel memiliki skema berikut:

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

      SHOW CREATE TABLE sales \G

      Hasil sampel:

      *************************** 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. Execute the DLM policy

    1. Eksekusi pernyataan berikut untuk langsung mengeksekusi kebijakan DLM:

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

      SELECT * FROM mysql.dlm_progress \G

      Hasil sampel:

      *************************** 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)

      Data dingin yang awalnya disimpan dalam partisi p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000 dihapus.

    3. Tabel sales memiliki skema berikut:

      SHOW CREATE TABLE sales \G

      Hasil sampel:

      *************************** 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 mengeksekusi pernyataan ALTER TABLE

  • Buat kebijakan DLM dengan mengeksekusi pernyataan 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 tabel t diberi nama test_policy. Kebijakan ini dieksekusi ketika jumlah partisi dalam tabel melebihi tiga. Dalam kasus ini, data dalam partisi sebelumnya dari tabel t diarsipkan ke OSS. Tabel arsip di OSS diberi nama 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 pada tabel t.

    ALTER TABLE t DLM DROP POLICY test_policy;

Troubleshoot execution errors

Setelah kebijakan DLM dieksekusi, kesalahan mungkin terjadi karena konfigurasi yang tidak tepat. Catatan kesalahan disimpan dalam tabel mysql.dlm_progress. Eksekusi pernyataan berikut untuk melihat catatan kesalahan:

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

Temukan detail kesalahan dalam bidang Extra_info, konfirmasikan penyebab kesalahan, lalu hapus catatan kesalahan saat ini atau ubah nilai bidang Archive_stage dari catatan kesalahan saat ini menjadi ARCHIVE_COMPLETE. Eksekusi pernyataan call dbms_dlm.execute_all_dlm_policies; untuk secara manual mengeksekusi kebijakan DLM atau tunggu siklus eksekusi berikutnya untuk secara otomatis mengeksekusi kebijakan DLM.

Catatan

Jika suatu kebijakan memiliki catatan eksekusi dalam status ARCHIVE_ERROR, kebijakan tersebut tidak dieksekusi secara otomatis demi memastikan keamanan data. Anda harus mengonfirmasi penyebab kesalahan dan mengubah status catatan kesalahan. Setelah itu, kebijakan akan dieksekusi.