このトピックでは、CSV または ORC 形式でコールドデータをアーカイブする方法、および OSS テーブルから PolarStore にデータを復元する方法について説明します。
適用範囲
まず、コールドデータアーカイブを有効化する必要があります。この機能には、次のいずれかのクラスターリビジョンが必要です:
CSV 形式へのアーカイブ
クラスターエディションは Cluster Edition:
標準テーブルのアーカイブ:
MySQL 8.0.1、リビジョン 8.0.1.1.47 以降。
MySQL 8.0.2、リビジョン 8.0.2.2.10 以降。
パーティションテーブルのアーカイブ:
MySQL 8.0.2、リビジョン 8.0.2.2.34.1 以降。
クラスターのエディションが マルチマスタークラスター (Limitless) Edition の場合:
MySQL 8.0.1、リビジョン 8.0.1.0.13 以降。
ORC 形式へのアーカイブ
クラスターエディションは Cluster Edition です:
標準テーブルのアーカイブ:MySQL 8.0.2、リビジョン 8.0.2.2.30 以降。
パーティションテーブルのアーカイブ:MySQL 8.0.2、リビジョン 8.0.2.2.34.1 以降。
クラスターのエディションが マルチマスタークラスター (Limitless) Edition の場合:MySQL 8.0.2、リビジョン 8.0.2.2.30 以降。
次のいずれかのバージョンのクラスターでコールドデータを手動でアーカイブする場合、その操作はバイナリログに記録されません。
-
PolarDB for MySQL 8.0.1、リビジョン 8.0.1.1.33 以降。
-
PolarDB for MySQL 8.0.2、リビジョン 8.0.2.2.11.1 以降。
操作手順
標準テーブルのアーカイブ
コールドデータアーカイブはテーブルレベルの操作です。テーブルをアーカイブすると、そのテーブルは読み取り専用のアーカイブテーブルになります。アーカイブテーブルのエンジンは OSS エンジンであり、そのデータファイルは Object Storage Service (OSS) に保存されます。アーカイブ操作が完了すると、PolarDB は元のテーブルが PolarStore で占有していた領域を解放します。
構文
CSV 形式
-
フォーマット 1:
ALTER TABLE table_name ENGINE = CSV CONNECTION = 'default_oss_server'; -
フォーマット 2:ご利用のクラスターは、次のいずれかのリビジョン要件を満たす必要があります。
-
Cluster Edition:
-
MySQL 8.0.1、リビジョン 8.0.1.1.33 以降。
-
MySQL 8.0.2、リビジョン 8.0.2.2.13 以降。
-
-
マルチマスタークラスター (Limitless) Edition:リビジョンは 8.0.1.1.15 以降である必要があります。
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. -
クラスターのバージョンが MySQL 8.0.2 で、リビジョンが 8.0.2.2.29 以降の場合、
FORCE STORAGE OSSオプションを使用して OSS ファイルを強制的に削除できます。FORCE STORAGE OSSオプションを上記の構文に追加して、テーブル構造と対応する OSS ファイルを削除できます。例:DROP TABLE table_name FORCE STORAGE OSS;
パラメーター
|
パラメーター |
説明 |
|
table_name |
OSS にアーカイブするテーブルの名前。 |
注意事項
-
コールドデータアーカイブ機能は、InnoDB ストレージエンジンまたは X-Engine ストレージエンジンを使用するテーブルで使用できます。
-
アーカイブプロセス中に DDL または DML ステートメントを使用してテーブルを変更することはできません。
-
ユーザーが作成した OSS サーバーにデータをアーカイブすることはできません。
-
InnoDB テーブルをアーカイブするには、プライマリキーが必要です。
-
アーカイブ後、OSS 内のテーブルは読み取り専用になり、クエリのパフォーマンスが低下する可能性があります。パフォーマンスをテストして、要件を満たしていることを確認する必要があります。
-
インメモリ列指向インデックス (IMCI) が設定されたテーブルは、CSV 形式ではアーカイブできず、ORC 形式でアーカイブする必要があります。
例
テーブル t のデータを CSV または ORC 形式で OSS にアーカイブします。
-
oss_testデータベースにtという名前の InnoDB テーブルを作成します。CREATE TABLE t(a int, b int, c int, primary key(a)) ENGINE = INNODB; -
テーブル
tにデータを挿入します。INSERT INTO t VALUES (1,2,3); -
ALTER TABLEコマンドを使用してテーブルをアーカイブします。-
CSV 形式でアーカイブ:
ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server'; -
ORC 形式でアーカイブ:
ALTER TABLE t ENGINE = ORC STORAGE OSS;
-
-
アーカイブが完了したら、PolarDBコンソールでアーカイブされたテーブル情報を表示するか、SQL を使用して直接データをクエリできます:
-
OSS にアーカイブされたデータベースとテーブルに関する情報を表示するには:PolarDB コンソールにログインします。対象クラスターの左側のナビゲーションウィンドウで、 を選択して情報を表示します。
-
標準テーブルと同様に、アーカイブされたテーブルのデータをクエリします。例:
SELECT * FROM t;
-
パーティションの OSS 外部テーブルへのアーカイブ
構文
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 |
宛先テーブルのデータベース名。 |
|
archive_table |
宛先テーブルの名前。 |
|
oss_file_filter |
宛先テーブルの oss_file_filter に含める列のカンマ区切りリスト。詳細については、「OSS_FILE_FILTER クエリ高速化」をご参照ください。 |
注意事項
-
宛先の OSS テーブルが存在しない場合は、自動的に作成されます。クエリを高速化するために、
oss_file_filterパラメーターで指定された列にoss_file_filterも自動的に作成されます。プライマリキーとパーティションキーも自動的にoss_file_filterに追加されます。 -
ターゲットの OSS テーブルが存在する場合、2 つのテーブルの列名または列タイプの定義を比較する必要があります。データは、定義が一致する場合にのみアーカイブできます。それ以外の場合は、エラーが発生します。DDL ステートメントを使用して、2 つのテーブル定義を一致させることができます。詳細については、「コールドデータ DDL」をご参照ください。さらに、ターゲットテーブルに
oss_file_filterが定義されており、その定義がcall dbms_dlm.archive_partition2tableコマンドの定義と一致しない場合、ターゲットテーブルのoss_file_filter定義が優先されます。 -
宛先の OSS テーブルは存在しないが、同じ名前のファイルが OSS に存在する場合、アーカイブ操作を実行するとエラーメッセージが報告されます。エラーメッセージは次のとおりです:
mysql> CALL dbms_dlm.archive_partition2table('test', 'sales', 'p0', 'test', 'sales_history', 'id'); 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 内のデータを削除してから、アーカイブ操作を実行できます。
-- OSS データを削除します。 mysql> CALL dbms_oss.delete_table_file('test', 'sales_history'); Query OK, 0 rows affected (0.76 sec) -- アーカイブ操作を実行します。 mysql> CALL dbms_dlm.archive_partition2table('test', 'sales', 'p0', 'test', 'sales_history', 'id'); Query OK, 0 rows affected (4.24 sec) -
宛先の OSS テーブルは、CSV 形式のコールドデータのみをサポートします。
-
パーティションがアーカイブされた後、テーブルには少なくとも 1 つの InnoDB パーティションが含まれている必要があります。
-
アーカイブされたデータはパーティション情報を失い、パーティションに直接復元することはできません。ただし、
INSERT ... SELECTステートメントを使用してデータをテーブルに復元できます。 -
個々の 2 次パーティションをアーカイブすることはできません。1 次パーティション全体 (すべての 2 次パーティションを含む) のみをアーカイブできます。
-
次の表に、PolarDB for MySQL のパーティション関数でサポートされているパーティションタイプを示します。
1 次パーティション
2 次パーティション
OSS アーカイブのサポート
HASH
任意のタイプ
HASH 1 次パーティションの OSS 外部テーブルへのアーカイブはサポートされていません。
LIST
任意のタイプ
サポートされています。
RANGE
任意のタイプ
サポートされています。
KEY
任意のタイプ
サポートされています。
任意のタイプ
DEFAULT パーティションのアーカイブはサポートされていません。
例
-
InnoDB パーティションテーブルを作成し、データを挿入します。
DROP TABLE IF EXISTS `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(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); 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'); -
パーティションテーブルの p0 パーティションを新しい OSS テーブルにアーカイブします。
-
次のコマンドを実行して、sales テーブルのスキーマを表示します。
-- 現在の InnoDB テーブルのステータスを表示します。 mysql> 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, PARTITION _p20240201000000 VALUES LESS THAN ('2024-02-01 00:00:00') ENGINE = InnoDB, PARTITION _p20240301000000 VALUES LESS THAN ('2024-03-01 00:00:00') ENGINE = InnoDB, PARTITION _p20240401000000 VALUES LESS THAN ('2024-04-01 00:00:00') ENGINE = InnoDB, PARTITION _p20240501000000 VALUES LESS THAN ('2024-05-01 00:00:00') ENGINE = InnoDB) */ 1 row in set (0.03 sec) -
次のコマンドを実行して、p0 パーティションを OSS テーブル sales_history にアーカイブします。
-- p0 パーティションを OSS テーブル sales_history にアーカイブし、id 列に OSS_FILE_FILTER を作成します。 mysql> 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 クエリ高速化機能を有効にして、クエリを高速化できます。
mysql> explain SELECT * FROM sales_history WHERE id = 100; +----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-------------------------------------------------------------------------------+ | 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 | 152 | 10.00 | Using where; With pushed engine condition (`test`.`sales_history`.`id` = 100) | +----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-------------------------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> 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)
パーティションテーブルのアーカイブ
パーティションテーブルをハイブリッドパーティションテーブルとしてアーカイブするには、次の条件を満たす必要があります:
-
MySQL 8.0.2 で、マイナーバージョンが 8.0.2.2.34.1 以降であること。設定して、
loose_allow_create_hybrid_partitionパラメーターをONに設定する必要があります。 -
MySQL 8.0.2 で、マイナーバージョンが 8.0.2.2.34.1 より前であること。後のマイナーバージョンにアップグレードしてください。
パーティションテーブルをアーカイブする場合、そのパーティションをアーカイブします。テーブルはハイブリッドパーティションテーブルになり、アーカイブされたパーティションのデータファイルは OSS に保存されます。アーカイブ操作が完了すると、PolarDB はパーティションが PolarStore で占有していた領域を自動的に解放します。
構文
-
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. -
クラスターのバージョンが MySQL 8.0.2 で、そのリビジョンが 8.0.2.2.29 以降の場合、
FORCE STORAGE OSSオプションを使用して OSS ファイルを強制的に削除できます。上記の 3 つの構文にFORCE STORAGE OSSオプションを追加して、テーブル構造と対応する OSS ファイルを削除できます。たとえば、パーティションテーブルを CSV 形式でアーカイブする場合、FORCE STORAGE OSSオプションを追加する構文は次のとおりです:ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV FORCE STORAGE OSS;
パラメーター
|
パラメーター |
説明 |
|
table_name |
OSS にアーカイブするテーブルの名前。 |
|
part_name |
OSS にアーカイブするパーティションの名前。 |
注意事項
-
コールドデータアーカイブ機能は、InnoDB パーティションテーブルでのみ使用できます。
-
アーカイブ後、テーブルはハイブリッドパーティションテーブルになります。ハイブリッドパーティションテーブルには、ORC または CSV パーティションを含めることができます。列やインデックスの追加または削除を除き、ハイブリッドパーティションテーブルに対してオンライン DDL 操作を実行することはできません。使用上の注意については、「ハイブリッドパーティションの作成」をご参照ください。
-
アーカイブされたパーティションのデータは変更できません。
-
パーティションテーブル内の 2 次パーティションには、コールドデータアーカイブを使用できません。
-
LIST DEFAULT HASHパーティションテーブルのDEFAULTパーティションには、コールドデータアーカイブを使用できません。 -
HASHまたはKEYパーティションテーブルには、コールドデータアーカイブを使用できません。 -
パーティションテーブル全体を手動でアーカイブすることはできません。
-
パーティション内のデータをアーカイブする際に、同じ名前のファイルが OSS に存在する場合、操作は失敗し、次のようなエラーメッセージが報告されます:
Target file for archived table exists on oss.OSS 内の既存のファイルを上書きするには、次のコマンドを実行する必要があります。
table_nameとpart_nameを実際の値に置き換えてください。ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV/ORC FORCE STORAGE OSS;
例
テーブル t の p1 および p2 パーティションのデータを CSV 形式で OSS にアーカイブします。
-
データベースに
tという名前の InnoDB テーブルを作成します。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 ); -
テーブル
tにデータを挿入します。INSERT INTO t VALUES(1,1,1); INSERT INTO t VALUES(10,10,10); INSERT INTO t VALUES(100,100,100); INSERT INTO t VALUES(150,150,150); INSERT INTO t VALUES(200,200,200); INSERT INTO t VALUES(1000,1000,1000); -
次のコマンドを実行して、
p1およびp2パーティションのデータを OSS エンジンにアーカイブします。-
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コンソールにログインして OSS にアーカイブされたデータベースとテーブルに関する情報を表示するか、SQL ステートメントを使用してハイブリッドパーティションテーブルのデータをクエリできます:
-
OSS にアーカイブされたデータベースとテーブルに関する情報を表示するには:PolarDB コンソールにログインします。対象クラスターの左側のナビゲーションウィンドウで、 を選択して情報を表示します。
-
ハイブリッドパーティションテーブルのデータをクエリするには、「ハイブリッドパーティションのクエリ」をご参照ください。
-
アーカイブ済みデータの TDE 暗号化
-
CSV または ORC 形式での手動アーカイブのみがサポートされています。
-
次のバージョンの PolarDB for MySQL クラスターのみが、アーカイブ中に OSS のデータファイルを暗号化することをサポートしています:
-
8.0.1、マイナーバージョン 8.0.1.1.47 以降。
-
8.0.2、マイナーバージョン 8.0.2.2.27 以降。
-
-
ご利用のクラスターのマイナーバージョンが要件を満たしていない場合は、マイナーバージョンをアップグレードすることを推奨します。詳細については、「マイナーバージョン管理」をご参照ください。
データセキュリティ要件を満たすために、OSS にアーカイブされるコールドデータファイルに対して TDE (透過的データ暗号化) を有効にすることができます。基本的な原則は、アーカイブ操作中に暗号化したいファイルを選択し、OSS サーバーが暗号化を実行することです。詳細については、「データ暗号化」をご参照ください。データが暗号化された後、PolarDB for MySQL の SQL ステートメントを使用してアーカイブされたデータをクエリできます。暗号化と復号のプロセス全体はバックグラウンドで実行され、ユーザーに対して透過的であり、追加の操作は必要ありません。
構文
手動アーカイブ操作中に、ENCRYPTION="Y" 構文を追加して TDE を有効にすることができます。
ALTER TABLE t1 engine = CSV ENCRYPTION="Y" STORAGE OSS;
OSS から PolarStore へのデータの復元
標準アーカイブテーブルの復元
OSS にアーカイブされたコールドデータを変更するには、ALTER ENGINE 構文を使用してデータを PolarStore に復元します。データを PolarStore に復元すると、OSS 上の対応するデータも削除されます。データを変更した後、変更されたテーブルを再度 OSS にアーカイブできます。
構文
ALTER TABLE table_name ENGINE[=]engine_name;
パラメーター
|
パラメーター |
説明 |
|
table_name |
復元する OSS テーブルの名前。 |
|
engine_name |
復元後のエンジンタイプ。 |
注意事項
アーカイブされた OSS テーブルは読み取り専用であり、INSERT、UPDATE、または DELETE 操作は許可されません。データを変更するには、まずテーブルを InnoDB のような読み書き可能なエンジンに復元する必要があります。読み取り専用の OSS テーブルを変更しようとすると、次のエラーが発生します:
1036 - Table 't1' is read only
例
oss_test データベースの OSS テーブル t を PolarStore に復元します。
ALTER TABLE `oss_test`.`t` ENGINE = InnoDB;
InnoDB テーブル t のデータを変更します。データを変更した後、InnoDB エンジンからテーブル t を再度 OSS にアーカイブできます。例:
ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';
または
ALTER TABLE t ENGINE = CSV STORAGE OSS;
アーカイブ済みパーティションの復元
アーカイブされたパーティションテーブルから PolarStore にデータを復元する必要がある場合は、ALTER ステートメントを使用して OSS から PolarStore にデータを復元できます。データが復元されると、OSS 内のコールドデータも削除されます。
ご利用のクラスターは、カーネルリビジョンが 8.0.2.2.34.1 以降の PolarDB for MySQL 8.0.2 である必要があります。
構文
ALTER TABLE table_name REORGANIZE PARTITION part_name INTO (partition_definition);
パラメーター
|
パラメーター |
説明 |
|
table_name |
復元する OSS テーブルの名前。 |
|
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 以降である必要があります。
-
-
ご利用のクラスターのマイナーバージョンが上記の要件を満たしていない場合、OSS 上の対応するファイルを削除することはできません。クラスターのマイナーバージョンをアップグレードしてください。詳細については、「マイナーバージョン管理」をご参照ください。
OSS 上のテーブルを削除したり、PolarStore にインポートし直したりしても、OSS 上のファイルは自動的に削除されません。データが不要になったことを確認した後、次の構文を使用して OSS 上の対応するファイルを削除します:
CALL dbms_oss.delete_table_file('database_name', 'table_name');
OSS 上のファイルを削除する操作は非同期です。ファイルは、クラスター内のすべてのノードがそれらに依存しなくなった後に完全に削除されます。トラフィックが多いと遅延が発生する可能性があります。コマンドが失敗し、OSS files are still in use エラーが返された場合は、しばらく待ってから再度コマンドを実行してください。