このトピックでは、コールドデータを 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 以降。
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 以降)。
PolarDB for MySQL 8.0.2 (マイナーバージョン 8.0.2.2.11.1 以降)。
使用上の注意
標準テーブルのアーカイブ
コールドデータアーカイブはテーブルレベルの操作です。テーブルをアーカイブすると、読み取り専用のアーカイブ済みテーブルになります。アーカイブ済みテーブルのエンジンは OSS エンジンであり、そのデータファイルは OSS に保存されます。コールドデータアーカイブ操作が完了すると、元のローカルテーブルが 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 以降)。
Multi-master Cluster (Limitless) Edition: リビジョンは 8.0.1.1.15 以降である必要があります。
ALTER TABLE table_name ENGINE = CSV STORAGE OSS;
ORC 形式
ALTER TABLE table_name ENGINE = ORC STORAGE OSS;アーカイブされたデータファイルと同じ名前のデータファイルが Object Storage Service (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コマンドを使用してコールドデータをアーカイブします。CSV 形式でアーカイブ:
ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';ORC 形式でアーカイブ:
ALTER TABLE t ENGINE = ORC STORAGE OSS;
アーカイブが完了したら、PolarDBコンソールにログインして OSS にアーカイブされたデータベースとテーブルに関する情報を表示するか、SQL 文を使用してアーカイブされたテーブルのデータを表示できます。
OSS にアーカイブされたデータベースとテーブルに関する情報を表示するには、PolarDB コンソールにログインします。対象クラスターのページで、 に移動して情報を表示します。
アーカイブされたテーブルのデータを表示するには、SQL 文を使用します。テーブルへのアクセス方法を変更する必要はありません。例:
SELECT * FROM t;
パーティションテーブルを OSS 外部テーブルにアーカイブする
PolarDB for MySQL クラスターは、マイナーバージョン 8.0.2.2.25 以降のバージョン 8.0.2 である必要があります。
コンソールで、クラスターパラメーター
partition_level_mdl_enabledを ON に設定して、パーティションレベルのメタデータロック (MDL) 機能を有効にします。クラスターパラメーターの設定方法の詳細については、「クラスターおよびノードパラメーターの設定」をご参照ください。コンソールで、クラスターパラメーター
loose_use_oss_metaを ON に設定して、use_oss_meta機能を有効にします。クラスターパラメーターの設定方法の詳細については、「クラスターおよびノードパラメーターの設定」をご参照ください。
構文
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 | 宛先テーブルに新しい 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を使用して復元できます。サブパーティションを個別にアーカイブすることはできません。第 1 レベルのパーティション全体の下にあるすべてのサブパーティションをアーカイブできます。
次の表に、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)
パーティションテーブルのアーカイブ
パーティションテーブルのアーカイブ機能はカナリアリリースです。この機能を使用するには、Quota Center に移動し、[Quota ID]
polardb_mysql_hybrid_partitionでクォータを見つけ、[アクション] 列のRequestをクリックして機能を有効にします。PolarDB for MySQL クラスターがリビジョン 8.0.2.2.14 以降のバージョン 8.0.2 である場合、パーティションテーブルをアーカイブできます。
パーティションテーブルのアーカイブとは、そのパーティションをアーカイブすることを意味します。テーブルはアーカイブ後にハイブリッドパーティションテーブルになり、アーカイブされたパーティションのデータファイルは OSS に保存されます。アーカイブ操作が完了すると、パーティションが 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 エンジンを使用するパーティションテーブルに対してのみ、コールドデータアーカイブ機能を使用できます。
パーティションテーブルのパーティションをアーカイブする場合、InnoDB エンジンを使用するパーティションを少なくとも 1 つ保持する必要があります。InnoDB エンジンを使用する最後のパーティションをアーカイブすることはできません。
テーブルはアーカイブ後にハイブリッドパーティションテーブルになります。ハイブリッドパーティションテーブルに対して DDL 操作を実行することはできません。考慮事項の詳細については、「ハイブリッドパーティションの作成」をご参照ください。
アーカイブされたパーティションのデータは変更できません。
パーティションテーブルのサブパーティションはアーカイブできません。
リストデフォルトハッシュパーティションテーブルの 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;
例
テーブル 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 の標準アーカイブテーブルからのデータの復元
OSS にアーカイブされたコールドデータを時々変更するには、ALTER ENGINE 構文を使用して OSS から PolarStore にデータを復元できます。データが PolarStore に復元されると、OSS のコールドデータは削除されます。データを変更した後、テーブルを再度 OSS にアーカイブできます。
構文
ALTER TABLE table_name ENGINE[=]engine_name;パラメーター
パラメーター | 説明 |
table_name | 復元する OSS テーブルの名前。 |
engine_name | 復元後のエンジンタイプ。 |
考慮事項
OSS テーブルが読み取り専用状態の場合、INSERT、UPDATE、DELETE などの変更操作は実行できません。アーカイブされたコールドデータを変更するには、OSS テーブルを 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;OSS のパーティション化されたアーカイブテーブルからのデータの復元
アーカイブされたパーティションテーブルから PolarStore にデータを復元するには、ALTER 文を使用して OSS から PolarStore にデータを復元できます。データが復元されると、OSS のコールドデータは削除されます。
構文
ALTER TABLE table_name REORGANIZE PARTITION part_name INTO (partition_definition);パラメーター
パラメーター | 説明 |
table_name | 復元する OSS テーブルの名前。 |
part_name | 復元するパーティションの名前。 |
partition_definition | 復元するパーティションの |
例
データベースで、OSS にアーカイブされているパーティションテーブル t の p1 パーティションから PolarStore にデータを復元します。
ALTER TABLE t REORGANIZE PARTITION p1 INTO(PARTITION p1 values less than(100));OSS から対応するファイルを削除する
次のバージョンの PolarDB for MySQL クラスターのみが、OSS から対応するファイルを削除することをサポートします。
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 が返された場合は、しばらく待ってからコマンドを再実行してください。