ストレージコストを削減し、ストレージ効率を向上させるために、データライフサイクル管理 (DLM) ポリシーを使用して、PolarStoreからObject storage Service (OSS) へのコールドデータの自動アーカイブを有効にできます。
前提条件
クラスターは、次のいずれかのデータベースエンジンバージョンを実行します。
クラスターのデータベースエンジンバージョンを照会する方法については、「エンジンバージョンの照会」をご参照ください。
説明 クラスタがリビジョンバージョンが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にアーカイブします。 |
パーティーへの時間 | 必須 | パーティションをOSSにアーカイブします。
説明 この機能はカナリアリリースにあります。 この機能を使用するには、クォータセンターに移動します。 polardb_mysql_hybrid_partition クォータIDに対応するクォータ名を見つけ、[操作] 列の [適用] をクリックします。 パーティションテーブルのパーティションをOSSにアーカイブできるのは、リビジョンバージョンが8.0.2.2.17以降のPolarDB for MySQL 8.0.2をクラスターで実行している場合のみです。 この機能を使用する場合は、パーティションテーブルのパーティションの総数が8,192を超えないようにしてください。
|
ティアーからノー | 必須 | アーカイブするデータを削除します。 |
engine_name | 選択可能 | データがアーカイブされるストレージエンジン。 データはCSVストレージエンジンにのみアーカイブできます。 |
storage_schema_name | 選択可能 | アーカイブされたテーブルのスキーム。 デフォルトでは、アーカイブテーブルはソーステーブルと同じスキーマを保持します。 |
storage_table_name | 選択可能 | アーカイブされたテーブルの名前。 テーブル名を指定できます。 デフォルトでは、テーブル名の形式は <現在のテーブル名 >_< 現在のDLMポリシー名> です。 |
STORAGE [=] OSS | 選択可能 | アーカイブされたデータをOSSに保存することを指定します (デフォルト) 。 |
読むだけ | 選択可能 | アーカイブデータが読み取り専用 (デフォルト) であることを指定します。 |
comment_string | 選択可能 | DLMポリシーのコメント。 |
extra_info | 選択可能 | ターゲットOSSテーブルのOSSファイルフィルター情報を指定します。
説明 クラスタがPolarDB for MySQL Enterprise Edition 8.0.2のリビジョンバージョンが8.0.2.2.25以降である場合にのみ、パーティションテーブルのパーティションをOSSにアーカイブできます。 この機能は、宛先テーブルが存在しない場合にのみ有効です。 ターゲット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 (数を超えるパーティー) | 必須 | パーティションの数が指定された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イベント機能を使用して、クラスターの運用中に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
パーティションテーブルを作成するには、要件が満たされていることを確認します。 詳細については、「間隔範囲のパーティション分割」をご参照ください。
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
列に作成します。
現在のテーブルの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つのパーティションしかありません。
DLMポリシーの実行記録は、mysql.dlm_progress
テーブルで確認できます。 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ポリシーの名前はpolici_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に転送されることを示しています。 InnoDBには、テーブル内のホットデータを格納する _p20260101000000
、_p20270101000000
、および _p20280101000000
パーティションのみが保持されます。 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
テーブルにテストデータを挿入して、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を超えた場合に実行されます。 この場合、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ポリシーを手動で実行するか、次の実行サイクルを待ってDLMポリシーを自動的に実行します。
説明 ポリシーにARCHIVE_ERROR状態の実行レコードがある場合、データのセキュリティを確保するために、ポリシーは自動的に実行されません。 エラーの原因を確認し、エラーレコードのステータスを変更する必要があります。 そして、ポリシーが実行されます。