データライフサイクル管理 (DLM) 機能は、使用頻度の低いデータを PolarStore から低コストの Object Storage Service (OSS) に定期的に転送することで、コールドデータを自動的にアーカイブします。これにより、ストレージコストを削減し、データベースの効率を向上させます。
適用範囲
ご利用のクラスターは、PolarDB for MySQL 8.0.2、マイナーバージョン 8.0.2.2.9 以降を実行している必要があります。
クラスターのバージョンを確認するには、「バージョン番号のクエリ」をご参照ください。
説明 ご利用のクラスターが 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 にデータをアーカイブすることを推奨します。
説明 PolarDB for MySQL 8.0.2、マイナーバージョン 8.0.2.2.0 以降を実行するクラスターのみがインターバルレンジパーティショニングをサポートします。
注意事項
コールドデータがアーカイブされた後、OSS 上のアーカイブテーブルは読み取り専用となり、クエリパフォーマンスが低下します。事前にアーカイブされたデータでテストを行い、クエリパフォーマンスが要件を満たしていることを確認してください。
パーティションテーブルのパーティションが OSS にアーカイブされると、アーカイブされたパーティション内のデータは読み取り専用になります。パーティションテーブルに対して DDL 操作を実行することはできません。
バックアップ操作を実行する際、OSS に転送されたデータはバックアップされません。OSS 上のデータはポイントインタイムリストア (PITR) をサポートしていません。
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 | はい | テーブルにアーカイブします。 |
TIER TO PARTITION | はい | パーティションを OSS にアーカイブします。
説明 この機能はカナリアリリースです。この機能を使用するには、Quota Center に移動し、ID polardb_mysql_hybrid_partition でクォータを検索し、[アクション] 列の [リクエスト] をクリックして有効にします。 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 | いいえ | テーブルにアーカイブする場合、これはテーブルの名前です。テーブル名を指定できます。デフォルトは <current_table_name>_<current_DLM_policy_name> です。 |
STORAGE [=] OSS | いいえ | アーカイブされたデータは OSS エンジンに格納されます。これがデフォルトです。 |
READ ONLY | いいえ | アーカイブされたデータは読み取り専用です。これがデフォルトです。 |
comment_string | いいえ | DLM ポリシーのコメント。 |
extra_info | いいえ | 宛先 OSS テーブルの OSS_FILE_FILTER 情報。
説明 Enterprise Edition クラスターで PolarDB for MySQL 8.0.2、リビジョン 8.0.2.2.25 以降を実行しているパーティションテーブルからのみ、パーティションを OSS にアーカイブできます。 この機能は、宛先テーブルが存在しない場合にのみ有効です。この場合、システムは EXTRA_INFO の OSS_FILE_FILTER パラメーターを使用して、宛先 OSS テーブルを作成する際に 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 を実行してデータベースのパフォーマンスに影響を与えることを避け、期限切れのデータを定期的に転送してデータベースのストレージ料金を削減できます。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 | はい | 現在の EVENT の名前。 |
schedule | はい | 現在の EVENT の実行時間と間隔。 |
comment | いいえ | 現在の EVENT のコメント。 |
event_body | はい | 現在の EVENT が実行する内容。DLM ポリシーを実行するステートメントに設定します。
説明 CALL dbms_dlm.execute_all_dlm_policies() を使用する場合、現在の EVENT はクラスター上のすべての DLM ポリシーを実行します。したがって、クラスターごとに 1 つの EVENT を作成する必要があります。
CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name'); を使用する場合、現在の EVENT は特定のテーブルの DLM ポリシーのみを実行します。したがって、DLM ポリシーを持つ各テーブルに対応する EVENT を作成し、指定した時間にデータをアーカイブする必要があります。
|
interval | はい | EVENT の実行間隔。 |
timestamp | はい | EVENT の実行を開始する時間。 |
database_name | はい | データベース名。 |
table_name | はい | テーブル名。 |
MySQL EVENT 機能の詳細については、「MySQL EVENT 公式ドキュメント」をご参照ください。
使用例については、「OSS へのコールドデータアーカイブの例」をご参照ください。
例
パーティションテーブルから OSS 外部テーブルへのデータアーカイブ
DLM ポリシーの作成
次の例では、sales という名前のパーティションテーブルを作成します。このテーブルは order_time 列をパーティションキーとして使用し、時間間隔でパーティションを分割します。テーブルには INTERVAL と DLM の 2 つのポリシーがあります。
説明 INTERVAL RANGE パーティションテーブルの作成には特定の前提条件があります。INTERVAL の使用に関する詳細については、「PolarDB 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 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 テーブルが存在しない場合、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 ポリシーの実行
DLM ポリシーは SQL ステートメントで直接実行することも、MySQL の EVENT 機能を使用して定期的に実行することもできます。たとえば、2022 年 10 月 11 日から、クラスターの O&M ウィンドウが毎日午前 1 時に開始するとします。DLM ポリシーは毎日午前 1 時に実行されます。対応する実行 EVENT を次のように作成します:
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();
午前 1 時以降、この EVENT はすべてのテーブルで 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: 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 の 2 つのポリシーがあります。
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 テーブルはハイブリッドパーティションテーブルになりました。ハイブリッドパーティションテーブルのデータクエリ方法については、「ハイブリッドパーティションのクエリ」をご参照ください。
コールドデータの直接削除
DLM ポリシーの作成
次の例では、sales という名前のパーティションテーブルを作成します。このテーブルは order_time 列をパーティションキーとして使用し、時間間隔でパーティションを分割します。テーブルには INTERVAL と DLM の 2 つのポリシーがあります。
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 を超えることです。DLM ポリシーが実行されると、コールドデータが直接削除されます。
次のコマンドを実行して、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 を使用した 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 を超えることです。この DLM ポリシーが実行され、パーティション数が 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";
エラーの詳細は Extra_info フィールドで確認できます。エラーの原因を確認した後、現在のレコードを削除するか、現在のレコードの Archive_stage を ARCHIVE_COMPLETE に変更します。その後、call dbms_dlm.execute_all_dlm_policies; コマンドで DLM ポリシーを手動で実行するか、次の実行サイクルで自動的に実行されるのを待ちます。
説明 データセキュリティのため、ポリシーの実行レコードのステータスが ARCHIVE_ERROR の場合、そのポリシーは自動的に再実行されません。ポリシーは、障害の原因を確認し、対応するレコードを修正した後にのみ続行されます。