全部產品
Search
文件中心

PolarDB:歸檔為CSV或ORC格式

更新時間:Nov 22, 2025

本文介紹了將冷資料歸檔為CSV或ORC格式的方法,以及將OSS表資料導回至PolarStore的方法。

前提條件

您需先開啟冷資料歸檔功能。開啟冷資料歸檔功能存在叢集版本限制,具體如下:

  • 歸檔為CSV格式

    • 產品系列為叢集版時,核心版本需為如下版本之一:

      • MySQL 8.0.1且修訂版本為8.0.1.1.47及以上。

      • MySQL 8.0.2且修訂版本為8.0.2.2.10及以上。

    • 產品系列為多主叢集(Limitless)時,核心版本需為8.0.1.0.13及以上。

  • 歸檔為ORC格式

    • 產品系列為叢集版時,修訂版本需為8.0.2.2.30及以上。

    • 產品系列為多主叢集(Limitless)時,修訂版本需為8.0.2.2.30及以上。

說明

叢集版本為以下版本時,手動歸檔冷資料不記錄Binlog日誌。

  • PolarDB MySQL版8.0.1版本且小版本為8.0.1.1.33及以上。

  • PolarDB MySQL版8.0.2版本且小版本為8.0.2.2.11.1及以上。

使用說明

歸檔普通表

冷資料歸檔執行的是表歸檔操作,執行冷資料歸檔操作後的表稱為歸檔表(唯讀),歸檔表的引擎為OSS引擎,歸檔表的資料檔案儲存在OSS上。執行冷資料歸檔操作後,原來本地表在PolarStore上佔用的空間將被釋放。

文法

CSV格式

  • 格式一:

    ALTER TABLE table_name ENGINE = CSV CONNECTION = 'default_oss_server';
  • 格式二:您的叢集版本需滿足如下條件之一。

    • 叢集版

      • MySQL 8.0.1且修訂版本為8.0.1.1.33及以上。

      • MySQL 8.0.2且修訂版本為8.0.2.2.13及以上。

    • 多主叢集(Limitless):修訂版本需為8.0.1.1.15及以上。

    ALTER TABLE table_name ENGINE = CSV STORAGE OSS;

ORC格式

ALTER TABLE table_name ENGINE = ORC STORAGE OSS;
說明
  • 如果OSSObject Storage Service中存在與歸檔的資料檔案名稱衝突的資料檔案,系統會報檔案已經存在的錯誤。例如: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

需要歸檔到OSSObject Storage Service中的表名。

注意事項

  • 支援對InnoDB引擎和X-Engine引擎上的表使用冷資料歸檔功能。

  • 冷資料歸檔過程中不支援對錶進行修改(DDL和DML)。

  • 冷資料歸檔功能不支援將資料檔案歸檔到使用者自建的OSS Server中。

  • 對InnoDB引擎中的表使用冷資料歸檔功能時,執行冷資料歸檔操作的表中必須有主鍵。

  • 冷資料歸檔完成後,OSS上的歸檔表唯讀,且查詢效能較差。您需要提前測試資料歸檔後是否能滿足您的查詢效能要求。

  • 若表中存在列存索引(IMCI),則不支援歸檔為CSV格式,僅支援歸檔為ORC格式。

樣本

將表t中的資料以CSVORC格式歸檔至OSS。

  1. 在資料庫oss_test中建立InnoDB表t

    CREATE TABLE t(a int, b int, c int, primary key(a)) ENGINE = INNODB;
  2. 在表t中插入資料。

    INSERT INTO t VALUES (1,2,3);
  3. 通過ALTER命令歸檔冷資料。

    • 歸檔為CSV格式:

      ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';
    • 歸檔為ORC格式:

      ALTER TABLE t ENGINE = ORC STORAGE OSS;
  4. 歸檔完成後,您可以登入PolarDB控制台查看歸檔在OSS上的庫表資訊,或通過SQL語句查看歸檔表上的資料:

    • 查看歸檔在OSS上的庫表資訊:登入PolarDB控制台在目的地組群的配置与管理 > 数据生命周期 > 冷数据归档(冷数据)路徑下,查看歸檔在OSS上的庫表資訊。

    • 查看歸檔表上的資料:通過SQL語句查看歸檔表上的資料,而不需要修改表的訪問方式。例如:

      SELECT * FROM t;

分區表歸檔至OSS外表

說明
  • PolarDB MySQL版需要為8.0.2版本且小版本為8.0.2.2.25及以上。

  • 請在控制台上將叢集參數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表,且目標表上會自動在 oss_file_filter指定的列上建立oss_file_filter,以提供查詢加速功能。同時 oss_file_filter中會自動加入主鍵和分區鍵,協助提升查詢速度。

  • 如果歸檔目標OSS表存在,則需要比較兩個表中列名或者列類型定義是否一致。如果一致,則可以進行歸檔;如果不一致,則會出錯。您可以使用DDL語句讓這兩個表定義保持一致,具體請參考相關文檔冷資料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格式冷資料。

  • 分區表歸檔後至少還需要包含一個InnoDB分區。

  • 歸檔後的資料丟失了分區資訊,無法直接取回。但是可以通過insert select取回。

  • 不支援單獨歸檔二級分區,可以把整個一級分區下的二級分區全部歸檔。

  • 下表列出了PolarDB MySQL版分區函數支援的分區類型。

    一級分區

    二級分區

    是否支援歸檔至OSS外表

    HASH

    任意類型

    不支援一級分區HASH類型歸檔至OSS外表。

    LIST

    任意類型

    支援。

    RANGE

    任意類型

    支援。

    KEY

    任意類型

    支援。

    LIST DEFAULT

    任意類型

    不支援歸檔DEFAULT分區。

樣本

  1. 建立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');
  2. 把分區表的p0分區歸檔至新的執行OSS表。

    1. 執行如下命令,查看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)
    2. 執行如下命令,將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)
    3. 執行如下命令,查看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)
  3. 在新的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)

歸檔分區表

說明
  • 歸檔分區表功能目前處於灰階階段,如需使用,請前往配額中心,根據配額ID polardb_mysql_hybrid_partition找到配額名稱,在對應的操作列單擊申請來開通該功能。

  • 叢集版本為PolarDB MySQL版8.0.2版本且修訂版本為8.0.2.2.14及以上時,支援歸檔分區表。

歸檔分區表是對錶的分區進行歸檔,歸檔後的表為混合分區表,歸檔後分區的資料檔案儲存在OSS上。執行完歸檔操作後,分區在PolarStore上佔用的空間會自動釋放。

文法

  • 歸檔為CSV格式的檔案:

    ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV;
  • 歸檔為ORC格式的檔案:

    ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = ORC;
說明
  • 如果OSSObject Storage Service中存在與歸檔的資料檔案名稱衝突的資料檔案,系統會報檔案已經存在的錯誤。例如: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檔案。以分區表歸檔為CSV格式為例,添加FORCE STORAGE OSS選項的文法如下:

    ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV FORCE STORAGE OSS;

參數說明

參數

說明

table_name

需要歸檔到OSSObject Storage Service中的表名。

part_name

需要歸檔到OSSObject Storage Service中的分區名。

注意事項

  • 僅支援對InnoDB引擎上的分區表使用冷資料歸檔功能。

  • 對分區表執行分區歸檔操作時,至少保留一個分區在InnoDB引擎上,即無法對最後一個InnoDB引擎上的分區執行冷資料歸檔操作。

  • 歸檔後的表為混合分區表,不支援對混合分區表執行DDL操作。使用時的注意事項詳情請參見建立混合分區

  • 暫不支援對歸檔後的分區資料進行修改。

  • 暫不支援對分區表中的二級分區執行冷資料歸檔操作。

  • 暫不支援對LIST DEFAULT HASH分區表的DEFAULT分區執行冷資料歸檔操作。

  • 暫不支援對HASH或KEY類型的分區表執行冷資料歸檔操作。

  • 暫不支援對整張分區表執行手動歸檔冷資料操作。

  • 歸檔分區中的資料時,若OSS上存在同名檔案,則會執行失敗並報類似如下錯誤資訊:

    Target file for archived table exists on oss.

    您需要執行以下命令來覆蓋OSS上已存在的檔案。執行命令時請根據實際情況替換table_namepart_name

    ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV/ORC FORCE;

樣本

將表tp1p2分區上的資料以CSV格式歸檔至OSS。

  1. 在資料庫中建立InnoDB表t

    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. 在表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);
  3. 執行以下命令,將p1p2分區上的資料歸檔至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;
  4. 歸檔完成後,您可以登入PolarDB控制台查看歸檔在OSS上的庫表資訊,或通過SQL語句查詢混合分區表中的資料:

    • 查看歸檔在OSS上的庫表資訊:登入PolarDB控制台在目的地組群的配置与管理 > 数据生命周期 > 冷数据归档(冷数据)路徑下,查看歸檔在OSS上的庫表資訊。

    • 查詢混合分區表中的資料:操作詳情請參見查詢混合分區

歸檔資料支援TDE加密

說明
  • 目前僅支援手動歸檔操作,歸檔方式為CSV或ORC格式。

  • 當前僅滿足以下版本的PolarDB MySQL版叢集支援將OSS上對應的檔案歸檔時進行資料加密操作:

    • 8.0.1版本且小版本需為8.0.1.1.47及以上。

    • 8.0.2版本且小版本需為8.0.2.2.27及以上。

  • 若您的叢集的小版本不滿足以上版本要求,建議升級您叢集的小版本,具體請參見小版本管理

為滿足您對資料安全性的需求,冷資料歸檔到OSS的檔案支援指定TDE加密。基本原理是在歸檔操作中選擇需要進行TDE加密的檔案,由OSS伺服器負責執行加密操作,詳細加密操作請參見資料加密。經過加密處理後,您可以直接通過PolarDB 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表為唯讀狀態時,不支援執行修改操作(INSERTUPDATEDELETE)。如需修改已經歸檔的冷資料,您需要將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

與需要導回的分區的partition_definition保持一致。

樣本

在資料庫中,將歸檔在OSS上的分區表tp1分區上的資料導回至PolarStore。

ALTER TABLE t REORGANIZE PARTITION p1 INTO(PARTITION p1 values less than(100));

刪除OSS上對應的檔案

說明
  • 當前僅滿足以下版本的PolarDB 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檔案後才可完全刪除,且流量較大時存在一定時延。因此,如果上述命令執行失敗並返回錯誤資訊OSS files are still in use時,您可以等待一段時間後再重新執行該命令。