テーブルにコールドデータが蓄積すると、PolarStore 内に保持しても高価なローカル記憶域を消費するだけで、実質的なクエリ利点が得られません。コールドデータアーカイブでは、テーブルデータを PolarStore から Object Storage Service (OSS) へ CSV または ORC 形式で移動し、ローカル記憶域を解放します。同時に、標準 SQL を用いたクエリは引き続き可能であり、アプリケーション側のクエリ変更は一切不要です。
本ページでは、標準テーブルおよびパーティションテーブルのアーカイブ方法、アーカイブデータの暗号化有効化、OSS からの PolarStore へのデータ復元、および OSS ファイルの削除について説明します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
クラスターでコールドデータアーカイブを有効化 していること
フォーマット要件を満たすクラスターバージョンであること:
CSV 形式
クラスタータイプ 最低バージョン Cluster Edition MySQL 8.0.1 リビジョン 8.0.1.1.47、または MySQL 8.0.2 リビジョン 8.0.2.2.10 Multi-master Cluster (Limitless) Edition カーネルバージョン 8.0.1.0.13 ORC 形式
クラスタータイプ 最低バージョン Cluster Edition リビジョン 8.0.2.2.30 Multi-master Cluster (Limitless) Edition リビジョン 8.0.2.2.30
PolarDB for MySQL 8.0.1(リビジョン 8.0.1.1.33 以降)または 8.0.2(リビジョン 8.0.2.2.11.1 以降)を実行中のクラスターでは、手動アーカイブ操作はバイナリログに記録されません。
標準テーブルのアーカイブ
標準テーブルのアーカイブは、テーブルレベルの操作です。アーカイブ後、テーブルは OSS エンジンにより読み取り専用となり、データファイルは OSS に格納され、PolarStore で占めていた領域が解放されます。アーカイブ完了後も、従来と同一の SQL ステートメントでテーブルをクエリできます。アクセスパターンの変更は一切不要です。
制限事項
対応エンジン:InnoDB および X-Engine。
InnoDB テーブルにはプライマリキーが必要です。
インメモリ列指向インデックス(IMCI)を持つテーブルは、CSV 形式ではなく ORC 形式でのみアーカイブ可能です。
アーカイブ中は、そのテーブルに対して DDL および DML ステートメントを実行できません。
ユーザー作成の OSS サーバーへのアーカイブはサポートされていません。
アーカイブ後はテーブルが読み取り専用となり、クエリパフォーマンスが低下する可能性があります。要件を満たすか確認するため、アーカイブ後にクエリパフォーマンスをテストしてください。
構文
CSV 形式
形式 1:
ALTER TABLE table_name ENGINE = CSV CONNECTION = 'default_oss_server';形式 2:クラスターが以下のいずれかの要件を満たしている必要があります。
CSV 形式でのアーカイブ
プロダクトエディションが Cluster Edition の場合、Milvus バージョンは以下のいずれかである必要があります。
MySQL 8.0.1、マイナーバージョン 8.0.1.1.47 以降。
MySQL 8.0.2、リビジョンバージョン 8.0.2.2.10 以降。
Multi-master Cluster (Limitless) Edition の場合、カーネルバージョンは 8.0.1.0.13 以降である必要があります。
ORC 形式でのアーカイブ
Cluster Edition の場合、リビジョンバージョンは 8.0.2.2.30 以降である必要があります。
Multi-master Cluster (Limitless) Edition の場合、リビジョンバージョンは 8.0.2.2.30 以降である必要があります。
X-Engine 形式でのアーカイブ
標準テーブルのアーカイブ:
MySQL 8.0.1(リビジョン 8.0.1.1.31 以降)。
MySQL 8.0.2(リビジョン 8.0.2.2.12 以降)。
パーティションテーブルのアーカイブ:MySQL 8.0.2(リビジョン 8.0.2.2.12 以降)。
X-Engine 列指向テーブルとしてのアーカイブ:MySQL 8.0.2(リビジョン 8.0.2.2.33 以降)。
ALTER TABLE table_name ENGINE = CSV STORAGE OSS;
ORC 形式
ALTER TABLE table_name ENGINE = ORC STORAGE OSS;OSS に同名のファイルが既に存在する場合、操作はエラー「Target file for archived table exists on oss.」で失敗します。リビジョン 8.0.2.2.29 以降を実行中のクラスターでは、テーブルスキーマを削除する際に対応する OSS ファイルも削除するため、FORCE STORAGE OSSをDROP TABLEステートメントに追加してください。
DROP TABLE table_name FORCE STORAGE OSS;パラメーター
| パラメーター | 説明 |
|---|---|
table_name | OSS へアーカイブするテーブルの名前 |
例
t テーブルを oss_test データベースから CSV または ORC 形式で OSS へアーカイブします。
プライマリキーを持つ InnoDB テーブルを作成します。
CREATE TABLE t(a int, b int, c int, primary key(a)) ENGINE = INNODB;データを挿入します。
INSERT INTO t VALUES (1,2,3);テーブルをアーカイブします。CSV 形式:
ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';ORC 形式:
ALTER TABLE t ENGINE = ORC STORAGE OSS;アーカイブ完了後に結果を確認します。
コンソールから:PolarDB コンソール にログインします。対象クラスターページで、設定項目と管理 > データライフサイクル > データアーカイブ(コールドデータ) へ移動します。
SQL から: アーカイブ済みテーブルを直接クエリします — アクセスパターンは変更されません。
sql SELECT * FROM t;
OSS 外部テーブルへのパーティションのアーカイブ
この手法では、パーティションテーブルの特定のパーティションを新しい OSS 外部テーブルへアーカイブします。ソース InnoDB テーブルは非アーカイブパーティションを継続して保持し、アーカイブされたデータは OSS 外部テーブルからクエリ可能です。
前提条件
クラスターバージョン:PolarDB for MySQL 8.0.2(リビジョン 8.0.2.2.25 以降)。
パーティションレベルのメタデータロック (MDL) を有効にするには、クラスターパラメーター
partition_level_mdl_enabledをONに設定します。詳細については、「クラスターおよびノードパラメーターの設定」をご参照ください。クラスターパラメーター
loose_use_oss_metaをONに設定します。手順については、「クラスターおよびノードのパラメーターを設定する」をご参照ください。
制限事項
送信先 OSS テーブルは CSV 形式のみをサポートします。
パーティションをアーカイブした後、ソーステーブルには少なくとも 1 つの InnoDB パーティションを残す必要があります。
アーカイブされたデータはパーティション情報を持たなくなり、直接復元できません。必要に応じて、
INSERT INTO ... SELECTを使用してデータを復元してください。サブパーティションは個別にアーカイブできません。代わりに、最上位レベルのパーティション全体をアーカイブしてください。
対応する最上位レベルのパーティションタイプ:
最上位レベルのパーティションタイプ 2 次パーティションタイプ 対応状況 LIST 任意 はい RANGE 任意 はい KEY 任意 はい HASH 任意 いいえ LIST DEFAULT 任意 DEFAULT パーティションを除き対応
構文
CALL dbms_dlm.archive_partition2table(
'source_db',
'source_tb',
'source_part',
'archive_db',
'archive_table',
'oss_file_filter'
);パラメーター
| パラメーター | 説明 |
|---|---|
source_db | ソーステーブルを含むデータベース |
source_tb | ソーステーブルの名前 |
source_part | アーカイブするパーティション。複数のパーティション名はカンマで区切ります |
archive_db | 送信先 OSS テーブルのデータベース |
archive_table | 送信先 OSS テーブルの名前 |
oss_file_filter | クエリ高速化のために OSS_FILE_FILTER を作成する列。詳細については、「OSS_FILE_FILTER クエリ高速化 |
送信先テーブルの状態に基づく動作:
送信先テーブルが存在しない場合: テーブルは自動的に作成されます。
OSS_FILE_FILTERは指定された列に作成され、プライマリキーおよびパーティションキーは自動的に追加されます。送信先テーブルが存在する場合: 列名および型はソーステーブルと一致している必要があります。異なる場合は、アーカイブ前に DDL ステートメントを使用してスキーマを整合させてください。「コールドデータ向け DDL」をご参照ください。送信先テーブルに定義が異なる
OSS_FILE_FILTERが既に存在する場合、既存のものが使用されます。送信先テーブルは存在しないが、OSS に同名のファイルが存在する場合: 操作は以下のエラーで失敗します。
ERROR 8181 (HY000): [Data Lifecycle Management] errmsg: Target file for archived table exists on oss, please remove it first, or use flag 'FORCE' to overwrite on existing files.不要な残留 OSS ファイルがある場合は、それらを削除して再試行してください。
-- 残留 OSS ファイルを削除します。 CALL dbms_oss.delete_table_file('test', 'sales_history'); -- Query OK, 0 rows affected (0.76 sec) -- アーカイブ操作を再試行します。 CALL dbms_dlm.archive_partition2table('test', 'sales', 'p0', 'test', 'sales_history', 'id'); -- Query OK, 0 rows affected (4.24 sec)
例
パーティションテーブル sales の p0 パーティションを、新しい OSS テーブル sales_history へアーカイブします。
InnoDB パーティションテーブルを作成し、データを挿入します。
DROP TABLE IF EXISTS `sales`; -- RANGE パーティションテーブルを作成します。 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(month, 1) (PARTITION p0 VALUES LESS THAN ('2022-01-01') ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = InnoDB); -- バッチ挿入プロシージャを使用して 1,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 + 738368); EXECUTE stmt using @ID1, @NAME, @TIME; SET begin = begin + 1; END WHILE; END; $$ delimiter ; CALL proc_batch_insert(1, 1000, 'sales');salesテーブルの現在のスキーマを確認します。SHOW CREATE TABLE sales;期待される出力:
*************************** 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(MONTH, 1) */ /*!50500 (PARTITION p0 VALUES LESS THAN ('2022-01-01') ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = InnoDB, ...) */ 1 row in set (0.03 sec)p0パーティションを OSS テーブルsales_historyへアーカイブし、OSS_FILE_FILTERをid列に設定します。CALL dbms_dlm.archive_partition2table('test', 'sales', 'p0', 'test', 'sales_history', 'id'); -- Query OK, 0 rows affected (1.86 sec)作成された
sales_historyテーブルのスキーマを確認します。SHOW CREATE TABLE sales_history;期待される出力:
*************************** 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,order_time' */ 1 row in set (0.00 sec)アーカイブされたデータをクエリします。
クエリパフォーマンス向上のため、OSS テーブルで OSS_FILE_FILTER クエリ高速化 を有効化してください。
SELECT * FROM sales_history WHERE id = 100;期待される出力:
+------+-----------------+---------------------+ | id | name | order_time | +------+-----------------+---------------------+ | 100 | 28131400@stiven | 2021-11-09 00:00:00 | +------+-----------------+---------------------+ 1 row in set (0.24 sec)
インプレースでのパーティションアーカイブ(ハイブリッドパーティションテーブル)
本機能はカナリアリリース中です。有効化するには、クォータセンター にアクセスし、「polardb_mysql_hybrid_partition」という ID のクォータを見つけ、要求 をクリックしてください。インプレースでのパーティションアーカイブは、InnoDB テーブルの特定のパーティションを OSS バックエンドストレージへ変換し、ハイブリッドパーティションテーブルを作成します。非アーカイブパーティションは PolarStore に残り、アーカイブパーティションが使用していた領域は自動的に解放されます。
前提条件
クラスターバージョン:PolarDB for MySQL 8.0.2(リビジョン 8.0.2.2.14 以降)。
制限事項
InnoDB ストレージエンジンのパーティションテーブルのみがサポートされます。
テーブルには少なくとも 1 つの InnoDB パーティションを残す必要があります。最後の InnoDB パーティションはアーカイブできません。
ハイブリッドパーティションテーブルでは DDL 操作を実行できません。「ハイブリッドパーティションテーブルの作成」を参照して、詳細情報をご確認ください。
アーカイブされたパーティションのデータは読み取り専用です。アーカイブパーティションに対する書き込み操作はサポートされていません。
サブパーティションは個別にアーカイブできません。
LIST DEFAULT HASH パーティションテーブルの DEFAULT パーティションはアーカイブできません。
HASH および KEY パーティションテーブルはアーカイブできません。
パーティションテーブル全体を手動でアーカイブすることはできません。パーティションを個別にアーカイブしてください。
構文
-- CSV 形式でアーカイブ:
ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV;
-- ORC 形式でアーカイブ:
ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = ORC;OSS に同名のファイルが既に存在する場合、操作は「Target file for archived table exists on oss.」というエラーで失敗します。既存の OSS ファイルを上書きするには、ステートメントにFORCEを追加します。リビジョン 8.0.2.2.29 以降を実行中のクラスターでは、FORCE STORAGE OSSもサポートされています。
ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV/ORC FORCE;ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV FORCE STORAGE OSS;パラメーター
| パラメーター | 説明 |
|---|---|
table_name | パーティションテーブルの名前 |
part_name | アーカイブするパーティションの名前 |
例
テーブル t の p1 および p2 パーティションを CSV 形式で OSS へアーカイブします。
InnoDB RANGE パーティションテーブルを作成します。
CREATE TABLE t(a int, b int, c int, primary key(a)) PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN (100), PARTITION p2 VALUES LESS THAN (200), PARTITION p3 VALUES LESS THAN MAXVALUE );データを挿入します。
INSERT INTO t VALUES (1,1,1), (10,10,10), (100,100,100), (150,150,150), (200,200,200), (1000,1000,1000);p1およびp2パーティションをアーカイブします。CSV 形式:ALTER TABLE t CHANGE PARTITION p1 ENGINE = CSV; ALTER TABLE t CHANGE PARTITION p2 ENGINE = CSV;ORC 形式:
ALTER TABLE t CHANGE PARTITION p1 ENGINE = ORC; ALTER TABLE t CHANGE PARTITION p2 ENGINE = ORC;アーカイブ完了後に結果を確認します。
コンソールから:PolarDB コンソール にログインします。対象クラスターページで、設定項目と管理 > データライフサイクル > データアーカイブ(コールドデータ) へ移動します。
SQL から: ハイブリッドパーティションテーブルをクエリします。「ハイブリッドパーティションのクエリ」を参照して、詳細情報をご確認ください。
アーカイブデータに対する TDE 暗号化の有効化
透過的データ暗号化(TDE)は、アーカイブ時に OSS へ書き込まれるデータファイルを暗号化します。OSS サーバーが暗号化および復号を透明に行うため、通常通り SQL を使用してアーカイブデータをクエリでき、追加の手順は一切不要です。
OSS 側の暗号化に関する詳細については、「データ暗号化」をご参照ください。
前提条件
CSV または ORC 形式での手動アーカイブのみ対応。
クラスターバージョン:PolarDB for MySQL 8.0.1(リビジョン 8.0.1.1.47 以降)または 8.0.2(リビジョン 8.0.2.2.27 以降)。クラスターがこの要件を満たさない場合は、「マイナーバージョンのアップグレード」をご参照ください。
構文
アーカイブステートメントに ENCRYPTION="Y" を追加します。
ALTER TABLE t1 ENGINE = CSV ENCRYPTION="Y" STORAGE OSS;OSS から PolarStore へのデータ復元
標準アーカイブテーブルの復元
復元操作では、OSS テーブルを PolarStore 内の読み書き可能な InnoDB テーブルへ変換します。復元後、OSS 内のアーカイブデータは削除されます。
アーカイブ済みの OSS テーブルは読み取り専用です。INSERT、UPDATE、およびDELETE操作は「1036 - Table 't1' is read only」というエラーで失敗します。変更を行う前に、テーブルを PolarStore へ復元してください。
構文
ALTER TABLE table_name ENGINE = engine_name;パラメーター
| パラメーター | 説明 |
|---|---|
table_name | 復元するアーカイブ済み OSS テーブルの名前 |
engine_name | 復元先のエンジンタイプ(例:InnoDB) |
例
t OSS テーブルを oss_test データベースから PolarStore へ復元します。
ALTER TABLE `oss_test`.`t` ENGINE = InnoDB;復元後、必要に応じてデータを変更し、その後、以下のいずれかの形式で再度アーカイブできます。
-- 形式 1:
ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';
-- 形式 2:
ALTER TABLE t ENGINE = CSV STORAGE OSS;アーカイブ済みパーティションの復元
アーカイブ済みパーティションの復元では、そのデータが OSS から PolarStore へ戻されます。復元後、OSS 内のコールドデータは削除されます。
構文
ALTER TABLE table_name REORGANIZE PARTITION part_name INTO (partition_definition);パラメーター
| パラメーター | 説明 |
|---|---|
table_name | アーカイブ済みパーティションを含むテーブルの名前 |
part_name | 復元するパーティションの名前 |
partition_definition | パーティション定義。復元対象のパーティションの元の定義と一致している必要があります |
例
パーティションテーブル t の p1 パーティションを OSS から PolarStore へ復元します。
ALTER TABLE t REORGANIZE PARTITION p1 INTO (PARTITION p1 VALUES LESS THAN (100));OSS ファイルの削除
本機能は、PolarDB for MySQL 8.0.1(リビジョン 8.0.1.1.42 以降)または 8.0.2(リビジョン 8.0.2.2.23 以降)を必要とします。クラスターがこの要件を満たさない場合は、「マイナーバージョンのアップグレード」をご参照ください。
アーカイブ済みテーブルの削除や PolarStore への復元を行っても、OSS 内の基盤となるファイルは自動的に削除されません。データが不要になったと確認した後、ファイルを手動で削除してください。
CALL dbms_oss.delete_table_file('database_name', 'table_name');OSS ファイルの削除は非同期で行われます — ファイルは、すべてのクラスターノードがそのファイルに依存しなくなるまで完全には削除されません。コマンドが「OSS files are still in use」というエラーで失敗した場合は、しばらく待ってから再試行してください。
次のステップ
アーカイブデータのクエリを高速化するには、「OSS_FILE_FILTER クエリ高速化」を有効化してください。
アーカイブデータを DDL で管理するには、「コールドデータ向け DDL」をご参照ください。
ハイブリッドパーティションテーブルを操作するには、「ハイブリッドパーティションテーブルの作成」をご参照ください。