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

PolarDB:CSV または ORC フォーマットでのデータアーカイブ

最終更新日:Aug 11, 2026

データライフサイクル管理 (DLM) 機能により、PolarStore のコールドデータを、コスト効率の高い OSS ストレージに CSV または ORC フォーマットで自動的かつ定期的にアーカイブできます。これにより、コストが削減され、効率が向上します。

前提条件

  • クラスターは、PolarDB for MySQL 8.0.2 のリビジョンバージョン 8.0.2.2.34.1 以降を実行している必要があります。

    説明
    • クラスターのバージョンを確認するには、「エンジンバージョンの照会」をご参照ください。

    • クラスターが PolarDB for MySQL 8.0.2 のリビジョンバージョン 8.0.2.2.11.1 以降を実行している場合、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 ポリシーがある場合は、列の追加または削除、列のデータ型の変更など、ソーステーブルとアーカイブテーブルの不整合を引き起こす DDL 操作は避けてください。このような不整合があると、後続のアーカイブデータを解析できなくなる可能性があります。これらの DDL 操作を実行する前に、DLM ポリシーを削除する必要があります。自動アーカイブを再開するには、新しい DLM ポリシーを作成し、アーカイブテーブルに新しい名前を指定してください。この名前は、以前に使用したアーカイブテーブル名と同一にすることはできません。

  • パーティションを自動的に拡張し、DLM 機能を使用してアクセス頻度の低いパーティションから OSS にデータをアーカイブするには、INTERVAL RANGE パーティショニングの使用を推奨します。

    説明

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

  • CREATE TABLE または ALTER TABLE ステートメントを実行する際は、DLM ポリシーを指定する必要があります。

  • SHOW CREATE TABLE ステートメントでは DLM ポリシーは表示されません。すべての DLM ポリシーは、mysql.dlm_policies テーブルで確認できます。

注意事項

  • コールドデータのアーカイブ後、OSS にアーカイブされたテーブルは読み取り専用になり、クエリパフォーマンスが低下する可能性があります。事前にテストを行い、クエリパフォーマンスが要件を満たすことを確認してください。

  • パーティションテーブルのパーティションが OSS にアーカイブされると、アーカイブされたパーティション内のデータは読み取り専用になります。

  • ハイブリッドパーティションテーブルでは、セカンダリインデックスの作成または削除に Copy DDL と INPLACE DDL を使用できますが、Instant DDL はサポートされていません。

  • バックアップには、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

はい

ポリシー名。

TIER TO TABLE

はい

OSS 外部テーブルにデータをアーカイブします。

説明

OSS 外部テーブルへのアーカイブでは、CSV フォーマットのみがサポートされています。

TIER TO PARTITION

はい

CSV、ORC、または X-Engine フォーマットでパーティションをアーカイブします。つまり、ハイブリッドパーティションテーブルを作成します。

説明
  • パーティションテーブルのパーティションをハイブリッドパーティションテーブルとしてアーカイブするには、次の条件を満たす必要があります。

    • MySQL 8.0.2 であり、マイナーバージョンが 8.0.2.2.34.1 以降である場合は、loose_allow_create_hybrid_partition パラメーターを ON設定する必要があります。

    • MySQL 8.0.2 であり、マイナーバージョンが 8.0.2.2.34.1 より前である場合は、新しいマイナーバージョンにアップグレードしてください。

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

TIER TO NONE

はい

コールドデータをアーカイブせずに削除します。

engine_name

いいえ

アーカイブデータのストレージエンジン。有効な値: CSVORC、X-Engine。

storage_schema_name

いいえ

テーブルにアーカイブする場合、このパラメーターでテーブルを含むデータベースを指定します。デフォルトはソーステーブルのデータベースです。

storage_table_name

いいえ

テーブルにアーカイブする場合、このパラメーターはアーカイブテーブルの名前を指定します。デフォルトは <source_table_name>_<current_dlm_policy_name> です。

STORAGE [=] OSS

いいえ

アーカイブデータは OSS エンジンに保存されます。これがデフォルトです。

READ ONLY

いいえ

アーカイブデータは読み取り専用です。これがデフォルトです。

comment_string

いいえ

DLM ポリシーのコメント。

extra_info

いいえ

ターゲット OSS テーブルの OSS_FILE_FILTER 情報。

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

  • このパラメーターは、ターゲットテーブルが存在しない場合にのみ適用されます。この場合、システムは 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 event 機能を使用すると、クラスターのメンテナンスウィンドウ中に 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ポリシーが設定されているテーブルごとに、対応するイベントを作成する必要があります。

interval

はい

イベントの実行間隔。

timestamp

はい

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

database_name

はい

データベース名。

table_name

はい

テーブル名。

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

使用例については、「コールドデータを OSS にアーカイブする」をご参照ください。

OSS 外部テーブルへのデータのアーカイブ

  1. DLM ポリシーの作成

    次の例では、sales という名前のパーティションテーブルを作成します。このテーブルは、order_time 列をパーティションキーとして使用し、時間間隔でパーティション分割されます。このテーブルには、INTERVAL ポリシーと DLM ポリシーの両方があります:

    • INTERVAL ポリシー: 挿入されたデータが既存のパーティションの範囲外にある場合、新しいパーティションが自動的に作成されます。時間間隔は 1 年です。

    • DLM ポリシー: テーブルは 3 つのパーティションのみを保持します。パーティション数が 3 つを超えると、DLM ポリシーがトリガーされ、次のいずれかのアクションを実行します。

      • OSS 外部テーブル sales_history が存在しない場合は、新しい OSS 外部テーブル sales_history を作成し、コールドデータを sales_history 外部テーブルにダンプします。

      • sales_history 外部テーブルが存在し、sales_history テーブルが組み込み OSS 領域にある場合、コールドデータは sales_history 外部テーブルに直接ダンプされます。

    説明

    INTERVAL RANGE パーティションテーブルの作成には前提条件があります。INTERVAL の使用に関する詳細については、「INTERVAL RANGE パーティショニング」をご参照ください。

    1. DLM ポリシーを使用して 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 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 を超えると、ソーステーブルのコールドデータが CSV 形式で OSS にアーカイブされます。アーカイブされたテーブルは sales_history という名前で、読み取り専用です。宛先の OSS テーブルが存在しない場合、システムはそれを自動的に作成し、id 列と name 列に OSS_FILE_FILTER を追加します。

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

      現在、sales テーブルには 3 つのパーティションがあるため、データはアーカイブされていません。

    3. sales パーティションテーブルに 3,000 行のテストデータを挿入します。 既存のパーティションの範囲外にデータを挿入すると、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. INTERVAL ポリシーにより、新しいパーティションが自動的に作成され、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 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 EVENT 機能を使用して定期的な実行をスケジュールできます。たとえば、クラスターのメンテナンスウィンドウが 2022 年 10 月 11 日から毎日 01:00 に開始される場合、次のイベントを作成して、毎日 01:00 に DLM ポリシーを実行できます。

      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. DLM ポリシーの実行記録は、mysql.dlm_progress テーブルで表示できます。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: 100
        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_FILE_FILTER に追加されました。order_time はパーティションキーであるため、この列用の OSS_FILE_FILTER も自動的に作成されます。

    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_FILE_FILTER を使用して OSS 外部テーブルをクエリします。最初に OSS_FILE_FILTER スイッチを有効にする必要があります。

      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 へのアーカイブ

CSV フォーマットでのアーカイブ

  1. DLM ポリシーの作成

    次の例では、order_time 列をパーティションキーとして時間間隔でパーティション化され、INTERVAL ポリシーと DLM ポリシーの両方が設定された、sales という名前のパーティションテーブルを作成します。

    • INTERVAL ポリシー: 挿入されたデータが既存のパーティションの範囲外にある場合、新しいパーティションが自動的に作成されます。時間間隔は 1 年です。

    • DLM ポリシー: テーブルは 3 つのパーティションのみを保持します。パーティション数が 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 パーティションテーブルにテストデータを挿入し、INTERVAL ポリシーをトリガーして新しいパーティションを自動的に作成します。

      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 にアーカイブされていることが示されています。InnoDB エンジンには、3つのホットデータパーティション _p20260101000000_p20270101000000、および _p20280101000000 のみが残っています。sales テーブルは、現在ハイブリッドパーティションテーブルです。ハイブリッドパーティションテーブルのデータをクエリする方法については、「ハイブリッドパーティションテーブルをクエリする」をご参照ください。

ORC フォーマットでのアーカイブ

  1. DLM ポリシーの作成

    次の例では、order_time 列をパーティションキーとして使用し、時間間隔でデータをパーティション分割する sales_orc パーティションテーブルを作成します。このテーブルには、INTERVAL ポリシーと DLM ポリシーの両方があります。

    • INTERVAL ポリシー: 挿入されたデータがパーティション範囲を超えると、1 年間隔で新しいパーティションが自動的に作成されます。

    • DLM ポリシー: テーブルに 3 つを超えるパーティションがある場合、DLM ポリシーは古いパーティションを ORC フォーマットで OSS にアーカイブします。テーブルはハイブリッドパーティションテーブルになります。

    TIER TO PARTITION ENGINE=ORC を使用して古いパーティションを OSS にアーカイブする DLM ポリシーを持つ sales_orc テーブルを作成します。

    CREATE TABLE `sales_orc` (
      `id` int DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `order_time` datetime NOT NULL,
       PRIMARY KEY (`order_time`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    -- order_time に対して 1 年間隔の RANGE COLUMN パーティションを作成 (自動パーティション作成)
    PARTITION BY RANGE  COLUMNS(order_time) INTERVAL(YEAR, 1)
    -- 2020 / 2021 / 2022 より前のデータを保持する 3 つの初期パーティションを事前作成
    (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 ポリシー: パーティション数が 3 を超えると、古いパーティションを ORC フォーマットで OSS にアーカイブ
    -- TIER TO PARTITION: パーティションレベルのアーカイブ。テーブルはハイブリッドパーティションテーブルになります
    -- (ホット InnoDB パーティションとコールド ORC パーティションが共存)
    DLM ADD POLICY policy_orc TIER TO PARTITION ENGINE=ORC STORAGE=OSS READ ONLY
    ON (PARTITIONS OVER 3);

    DLM ポリシー policy_orc では、パーティション数が 3 を超えると、古いパーティションが ORC 形式で OSS にアーカイブされます。これにより、テーブルはホット InnoDB パーティションとコールド ORC パーティションの両方を含むハイブリッドパーティションテーブルになります。

  2. DLM ポリシーの実行

    INTERVAL をトリガーして新しいパーティションを自動的に作成し、パーティション数が 3 を超えて DLM ポリシー条件が満たされるように、sales_orc パーティションテーブルにテストデータを挿入します。

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

    DLM ポリシーを実行します。

    CALL dbms_dlm.execute_all_dlm_policies();
  3. アーカイブ結果の表示

    mysql.dlm_progress テーブルで DLM ポリシー実行レコードを表示するには、次のコマンドを実行します:

    SELECT * FROM mysql.dlm_progress\G

    アクセス頻度の低いコールドデータを格納するパーティションは OSS にアーカイブされています。次のコマンドを実行して、sales_orc テーブルのスキーマを表示します:

    SHOW CREATE TABLE sales_orc\G

    結果は次のとおりです。

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

    クエリ結果に示すように、sales_orc パーティションテーブルの p20210101000000p20220101000000_p20230101000000_p20240101000000、および _p20250101000000 パーティションは OSS にアーカイブされています。InnoDB エンジンには、3つのホットデータパーティション _p20260101000000_p20270101000000、および _p20280101000000 のみが残っています。これにより、sales_orc テーブルはハイブリッドパーティションテーブルになります。ハイブリッドパーティションテーブルでデータをクエリする方法については、「ハイブリッドパーティションテーブルのクエリ」をご参照ください。

コールドデータの直接削除

  1. DLM ポリシーの作成

    次の例では、sales という名前のパーティションテーブルを作成します。このテーブルは order_time 列をパーティションキーとして使用し、時間間隔でパーティション化されます。このテーブルには INTERVAL ポリシーと DLM ポリシーの両方が設定されています:

    • INTERVAL ポリシー:挿入されたデータが既存パーティションのレンジ外にある場合、新しいパーティションが自動的に作成されます。時間間隔は 1 年です。

    • DLM ポリシー:このテーブルでは 3 つのパーティションのみを保持します。パーティション数が 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 パーティションテーブルにテストデータを挿入して、INTERVAL ポリシーがトリガーされ、新しいパーティションが自動的に作成されるようにします。新しいデータを挿入するには、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 によるポリシーの管理

  • 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 の古いパーティションのデータが、sales_history という名前の読み取り専用のテーブルとして OSS にアーカイブされます。

  • テーブル ttest_policy DLM ポリシーを有効化します。

    ALTER TABLE t DLM ENABLE POLICY test_policy;
  • テーブル ttest_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";

エラーの原因を特定するために、Extra_info フィールドでエラーの詳細を確認してください。その後、レコードを削除するか、Archive_stageARCHIVE_COMPLETE に変更してください。最後に、call dbms_dlm.execute_all_dlm_policies; コマンドを使用してポリシーを手動で再実行するか、次回のスケジュールされた実行をお待ちください。

説明

データセキュリティのため、ポリシーに ARCHIVE_ERROR 状態の実行レコードがある場合、そのポリシーは自動的に再実行されません。ポリシーを再度実行するには、失敗の原因を特定し、レコードを修正する必要があります。