本文介紹了PolarDB MySQL版的到期資料清理功能。
版本限制
PolarDB MySQL版適用的資料庫引擎版本如下:
MySQL 8.0.1且小版本需為8.0.1.1.49.2及以上版本。
MySQL 8.0.2且小版本需為8.0.2.2.29.2及以上版本。
如何查看核心版本,請參見核心版本說明。
注意事項
不允許在暫存資料表上設定TTL屬性,包括本地暫存資料表和全域暫存資料表。
具有TTL屬性的表不支援列存索引(IMC)、多主叢集(Limitless)、GSI和分區表等功能。
具有TTL屬性的表不支援作為外鍵約束的主表被其他表引用。
具有TTL屬性的表,不允許包含觸發器。
不保證所有到期資料會立即被刪除,到期資料的刪除時間取決於後台清理任務的調度周期。
在使用庫表或備份進行恢複時,需要將
loose_innodb_enable_ttl_purge設定為OFF,以關閉TTL清理到期資料的功能。這是因為在恢複後,所有資料可能已經到期。具有TTL屬性的列,必須是TIMESTAMP類型。
通過TTL資料清理的資料不會產生Binlog記錄,當通過Binlog進行資料同步時,如果源庫中的一張表已開啟TTL功能,那麼在將同步資料到備庫時,可能會出現索引值衝突的情況。
文法說明
可以通過CREATE TABLE或ALTER TABLE語句來配置表的TTL功能。
建立具有TTL屬性的表
您可以使用以下兩種方法中的一種來建立TTL屬性的表:
建立了一張名為t1的表,並指定created_at為TTL的時間列,表示資料的建立時間。通過設定created_at存活時間來調整資料是否被刪除。
設定
created_at最長存活時間為100秒。CREATE TABLE `t1` ( `a` INT PRIMARY KEY, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, KEY idx_created_at (`created_at`) )ENGINE=InnoDB TTL='created_at@100';說明通過
TTL='created_at@100'設定了表中行的最長存活時間為100秒。超過此時間長度的到期資料將在之後被刪除。設定
created_at最長存活時間為3小時。CREATE TABLE `t1` ( `a` INT PRIMARY KEY, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, KEY idx_created_at (`created_at`) )ENGINE=InnoDB TTL='created_at' + INTERVAL 3 HOUR;說明通過設定
TTL ='created_at'+ INTERVAL 3 HOUR,您可以將表中的最長存活時間設為3小時,超出該時間長度的到期資料將被自動刪除。該TTL(Time To Live)設定支援多種時間單位,包括YEAR(年)、QUARTER(季度)、MONTH(月)、WEEK(周)、DAY(天)、HOUR(小時)、MINUTE(分鐘)和SECOND(秒)。這種靈活性使得您能夠根據具體需求選擇合適的時間單位,實現高效的資料管理和維護。
修改表的TTL屬性
您可以使用以下兩種方法中的一種來修改表的TTL屬性:
通過修改t1表中created_at存活時間來調整資料是否被刪除。
修改
created_at最長存活時間為10000秒。ALTER TABLE `t1` TTL='created_at@10000';說明通過在
created_at欄位上設定TTL為10000秒,確保資料在建立時間後的10000秒內,超過10000秒的資料會被自動刪除。修改
created_at最長存活時間為3天。ALTER TABLE `t1` TTL='created_at' + INTERVAL 3 DAY;說明通過在TTL屬性中使用
created_at時間戳記並增加3天的有效期間,設定資料的到期時間為3天,從而確保資料在建立後不會超過3天,超出3天的資料會被自動刪除。
清除一張表的TTL屬性
ALTER TABLE t1 TTL = '';查詢一張表的TTL屬性
SHOW CREATE TABLE `t1` FULL;
CREATE TABLE `t1` (
`a` INT PRIMARY KEY,
`created_at` TIMESTAMP DEFAULT
CURRENT_TIMESTAMP,
KEY idx_created_at (`created_at`)
)ENGINE=InnoDB TTL='created_at@259200';可以通過以上語句來查詢某一個表是否包含TTL資訊。
參數說明
同時添加了以下全域參數來控制TTL到期資料的清理:
PolarDB支援通過控制台修改以下全域參數,來控制TTL到期資料清理。
參數名稱 | 描述 |
loose_innodb_enable_ttl_purge | 是否開啟TTL到期資料的清理。 取值範圍如下:
說明 需要您自行前往控制台開啟TTL到期資料清理功能。 |
loose_innodb_ttl_min_interval | 設定資料到期時間時,允許的最小時間,預設值為100,預設單位為秒。 |
loose_innodb_ttl_purge_thread | 清理TTL到期資料的線程數。修改後需重設 |
loose_innodb_ttl_cluster_index_purge_batch_size | 如果指定的TTL列沒有索引,掃描TTL到期資料時將掃描主鍵,一次掃描主鍵的行數預設為10,000。 |
loose_innodb_ttl_index_purge_batch_size | 如果指定的TTL列已建立索引,掃描TTL到期資料時將掃描此索引,一次掃描此索引的行數預設為500。 |
loose_innodb_ttl_purge_start_hour | TTL清理任務開始的時間,預設為0,取值範圍為0~23,不得超過 |
loose_innodb_ttl_purge_end_hour | TTL清理任務結束的時間,預設為0,取值範圍為0~23,不得小於 |
loose_innodb_ttl_finished_job_expired_days | 控制 |
觀測TTL
系統會定時採集TTL運行時的資訊,並提供一張系統資料表,用於展示TTL清理任務執行的具體狀況,mysql.ttl_job_history表中欄位說明如下:
列名 | 描述 |
job_id | TTL清理的任務ID,一般為時間戳記,毫秒級。 |
table_name | 表示此次TTL執行的任務對應的表名稱。 |
state | TTL任務執行的狀態,包括掛起、執行中和完成。 |
start_time | 任務的開始時間。 |
finished_time | 任務的完成時間。 |
expire_time | 此次TTL任務清理的資料的到期時間。 |
scan_cost | 掃描此批次所用的耗時。 |
purge_cost | 清理此批次所用的耗時。 |
purge_rows | 此次TTL任務清理的資料行數。 |