すべてのプロダクト
Search
ドキュメントセンター

PolarDB:CSV または ORC 形式でのデータアーカイブ

最終更新日:Mar 29, 2026

テーブルにコールドデータが蓄積すると、PolarStore 内に保持しても高価なローカル記憶域を消費するだけで、実質的なクエリ利点が得られません。コールドデータアーカイブでは、テーブルデータを PolarStore から Object Storage Service (OSS) へ CSV または ORC 形式で移動し、ローカル記憶域を解放します。同時に、標準 SQL を用いたクエリは引き続き可能であり、アプリケーション側のクエリ変更は一切不要です。

本ページでは、標準テーブルおよびパーティションテーブルのアーカイブ方法、アーカイブデータの暗号化有効化、OSS からの PolarStore へのデータ復元、および OSS ファイルの削除について説明します。

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

  • クラスターでコールドデータアーカイブを有効化 していること

  • フォーマット要件を満たすクラスターバージョンであること:

    CSV 形式

    クラスタータイプ最低バージョン
    Cluster EditionMySQL 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 OSSDROP TABLE ステートメントに追加してください。
DROP TABLE table_name FORCE STORAGE OSS;

パラメーター

パラメーター説明
table_nameOSS へアーカイブするテーブルの名前

t テーブルを oss_test データベースから CSV または ORC 形式で OSS へアーカイブします。

  1. プライマリキーを持つ InnoDB テーブルを作成します。

    CREATE TABLE t(a int, b int, c int, primary key(a)) ENGINE = INNODB;
  2. データを挿入します。

    INSERT INTO t VALUES (1,2,3);
  3. テーブルをアーカイブします。CSV 形式:

    ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';

    ORC 形式:

    ALTER TABLE t ENGINE = ORC STORAGE OSS;
  4. アーカイブ完了後に結果を確認します。

    • コンソールから:PolarDB コンソール にログインします。対象クラスターページで、設定項目と管理 > データライフサイクル > データアーカイブ(コールドデータ) へ移動します。

    • SQL から: アーカイブ済みテーブルを直接クエリします — アクセスパターンは変更されません。sql SELECT * FROM t;

OSS 外部テーブルへのパーティションのアーカイブ

この手法では、パーティションテーブルの特定のパーティションを新しい OSS 外部テーブルへアーカイブします。ソース InnoDB テーブルは非アーカイブパーティションを継続して保持し、アーカイブされたデータは OSS 外部テーブルからクエリ可能です。

前提条件

制限事項

  • 送信先 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)

パーティションテーブル salesp0 パーティションを、新しい OSS テーブル sales_history へアーカイブします。

  1. 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');
  2. 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)
  3. p0 パーティションを OSS テーブル sales_history へアーカイブし、OSS_FILE_FILTERid 列に設定します。

    CALL dbms_dlm.archive_partition2table('test', 'sales', 'p0', 'test', 'sales_history', 'id');
    -- Query OK, 0 rows affected (1.86 sec)
  4. 作成された 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)
  5. アーカイブされたデータをクエリします。

    クエリパフォーマンス向上のため、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アーカイブするパーティションの名前

テーブル tp1 および p2 パーティションを CSV 形式で OSS へアーカイブします。

  1. 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
    );
  2. データを挿入します。

    INSERT INTO t VALUES (1,1,1), (10,10,10), (100,100,100),
                         (150,150,150), (200,200,200), (1000,1000,1000);
  3. 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;
  4. アーカイブ完了後に結果を確認します。

    • コンソールから: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 テーブルは読み取り専用です。INSERTUPDATE、および 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パーティション定義。復元対象のパーティションの元の定義と一致している必要があります

パーティションテーブル tp1 パーティションを 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」というエラーで失敗した場合は、しばらく待ってから再試行してください。

次のステップ