ストレージ コストを削減し、ストレージ効率を向上させるために、データ ライフサイクル管理(DLM)ポリシーを使用して、PolarStore から Object Storage Service (OSS) へのコールドデータの自動アーカイブを有効にすることができます。
前提条件
クラスタは、リビジョン バージョンが 8.0.2.2.9 以後の PolarDB for MySQL 8.0.2 を実行しています。
クラスタのデータベース エンジン バージョンのクエリ方法については、「エンジン バージョンのクエリ」をご参照ください。
説明 クラスタがリビジョン バージョン 8.0.2.2.11.1 以後の PolarDB for MySQL 8.0.2 を実行している場合、データベースに対する DLM 関連の変更はバイナリ ログに記録されません。
DLM ポリシーを使用する前に、コールドデータ アーカイブ機能を有効にする必要があります。 詳細については、「コールドデータ アーカイブの有効化」をご参照ください。
説明 DLM ポリシーの使用時にコールドデータ アーカイブ機能が無効になっていると、次のエラーが報告されます。
ERROR 8158 (HY000): [Data Lifecycle Management] DLM storage engine is not support. The value of polar_dlm_storage_mode is OFF.
制限事項
DLM ポリシーは、パーティション テーブルでのみ使用できます。 パーティション テーブルでは、RANGE COLUMN パーティション方式を使用する必要があり、サブパーティションを含めることはできません。
グローバル セカンダリ インデックス(GSI)が作成されているパーティション テーブルでは、DLM ポリシーを使用できません。
PolarDB for MySQL クラスタで DLM ポリシーを直接変更することはできません。 DLM ポリシーを変更するには、ポリシーを削除してから新しいポリシーを作成します。
テーブルに DLM ポリシーを作成すると、ポリシーに基づいてコールドデータがアーカイブされます。 列の追加や削除、データ型の変更など、元のテーブルに対する DDL 操作によって、元のテーブルとアーカイブ テーブルのスキーマに不整合が生じた場合、後でアーカイブされたデータを解析できません。 このような DDL 操作を実行する前に、テーブルの DLM ポリシーを削除する必要があります。 後で自動コールドデータ アーカイブ機能を再度使用するには、DLM ポリシーを再作成し、アーカイブ テーブルに新しい名前を指定できます。 アーカイブ テーブルの新しい名前は、アーカイブ テーブルの元の名前と同じにすることはできません。
INTERVAL RANGE パーティションを使用してテーブルを自動的にパーティション分割し、DLM ポリシーを使用してアクセス頻度の低いパーティション データを OSS にアーカイブすることをお勧めします。
説明 INTERVAL RANGE パーティションは、リビジョン バージョンが 8.0.2.2.0 以後の PolarDB for MySQL 8.0.2 を実行しているクラスタでのみサポートされています。
使用上の注意
コールドデータがアーカイブされると、OSS 内のアーカイブ テーブルは読み取り専用になり、クエリ パフォーマンスが低下します。 アーカイブ テーブルがビジネスのクエリ パフォーマンス要件を満たせるかどうかを事前に確認してください。
パーティション テーブルのパーティションが OSS にアーカイブされると、パーティション内のデータは読み取り専用になります。 パーティション テーブルでは SQL 文を実行できません。
バックアップ操作を実行する場合、OSS に転送されるデータはバックアップされません。 データを過去の時点に復元する場合、OSS に格納されているデータは復元されません。
DLM ポリシーの作成
CREATE TABLE 文を実行して DLM ポリシーを作成する
CREATE TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
[dlm_add_options]
dlm_add_options:
DLM ADD
[(dlm_policy_definition [, dlm_policy_definition] ...)]
dlm_policy_definition:
POLICY policy_name
[TIER TO TABLE/TIER TO PARTITION/TIER TO NONE]
[ENGINE [=] engine_name]
[STORAGE SCHEMA_NAME [=] storage_schema_name]
[STORAGE TABLE_NAME [=] storage_table_name]
[STORAGE [=] OSS]
[READ ONLY]
[COMMENT 'comment_string']
[EXTRA_INFO 'extra_info']
ON [(PARTITIONS OVER num)]
ALTER TABLE 文を実行して DLM ポリシーを作成する
ALTER TABLE tbl_name
[alter_option [, alter_option] ...]
[partition_options]
[dlm_add_options]
dlm_add_options:
DLM ADD
[(dlm_policy_definition [, dlm_policy_definition] ...)]
dlm_policy_definition:
POLICY policy_name
[TIER TO TABLE/TIER TO PARTITION/TIER TO NONE]
[ENGINE [=] engine_name]
[STORAGE SCHEMA_NAME [=] storage_schema_name]
[STORAGE TABLE_NAME [=] storage_table_name]
[STORAGE [=] OSS]
[READ ONLY]
[COMMENT 'comment_string']
[EXTRA_INFO 'extra_info']
ON [(PARTITIONS OVER num)]
DLM ポリシー パラメータ
パラメータ | 必須 | 説明 |
tbl_name | はい | テーブルの名前。 |
policy_name | はい | DLM ポリシーの名前。 |
TIER TO TABLE | はい | テーブルを OSS にアーカイブします。 |
TIER TO PARTITION | はい | パーティションを OSS にアーカイブします。
説明 この機能はカナリア リリース版です。 この機能を使用するには、クォータ センター にアクセスします。 polardb_mysql_hybrid_partition クォータ ID に対応するクォータ名を見つけ、[適用] 列の [適用] をクリックします。 パーティション テーブルのパーティションを OSS にアーカイブできるのは、クラスタがリビジョン バージョン 8.0.2.2.17 以後の PolarDB for MySQL 8.0.2 を実行している場合のみです。 この機能を使用する場合は、パーティション テーブルのパーティションの総数が 8,192 を超えないようにしてください。
|
TIER TO NONE | はい | アーカイブするデータを削除します。 |
engine_name | いいえ | データをアーカイブするストレージ エンジン。 データは CSV ストレージ エンジンにのみアーカイブできます。 |
storage_schema_name | いいえ | アーカイブ テーブルのスキーマ。 デフォルトでは、アーカイブ テーブルはソース テーブルと同じスキーマを保持します。 |
storage_table_name | いいえ | アーカイブ テーブルの名前。 テーブル名を指定できます。 デフォルトでは、テーブル名は <現在のテーブル名>_<現在の DLM ポリシー名> の形式です。 |
STORAGE [=] OSS | いいえ | アーカイブされたデータが OSS に格納されることを指定します(デフォルト)。 |
READ ONLY | いいえ | アーカイブされたデータが読み取り専用であることを指定します(デフォルト)。 |
comment_string | いいえ | DLM ポリシーのコメント。 |
extra_info | いいえ | 宛先 OSS テーブルの OSS ファイル フィルタ情報を指定します。
説明 パーティション テーブルのパーティションを OSS にアーカイブできるのは、クラスタがリビジョン バージョン 8.0.2.2.25 以後の PolarDB for MySQL Enterprise Edition 8.0.2 を実行している場合のみです。 この機能は、宛先テーブルが存在しない場合にのみ有効になります。 宛先 OSS テーブルが存在しない場合、システムは EXTRA_INFO パラメータの OSS_FILE_FILTER 値に基づいて FILE_FILTER 属性を自動的に生成し、アーカイブ中にフィルタ データを自動的に生成します。 宛先テーブルが既に存在する場合、既存のファイル フィルタが優先されます。
EXTRA_INFO 形式: {"oss_file_filter":"field_filter[,field_filter]"}。 field_filter は次の形式です。
field_filter := field_name[:filter_type]
filter_type := bloom
|
ON (PARTITIONS OVER num) | はい | パーティションの数が指定された num 値を超えると、データをアーカイブします。 |
DLM ポリシーの管理
DLM ポリシーを有効にします。
ALTER TABLE table_name DLM ENABLE POLICY [(dlm_policy_name [, dlm_policy_name] ...)]
DLM ポリシーを無効にします。
ALTER TABLE table_name DLM DISABLE POLICY [(dlm_policy_name [, dlm_policy_name] ...)]
DLM ポリシーを削除します。
ALTER TABLE table_name DLM DROP POLICY [(dlm_policy_name [, dlm_policy_name] ...)]
上記の文では、table_name パラメータはテーブルの名前を指定し、dlm_policy_name パラメータは管理するポリシーの名前を指定します。 複数のポリシー名を指定できます。
DLM ポリシーの実行
現在のクラスタ内のすべてのテーブルで DLM ポリシーを実行します。
CALL dbms_dlm.execute_all_dlm_policies();
特定のテーブルで DLM ポリシーを実行します。
CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');
上記の文では、database_name パラメータはデータベースの名前を指定し、table_name パラメータはテーブルの名前を指定します。
[MySQL イベント] 機能を使用して、クラスタの O&M 中に DLM ポリシーを実行できます。 これにより、ピーク時のデータベースのパフォーマンスへの影響を防ぎます。 また、期限切れのデータを定期的に転送して、ストレージ コストを削減することもできます。 イベントを作成して DLM ポリシーを実行するための構文:
CREATE
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[COMMENT 'comment']
DO event_body;
schedule: {
EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
}
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
event_body: {
CALL dbms_dlm.execute_all_dlm_policies();
| CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');
}
次の表は、上記のサンプル コードのパラメータについて説明しています。
パラメータ | 必須 | 説明 |
event_name | はい | イベントの名前。 |
schedule | はい | イベントを実行するスケジュール。 |
comment | いいえ | イベントのコメント。 |
event_body | はい | イベントの内容。 内容は、イベントを使用して DLM ポリシーを実行する文である必要があります。
説明 CALL dbms_dlm.execute_all_dlm_policies() 文を指定すると、イベントはクラスタのすべての DLM ポリシーを実行します。 したがって、クラスタごとに 1 つのイベントを作成する必要があります。
CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name'); 文を指定すると、イベントは指定されたテーブルのすべての DLM ポリシーのみを実行します。 したがって、指定された時間にテーブルのデータをアーカイブするために DLM ポリシーが定義されているテーブルごとに、1 つのイベントを作成する必要があります。
|
interval | はい | イベントを実行する間隔。 |
timestamp | はい | イベントの実行を開始する時刻。 |
database_name | はい | データベースの名前。 |
table_name | はい | テーブルの名前。 |
MySQL イベント機能の詳細については、「MySQL イベント ドキュメント」をご参照ください。
パーティション テーブル データを OSS にアーカイブする方法の例については、「例」をご参照ください。
例
パーティション テーブルのデータを OSS 外部テーブルにアーカイブする
DLM ポリシーを作成する
次の例では、sales という名前のパーティション テーブルが作成されます。 テーブルは、order_time 列をパーティション キーとして使用し、インターバル パーティションを採用しています。 テーブルには、インターバル ポリシーと DLM ポリシーが定義されています。
説明 INTERVAL RANGE パーティションテーブルを作成するには、要件が満たされていることを確認してください。詳細については、「間隔範囲パーティション」をご参照ください。
sales という名前のテーブルを、DLM ポリシーを定義して作成します。
CREATE TABLE `sales` (
`id` int DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`order_time` datetime NOT NULL,
PRIMARY KEY (`order_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
PARTITION BY RANGE COLUMNS(order_time) INTERVAL(YEAR, 1)
(PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = InnoDB,
PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = InnoDB,
PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = InnoDB)
DLM ADD POLICY test_policy TIER TO TABLE ENGINE=CSV STORAGE=OSS READ ONLY
STORAGE TABLE_NAME = 'sales_history' EXTRA_INFO '{"oss_file_filter":"id,name:bloom"}' ON (PARTITIONS OVER 3);
DLM ポリシーの名前は test_policy です。テーブルのパーティション数が 3 を超えると、コールドデータが現在のテーブルから OSS に CSV 形式でアーカイブされます。アーカイブされたテーブルの名前は sales_history で、読み取り専用です。OSS 外部テーブルが存在しない場合、システムは自動的にテーブルと、id 列と name 列に OSS ファイルフィルターを作成します。
現在のテーブルの DLM ポリシーは、mysql.dlm_policies システムテーブルに格納されます。システムテーブルで DLM ポリシーの詳細を表示できます。mysql.dlm_policies システムテーブルの詳細については、「テーブル形式」をご参照ください。mysql.dlm_policies システムテーブルのスキーマを表示するには、次の文を実行します。
mysql> SELECT * FROM mysql.dlm_policies\G
サンプル結果:
*************************** 1. row ***************************
Id: 3
Table_schema: gg
Table_name: sales
Policy_name: test_policy
Policy_type: TABLE
Archive_type: PARTITION COUNT
Storage_mode: READ ONLY
Storage_engine: CSV
Storage_media: OSS
Storage_schema_name: gg
Storage_table_name: sales_history
Data_compressed: OFF
Compressed_algorithm: NULL
Enabled: ENABLED
Priority_number: 10300
Tier_partition_number: 3
Tier_condition: NULL
Extra_info: {"oss_file_filter": "id,name:bloom,order_time"}
Comment: NULL
1 row in set (0.03 sec)
sales テーブルには 3 つのパーティションが含まれています。データはアーカイブされていません。
sales テーブルに 3,000 行のテストデータを挿入して、[インターバル] パーティションの自動作成をトリガーします。
DROP PROCEDURE IF EXISTS proc_batch_insert;
delimiter $$
CREATE PROCEDURE proc_batch_insert(IN begin INT, IN end INT, IN name VARCHAR(20))
BEGIN
SET @insert_stmt = concat('INSERT INTO ', name, ' VALUES(? , ?, ?);');
PREPARE stmt from @insert_stmt;
WHILE begin <= end DO
SET @ID1 = begin;
SET @NAME = CONCAT(begin+begin*281313, '@stiven');
SET @TIME = from_days(begin + 737600);
EXECUTE stmt using @ID1, @NAME, @TIME;
SET begin = begin + 1;
END WHILE;
END;
$$
delimiter ;
CALL proc_batch_insert(1, 3000, 'sales');
この場合、sales テーブルのパーティション数は 3 を超えています。次の文を実行して、テーブルのスキーマを表示します。
mysql> SHOW CREATE TABLE sales\G
サンプル結果:
*************************** 1. row ***************************
Table: sales
Create Table: CREATE TABLE `sales` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`order_time` datetime NOT NULL,
PRIMARY KEY (`order_time`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
/*!50500 PARTITION BY RANGE COLUMNS(order_time) */
/*!99990 800020200 INTERVAL(YEAR, 1) */
/*!50500 (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = InnoDB,
PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = InnoDB,
PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = InnoDB,
PARTITION _p20230101000000 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = InnoDB,
PARTITION _p20240101000000 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = InnoDB,
PARTITION _p20250101000000 VALUES LESS THAN ('2025-01-01 00:00:00') ENGINE = InnoDB,
PARTITION _p20260101000000 VALUES LESS THAN ('2026-01-01 00:00:00') ENGINE = InnoDB,
PARTITION _p20270101000000 VALUES LESS THAN ('2027-01-01 00:00:00') ENGINE = InnoDB,
PARTITION _p20280101000000 VALUES LESS THAN ('2028-01-01 00:00:00') ENGINE = InnoDB) */
1 row in set (0.03 sec)
テーブルに新しいパーティションが作成され、テーブルのパーティション数が 3 を超えています。DLM ポリシーの実行要件が満たされているため、データをアーカイブできます。
DLM ポリシーを実行する
SQL 文を実行して DLM ポリシーを直接実行するか、MySQL イベント機能を使用して DLM ポリシーを定期的に実行できます。 クラスタの O&M 開始時刻が 2022 年 10 月 11 日から毎日 01:00 の場合、DLM ポリシーは毎日 01:00 に実行されます。 次のイベントを作成できます。
CREATE EVENT dlm_system_base_event
ON SCHEDULE EVERY 1 DAY
STARTS '2022-10-11 01:00:00'
do CALL
dbms_dlm.execute_all_dlm_policies();
毎日 01:00 に、イベントはすべてのテーブルで DLM ポリシーの実行を開始します。
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 ポリシーの実行レコードを表示できます。 mysql.dlm_progress テーブルの詳細については、「テーブルのフォーマット」をご参照ください。 mysql.dlm_progress テーブルのスキーマを表示するには、次の文を実行します。
mysql> SELECT * FROM mysql.dlm_progress\G
結果例:
*************************** 1. row ***************************;
Id: 1
Table_schema: test
Table_name: sales
Policy_name: test_policy
Policy_type: TABLE
Archive_option: PARTITIONS OVER 3
Storage_engine: CSV
Storage_media: OSS
Data_compressed: OFF
Compressed_algorithm: NULL
Archive_partitions: p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, _p20250101000000
Archive_stage: ARCHIVE_COMPLETE
Archive_percentage: 0
Archived_file_info: null
Start_time: 2024-07-26 17:56:20
End_time: 2024-07-26 17:56:50
Extra_info: null
1 row in set (0.00 sec)
元々 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 ファイルフィルタに追加されます。 order_time 列はパーティションキーです。 したがって、OSS ファイルフィルタは列に自動的に作成されます。
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 ファイルフィルタを使用して OSS 外部テーブルのデータのクエリを実行します。 この操作を実行する前に、OSS ファイルフィルタが有効になっていることを確認してください。
mysql> explain select * from sales_history where id = 9;
+----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------------------------+
| 1 | SIMPLE | sales_history | NULL | ALL | NULL | NULL | NULL | NULL | 2016 | 10.00 | Using where; With pushed engine condition (`test`.`sales_history`.`id` = 9) |
+----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------------------------+
1 row in set, 1 warning (0.59 sec)
mysql> select * from sales_history where id = 9;
+------+----------------+---------------------+
| id | name | order_time |
+------+----------------+---------------------+
| 9 | 2531826@stiven | 2019-07-04 00:00:00 |
+------+----------------+---------------------+
1 row in set (0.19 sec)
パーティションテーブルのパーティションを OSS にアーカイブする
DLM ポリシーを作成する
次の例では、sales という名前のパーティションテーブルが作成されます。このテーブルは、order_time 列をパーティションキーとして使用し、インターバルパーティションを採用しています。テーブルには、インターバルポリシーと 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 テーブルに挿入し、インターバルポリシーをトリガーして新しいパーティションを作成します。
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 に転送されたことを示しています。テーブル内のホットデータを格納する _p20260101000000、_p20270101000000、_p20280101000000 パーティションのみが InnoDB に保持されます。sales テーブルはハイブリッドパーティションテーブルになります。ハイブリッドパーティションテーブルのデータのクエリ方法については、「ハイブリッドパーティションテーブルのデータをクエリする」をご参照ください。
コールドデータの削除
[DLM ポリシーの作成]
次の例では、sales という名前のパーティションテーブルが作成されます。このテーブルは、order_time 列をパーティションキーとして使用し、インターバルパーティションを採用しています。テーブルには、インターバルポリシーと 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 テーブルにテストデータを挿入して、[インターバル] パーティションの自動作成をトリガーします。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 を超えた場合に実行されます。この場合、t テーブルの以前のパーティションのデータは OSS にアーカイブされます。 OSS 内のアーカイブテーブルの名前は sales_history です。
t テーブルで test_policy DLM ポリシーを有効にします。
ALTER TABLE t DLM ENABLE POLICY test_policy;
t テーブルで test_policy DLM ポリシーを無効にします。
ALTER TABLE t DLM DISABLE POLICY test_policy;
t テーブルで test_policy DLM ポリシーを削除します。
ALTER TABLE t DLM DROP POLICY test_policy;
実行エラーのトラブルシューティング
DLM ポリシーが実行された後、不適切な構成が原因でエラーが発生する場合があります。 エラーレコードは mysql.dlm_progress テーブルに保存されます。 エラーレコードを表示するには、次の文を実行します。
SELECT * FROM mysql.dlm_progress WHERE Archive_stage = "ARCHIVE_ERROR"; /* エラーレコードを表示するクエリ */
[追加情報] フィールドでエラーの詳細を確認し、エラーの原因を確認してから、現在のエラーレコードを削除するか、現在のエラーレコードの [アーカイブステージ] フィールドの値を [アーカイブ完了] に変更します。 call dbms_dlm.execute_all_dlm_policies; /* DLMポリシーを手動で実行する */ 文を実行して DLM ポリシーを手動で実行するか、次の実行サイクルを待って DLM ポリシーを自動的に実行します。
説明 ポリシーに [アーカイブエラー] 状態の実行レコードがある場合、データセキュリティを確保するために、ポリシーは自動的に実行されません。 エラーの原因を確認し、エラーレコードのステータスを変更する必要があります。 その後、ポリシーが実行されます。