歸檔表是用于保存已歸檔數據的表。TTL表與歸檔表之間存在強綁定的一對一關系,即每個TTL表最多只能創建一個歸檔表。本文將為您介紹歸檔表的相關語法說明。
前提條件
實例版本要求如下:
引擎版本為MySQL 5.7時,實例版本必須是polardb-2.4.0_5.4.19-20240927_xcluster5.4.19-20240920及以上。
引擎版本為MySQL 8.0時,實例版本必須是polardb-2.4.0_5.4.19-20240927_xcluster8.4.19-20240924及以上。
TTL定義僅支持AUTO模式數據庫的分區表(不包括使用
Local Partition
的分區表 )。
名詞解析
名詞 | 說明 |
冷數據 | 在實例中某些數據庫表幾乎沒有更新,且查詢頻率非常低的數據。 |
在線表 | 承載在線流量的業務數據表。 |
歸檔表 | 用于保存已歸檔數據的表,通常存放在高壓縮、低成本的存儲介質中,例如OSS。 |
TTL | 全稱為“生存時間”(Time To Live),指的是數據在數據庫中所能存儲的時間長度。在此時間段之后,數據將被自動清理。 |
TTL表 | 所有設置了TTL定義的在線表。 |
TTL列 | TTL定義中用于計算數據有效性的時間列。 |
創建歸檔表
在通過CREATE TABLE
或ALTER TABLE
語句創建TTL表后,若對TTL表的歷史數據有歸檔需求,則需為當前TTL表創建相應的歸檔表。歸檔表會將TTL表的數據轉存至高壓縮且低成本的OSS對象存儲中,從而有效降低存儲成本。
語法定義
CREATE TABLE #archiveTableName
LIKE #ttlTableName
ENGINE = 'Columnar' ARCHIVE_MODE = 'TTL'
語法示例
例如,已經創建了一個名為my_ttl_tbl
的TTL表。如果希望為該TTL表創建一個名為my_arc_tbl
的歸檔表,可以使用以下SQL語句:
/*+TDDL:cmd_extra(ENABLE_ASYNC_DDL=true, PURE_ASYNC_DDL_MODE=true)*/
CREATE TABLE `my_arc_tbl`
LIKE `my_ttl_tbl`
ENGINE = 'Columnar' ARCHIVE_MODE = 'TTL';
歸檔表分區
分區方案
歸檔表默認會按TTL定義中
TTL_EXPR
的ttl_column
進行Range分區。Range分區的間隔是TTL定義中TTL_EXPR
的ttl_interval_definition
。例如,在某個TTL表中,TTL列為
date_field
。如果數據的存活時間間隔按月進行定義,保留最近3個月的數據。那么歸檔表的Range分區的間隔就是一個月,一個月對應一個Range分區。示例如下:TTL_EXPR = `date_field` EXPIRE AFTER 3 MONTH TIMEZONE '+08:00'
當創建歸檔表時,自動生成的Range分區數量及其定義由兩個參數共同決定。
ARCHIVE_TABLE_PRE_ALLOCATE
: 該參數是決定在創建歸檔表時,最多向未來時間預建多少個分區。ARCHIVE_TABLE_POST_ALLOCATE
:該參數是決定在創建歸檔表時,最多為過去時間補建多少個分區。
例如,假設當前時間為2024-10-02,
ARCHIVE_TABLE_PRE_ALLOCATE
的取值為4(即向未來時間預建4個分區),ARCHIVE_TABLE_POST_ALLOCATE
的取值為3(即為過去時間補建3個分區)。因此,最后歸檔表的分區方案如下所示:PARTITION BY RANGE COLUMNS(`date_field`) ( PARTITION `pstart` VALUES LESS THAN ('1970-01-02 00:00:00'), PARTITION `p202407` VALUES LESS THAN ('2024-08-01 00:00:00'), PARTITION `p202408` VALUES LESS THAN ('2024-09-01 00:00:00'), PARTITION `p202409` VALUES LESS THAN ('2024-10-01 00:00:00'), PARTITION `p202410` VALUES LESS THAN ('2024-11-01 00:00:00')/*當前時間 2024-10-02 所在的分區*/, PARTITION `p202411` VALUES LESS THAN ('2024-12-01 00:00:00'), PARTITION `p202412` VALUES LESS THAN ('2025-01-01 00:00:00'), PARTITION `p202501` VALUES LESS THAN ('2025-02-01 00:00:00'), PARTITION `pm` VALUES LESS THAN (MAXVALUE) )
調整分區參數
若您希望調整ARCHIVE_TABLE_PRE_ALLOCATE
或ARCHIVE_TABLE_POST_ALLOCATE
的值,以便為未來時間及過去時間創建更多的分區,您可以使用以下語法進行調整:
/**
* 給未來時間預建 12 個分區,
* 給過去時間補建 24 個分區,
*/
ALTER TABLE `my_ttl_tbl`
MODIFY TTL
SET
ARCHIVE_TABLE_PRE_ALLOCATE=12,
ARCHIVE_TABLE_POST_ALLOCATE=24;
查詢歸檔表
查詢歸檔表定義
創建歸檔表的過程實質上是一個創建列存索引的過程。當歸檔表創建完成后,原TTL表中將新增對應的列存索引(名稱為arctmp_+歸檔表表名),這個列存索引就是歸檔表專用的列存索引。詳細說明請參見原理概述。
因此,通過對TTL表執行SHOW CREATE TABLE
指令,便可以查詢到歸檔表的列存索引定義及其分區情況。
例如,TTL表my_ttl_tbl
的歸檔表my_arc_tbl
所對應的列存索引名為arctmp_my_arc_tbl
。歸檔表my_arc_tbl
實質上是一個顯式指定列存索引arctmp_my_arc_tbl
的查詢視圖,如下所示:
顯示所有表。
show tables;
+------------------+ | Tables_in_ttldb | +------------------+ | my_ttl_tbl | | my_arc_tbl | +------------------+ 2 rows in set (0.00 sec)
對TTL表執行
SHOW CREATE TABLE
。show create table my_ttl_tbl\G;
*************************** 1. row *************************** Table: my_ttl_tbl Create Table: CREATE TABLE `my_ttl_tbl` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_field` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), CLUSTERED COLUMNAR INDEX `arctmp_my_arc_tbl` (`date_field`) PARTITION BY RANGE COLUMNS(`date_field`) (PARTITION `pstart` VALUES LESS THAN ('1970-01-02 00:00:00') ENGINE = Columnar, PARTITION `p201903` VALUES LESS THAN ('2019-04-01 00:00:00') ENGINE = Columnar, ... PARTITION `p202506` VALUES LESS THAN ('2025-07-01 00:00:00') ENGINE = Columnar, PARTITION `p202507` VALUES LESS THAN ('2025-08-01 00:00:00') ENGINE = Columnar) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 TTL = TTL_DEFINITION( TTL_ENABLE = 'OFF', TTL_EXPR = `date_field` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00', TTL_JOB = CRON '0 0 1 * * ? *' TIMEZONE '+08:00', ARCHIVE_TYPE = 'COLUMNAR', ARCHIVE_TABLE_NAME = 'my_arc_tbl', ARCHIVE_TABLE_PRE_ALLOCATE = 12, ARCHIVE_TABLE_POST_ALLOCATE = 64 ) PARTITION BY KEY(`id`) PARTITIONS 8 1 row in set (0.00 sec)
對歸檔表執行
SHOW CREATE TABLE
。show create table my_arc_tbl\G;
*************************** 1. row *************************** View: my_arc_tbl Create View: CREATE VIEW `my_arc_tbl` AS SELECT `my_ttl_tbl`.`id`, `my_ttl_tbl`.`date_field` FROM `ttldb`.`my_ttl_tbl` FORCE INDEX(`ARCTMP_MY_ARC_TBL`) character_set_client: utf8 collation_connection: utf8_general_ci 1 row in set (0.00 sec)
查詢歸檔表數據
基于歸檔表my_arc_tbl
這個查詢視圖,您可以方便地查詢TTL表中所有已完成歸檔的歷史數據。例如:
select count(1) from my_arc_tbl;
查詢歸檔表數據時,需要將遠端的OSS文件拉取至本地磁盤。這是一項相對耗費I/O資源的操作,在未命中本地OSS緩存的情況下,查詢時間可能會較慢。因此,建議業務低頻次執行。
刪除歸檔表
TTL表與歸檔表之間存在強綁定的一對一關系(每個TTL表最多只能創建一個歸檔表)。因此,刪除操作需注意:
若TTL表被刪除,其對應的歸檔表也會被同步刪除。
若歸檔表被刪除,其對應的TTL表不會被刪除。但是,TTL表的清理任務將變為單純的數據清理,被清理的數據不會再被歸檔。
默認情況下,為防止誤操作刪除已歸檔的歷史數據,歸檔表的DROP TABLE
操作會被限制。
例如,TTL表my_ttl_tbl
所綁定的歸檔表為my_arc_tbl
,直接刪除my_arc_tbl
會觸發如下報錯:
顯示所有表。
show tables;
+------------------+ | Tables_in_ttldb | +------------------+ | my_ttl_tbl | | my_arc_tbl | +------------------+ 2 rows in set (0.00 sec)
對歸檔表執行
DROP TABLE
。DROP TABLE my_arc_tbl;
返回錯誤如下:
ERROR 4601 (HY000): [189b8f1eb7cxxxxx][10.57.xxx.xxx:xxxx][ttldb]ERR-CODE: [TDDL-4601][ERR_EXECUTOR] Forbid to drop the ttl-defined table `ttldb`.`my_arc_tbl` with archive cci, please use the hint /*TDDL:cmd_extra(TTL_FORBID_DROP_TTL_TBL_WITH_ARC_CCI=false)*/ to drop this table
若您確認需要單獨刪除歸檔表,可使用以下DROP TABLE
語法來完成此操作。例如,您想要刪除名為my_arc_tbl
的歸檔表:
/*+TDDL:CMD_EXTRA(TTL_FORBID_DROP_TTL_TBL_WITH_ARC_CCI=false)*/
DROP TABLE my_arc_tbl;
DROP TABLE
前面所附的HINT/*+TDDL:CMD_EXTRA(TTL_FORBID_DROP_TTL_TBL_WITH_ARC_CCI=false)*/
是用于解除上述防止誤刪除限制的。
DDL相關限制
TTL表與歸檔表之間存在強綁定的一對一關系(每個TTL表最多只能創建一個歸檔表)。因此,當TTL表創建歸檔表后,將會有一些DDL操作的限制,具體如下所示:
含有歸檔表的TTL表,默認不允許執行普通的
CREATE TABLE LIKE
語句(即不包含參數ENGINE = 'Columnar' ARCHIVE_MODE = 'TTL'
)的DDL操作。如果需要對TTL表執行CREATE TABLE LIKE
語句,則須在語句前添加HINT/*+TDDL:CMD_EXTRA(ALLOW_CREATE_TABLE_LIKE_IGNORE_ARCHIVE_CCI=true)*/
,來自動去除歸檔表的相關定義。例如:
/*+TDDL:CMD_EXTRA(ALLOW_CREATE_TABLE_LIKE_IGNORE_ARCHIVE_CCI=true)*/ CREATE TABLE my_tbl2 like my_ttl_tbl;
含有歸檔表的TTL表,默認不允許對TTL列進行列名或列類型等變更,例如
MODIFY COLUMNS
、CHANGE COLUMNS
或RENAME COLUMNS
等DDL操作。這是由于TTL列的變更可能會觸發歸檔表的重分區,因此暫時不支持對TTL列進行相關操作。