データライフサイクル管理 (DLM) 機能を使用すると、ストレージコストを削減し、効率を向上できます。この機能により、PolarStore からアクセス頻度が低いコールドデータが自動的かつ定期的に Object Storage Service (OSS) などの低コストな記憶媒体にアーカイブされます。
制限事項
DLM 機能は、サブパーティションを含まないパーティションテーブルのみをサポートします。パーティション方式は RANGE COLUMN である必要があります。
グローバルセカンダリインデックス (GSI) を持つパーティションテーブルでは、DLM 機能を使用できません。
PolarDB for MySQL では、DLM ポリシーを変更することはできません。ポリシーを変更するには、既存のポリシーを削除してから新しいポリシーを作成する必要があります。
テーブルに DLM ポリシーが存在する場合、ソーステーブルとアーカイブテーブルのスキーマに不整合を引き起こす DDL 操作(列の追加または削除、列のデータ型の変更など)を実行しないでください。このような不整合により、その後にアーカイブされたデータを解析できなくなる可能性があります。これらの DDL 操作を実行する前に、テーブルから DLM ポリシーを削除する必要があります。自動データアーカイブを再開するには、新しい DLM ポリシーを作成し、アーカイブテーブルに新しい名前を指定してください。新しい名前は、以前に使用されたアーカイブテーブル名と同じであってはなりません。
INTERVAL RANGE パーティション を使用してパーティションを自動的に拡張し、DLM 機能を使用してアクセス頻度の低いパーティションのデータを OSS にアーカイブできます。
説明 INTERVAL RANGE パーティションは、PolarDB for MySQL 8.0.2、リビジョン 8.0.2.2.0 以降を実行するクラスターでのみサポートされます。
注意事項
コールドデータがアーカイブされた後、OSS 内のアーカイブテーブルは読み取り専用となり、クエリパフォーマンスが遅くなる可能性があります。事前にテストを行い、クエリパフォーマンスが要件を満たしていることを確認してください。
パーティションテーブルのパーティションが OSS にアーカイブされた後、そのパーティション内のデータは読み取り専用になります。パーティションテーブルに対して DDL 操作を実行することはできません。
バックアップ操作には、OSS にアーカイブされたデータは含まれません。OSS 内のデータはポイントインタイムリカバリをサポートしていません。
ポリシーの作成
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 外部テーブルにアーカイブします。 |
TIER TO PARTITION | はい | ホットデータのパーティションを同じテーブル内で OSS に保存されたコールドデータパーティションに変換し、ハイブリッドパーティションテーブルを作成します。
説明 この機能はカナリアリリース中です。この機能を使用するには、クォータセンター にアクセスし、polardb_mysql_hybrid_partition クォータ ID に対応するクォータ名を見つけ、[操作] 列の [申請] をクリックしてください。 ご利用のクラスターが PolarDB for MySQL 8.0.2、リビジョン 8.0.2.2.17 以降を実行している場合に限り、パーティションテーブルのパーティションを OSS にアーカイブできます。 この機能を使用する際は、パーティションテーブルのパーティション総数が 8,192 を超えないようにしてください。
|
TIER TO NONE | はい | データをアーカイブせずに、最も古いパーティションからデータを削除します。 |
engine_name | いいえ | アーカイブデータのストレージエンジンです。現在、データは CSV エンジンにのみアーカイブできます。 |
storage_schema_name | いいえ | アーカイブテーブルのデータベースです。デフォルトでは、ソーステーブルのデータベースが使用されます。 |
storage_table_name | いいえ | アーカイブテーブルの名前です。指定しない場合、デフォルトで <source_table_name>_<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 以降を実行している必要があります。 この機能は、送信先テーブルが存在しない場合にのみ有効になります。この場合、送信先 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 ポリシーを有効化します。
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 ポリシーを実行します。
CALL dbms_dlm.execute_all_dlm_policies();
単一テーブルに対して DLM ポリシーを実行します。
CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');
この文において、database_name はテーブルを含むデータベース名、table_name はテーブル名です。
ご利用のクラスターのメンテナンスウィンドウ中に DLM ポリシーを実行するために、MySQL イベント 機能を使用できます。この方法により、ピーク業務時間中のデータベースパフォーマンスへの影響を回避でき、定期的に期限切れデータを移動してストレージコストを削減できます。イベントを使用して 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 ポリシーのみを実行します。したがって、スケジュールされたアーカイブが必要な各テーブルに対してイベントを作成してください。
|
interval | はい | イベントの実行頻度です。 |
timestamp | はい | イベントの開始時刻です。 |
database_name | はい | データベース名です。 |
table_name | はい | テーブル名です。 |
MySQL EVENT 機能の詳細については、「CREATE EVENT の公式 MySQL ドキュメント」をご参照ください。
使用例については、「OSS へのコールドデータアーカイブの例」をご参照ください。
使用例
外部テーブルへのデータアーカイブ
DLM ポリシーの作成
次の例では、sales という名前のパーティションテーブルを作成します。このテーブルは order_time 列をパーティションキーとして使用します。テーブルには INTERVAL ポリシーと DLM ポリシーが設定されています。
説明 INTERVAL RANGE パーティションを使用してテーブルを作成するには、すべての前提条件を満たしている必要があります。INTERVAL の詳細については、「INTERVAL RANGE パーティション」をご参照ください。
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 を追加します。
現在のテーブルの 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 つのパーティションがあるため、データはアーカイブされていません。
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');
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 ポリシーの条件が満たされ、データがアーカイブされる準備が整いました。
DLM ポリシーの実行
SQL 文を直接実行して DLM ポリシーを実行することも、MySQL EVENT 機能を使用して定期的に実行することもできます。たとえば、メンテナンスウィンドウが 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 ポリシーが実行されます。
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 つのパーティションしかありません。
mysql.dlm_progress テーブルを照会して、DLM ポリシーの実行履歴を確認できます。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)
p20200101000000、p20210101000000、p20220101000000、_p20230101000000、_p20240101000000、および _p20250101000000 のパーティションに保存されているアクセス頻度の低いコールドデータが、OSS 外部テーブルにアーカイブされました。
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 が自動的に作成されます。
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 テーブルに挿入された行数と一致しています。
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 にアーカイブ
DLM ポリシーの作成
次の例では、sales という名前のパーティションテーブルを作成します。このテーブルは order_time 列をパーティションキーとして使用します。テーブルには INTERVAL ポリシーと 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 policy_part2part TIER TO PARTITION ENGINE=CSV STORAGE=OSS READ ONLY ON (PARTITIONS OVER 3);
このテーブルの DLM ポリシー名は policy_part2part です。パーティション数が 3 を超えると、古いパーティションが OSS にアーカイブされます。
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)
proc_batch_insert ストアドプロシージャを使用して、sales パーティションテーブルにテストデータを挿入します。この操作により INTERVAL ポリシーがトリガーされ、新しいパーティションが自動的に作成されます。
CALL proc_batch_insert(1, 3000, 'sales');
次の結果は、データが正常に挿入されたことを示しています。
Query OK, 1 row affected, 1 warning (0.99 sec)
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)
DLM ポリシーの実行
DLM ポリシーを実行するには、次のコマンドを実行します。
CALL dbms_dlm.execute_all_dlm_policies();
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)
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)
出力から、p20200101000000、p20210101000000、p20220101000000、_p20230101000000、_p20240101000000、および _p20250101000000 の sales パーティションテーブルのパーティションが OSS にアーカイブされたことがわかります。InnoDB ストレージエンジンには、ホットデータのパーティション _p20260101000000、_p20270101000000、および _p20280101000000 の 3 つだけが保持されています。sales テーブルは現在、ハイブリッドパーティションテーブルです。ハイブリッドパーティションテーブルのデータのクエリ方法については、「ハイブリッドパーティションテーブルのクエリ」をご参照ください。
コールドデータの削除
DLM ポリシーの作成
次の例では、sales という名前のパーティションテーブルを作成します。このテーブルは order_time 列をパーティションキーとして使用します。テーブルには INTERVAL ポリシーと DLM ポリシーが設定されています。
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 を超えるとトリガーされ、実行時にコールドデータを削除します。
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)
proc_batch_insert ストアドプロシージャを使用して、sales パーティションテーブルにテストデータを挿入します。この操作により INTERVAL ポリシーがトリガーされ、新しいパーティションが自動的に作成されます。
CALL proc_batch_insert(1, 3000, 'sales');
Query OK, 1 row affected, 1 warning (0.99 sec)
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)
DLM ポリシーの実行
DLM ポリシーを直接実行するには、次のコマンドを実行します。
CALL dbms_dlm.execute_all_dlm_policies();
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)
アクセス頻度が低いコールドデータを格納しているパーティション(p20200101000000、p20210101000000、p20220101000000、_p20230101000000、_p20240101000000、および_p20250101000000)は削除されました。
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 テーブルにアーカイブします。
テーブル 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";
Extra_info フィールドでエラーの詳細を確認します。エラーの原因を特定して解決した後、レコードを削除するか、Archive_stage を ARCHIVE_COMPLETE に更新してください。その後、call dbms_dlm.execute_all_dlm_policies; コマンドを実行してポリシーを手動で実行するか、次のスケジュール実行を待ってください。
説明 データセキュリティのため、ポリシー実行レコードの状態が ARCHIVE_ERROR の場合、スケジューラはポリシーを自動的に再度実行しません。障害の原因を確認してレコードを更新した後、ポリシーはスケジュールされた実行を再開します。