このトピックでは、Time to Live(TTL)テーブルの定義、およびテーブルの TTL 定義を指定、変更、削除する方法について説明します。
前提条件
以下の要件のいずれかを満たす PolarDB-X インスタンスが作成されていること。
インスタンスのエンジンバージョンが 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 以降である。
説明バージョン番号の詳細については、「リリースノート」をご参照ください。
インスタンスバージョンの確認方法については、「インスタンスのバージョンを表示および更新する」をご参照ください。
AUTO モードのデータベースに属し、
LOCAL PARTITION BY句を使用してパーティション化されていないパーティションテーブルが使用されていること。
TTL 定義
データベースコンテキストにおける TTL は、データベース内のデータの保持期間を指します。保持期間が終了すると、データは自動的に削除されるか、期限切れとしてマークされます。 TTL 定義を使用してデータのライフサイクルを設定し、データの自動期限切れを実装できます。
PolarDB-X 2.0 の TTL 定義は、TTL_EXPR、TTL_JOB、TTL_ENABLE、および TTL_FILTER の各属性で構成されます。 TTL_JOB、TTL_ENABLE、および TTL_FILTER 属性はオプションです。
TTL_EXPR
TTL テーブルの時間列とデータ保持期間を指定します。
構文:
TTL_EXPR = ttl_column EXPIRE AFTER ttl_interval_definition timezone_definition ttl_interval_definition: ttl_interval_num { DAY | MONTH | YEAR } timezone_definition: TIMEZONE time_zone_value説明ttl_column: TTL テーブルの時間列。
Date、Datetime、Timestamp型の列のみがサポートされています。ttl_interval_definition: TTL テーブル内のデータの保持期間。単位:
DAY、MONTH、YEAR。now() の値と ttl_column の値の差が、ttl_interval_definition で指定された ttl_interval_num の値よりも大きい場合、システムは ttl_column の値を持つ対応するデータを自動的にクリーンアップします。timezone_definition: TTL テーブルのタイムゾーン。Timestamp などのタイムゾーン依存型の場合、TTL 定義でタイムゾーンを指定して、タイムゾーンベースのクリーンアップを実装できます。
例:
TTL_EXPR = `date_field` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00'説明date_field 列は、TTL テーブルの時間列です。
2 MONTH は、データ保持期間が 2 か月であることを指定します。指定された時間列の値に基づいて、2 か月の保持期間が終了すると、テーブル内のデータは期限切れになります。
+08:00 は、タイムゾーンが UTC + 08:00 であることを指定します。
TTL_JOB
クリーンアップジョブを実行するスケジュールを指定します。デフォルト値: '0 0 1 */1 * ? *'。これは、クリーンアップジョブが毎日 01:00 に実行されることを指定します。
構文:
TTL_JOB = quartz_cron_expr_definition timezone_definition quartz_cron_expr_definition: CRON cron_expr_value timezone_definition: TIMEZONE time_zone_value説明quartz_cron_expr_definition: クリーンアップジョブを実行するスケジュール。値は、Quartz フレームワークの CRON 式で、以下の部分で構成されます。
秒。有効な値: 0 ~ 59。
分。有効な値: 0 ~ 59。
時。有効な値: 0 ~ 23 およびアスタリスク (
*)。アスタリスク (*) は、クリーンアップジョブが毎時実行されることを指定します。日。月の何日目を指定します。有効な値: 1 ~ 31 およびアスタリスク (
*)。アスタリスク (*) は、クリーンアップジョブが毎日実行されることを指定します。月。有効な値: 1 ~ 12 または JAN、FEB、MAR、APR、...、DEC、およびアスタリスク (
*)。アスタリスク (*) は、クリーンアップジョブが毎月実行されることを指定します。曜日。有効な値: 1 ~ 7 または SUN、MON、TUE、WED、THU、FRI、SAT、および疑問符 (?)。1 は日曜日を指定します。疑問符 (?) はプレースホルダーとして機能し、値が設定されていないことを指定します。
年。有効な値: 年の値およびアスタリスク (
*)。アスタリスク (*) は、クリーンアップジョブが毎年実行されることを指定します。
重要スケジュールされたクリーンアップジョブは、特定量のリソースを消費します。頻繁なクリーンアップジョブがビジネスの安定性に影響を与えるのを防ぐため、PolarDB-X 2.0 では、クリーンアップジョブの実行スケジュールを分または秒単位の式に設定することはできません。
例: スケジュールされたクリーンアップジョブを毎日 02:00 に実行するように設定します。
TTL_JOB = CRON '0 0 2 */1 * ? *' TIMEZONE '+08:00'
TTL_ENABLE
TTL テーブルのスケジュールされたクリーンアップジョブを有効にするかどうかを指定します。
TTL_ENABLE = {'ON' | 'OFF'}この属性はオプションです。デフォルト値は 'OFF' で、スケジュールされたクリーンアップジョブが無効になっていることを指定します。
TTL_FILTER
TTL テーブルに対してクリーンアップジョブがトリガーされると、デフォルトでは、時間列の値が NULL の行が削除されます。これらの行を保持するには、TTL テーブルに TTL_FILTER=COND_EXPR(<ttl_column> IS NOT NULL) を明示的に設定します。
サンプルコード:
ALTER TABLE `my_ttl_tbl`
MODIFY TTL
SET
TTL_FILTER = COND_EXPR(`date_field` IS NOT NULL); この属性は、次のバージョンのインスタンスでサポートされています。
MySQL 5.7 を実行するインスタンスの場合、インスタンスバージョンは polardb-2.5.0_5.4.20-20250328_xcluster5.4.20-20250221 以降である必要があります。
MySQL 8.0 を実行するインスタンスの場合、インスタンスバージョンは polardb-2.5.0_5.4.20-20250328_xcluster8.4.20-20250304 以降である必要があります。
TTL 定義の指定
既存のテーブルに TTL 定義を指定する
この例では、次の文を実行して my_ttl_tbl という名前のテーブルを作成します。
CREATE TABLE `my_ttl_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date_field` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`id`)
PARTITIONS 8;次の ALTER 文を実行して、my_ttl_tbl テーブルの TTL 定義を指定します。
ALTER TABLE my_ttl_tbl
MODIFY TTL
SET
TTL_EXPR = `date_field` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00';上記の my_ttl_tbl テーブルの TTL 定義では、date_field 列が時間列であり、2 MONTH はデータ保持期間が 2 か月であることを指定し、+08:00 はスケジュールされたクリーンアップジョブのタイムゾーンが UTC + 08:00 であることを指定します。
テーブルの作成時に TTL 定義を指定する
次の文を実行して、TTL 定義を指定した my_ttl_tbl という名前のテーブルを作成します。
CREATE TABLE `my_ttl_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date_field` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 TTL = TTL_DEFINITION ( TTL_EXPR = `date_field` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00' )
PARTITION BY KEY(`id`)
PARTITIONS 8;上記の my_ttl_tbl テーブルの定義では、date_field 列が時間列であり、2 MONTH はデータ保持期間が 2 か月であることを指定し、+08:00 はスケジュールされたクリーンアップジョブのタイムゾーンが UTC + 08:00 であることを指定します。
TTL 定義の変更
my_ttl_tbl という名前のテーブルを作成するときに、時間列として指定された date_field 列を含む TTL 定義を指定します。
CREATE TABLE `my_ttl_tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date_field` datetime DEFAULT CURRENT_TIMESTAMP,
`create_date` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 TTL = TTL_DEFINITION ( TTL_EXPR = `date_field` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00' )
PARTITION BY KEY(`id`)
PARTITIONS 8;時間列の変更
次の ALTER 文を実行して、TTL 定義の時間列を date_field から create_date に変更します。
ALTER TABLE my_ttl_tbl
MODIFY TTL
SET
TTL_EXPR = `create_date` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00';データ保持期間の変更
ALTER TABLE `my_ttl_tbl`
MODIFY TTL
SET
TTL_EXPR = `create_date` EXPIRE AFTER 2 YEAR TIMEZONE '+08:00';データ保持期間は 2 YEAR に変更されます。指定された時間列の値に基づいて、2 年の保持期間が終了すると、テーブル内のデータは期限切れになります。
データ保持期間を変更する場合は、TIMEZONE パラメーターを指定する必要があります。
クリーンアップジョブの実行スケジュールの変更
ALTER TABLE `my_ttl_tbl`
MODIFY TTL
SET
TTL_JOB = CRON '0 0 3 */1 * ? *' TIMEZONE '+08:00';クリーンアップジョブの実行スケジュールは
CRON '0 0 3 */1 * ? *'に変更されます。クリーンアップジョブは毎日 03:00 に実行されます。クリーンアップジョブの実行スケジュールを変更する場合は、TIMEZONE パラメーターを指定する必要があります。
スケジュールされたクリーンアップジョブの有効化ステータスの変更
ALTER TABLE `my_ttl_tbl`
MODIFY TTL
SET
TTL_ENABLE = 'ON';TTL 定義の TTL_ENABLE 属性のデフォルト値は OFF で、クリーンアップジョブが無効になっていることを指定します。クリーンアップジョブの自動スケジューリングを有効にするには、上記の文を実行します。
TTL 定義の削除
ALTER TABLE my_ttl_tbl REMOVE TTL;TTL テーブルのアーカイブテーブルを作成した場合、テーブルの TTL 定義を直接削除することはできません。TTL 定義を削除する前に、アーカイブテーブルを削除する必要があります。