すべてのプロダクト
Search
ドキュメントセンター

PolarDB:使用方法

最終更新日:Jun 12, 2025

ストレージ コストを削減し、ストレージ効率を向上させるために、データ ライフサイクル管理(DLM)ポリシーを使用して、PolarStore から Object Storage Service (OSS) へのコールドデータの自動アーカイブを有効にすることができます。

前提条件

  • クラスタは、リビジョン バージョンが 8.0.2.2.9 以後の PolarDB for MySQL 8.0.2 を実行しています。

    クラスタのデータベース エンジン バージョンのクエリ方法については、「エンジン バージョンのクエリ」をご参照ください。

    説明

    クラスタがリビジョン バージョン 8.0.2.2.11.1 以後の PolarDB for MySQL 8.0.2 を実行している場合、データベースに対する DLM 関連の変更はバイナリ ログに記録されません。

  • DLM ポリシーを使用する前に、コールドデータ アーカイブ機能を有効にする必要があります。 詳細については、「コールドデータ アーカイブの有効化」をご参照ください。

    説明

    DLM ポリシーの使用時にコールドデータ アーカイブ機能が無効になっていると、次のエラーが報告されます。

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

制限事項

  • DLM ポリシーは、パーティション テーブルでのみ使用できます。 パーティション テーブルでは、RANGE COLUMN パーティション方式を使用する必要があり、サブパーティションを含めることはできません。

  • グローバル セカンダリ インデックス(GSI)が作成されているパーティション テーブルでは、DLM ポリシーを使用できません。

  • PolarDB for MySQL クラスタで DLM ポリシーを直接変更することはできません。 DLM ポリシーを変更するには、ポリシーを削除してから新しいポリシーを作成します。

  • テーブルに DLM ポリシーを作成すると、ポリシーに基づいてコールドデータがアーカイブされます。 列の追加や削除、データ型の変更など、元のテーブルに対する DDL 操作によって、元のテーブルとアーカイブ テーブルのスキーマに不整合が生じた場合、後でアーカイブされたデータを解析できません。 このような DDL 操作を実行する前に、テーブルの DLM ポリシーを削除する必要があります。 後で自動コールドデータ アーカイブ機能を再度使用するには、DLM ポリシーを再作成し、アーカイブ テーブルに新しい名前を指定できます。 アーカイブ テーブルの新しい名前は、アーカイブ テーブルの元の名前と同じにすることはできません。

  • INTERVAL RANGE パーティションを使用してテーブルを自動的にパーティション分割し、DLM ポリシーを使用してアクセス頻度の低いパーティション データを OSS にアーカイブすることをお勧めします。

    説明

    INTERVAL RANGE パーティションは、リビジョン バージョンが 8.0.2.2.0 以後の PolarDB for MySQL 8.0.2 を実行しているクラスタでのみサポートされています。

  • DLM ポリシーを使用するには、CREATE TABLE 文または ALTER TABLE 文を実行してポリシーを構成します。

  • DLM ポリシーは、SHOW CREATE TABLE 文の出力には表示されません。 クラスタ内のテーブルのすべての DLM ポリシーは、mysql.dlm_policies テーブルで確認できます。

使用上の注意

  • コールドデータがアーカイブされると、OSS 内のアーカイブ テーブルは読み取り専用になり、クエリ パフォーマンスが低下します。 アーカイブ テーブルがビジネスのクエリ パフォーマンス要件を満たせるかどうかを事前に確認してください。

  • パーティション テーブルのパーティションが OSS にアーカイブされると、パーティション内のデータは読み取り専用になります。 パーティション テーブルでは SQL 文を実行できません。

  • バックアップ操作を実行する場合、OSS に転送されるデータはバックアップされません。 データを過去の時点に復元する場合、OSS に格納されているデータは復元されません。

構文

DLM ポリシーの作成

  • CREATE TABLE 文を実行して DLM ポリシーを作成する

    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)]           
  • ALTER TABLE 文を実行して DLM ポリシーを作成する

    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 ポリシー パラメータ

パラメータ

必須

説明

tbl_name

はい

テーブルの名前。

policy_name

はい

DLM ポリシーの名前。

TIER TO TABLE

はい

テーブルを OSS にアーカイブします。

TIER TO PARTITION

はい

パーティションを OSS にアーカイブします。

説明
  • この機能はカナリア リリース版です。 この機能を使用するには、クォータ センター にアクセスします。 polardb_mysql_hybrid_partition クォータ ID に対応するクォータ名を見つけ、[適用] 列の [適用] をクリックします。

  • パーティション テーブルのパーティションを OSS にアーカイブできるのは、クラスタがリビジョン バージョン 8.0.2.2.17 以後の PolarDB for MySQL 8.0.2 を実行している場合のみです。

  • この機能を使用する場合は、パーティション テーブルのパーティションの総数が 8,192 を超えないようにしてください。

TIER TO NONE

はい

アーカイブするデータを削除します。

engine_name

いいえ

データをアーカイブするストレージ エンジン。 データは CSV ストレージ エンジンにのみアーカイブできます。

storage_schema_name

いいえ

アーカイブ テーブルのスキーマ。 デフォルトでは、アーカイブ テーブルはソース テーブルと同じスキーマを保持します。

storage_table_name

いいえ

アーカイブ テーブルの名前。 テーブル名を指定できます。 デフォルトでは、テーブル名は <現在のテーブル名>_<現在の DLM ポリシー名> の形式です。

STORAGE [=] OSS

いいえ

アーカイブされたデータが OSS に格納されることを指定します(デフォルト)。

READ ONLY

いいえ

アーカイブされたデータが読み取り専用であることを指定します(デフォルト)。

comment_string

いいえ

DLM ポリシーのコメント。

extra_info

いいえ

宛先 OSS テーブルの OSS ファイル フィルタ情報を指定します。

説明
  • パーティション テーブルのパーティションを OSS にアーカイブできるのは、クラスタがリビジョン バージョン 8.0.2.2.25 以後の PolarDB for MySQL Enterprise Edition 8.0.2 を実行している場合のみです。

  • この機能は、宛先テーブルが存在しない場合にのみ有効になります。 宛先 OSS テーブルが存在しない場合、システムは EXTRA_INFO パラメータの OSS_FILE_FILTER 値に基づいて FILE_FILTER 属性を自動的に生成し、アーカイブ中にフィルタ データを自動的に生成します。 宛先テーブルが既に存在する場合、既存のファイル フィルタが優先されます。

EXTRA_INFO 形式: {"oss_file_filter":"field_filter[,field_filter]"}field_filter は次の形式です。

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

ON (PARTITIONS OVER num)

はい

パーティションの数が指定された num 値を超えると、データをアーカイブします。

DLM ポリシーの管理

  • DLM ポリシーを有効にします。

    ALTER TABLE table_name DLM ENABLE POLICY [(dlm_policy_name [, dlm_policy_name] ...)]
  • DLM ポリシーを無効にします。

    ALTER TABLE table_name DLM DISABLE POLICY [(dlm_policy_name [, dlm_policy_name] ...)]
  • DLM ポリシーを削除します。

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

上記の文では、table_name パラメータはテーブルの名前を指定し、dlm_policy_name パラメータは管理するポリシーの名前を指定します。 複数のポリシー名を指定できます。

DLM ポリシーの実行

  • 現在のクラスタ内のすべてのテーブルで DLM ポリシーを実行します。

    CALL dbms_dlm.execute_all_dlm_policies();
  • 特定のテーブルで DLM ポリシーを実行します。

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

    上記の文では、database_name パラメータはデータベースの名前を指定し、table_name パラメータはテーブルの名前を指定します。

[MySQL イベント] 機能を使用して、クラスタの O&M 中に DLM ポリシーを実行できます。 これにより、ピーク時のデータベースのパフォーマンスへの影響を防ぎます。 また、期限切れのデータを定期的に転送して、ストレージ コストを削減することもできます。 イベントを作成して DLM ポリシーを実行するための構文:

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');
}

次の表は、上記のサンプル コードのパラメータについて説明しています。

パラメータ

必須

説明

event_name

はい

イベントの名前。

schedule

はい

イベントを実行するスケジュール。

comment

いいえ

イベントのコメント。

event_body

はい

イベントの内容。 内容は、イベントを使用して DLM ポリシーを実行する文である必要があります。

説明
  • CALL dbms_dlm.execute_all_dlm_policies() 文を指定すると、イベントはクラスタのすべての DLM ポリシーを実行します。 したがって、クラスタごとに 1 つのイベントを作成する必要があります。

  • CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name'); 文を指定すると、イベントは指定されたテーブルのすべての DLM ポリシーのみを実行します。 したがって、指定された時間にテーブルのデータをアーカイブするために DLM ポリシーが定義されているテーブルごとに、1 つのイベントを作成する必要があります。

interval

はい

イベントを実行する間隔。

timestamp

はい

イベントの実行を開始する時刻。

database_name

はい

データベースの名前。

table_name

はい

テーブルの名前。

MySQL イベント機能の詳細については、「MySQL イベント ドキュメント」をご参照ください。

パーティション テーブル データを OSS にアーカイブする方法の例については、「」をご参照ください。

パーティション テーブルのデータを OSS 外部テーブルにアーカイブする

  1. DLM ポリシーを作成する

    次の例では、sales という名前のパーティション テーブルが作成されます。 テーブルは、order_time 列をパーティション キーとして使用し、インターバル パーティションを採用しています。 テーブルには、インターバル ポリシーと DLM ポリシーが定義されています。

    • インターバル ポリシー: テーブルに挿入されたデータが 1 年のパーティション間隔外になった場合、新しいパーティションが自動的に作成されます。

    • DLM ポリシー: テーブル内のパーティションの数が 3 を超えると、DLM ポリシーがトリガーされ、次のアクションが実行されます。

      • sales_history 外部テーブルが存在しない場合は、テーブルを作成し、コールドデータをテーブルにアーカイブします。

      • sales_history 外部テーブルが存在し、組み込みの OSS スペースにある場合は、コールドデータを テーブルに直接アーカイブします。

    説明

    INTERVAL RANGE パーティションテーブルを作成するには、要件が満たされていることを確認してください。詳細については、「間隔範囲パーティション」をご参照ください。

    1. sales という名前のテーブルを、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);

      DLM ポリシーの名前は test_policy です。テーブルのパーティション数が 3 を超えると、コールドデータが現在のテーブルから OSS に CSV 形式でアーカイブされます。アーカイブされたテーブルの名前は sales_history で、読み取り専用です。OSS 外部テーブルが存在しない場合、システムは自動的にテーブルと、id 列と name 列に OSS ファイルフィルターを作成します。

    2. 現在のテーブルの DLM ポリシーは、mysql.dlm_policies システムテーブルに格納されます。システムテーブルで DLM ポリシーの詳細を表示できます。mysql.dlm_policies システムテーブルの詳細については、「テーブル形式」をご参照ください。mysql.dlm_policies システムテーブルのスキーマを表示するには、次の文を実行します。

      mysql> SELECT * FROM mysql.dlm_policies\G

      サンプル結果:

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

      sales テーブルには 3 つのパーティションが含まれています。データはアーカイブされていません。

    3. sales テーブルに 3,000 行のテストデータを挿入して、[インターバル] パーティションの自動作成をトリガーします。

      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. この場合、sales テーブルのパーティション数は 3 を超えています。次の文を実行して、テーブルのスキーマを表示します。

      mysql> SHOW CREATE TABLE sales\G

      サンプル結果:

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

      テーブルに新しいパーティションが作成され、テーブルのパーティション数が 3 を超えています。DLM ポリシーの実行要件が満たされているため、データをアーカイブできます。

  2. DLM ポリシーを実行する

    1. SQL 文を実行して DLM ポリシーを直接実行するか、MySQL イベント機能を使用して DLM ポリシーを定期的に実行できます。 クラスタの O&M 開始時刻が 2022 年 10 月 11 日から毎日 01:00 の場合、DLM ポリシーは毎日 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();

      毎日 01:00 に、イベントはすべてのテーブルで DLM ポリシーの実行を開始します。

    2. sales テーブルのスキーマを表示するには、次の文を実行します。

      mysql> SHOW CREATE TABLE sales\G

      結果例:

      *************************** 1. row ***************************;
             Table: sales
      Create Table: CREATE TABLE `sales` (  
        `id` int(11) DEFAULT NULL,  
        `name` varchar(20) DEFAULT NULL,  
        `order_time` datetime NOT NULL,  
         PRIMARY KEY (`order_time`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
      /*!50500 PARTITION BY RANGE  COLUMNS(order_time) */ 
      /*!99990 800020200 INTERVAL(YEAR, 1) */
      /*!50500 (PARTITION _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)

      現在のテーブルには 3 つのパーティションしかありません。

    3. mysql.dlm_progress テーブルで DLM ポリシーの実行レコードを表示できます。 mysql.dlm_progress テーブルの詳細については、「テーブルのフォーマット」をご参照ください。 mysql.dlm_progress テーブルのスキーマを表示するには、次の文を実行します。

      mysql> SELECT * FROM mysql.dlm_progress\G

      結果例:

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

      元々 p20200101000000p20210101000000p20220101000000_p20230101000000_p20240101000000、および _p20250101000000 パーティションに格納されていたコールドデータは、OSS 外部テーブルに転送されます。

    4. OSS 外部テーブルのスキーマを表示するには、次の文を実行します。

      mysql> SHOW CREATE TABLE sales_history\G

      結果例:

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

      このテーブルは、データが OSS に格納されている CSV フォーマットのテーブルです。 指定された列は OSS ファイルフィルタに追加されます。 order_time 列はパーティションキーです。 したがって、OSS ファイルフィルタは列に自動的に作成されます。

    5. sales テーブルと 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)           

      上記の例の結果は、データ行の総数が 3,000 であることを示しており、これは元々 sales テーブルに挿入されたデータ行の数と同じです。

    6. OSS ファイルフィルタを使用して OSS 外部テーブルのデータのクエリを実行します。 この操作を実行する前に、OSS ファイルフィルタが有効になっていることを確認してください。

      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)

パーティションテーブルのパーティションを OSS にアーカイブする

  1. DLM ポリシーを作成する

    次の例では、sales という名前のパーティションテーブルが作成されます。このテーブルは、order_time 列をパーティションキーとして使用し、インターバルパーティションを採用しています。テーブルには、インターバルポリシーと DLM ポリシーが定義されています。

    • インターバルポリシー: テーブルに挿入されたデータが 1 年のパーティション間隔外になった場合、新しいパーティションが自動的に作成されます。

    • DLM ポリシー: テーブル内のパーティション数が 3 を超えると、DLM ポリシーが実行され、以前のパーティションが OSS に転送されます。

    1. 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);

      テーブルの DLM ポリシーの名前は policy_part2part です。テーブル内のパーティション数が 3 を超えると、以前のパーティションは OSS に転送されます。

    2. mysql.dlm_policies テーブルで DLM ポリシーを表示します。

      SELECT * FROM mysql.dlm_policies\G

      結果例:

      *************************** 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. proc_batch_insert ストアドプロシージャを使用して、テストデータを sales テーブルに挿入し、インターバルポリシーをトリガーして新しいパーティションを作成します。

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

      次の結果は、データが挿入されたことを示しています。

      Query OK, 1 row affected, 1 warning (0.99 sec)
    4. sales テーブルのスキーマを表示するには、次のステートメントを実行します。

      SHOW CREATE TABLE sales \G

      結果例:

      *************************** 1. row ***************************
             Table: sales
      Create Table: CREATE TABLE `sales` (
        `id` int(11) DEFAULT NULL,
        `name` varchar(20) DEFAULT NULL,
        `order_time` datetime 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. DLM ポリシーを実行する

    1. DLM ポリシーを実行するには、次のステートメントを実行します。

      CALL dbms_dlm.execute_all_dlm_policies();
    2. mysql.dlm_progress テーブルで DLM ポリシーの実行レコードを表示します。

      SELECT * FROM mysql.dlm_progress \G

      結果例:

      *************************** 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. sales テーブルのスキーマを表示するには、次のステートメントを実行します。

      SHOW CREATE TABLE sales \G

      結果例:

      *************************** 1. row ***************************
             Table: sales
      Create Table: CREATE TABLE `sales` (
        `id` int(11) DEFAULT NULL,
        `name` varchar(20) DEFAULT NULL,
        `order_time` datetime 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)

      上記の例の結果は、sales テーブルの p20200101000000p20210101000000p20220101000000_p20230101000000_p20240101000000_p20250101000000 パーティションが OSS に転送されたことを示しています。テーブル内のホットデータを格納する _p20260101000000_p20270101000000_p20280101000000 パーティションのみが InnoDB に保持されます。sales テーブルはハイブリッドパーティションテーブルになります。ハイブリッドパーティションテーブルのデータのクエリ方法については、「ハイブリッドパーティションテーブルのデータをクエリする」をご参照ください。

コールドデータの削除

  1. [DLM ポリシーの作成]

    次の例では、sales という名前のパーティションテーブルが作成されます。このテーブルは、order_time 列をパーティションキーとして使用し、インターバルパーティションを採用しています。テーブルには、インターバルポリシーと DLM ポリシーが定義されています。

    • インターバルポリシー: テーブルに挿入されたデータが 1 年のパーティション間隔外になった場合、新しいパーティションが自動的に作成されます。

    • DLM ポリシー: テーブル内のパーティション数が 3 を超えると、DLM ポリシーが実行され、コールドデータが削除されます。

    1. DLM ポリシーを定義した sales という名前のテーブルを作成します。

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

      テーブルの DLM ポリシーの名前は test_policy です。このポリシーは、テーブル内のパーティション数が 3 つを超えると実行されます。この場合、コールドデータが削除されます。

    2. mysql.dlm_policies テーブルのスキーマを表示するには、次の文を実行します。

      SELECT * FROM mysql.dlm_policies\G

      結果例:

      *************************** 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. sales テーブルにテストデータを挿入して、[インターバル] パーティションの自動作成をトリガーします。proc_batch_insert ストアドプロシージャを使用して、新しいデータを挿入します。テーブルのスキーマは次のとおりです。

      CALL proc_batch_insert(1, 3000, 'sales');
      Query OK, 1 row affected, 1 warning (0.99 sec)
    4. sales テーブルのスキーマを表示するには、次の文を実行します。

      SHOW CREATE TABLE sales \G

      結果例:

      *************************** 1. row ***************************
             Table: sales
      Create Table: CREATE TABLE `sales` (
        `id` int(11) DEFAULT NULL,
        `name` varchar(20) DEFAULT NULL,
        `order_time` datetime 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. [DLM ポリシーの実行]

    1. 次の文を実行して、DLM ポリシーを直接実行します。

      CALL dbms_dlm.execute_all_dlm_policies();
    2. DLM ポリシーが実行されたら、mysql.dlm_progress テーブルのデータを確認します。

      SELECT * FROM mysql.dlm_progress \G

      結果例:

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

      もともと p20200101000000p20210101000000p20220101000000_p20230101000000_p20240101000000_p20250101000000 パーティションに格納されていたコールドデータは削除されます。

    3. sales テーブルのスキーマは次のとおりです。

      SHOW CREATE TABLE sales \G

      結果例:

      *************************** 1. row ***************************
             Table: sales
      Create Table: CREATE TABLE `sales` (
        `id` int(11) DEFAULT NULL,
        `name` varchar(20) DEFAULT NULL,
        `order_time` datetime 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)

ALTER TABLE 文を実行して DLM ポリシーを作成または削除する

  • ALTER TABLE 文を実行して、DLM ポリシーを作成します。

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

    t テーブルの DLM ポリシーの名前は、test_policy です。このポリシーは、テーブル内のパーティション数が 3 を超えた場合に実行されます。この場合、t テーブルの以前のパーティションのデータは OSS にアーカイブされます。 OSS 内のアーカイブテーブルの名前は sales_history です。

  • t テーブルで test_policy DLM ポリシーを有効にします。

    ALTER TABLE t DLM ENABLE POLICY test_policy;
  • t テーブルで test_policy DLM ポリシーを無効にします。

    ALTER TABLE t DLM DISABLE POLICY test_policy;
  • t テーブルで test_policy DLM ポリシーを削除します。

    ALTER TABLE t DLM DROP POLICY test_policy;

実行エラーのトラブルシューティング

DLM ポリシーが実行された後、不適切な構成が原因でエラーが発生する場合があります。 エラーレコードは mysql.dlm_progress テーブルに保存されます。 エラーレコードを表示するには、次の文を実行します。

SELECT * FROM mysql.dlm_progress WHERE Archive_stage = "ARCHIVE_ERROR"; /* エラーレコードを表示するクエリ */

[追加情報] フィールドでエラーの詳細を確認し、エラーの原因を確認してから、現在のエラーレコードを削除するか、現在のエラーレコードの [アーカイブステージ] フィールドの値を [アーカイブ完了] に変更します。 call dbms_dlm.execute_all_dlm_policies; /* DLMポリシーを手動で実行する */ 文を実行して DLM ポリシーを手動で実行するか、次の実行サイクルを待って DLM ポリシーを自動的に実行します。

説明

ポリシーに [アーカイブエラー] 状態の実行レコードがある場合、データセキュリティを確保するために、ポリシーは自動的に実行されません。 エラーの原因を確認し、エラーレコードのステータスを変更する必要があります。 その後、ポリシーが実行されます。