このトピックでは、コールドデータをカンマ区切り値 (CSV) または最適化行列 (ORC) 形式で手動でアーカイブし、Object Storage Service (OSS) テーブルからPolarStoreにデータをインポートする方法について説明します。
前提条件
Enterprise EditionクラスターのコールドデータをCSV形式でアーカイブするには、クラスターが次のエンジンバージョン要件を満たしていることを確認します。 クラスターのエンジンバージョンを照会する方法については、「エンジンバージョン番号の照会」をご参照ください。
クラスターがcluster Editionの場合、次のいずれかのデータベースエンジンバージョンを実行する必要があります。
リビジョンバージョンが8.0.1.1.32以降のPolarDB for MySQL 8.0.1
リビジョンバージョンが8.0.2.2.10以降のPolarDB for MySQL 8.0.2
説明クラスターが次のいずれかのデータベースエンジンバージョンを実行している場合、コールドデータの手動アーカイブはバイナリログに記録されません。
リビジョンバージョンが8.0.1.1.33以降のPolarDB for MySQL 8.0.1
リビジョンバージョンが8.0.2.2.11.1以降のPolarDB for MySQL 8.0.2
クラスターがマルチマスタークラスター (データベース /テーブル) エディションの場合、PolarDB for MySQL 8.0.1.0.13以降を実行する必要があります。
Enterprise EditionクラスターのコールドデータをORC形式でアーカイブするには、リビジョンバージョンが8.0.2.2.16.2以降のPolarDB for MySQL 8.0.2を実行していることを確認します。 クラスターのエンジンバージョンを照会する方法については、「エンジンバージョン番号の照会」をご参照ください。
コールドデータアーカイブ機能が有効になっています。 詳細については、「コールドデータアーカイブの有効化」をご参照ください。
クラスターが接続されています。 詳細については、「クラスターへの接続」をご参照ください。
使用法
共通テーブルのアーカイブ
コールドデータアーカイブは、テーブル内のコールドデータを保存するプロセスです。 コールドデータを格納するこれらのテーブルは、アーカイブテーブル (読み取り専用) と呼ばれ、OSSエンジンを利用します。 これらのアーカイブテーブルに対応するデータファイルはOSSに保存されます。 コールドデータがアーカイブされると、元のテーブルが占有していたPolarFileSystemスペースが解放されます。
構文
コールドデータをCSV形式でアーカイブする:
ALTER TABLE table_name ENGINE = CSV CONNECTION = 'default_oss_server';
クラスターがPolarDB for MySQL 8.0.1.1.33以降、PolarDB for MySQL 8.0.2.2.13以降、またはマルチマスタークラスター (データベース /テーブル) エディションPolarDB for MySQL 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.
上記のステートメントにFORCEキーワードを追加して、OSSの既存のファイルを上書きできます。 次の例は、CSV形式でコールドデータをアーカイブするステートメントにFORCEキーワードを追加する方法を示しています。
ALTER TABLE table_name ENGINE = CSV CONNECTION = 'default_oss_server' , FORCE;
Parameters
パラメーター | 説明 |
table_name | OSSにアーカイブするテーブルの名前。 |
制限事項
InnoDBストレージエンジンとX-engineを使用するテーブルのデータのみをアーカイブできます。
コールドデータアーカイブ中にDDLまたはDMLステートメントを実行してテーブルを変更することはできません。
データファイルをカスタムOSSサーバーにアーカイブすることはできません。
InnoDBストレージエンジンを使用するテーブルにコールドデータをアーカイブするには、テーブルにプライマリキーがあることを確認します。
コールドデータがアーカイブされると、OSSのテーブルは読み取り専用になり、このテーブルのクエリ速度は遅くなります。 データアーカイブを実行する前に、テストデータを使用して、アーカイブテーブルのクエリパフォーマンスがビジネス要件を満たしているかどうかを評価することをお勧めします。
例
t
テーブルのデータをCSVまたはORC形式でOSSにアーカイブします。
oss_test
データベースにt
という名前のテーブルを作成します。 このテーブルはInnoDBストレージエンジンを使用します。t
テーブルにデータを挿入します。ALTER
ステートメントを実行して、コールドデータをアーカイブします。CSV形式でデータをアーカイブする:
ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';
クラスターがPolarDB for MySQL 8.0.1.1.33以降、PolarDB for MySQL 8.0.2.2.13以降、またはマルチマスタークラスター (データベース /テーブル) エディションPolarDB for MySQL 8.0.1.1.15以降の場合は、次のステートメントを実行します。
ALTER TABLE t ENGINE = CSV STORAGE OSS;
ORC形式でデータをアーカイブする:
ALTER TABLE t ENGINE = ORC STORAGE OSS;
データがアーカイブされた後、PolarDBコンソールにログインしてOSSのアーカイブされたデータベースとテーブルを表示するか、SQL文を実行してアーカイブされたテーブルのデータを表示します。
OSSでアーカイブされたデータベースとテーブルを表示するには、PolarDBコンソールにログインします。 クラスターを見つけ、 を選択して、OSSのアーカイブされたデータベースとテーブルに関する情報を表示します。
アーカイブされたテーブルのデータを表示するには、アーカイブ操作の前にSQL文を実行するのと同じ方法でSQL文を実行します。 例:
SELECT * FROM t;
CREATE TABLE t(a int, b int, c int, primary key(a)) ENGINE = INNODB;
INSERT INTO t VALUES (1,2,3);
OSS外部テーブルへのテーブルパーティションのアーカイブ
クラスターは、リビジョンバージョンが8.0.2.2.25以降のPolarDB for MySQL 8.0.2を実行する必要があります。
PolarDBコンソールで、
partition_level_mdl_enabled
クラスターパラメーターをONに設定して、パーティションレベルのメタデータロック (MDL) 機能を有効にします。 クラスターパラメーターの設定方法については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。PolarDBコンソールで
loose_use_oss_meta
クラスターパラメーターをONに設定し、use_oss_meta
機能を有効にします。 クラスターパラメーターの設定方法については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。
構文
CALL dbms_dlm.archive_partition2table('source_db', 'source_tb', 'source_part', 'archive_db', 'archive_table', 'archive_table_file_filter');
Parameters
パラメーター | 説明 |
source_db | ソースデータベースの名前。 |
source_tb | ソーステーブルの名前です。 |
source_part | アーカイブするソーステーブルのパーティション。 複数のパーティションはコンマ (,) で区切ります。 |
archive_db | ターゲットテーブルの名前です。 |
archive_table | 宛先テーブルの名前。 |
archive_table_file_filter | ターゲットテーブルのファイルフィルターを作成するかどうかを指定します。 |
使用上の注意
ターゲットOSSテーブルが存在しない場合、システムは自動的にOSSテーブルを作成し、
archive_table_file_filter
パラメーターで指定された列にOSSファイルフィルターを作成します。 ファイルフィルターにより、クエリのパフォーマンスが向上します。 プライマリキーとパーティションキーは、クエリを高速化するためにarchive_table_file_filter
パラメーターに自動的に追加されます。ターゲットOSSテーブルが存在する場合、ソーステーブルとターゲットテーブルの列名とタイプが同じかどうかがチェックされます。 列名と型が同じ場合、指定されたパーティションは宛先テーブルにアーカイブされます。 そうでない場合、アーカイブ操作は失敗します。 DDLステートメントを使用して、2つのテーブル間の定義の一貫性を確保できます。 詳細については、「コールドデータに対するDDL操作の実行」をご参照ください。 宛先テーブルに作成された
oss_file_filter
の定義がcall dbms_dlm.archive_partition2table
テーブルと異なる場合、宛先テーブルのoss_file_filter
が優先されます。ターゲットOSSテーブルが存在しないが、ターゲット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からファイルを削除し、データアーカイブを実行できます。
-- Delete OSS data. mysql> CALL dbms_oss.delete_table_file('test', 'sales_history'); Query OK, 0 rows affected (0.76 sec) -- Perform data archiving. 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パーティションが含まれている必要があります。
アーカイブされたパーティションデータは1つのテーブルにまとめられます。 パーティションテーブルにデータを復元する場合は、
INSERT SELECT
ステートメントを実行します。個々のレベル2パーティションをアーカイブすることはできません。 ただし、レベル1パーティションの下にあるすべてのレベル2パーティションをアーカイブできます。
次の表に、OSS外部テーブルにアーカイブできるパーティションタイプを示します。
レベル1パーティション
レベル2パーティション
OSS外部テーブルにアーカイブ可能
HASH
すべてのタイプ
いいえ
リスト
すべてのタイプ
はい
RANGE
すべてのタイプ
はい
キー
すべてのタイプ
はい
すべてのタイプ
例
InnoDBパーティションテーブルを作成し、テーブルにデータを挿入します。
DROP TABLE IF EXISTS `sales`; -- Create an partitioned table; 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テーブルの構造情報を表示します。
-- View the status of the InnoDB table. 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にアーカイブします。
-- Archive the p0 partition to the OSS table sales_history. Create OSS_FILE_FILTER on the id column; 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ファイルフィルター機能を有効にして、クエリを高速化できます。
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)
パーティション分割テーブルのアーカイブ
パーティションテーブルのアーカイブ機能はカナリアリリースにあります。 この機能を使用するには、クォータセンターに移動します。
polardb_mysql_hybrid_
パーティションのクォータIDに対応するクォータ名を見つけます。 次に、[操作] 列の[適用]
をクリックします。Enterprise Editionクラスターでは、リビジョンバージョンが8.0.2.2.14以降のPolarDB for MySQL 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に含まれている場合、システムはファイルがOSSに既に存在することを示すエラーメッセージを返します。 サンプルメッセージ:
Target file for archived table exists on oss.
上記のステートメントにFORCEキーワードを追加して、OSSの既存のファイルを上書きできます。 次の例は、CSV形式でコールドデータをアーカイブするステートメントにFORCEキーワードを追加する方法を示しています。
ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV FORCE;
Parameters
パラメーター | 説明 |
table_name | OSSにアーカイブするテーブルの名前。 |
part_name | OSSにアーカイブされるパーティションの名前。 |
制限事項
コールドデータアーカイブ機能は、InnoDBストレージエンジンを使用するパーティションテーブルでのみサポートされます。
パーティションテーブルのデータをアーカイブするときは、InnoDBストレージエンジンに少なくとも1つのパーティションが残っていることを確認してください。 つまり、InnoDBストレージエンジンの最後のパーティションにデータをアーカイブすることはできません。
アーカイブテーブルは、ハイブリッド分割テーブルです。 ハイブリッドパーティションテーブルでDDLステートメントを実行することはできません。 詳細については、「ハイブリッドパーティションテーブルの作成」をご参照ください。
アーカイブされたパーティションのデータは変更できません。
コールドデータアーカイブは、パーティションテーブルのサブパーティションではサポートされていません。
リストの既定のハッシュパーティションテーブルの既定のパーティションにデータをアーカイブすることはできません。
ハッシュまたはキーパーティションテーブルにデータをアーカイブすることはできません。
パーティションテーブル全体のデータをアーカイブすることはできません。
アーカイブするパーティション内のファイルと同じ名前のファイルが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コンソールにログインします。 クラスターを見つけ、 を選択して、OSSのアーカイブされたデータベースとテーブルに関する情報を表示します。
ハイブリッドパーティションテーブルのデータを表示する方法については、「ハイブリッドパーティションテーブルのデータの照会」をご参照ください。
OSSテーブルからPolarStoreへのデータのインポート
OSSにアーカイブされた共通テーブルからのデータのインポート
OSSテーブルにアーカイブされたコールドデータを変更する前に、ALTER ENGINE
ステートメントを実行して、OSSからPolarStoreにデータをインポートできます。 次に、インポートしたテーブルのデータを変更できます。 データがPolarStoreにインポートされると、OSSのコールドデータは削除されます。 データが変更された後、変更されたテーブルを再度OSSにアーカイブできます。
構文
ALTER TABLE table_name ENGINE[=]engine_name;
Parameters
パラメーター | 説明 |
table_name | インポートするOSSテーブルの名前。 |
engine_name | インポートされたテーブルのエンジン。 |
制限事項
OSSテーブルは読み取り専用状態であり、INSERT
、UPDATE
、またはDELETE
ステートメントを実行して変更することはできません。 アーカイブされたコールドデータを変更するには、OSSテーブルをInnoDBテーブルなどの読み書き可能なテーブルに変換します。 読み取り専用状態のOSSテーブルを変更すると、次のエラーメッセージが報告されます。
1036 - Table 't1' is read only
例
t
という名前のOSSテーブルから、oss_test
データベースのPolarStoreにデータをインポートします。
ALTER TABLE `oss_test`.`t` ENGINE = InnoDB;
t
という名前のInnoDBテーブルのデータを変更します。 データが変更されたら、InnoDBエンジンのt
テーブルを再度OSSにアーカイブします。 例:
ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';
または
ALTER TABLE t ENGINE = CSV STORAGE OSS;
OSSにアーカイブされたハイブリッドパーティションテーブルからのデータのインポート
OSSテーブルにアーカイブされているハイブリッドパーティションテーブルのデータを変更する前に、ALTERステートメントを実行してOSSからPolarStoreにデータをインポートできます。 データがPolarStoreにインポートされると、OSSのコールドデータは削除されます。
構文
ALTER TABLE table_name REORGANIZE PARTITION part_name INTO (partition_definition);
Parameters
パラメーター | 説明 |
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.1.42以降のPolarDB for MySQL 8.0.1
リビジョンバージョンが8.0.2.2.23以降のPolarDB for MySQL 8.0.2
クラスターのリビジョンバージョンが上記の要件を満たしていない場合、OSSから対応するファイルを削除することはできません。 クラスターのリビジョンバージョンをアップグレードすることを推奨します。 詳細については、「マイナーバージョンのアップグレード」をご参照ください。
OSSからテーブルを削除するか、OSSからPolarStoreにテーブルをインポートすると、OSS内の対応するファイルが保持されます。 データが不要になったことを確認した場合は、次のステートメントを使用して、OSSから対応するファイルを削除できます。
CALL dbms_oss.delete_table_file('database_name', 'table_name');
OSSファイルは非同期で削除されます。 したがって、ファイルを削除する前に、クラスター内のすべてのノードがOSSファイルに依存しなくなるまで待つ必要があります。 トラフィックが多いときに遅延が発生することに注意してください。 上記のステートメントが失敗し、「OSSファイルはまだ使用中です
」というエラーメッセージが表示された場合は、しばらく待ってからステートメントを再実行してください。