データライフサイクル管理 (DLM) 機能により、PolarStore のコールドデータを、コスト効率の高い OSS ストレージに CSV または ORC フォーマットで自動的かつ定期的にアーカイブできます。これにより、コストが削減され、効率が向上します。
制限事項
-
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 以降を実行するクラスターでのみサポートされます。
注意事項
-
コールドデータのアーカイブ後、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 フォーマットでパーティションをアーカイブします。つまり、ハイブリッドパーティションテーブルを作成します。
説明
-
パーティションテーブルのパーティションをハイブリッドパーティションテーブルとしてアーカイブするには、次の条件を満たす必要があります。
-
この機能を使用する場合、パーティションテーブル内のパーティションの総数が 8,192 を超えないようにしてください。
|
|
TIER TO NONE
|
はい
|
コールドデータをアーカイブせずに削除します。
|
|
engine_name
|
いいえ
|
アーカイブデータのストレージエンジン。有効な値: CSV、ORC、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 外部テーブルへのデータのアーカイブ
-
DLM ポリシーの作成
次の例では、sales という名前のパーティションテーブルを作成します。このテーブルは、order_time 列をパーティションキーとして使用し、時間間隔でパーティション分割されます。このテーブルには、INTERVAL ポリシーと DLM ポリシーの両方があります:
-
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 に開始される場合、次のイベントを作成して、毎日 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 ポリシーを実行します。
-
次のコマンドを実行して、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 つのパーティションのみが保持されています。
-
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)
アクセス頻度の低いコールドデータを保存するパーティション (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 へのアーカイブ
CSV フォーマットでのアーカイブ
-
DLM ポリシーの作成
次の例では、order_time 列をパーティションキーとして時間間隔でパーティション化され、INTERVAL ポリシーと DLM ポリシーの両方が設定された、sales という名前のパーティションテーブルを作成します。
-
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)
スキーマ情報では、sales パーティションテーブルのパーティション p20200101000000、p20210101000000、p20220101000000、_p20230101000000、_p20240101000000、および _p20250101000000 が OSS にアーカイブされていることが示されています。InnoDB エンジンには、3つのホットデータパーティション _p20260101000000、_p20270101000000、および _p20280101000000 のみが残っています。sales テーブルは、現在ハイブリッドパーティションテーブルです。ハイブリッドパーティションテーブルのデータをクエリする方法については、「ハイブリッドパーティションテーブルをクエリする」をご参照ください。
ORC フォーマットでのアーカイブ
-
DLM ポリシーの作成
次の例では、order_time 列をパーティションキーとして使用し、時間間隔でデータをパーティション分割する sales_orc パーティションテーブルを作成します。このテーブルには、INTERVAL ポリシーと DLM ポリシーの両方があります。
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 パーティションの両方を含むハイブリッドパーティションテーブルになります。
-
DLM ポリシーの実行
INTERVAL をトリガーして新しいパーティションを自動的に作成し、パーティション数が 3 を超えて DLM ポリシー条件が満たされるように、sales_orc パーティションテーブルにテストデータを挿入します。
CALL proc_batch_insert(1, 3000, 'sales_orc');
DLM ポリシーを実行します。
CALL dbms_dlm.execute_all_dlm_policies();
-
アーカイブ結果の表示
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 パーティションテーブルの p20210101000000、p20220101000000、_p20230101000000、_p20240101000000、および _p20250101000000 パーティションは OSS にアーカイブされています。InnoDB エンジンには、3つのホットデータパーティション _p20260101000000、_p20270101000000、および _p20280101000000 のみが残っています。これにより、sales_orc テーブルはハイブリッドパーティションテーブルになります。ハイブリッドパーティションテーブルでデータをクエリする方法については、「ハイブリッドパーティションテーブルのクエリ」をご参照ください。
コールドデータの直接削除
-
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)
-
sales パーティションテーブルにテストデータを挿入して、INTERVAL ポリシーがトリガーされ、新しいパーティションが自動的に作成されるようにします。新しいデータを挿入するには、proc_batch_insert ストアドプロシージャを使用します。
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 状態の実行レコードがある場合、そのポリシーは自動的に再実行されません。ポリシーを再度実行するには、失敗の原因を特定し、レコードを修正する必要があります。