全部產品
Search
文件中心

PolarDB:歸檔為 IBD 格式

更新時間:Sep 19, 2026

資料庫中很少被訪問的歷史資料長期佔用PolarDBBlock Storage,會持續產生儲存成本。歸檔為IBD格式在不更換InnoDB儲存引擎的前提下,把這部分冷資料轉存到成本更低的Object Storage Service,歸檔後的資料仍保留原有的InnoDB資料格式、索引結構和 DML 能力。MySQL 8.0.1MySQL 8.0.2都支援該功能,但歸檔文法、支援的歸檔對象和歸檔後的可操作範圍不同。

確認叢集版本對應的歸檔方式

基礎版和進階版都支援將冷資料歸檔為 IBD 格式,但底層實現不同:基礎版在 InnoDB 側封裝 OSS 訪問能力,進階版基於共用儲存 PolarStore 提供 OSS 混合儲存能力,兩者的歸檔文法、支援的歸檔對象和歸檔後的可操作範圍不同,語句不能混用。

對比項

基礎版

進階版

實現邏輯

在 InnoDB 儲存引擎側封裝 OSS 訪問能力,資料直接從 InnoDB 讀寫 OSS

基於共用儲存 PolarStore 提供 OSS 混合儲存能力,儲存層統一管理冷熱資料

支援版本

MySQL 8.0.1且修訂版本需為 8.0.1.1.51.2 或以上。

  • MySQL 8.0.2且修訂版本需為8.0.2.2.37或以上。

  • 儲存類型需為PSL4或PSL5,不支援ESSD雲端硬碟。

支援的歸檔對象

普通表

普通表和分區表,分區表可歸檔全部或指定分區

歸檔文法

ALTER TABLE table_name STORAGE_TYPE OSS

ALTER TABLE table_name STORAGE_TYPE HYBRID_OSS

歸檔後的 DDL 操作

不支援

支援增加列、建立索引、調整分區等常見 DDL 操作

查詢歸檔資料

歸檔整表後直接查詢

分區表預設跳過歸檔分區,可通過 WITH ARCHIVED 或會話參數包含歸檔分區

導回Block Storage

整表導回

整表、指定分區或全部已歸檔分區導回

通用適用範圍

操作指南

基礎版

基礎版是基於 InnoDB 儲存引擎封裝 OSS 訪問能力,支援將普通表整體歸檔到 OSS Object Storage Service。該版本後續僅包含缺陷修複,不再進行功能迭代。如需分區級歸檔、歸檔後 DDL 等進階能力,請使用進階版。

準備工作

  • MySQL 8.0.1且修訂版本需為 8.0.1.1.51.2 或以上。

  • 如需使用歸檔為 IBD 格式,請前往配額中心,根據配額 IDpolardb_innodb_oss_enable 找到配額名稱,在對應的操作列單擊申請開通該功能。

注意事項

  • 讀寫與事務限制(DML & DDL)

    • DML與事務支援:歸檔後的表支援正常的 INSERTUPDATEDELETE 等 DML 操作,並支援事務。

    • DDL 限制:不支援 DDL 操作。表一旦歸檔到 OSS,將無法修改表結構。

  • 歸檔過程中的可用性

    • 資料訪問中斷:在執行冷資料歸檔的過程中,預設無法訪問正在歸檔中的表資料。

    • 臨時規避方案:如果需要在歸檔期間保持可讀,須提前將參數 polar_oss_ddl_shared 的值設定為 ON

  • 備份與資料安全

    • 不包含在標準資料備份中:自動備份和手動備份均不包含儲存在 OSS 上的資料。

    • 恢複限制:無法對 OSS 上的資料執行庫表恢複或按時間點恢複操作。

  • 效能影響與營運建議

    • 歸檔期間資源消耗:歸檔冷資料會佔用一定量的網路和儲存 I/O 資源,建議在業務低峰期或非活躍叢集上執行。

    • 高延遲風險:Object Storage Service的 I/O 延遲比Block Storage高百倍以上,需評估因此導致的長 SQL 延遲影響。

    • 大批量寫操作避坑:對OSS表執行大量寫入或刪除前,建議先將表導回Block Storage,否則會引發以下嚴重後果:

      1. 緩衝汙染:消耗大量資料庫 Buffer Pool(頁緩衝)資源,導致其他正常表的 SQL 因無法擷取空閑頁面而變慢。

      2. 阻塞 Checkpoint:大量 OSS 髒頁持久化緩慢,會阻塞 Checkpoint 推進,從而拉長資料庫崩潰恢復。

      3. 拖慢崩潰恢複:崩潰恢複過程中,對OSS表的日誌回放會觸發 OSS 讀寫,進一步拖慢崩潰恢複速度。

將表資料歸檔至 OSS

當表中的資料為冷資料且對延遲不敏感,或訪問集中、可被緩衝且對尾訪問延遲不敏感時,通過以下文法將Block Storage錶轉換為 OSS Object Storage Service表:

ALTER TABLE table_name STORAGE_TYPE OSS;

將資料導回Block Storage

ALTER TABLE table_name STORAGE_TYPE NULL;

刪除 OSS 上對應的檔案

將 OSS 上的表刪除或導回Block Storage後,OSS 上的檔案不會同步刪除。確定資料不再使用後,使用如下文法刪除 OSS 上對應的檔案:

CALL dbms_oss.delete_table_file('database_name', 'table_name');

刪除 OSS 上對應檔案的操作非同步執行,需要等待叢集中的所有節點都不再依賴 OSS 檔案後才可完全刪除,且流量較大時存在一定延遲。如果上述命令執行失敗並返回錯誤資訊 OSS files are still in use,可等待一段時間後重新執行該命令。

樣本

以下樣本包含刪除表、刪除資料庫和刪除 OSS 上歸檔檔案的操作,請在測試資料庫中執行。

警告

資料備份不包含 OSS 上的資料,刪除後無法通過庫表恢複或按時間點恢複找回。確認資料不再使用後,再刪除 OSS 上對應的檔案。

  1. 建立資料庫。

    CREATE DATABASE oss;
  2. 使用資料庫。

    USE oss;
  3. 建立表 toss1

    CREATE TABLE `toss1`(
      `uid` int NOT NULL AUTO_INCREMENT,
      `text_data` text NOT NULL,
      `save_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY(`uid`)
    ) ENGINE = InnoDB;
  4. 建立預存程序 populate

    DELIMITER |
    CREATE PROCEDURE populate(IN `cnt` INT)
    BEGIN
      DECLARE i INT DEFAULT 1;
      WHILE (i <= cnt) DO
        INSERT INTO `toss1` (`text_data`) VALUES (REPEAT("#", 6333));
        SET i = i + 1;
      END WHILE;
    END |
    DELIMITER ;
  5. 調用預存程序,向表 toss1 中插入資料。

    CALL populate(5000);
  6. 將資料歸檔至 OSS。

    ALTER TABLE `toss1` STORAGE_TYPE OSS;
  7. 查詢 toss1 表中的資料。

    SELECT COUNT(*) FROM `toss1`;
  8. 刪除 OSS 上的 toss1 表。

    DROP TABLE `toss1`;
  9. 刪除 OSS 資料庫。

    DROP DATABASE oss;
  10. 確認資料不再使用後,刪除 OSS 上對應的檔案。

    CALL dbms_oss.delete_table_file('oss', 'toss1');

冷資料歸檔耗時

執行冷資料歸檔操作的並發線程數量由參數 innodb_oss_copy_worker 控制,其參數值與叢集規格綁定。不同線程數量和資料量下的冷資料歸檔耗時如下:

單張表的資料量

歸檔耗時(4 個線程)

歸檔耗時(8 個線程)

100 GB

約 18 分鐘

約 10 分鐘

1 TB

約 2.5 小時

約 1.3 小時

10 TB

約 24 小時

約 13 小時

進階版

進階版是基於共用儲存 PolarStore 提供 OSS 混合儲存能力,支援普通表和分區表的歸檔,並可按分區粒度操作。歸檔後仍支援常見 DDL 操作,是功能更完整的歸檔方案。

準備工作

  • MySQL 8.0.2且修訂版本需為8.0.2.2.37或以上,且儲存類型需為PSL4或PSL5,不支援ESSD雲端硬碟。

  • 在控制台配置与管理 > 参数配置中,開啟loose_polar_oss_enable參數。

  • 目標表使用獨立資料表空間,且儲存引擎為 InnoDB。分區表的所有分區均須使用 InnoDB 引擎。不支援壓縮表和通用資料表空間。

  • 在主節點(主地址)上執行歸檔、查詢和導回操作,且當前帳號具備目標表的操作許可權。

注意事項

  • 讀寫與分區行為(DML)

    • DML 與事務支援:歸檔後的表和分區仍可修改,支援 INSERTUPDATEDELETE 操作及事務。

    • 分區表特有行為

      • 查詢:預設會自動跳過已歸檔的分區。

      • 更新與刪除UPDATE 和 DELETE 操作不會跳過歸檔分區。執行前請務必確認操作的影響範圍,避免誤修改或因 OSS 延遲導致請求堆積。

  • 結構變更支援(DDL 規則)

    • DDL 能力提升:支援增加列、建立索引、調整分區等常見 DDL 操作(須滿足 InnoDB 自身限制)。

    • 歸檔狀態繼承:歸檔狀態會隨表結構變更自動保留或調整。但在分區重組(Reorganize Partition)後,建議重新手動確認各分區的歸檔狀態。

    • 文法限制(不準合并)

      • 歸檔和導回操作必須單獨執行,不能與其他表結構變更(如加列、改類型)合并在同一條 ALTER TABLE 語句中。

      • 執行歸檔和導回時,不能顯式指定 ALGORITHM=COPY 或 ALGORITHM=INSTANT(此限制僅針對歸檔動作本身,不影響已歸檔表執行普通的 COPY DDL)。

  • 表壓縮與資料表空間限制

    執行以下操作前,需要先將相關表或分區的資料從 OSS 導回Block Storage。導回操作不改變表的 InnoDB 儲存引擎。

    • 啟用表壓縮:歸檔狀態下不支援ROW_FORMAT=COMPRESSED和頁壓縮,啟用前需先導回資料。

    • 遷入通用資料表空間:通用資料表空間允許多張表共用同一個資料檔案。OSS 歸檔要求每張表或每個分區使用獨立的.ibd檔案,因此不支援歸檔通用資料表空間中的表。已歸檔的表遷入通用資料表空間前,需先導回資料。

    • 匯入或丟棄資料表空間:執行IMPORT TABLESPACE(匯入資料表空間檔案)或 DISCARD TABLESPACE(丟棄表當前使用的資料表空間)前,需先導回資料。DISCARD TABLESPACE不是導回操作,不能用於將資料遷回Block Storage。

  • 透明資料加密(TDE)

    • 完全支援 TDE。歸檔和導回操作不會改變表已有的加密屬性。

    • 若需修改加密屬性,請使用預設演算法或顯式指定 ALGORITHM=COPY,不支援 ALGORITHM=INPLACE

  • 備份、安全與營運建議

    • 歸檔不等於備份DROP 和 TRUNCATE 操作仍會物理刪除或清空 OSS 上的資料,嚴禁將其作為備份替代方案。

    • 並發阻塞與資源佔用:歸檔和導回操作會鎖定目標表,可能阻塞並發讀寫,且佔用網路與儲存 I/O。建議在業務低峰期執行。

    • 大批量修改建議:由於 OSS 訪問延遲高於Block Storage,在需要對歸檔資料進行大批量修改前,仍建議先將資料導回Block Storage執行。

將表資料歸檔至 OSS

歸檔適用於訪問頻率較低、對延遲不敏感的資料。在 CREATE TABLE 語句中指定 STORAGE_TYPE 不會使建立的表自動歸檔,需先建立表,再執行歸檔操作:

ALTER TABLE table_name STORAGE_TYPE HYBRID_OSS;

該文法同樣適用於分區表,執行後會歸檔表中的所有分區。

將指定分區歸檔至 OSS

-- 歸檔一個分區。
ALTER TABLE table_name MODIFY PARTITION p0 STORAGE_TYPE HYBRID_OSS;

-- 歸檔多個分區。
ALTER TABLE table_name MODIFY PARTITION p0, p1 STORAGE_TYPE HYBRID_OSS;

整表資料均為冷資料時歸檔整表,僅部分分區為冷資料時歸檔指定分區,不要對同一分區重複執行歸檔。若表包含子分區,可以填寫子分區名,填寫父分割名時,會歸檔該父分割下的所有子分區。

查詢歸檔資料

已歸檔的普通表可以直接查詢,用法與歸檔前一致。分區表預設只查詢未歸檔的分區,需要同時查詢歸檔分區時,可在語句中添加 WITH ARCHIVED,或關閉當前會話的歸檔分區過濾。

  • 單次查詢:在表名後添加 WITH ARCHIVED,只對添加該子句的語句生效,適合單次查詢歸檔資料:

    -- 查詢未歸檔分區。
    SELECT * FROM table_name;
    
    -- 查詢資料時包含歸檔分區。
    SELECT * FROM table_name WITH ARCHIVED;
  • 當前會話生效:關閉當前會話的歸檔分區過濾後,普通查詢即可包含歸檔分區。該方式對整個當前會話生效,適合需要持續查詢歸檔資料的情境:

    SET SESSION prune_archived_oss_partitions=OFF;

    參數 prune_archived_oss_partitions 的預設值為 ON。設定為 OFF 後,查詢仍會按 WHERE 條件和正常的分區規則篩選資料。如需恢複預設行為,將該參數的值設定為 ON

查看歸檔狀態

SHOW CREATE TABLE table_name;

返回結果中,表或對應分區帶有 STORAGE_TYPE HYBRID_OSS 時,表示該對象已歸檔。

將資料導回Block Storage

導回操作會保留業務資料,並取消相應表或分區的歸檔狀態。

-- 導回普通表;用於分區表時,導回所有已歸檔分區。
ALTER TABLE table_name STORAGE_TYPE NULL;

-- 僅導回指定分區。
ALTER TABLE table_name MODIFY PARTITION p0 STORAGE_TYPE NULL;

-- 導回所有已歸檔分區。
ALTER TABLE table_name MODIFY PARTITION ALL STORAGE_TYPE NULL;

需要恢複整表或分區表的全部已歸檔分區時使用第一條語句,只需恢複個別分區時使用 MODIFY PARTITION 指定分區。指定的分區必須處于歸檔狀態。使用 ALL 時,會選擇當前已歸檔的分區。

樣本

以下樣本分別示範普通表和分區表的操作,請在測試資料庫中執行。樣本使用少量資料展示操作方法,實際節省的儲存空間與表的大小有關。

普通表

  1. 建立表並寫入資料。

    CREATE TABLE archive_orders (
      id INT NOT NULL PRIMARY KEY,
      amount INT NOT NULL
    ) ENGINE=InnoDB;
    
    INSERT INTO archive_orders VALUES (1,100), (2,200), (3,300);
  2. 歸檔後查詢,仍可讀取全部 3 條記錄。

    ALTER TABLE archive_orders STORAGE_TYPE HYBRID_OSS;
    SELECT COUNT(*) FROM archive_orders;
    SHOW CREATE TABLE archive_orders;
  3. 將資料導回Block Storage。

    ALTER TABLE archive_orders STORAGE_TYPE NULL;

分區表

  1. 建立分區表,每個分區寫入一條記錄。

    CREATE TABLE archive_orders_part (
      id INT NOT NULL PRIMARY KEY,
      amount INT NOT NULL
    ) ENGINE=InnoDB
    PARTITION BY RANGE(id) (
      PARTITION p0 VALUES LESS THAN (10),
      PARTITION p1 VALUES LESS THAN (20),
      PARTITION pmax VALUES LESS THAN MAXVALUE
    );
    
    INSERT INTO archive_orders_part VALUES (1,100), (11,200), (21,300);
  2. 僅歸檔分區 p0,其他分區保持不變。

    ALTER TABLE archive_orders_part MODIFY PARTITION p0 STORAGE_TYPE HYBRID_OSS;
  3. 對比普通查詢和包含歸檔資料的查詢。

    SET SESSION prune_archived_oss_partitions=ON;
    
    -- 返回 2;歸檔分區被跳過時可能伴隨警告。
    SELECT COUNT(*) FROM archive_orders_part;
    
    -- 返回 3,包含歸檔分區中的記錄。
    SELECT COUNT(*) FROM archive_orders_part WITH ARCHIVED;
  4. 導回分區 p0 後,普通查詢即可讀取全部 3 條記錄。

    ALTER TABLE archive_orders_part MODIFY PARTITION p0 STORAGE_TYPE NULL;
    
    SELECT COUNT(*) FROM archive_orders_part;