本文介紹了將冷資料歸檔為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中的資料以CSV或ORC格式歸檔至OSS。
在資料庫
oss_test中建立InnoDB表t。CREATE TABLE t(a int, b int, c int, primary key(a)) ENGINE = INNODB;在表
t中插入資料。INSERT INTO t VALUES (1,2,3);通過
ALTER命令歸檔冷資料。歸檔為CSV格式:
ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';歸檔為ORC格式:
ALTER TABLE t ENGINE = ORC STORAGE OSS;
歸檔完成後,您可以登入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
任意類型
支援。
任意類型
不支援歸檔DEFAULT分區。
樣本
建立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');把分區表的p0分區歸檔至新的執行OSS表。
執行如下命令,查看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)執行如下命令,將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)執行如下命令,查看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_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_name和part_name。ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV/ORC FORCE;
樣本
將表t中p1和p2分區上的資料以CSV格式歸檔至OSS。
在資料庫中建立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 );在表
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上的庫表資訊。
查詢混合分區表中的資料:操作詳情請參見查詢混合分區。
歸檔資料支援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表為唯讀狀態時,不支援執行修改操作(INSERT、UPDATE和DELETE)。如需修改已經歸檔的冷資料,您需要將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 | 與需要導回的分區的 |
樣本
在資料庫中,將歸檔在OSS上的分區表t中p1分區上的資料導回至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時,您可以等待一段時間後再重新執行該命令。