資料庫中很少被訪問的歷史資料長期佔用PolarDBBlock Storage,會持續產生儲存成本。歸檔為IBD格式在不更換InnoDB儲存引擎的前提下,把這部分冷資料轉存到成本更低的Object Storage Service,歸檔後的資料仍保留原有的InnoDB資料格式、索引結構和 DML 能力。MySQL 8.0.1和MySQL 8.0.2都支援該功能,但歸檔文法、支援的歸檔對象和歸檔後的可操作範圍不同。
確認叢集版本對應的歸檔方式
基礎版和進階版都支援將冷資料歸檔為 IBD 格式,但底層實現不同:基礎版在 InnoDB 側封裝 OSS 訪問能力,進階版基於共用儲存 PolarStore 提供 OSS 混合儲存能力,兩者的歸檔文法、支援的歸檔對象和歸檔後的可操作範圍不同,語句不能混用。
對比項 | 基礎版 | 進階版 |
實現邏輯 | 在 InnoDB 儲存引擎側封裝 OSS 訪問能力,資料直接從 InnoDB 讀寫 OSS | 基於共用儲存 PolarStore 提供 OSS 混合儲存能力,儲存層統一管理冷熱資料 |
支援版本 | MySQL 8.0.1且修訂版本需為 8.0.1.1.51.2 或以上。 |
|
支援的歸檔對象 | 普通表 | 普通表和分區表,分區表可歸檔全部或指定分區 |
歸檔文法 |
|
|
歸檔後的 DDL 操作 | 不支援 | 支援增加列、建立索引、調整分區等常見 DDL 操作 |
查詢歸檔資料 | 歸檔整表後直接查詢 | 分區表預設跳過歸檔分區,可通過 |
導回Block Storage | 整表導回 | 整表、指定分區或全部已歸檔分區導回 |
通用適用範圍
已開啟冷資料歸檔功能。
不支援全球資料庫網路(GDN)中的叢集歸檔為 IBD 格式。
操作指南
基礎版
基礎版是基於 InnoDB 儲存引擎封裝 OSS 訪問能力,支援將普通表整體歸檔到 OSS Object Storage Service。該版本後續僅包含缺陷修複,不再進行功能迭代。如需分區級歸檔、歸檔後 DDL 等進階能力,請使用進階版。
準備工作
MySQL 8.0.1且修訂版本需為 8.0.1.1.51.2 或以上。
如需使用歸檔為 IBD 格式,請前往配額中心,根據配額 ID
polardb_innodb_oss_enable找到配額名稱,在對應的操作列單擊申請開通該功能。
注意事項
讀寫與事務限制(DML & DDL)
DML與事務支援:歸檔後的表支援正常的
INSERT、UPDATE、DELETE等 DML 操作,並支援事務。DDL 限制:不支援 DDL 操作。表一旦歸檔到 OSS,將無法修改表結構。
歸檔過程中的可用性
資料訪問中斷:在執行冷資料歸檔的過程中,預設無法訪問正在歸檔中的表資料。
臨時規避方案:如果需要在歸檔期間保持可讀,須提前將參數
polar_oss_ddl_shared的值設定為ON。
備份與資料安全
不包含在標準資料備份中:自動備份和手動備份均不包含儲存在 OSS 上的資料。
恢複限制:無法對 OSS 上的資料執行庫表恢複或按時間點恢複操作。
效能影響與營運建議
歸檔期間資源消耗:歸檔冷資料會佔用一定量的網路和儲存 I/O 資源,建議在業務低峰期或非活躍叢集上執行。
高延遲風險:Object Storage Service的 I/O 延遲比Block Storage高百倍以上,需評估因此導致的長 SQL 延遲影響。
大批量寫操作避坑:對OSS表執行大量寫入或刪除前,建議先將表導回Block Storage,否則會引發以下嚴重後果:
緩衝汙染:消耗大量資料庫 Buffer Pool(頁緩衝)資源,導致其他正常表的 SQL 因無法擷取空閑頁面而變慢。
阻塞 Checkpoint:大量 OSS 髒頁持久化緩慢,會阻塞 Checkpoint 推進,從而拉長資料庫崩潰恢復。
拖慢崩潰恢複:崩潰恢複過程中,對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 上對應的檔案。
建立資料庫。
CREATE DATABASE oss;使用資料庫。
USE oss;建立表
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;建立預存程序
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 ;調用預存程序,向表
toss1中插入資料。CALL populate(5000);將資料歸檔至 OSS。
ALTER TABLE `toss1` STORAGE_TYPE OSS;查詢
toss1表中的資料。SELECT COUNT(*) FROM `toss1`;刪除 OSS 上的
toss1表。DROP TABLE `toss1`;刪除 OSS 資料庫。
DROP DATABASE oss;確認資料不再使用後,刪除 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 與事務支援:歸檔後的表和分區仍可修改,支援
INSERT、UPDATE、DELETE操作及事務。分區表特有行為:
查詢:預設會自動跳過已歸檔的分區。
更新與刪除:
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 時,會選擇當前已歸檔的分區。
樣本
以下樣本分別示範普通表和分區表的操作,請在測試資料庫中執行。樣本使用少量資料展示操作方法,實際節省的儲存空間與表的大小有關。
普通表
建立表並寫入資料。
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);歸檔後查詢,仍可讀取全部 3 條記錄。
ALTER TABLE archive_orders STORAGE_TYPE HYBRID_OSS; SELECT COUNT(*) FROM archive_orders; SHOW CREATE TABLE archive_orders;將資料導回Block Storage。
ALTER TABLE archive_orders STORAGE_TYPE NULL;
分區表
建立分區表,每個分區寫入一條記錄。
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);僅歸檔分區
p0,其他分區保持不變。ALTER TABLE archive_orders_part MODIFY PARTITION p0 STORAGE_TYPE HYBRID_OSS;對比普通查詢和包含歸檔資料的查詢。
SET SESSION prune_archived_oss_partitions=ON; -- 返回 2;歸檔分區被跳過時可能伴隨警告。 SELECT COUNT(*) FROM archive_orders_part; -- 返回 3,包含歸檔分區中的記錄。 SELECT COUNT(*) FROM archive_orders_part WITH ARCHIVED;導回分區
p0後,普通查詢即可讀取全部 3 條記錄。ALTER TABLE archive_orders_part MODIFY PARTITION p0 STORAGE_TYPE NULL; SELECT COUNT(*) FROM archive_orders_part;