PolarDB-X 2.0 では、Time to Live(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 テーブルのクリーンアップジョブがトリガーされると、デフォルトで、time 列の値が NULL の行が削除されます。 これらの行を保持するには、TTL_FILTER 属性を明示的に設定します。
クリーンアップジョブの開始
TTL テーブルの期限切れデータのクリーンアップジョブを開始するには、次のいずれかの方法を使用できます。
スケジュールされた開始: TTL_JOB 属性を設定して、システムがスケジュールに従って自動的にクリーンアップジョブを開始できるようにします。
手動開始:
ALTER TABLE CLEANUP EXPIRED DATA文を手動で実行して、クリーンアップジョブを開始します。
システムでは、最大 2 つの TTL テーブルでクリーンアップジョブを同時に実行できます。 その他のクリーンアップジョブは、実行のためにキューに入れられる必要があります。
使用方法
スケジュールされた開始
例:
ALTER TABLE `my_ttl_tbl` MODIFY TTL SET TTL_ENABLE = 'ON';説明my_ttl_tblTTL テーブルのスケジュールされたクリーンアップジョブが有効になります。 デフォルトでは、クリーンアップジョブは無効になっています。ALTER TABLE `my_ttl_tbl` MODIFY TTL SET TTL_JOB = CRON '0 0 2 */1 * ? *' TIMEZONE '+08:00';説明my_ttl_tblTTL テーブルのクリーンアップジョブが実行されるスケジュールが変更されます。TTL_JOB 属性で指定されたスケジュールは、想定される時刻値です。 クリーンアップジョブの実際の実行時間は、前のジョブが完了しているかどうかによって異なります。 複数の TTL テーブルのクリーンアップジョブが実行中でキューに入れられている場合、クリーンアップジョブは、実行中およびキューに入れられているクリーンアップジョブが完了するまで待機する必要があります。
手動開始
例:
/*+TDDL:cmd_extra(ENABLE_ASYNC_DDL=true, PURE_ASYNC_DDL_MODE=true)*/ ALTER TABLE `my_ttl_tbl` CLEANUP EXPIRED DATA;説明/*+TDDL:cmd_extra(ENABLE_ASYNC_DDL=true, PURE_ASYNC_DDL_MODE=true)*/は、DDL 文をバックグラウンドで非同期的に実行するように設定するために使用されます。 現在のセッションで結果が返されるのを待つ必要はありません。ALTER TABLE CLEANUP EXPIRED DATA文は、TTL テーブルに対してのみサポートされています。
クリーンアップ時間範囲の計算
TTL テーブルは、最も古いものから最も新しいものへのバッチデータクリーンアップアルゴリズムを使用してデータを削除します。 クリーンアッププロセスは最も古いデータから始まり、各サイクル中に一定の時間間隔でデータを削除します。
次の文を実行して、TTL 定義で my_ttl_tbl テーブルのデータ保持期間を変更します。
ALTER TABLE `my_ttl_tbl`
MODIFY TTL
SET
TTL_EXPR = `time` EXPIRE AFTER 1 MONTH TIMEZONE '+08:00'テーブルのデータ保持期間は 1 か月です。
クリーンアップジョブのクリーンアップ時間範囲は、データ保持期間の 3 倍です。 この例では、クリーンアップ時間範囲は 3 か月です。
たとえば、現在の時刻が 2023-10-01 で、オンライントランザクションテーブルでは最新月のデータのみを保持する必要があるとします。 次の図は、クリーンアッププロセスを示しています。
1 日目:
この例では、TTL で定義された time 列の最小時間値は 2022-10-05(最小値) で、データクリーンアップ時間間隔 (CleanupDataInterval) は 3 か月です。 データクリーンアップ時間間隔の詳細については、「データクリーンアップ時間間隔の変更」をご参照ください。 最小時間値とデータクリーンアップ時間間隔に基づいて、最初のクリーンアップ時間範囲は 2022 年 10 月 5 日 (含む) から 2023 年 1 月 1 日 (含まない) です。 後続のクリーンアップ時間範囲は、2023 年 1 月 1 日 (含む) から 2023 年 4 月 1 日 (含まない)、2023 年 4 月 1 日 (含む) から 2023 年 7 月 1 日 (含まない)、および 2023 年 7 月 1 日 (含む) から 2023 年 9 月 1 日 (含まない) です。
2 日目:
2023 年 1 月 1 日 (含む) から 2023 年 4 月 1 日 (含まない) の時間範囲のデータをクリーンアップします。 2023 年 4 月 1 日は、クリーンアップジョブの上限 (CleanupUpperBound) です。
3 日目:
2023 年 4 月 1 日 (含む) から 2023 年 7 月 1 日 (含まない) の時間範囲のデータをクリーンアップします。 2023 年 7 月 1 日は、クリーンアップジョブの上限 (CleanupUpperBound) です。
4 日目:
2023 年 7 月 1 日 (含む) から 2023 年 9 月 1 日 (含まない) の時間範囲のデータをクリーンアップします。 時間範囲は 2 か月です。 この例では、現在の日付は 2023 年 10 月 1 日で、TTL テーブルは過去 1 か月 (ExpiredDataInterval) のデータを保持するように設定されています。 したがって、クリーンアップジョブは、2023 年 9 月 1 日より前のデータをクリーンアップします。これは、クリーンアップジョブの上限 (CleanupUpperBound) です。
各クリーンアップジョブの上限 (CleanupUpperBound) は、次の式を使用して計算できます。CleanupUpperBound = Min (最小値 + CleanupDataInterval, ExpiredDataInterval)。
クリーンアップジョブの進捗状況のクエリ
TTL テーブルの定義のクエリ
INFORMATION_SCHEMA.TTL_INFO ビューから、現在のデータベース内のすべての TTL テーブルのクリーンアップジョブの定義と有効化ステータスをクエリするには、次の文を実行します。
SELECT *
FROM INFORMATION_SCHEMA.TTL_INFO
WHERE TABLE_SCHEMA='ttldb' AND TABLE_NAME = 'my_ttl_tbl';*************************** 1. row ***************************
TABLE_SCHEMA: ttldb
TABLE_NAME: my_ttl_tbl
TTL_ENABLE: OFF
TTL_COL: date_field
TTL_EXPR: `date_field` EXPIRE AFTER 2 MONTH TIMEZONE '+08:00'
TTL_CRON: 0 0 1 * * ? *
ARCHIVE_TYPE:
ARCHIVE_TABLE_SCHEMA: NULL
ARCHIVE_TABLE_NAME: NULL
ARCHIVE_TABLE_PRE_ALLOCATE: 12
ARCHIVE_TABLE_POST_ALLOCATE: 64
1 row in set (0.07 sec)次の表に、フィールドを示します。
フィールド | 説明 |
TABLE_SCHEMA | TTL テーブルが属するデータベースの論理名。 |
TABLE_NAME | TTL テーブルの論理名。 |
TTL_ENABLE | TTL テーブルのスケジュールされたクリーンアップジョブが有効になっているかどうかを示します。 |
TTL_COL | time 列。 |
TTL_EXPR | データ保持期間。 |
TTL_CRON | TTL テーブルのクリーンアップジョブが実行されるスケジュール。 値は、Quartz フレームワークの CRON 式です。 |
ARCHIVE_TYPE | アーカイブタイプ。 デフォルト値: Columnar。これは、データが行ごとにアーカイブされることを示します。 |
ARCHIVE_TABLE_SCHEMA | TTL テーブルにバインドされているアーカイブテーブルが属するデータベースの論理名。 TTL テーブルがアーカイブテーブルにバインドされていない場合は、NULL が返されます。 |
ARCHIVE_TABLE_NAME | TTL テーブルにバインドされているアーカイブテーブルの論理名。 TTL テーブルがアーカイブテーブルにバインドされていない場合は、NULL が返されます。 |
ARCHIVE_TABLE_PRE_ALLOCATE | パーティション化ルールに基づいて TTL テーブル用に事前に作成されるパーティションの数。 |
ARCHIVE_TABLE_POST_ALLOCATE | TTL テーブル用に作成されるパーティションの数。 |
TTL テーブルのクリーンアップジョブに関する情報のクエリ
INFORMATION_SCHEMA.TTL_SCHEDULE ビューから、実行中の TTL テーブルのクリーンアップジョブに関するリアルタイム情報をクエリできます。
次の文を実行して、実行中の my_ttl_tbl TTL テーブルのクリーンアップジョブに関する情報をクエリします。
// クリーンアップジョブを手動で開始します。
ALTER TABLE `my_ttl_tbl` CLEANUP EXPIRED DATA;
SELECT *
FROM INFORMATION_SCHEMA.TTL_SCHEDULE
WHERE TABLE_SCHEMA='ttldb' AND TABLE_NAME = 'my_ttl_tbl';+--------------+------------+--------------------------------------+---------------------+
| TABLE_SCHEMA | TABLE_NAME | METRIC_KEY | METRIC_VAL |
+--------------+------------+--------------------------------------+---------------------+
| ttldb | my_ttl_tbl | SCHEDULE_STATUS | DISABLED |
| ttldb | my_ttl_tbl | SCHEDULE_EXPR | 0 0 1 * * ? * |
| ttldb | my_ttl_tbl | SCHEDULE_COMMENT | at 01:00 |
| ttldb | my_ttl_tbl | SCHEDULE_TIMEZONE | +08:00 |
| ttldb | my_ttl_tbl | SCHEDULE_LAST_FIRE_TIME | 1970-01-01 08:00:00 |
| ttldb | my_ttl_tbl | SCHEDULE_NEXT_FIRE_TIME | 1970-01-01 08:00:00 |
| ttldb | my_ttl_tbl | TTL_CURR_TTL_COL_MIN_VAL | null |
| ttldb | my_ttl_tbl | TTL_CURR_CLEANUP_BOUND | 2024-05-01 00:00:00 |
| ttldb | my_ttl_tbl | TTL_CURR_CLEANUP_UPPER_BOUND | 2024-05-01 00:00:00 |
| ttldb | my_ttl_tbl | TTL_CURR_NEW_DATETIME_VAL | 2024-07-18 18:22:54 |
| ttldb | my_ttl_tbl | TTL_CURR_JOB_STAGE | Finished |
| ttldb | my_ttl_tbl | TTL_CURR_JOB_BEGIN_TS | 1721298173321 |
| ttldb | my_ttl_tbl | TTL_CURR_JOB_END_TS | 0 |
| ttldb | my_ttl_tbl | TTL_CURR_JOB_FROM_SCHEDULER | false |
| ttldb | my_ttl_tbl | TTL_CURR_JOB_STOP_BY_MAINTAIN_WINDOW | false |
| ttldb | my_ttl_tbl | TTL_CURR_DN_ROWS_SPEED_LIMIT | 0 |
| ttldb | my_ttl_tbl | TTL_CURR_CLEANED_PHY_PART_COUNT | 8 |
| ttldb | my_ttl_tbl | TTL_CURR_TOTAL_PHY_PART_COUNT | 8 |
| ttldb | my_ttl_tbl | TTL_CURR_JOB_PERCENT | 100 |
| ttldb | my_ttl_tbl | TTL_ACQUIRE_PERMITS_AVG_RT_NANO | 0 |
| ttldb | my_ttl_tbl | TTL_CURR_CLEANUP_TIMECOST | 6044 |
| ttldb | my_ttl_tbl | TTL_CURR_CLEANUP_ROWS | 0 |
| ttldb | my_ttl_tbl | TTL_CURR_CLEANUP_ROWS_SPEED | 0 |
| ttldb | my_ttl_tbl | TTL_CURR_CLEANUP_DATA_LENGTH | 0 |
| ttldb | my_ttl_tbl | TTL_CURR_CLEANUP_SPEED | 0 |
| ttldb | my_ttl_tbl | TTL_CURR_SELECT_SQL_AVG_RT | 844 |
| ttldb | my_ttl_tbl | TTL_CURR_DELETE_SQL_AVG_RT | 2857 |
| ttldb | my_ttl_tbl | TTL_CURR_OPTIMIZE_SQL_AVG_RT | 0 |
| ttldb | my_ttl_tbl | TTL_CURR_ADD_PART_AVG_RT | 0 |
| ttldb | my_ttl_tbl | TTL_CURR_DATA_FREE_PERCENT_LIMIT | -1 |
| ttldb | my_ttl_tbl | TTL_CURR_TTL_TBL_DATA_FREE_PERCENT | 0.00 |
| ttldb | my_ttl_tbl | TTL_CURR_OPTIMIZE_TTL_TBL_PROGRESS | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_JOB_FROM_SCHEDULER | false |
| ttldb | my_ttl_tbl | TTL_LAST_TTL_COL_MIN_VAL | |
| ttldb | my_ttl_tbl | TTL_LAST_CLEANUP_BOUND | |
| ttldb | my_ttl_tbl | TTL_LAST_CLEANUP_UPPER_BOUND | |
| ttldb | my_ttl_tbl | TTL_LAST_JOB_BEGIN_TS | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_JOB_END_TS | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_SELECT_SQL_AVG_RT | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_DELETE_SQL_AVG_RT | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_OPTIMIZE_SQL_AVG_RT | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_ADD_PARTS_SQL_AVG_RT | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_CLEANUP_TIMECOST | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_CLEANUP_ROWS | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_CLEANUP_ROWS_SPEED | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_CLEANUP_DATA_LENGTH | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_CLEANUP_SPEED | 0 |
| ttldb | my_ttl_tbl | TTL_LAST_TTL_TBL_DATA_FREE_PERCENT | 0 |
+--------------+------------+--------------------------------------+---------------------+
48 rows in set (0.03 sec)次の表に、特定のフィールドを示します。
フィールド | 説明 |
SCHEDULE_STATUS | スケジュールされたクリーンアップジョブが有効になっているかどうかを示します。 有効な値:
|
SCHEDULE_EXPR | クリーンアップジョブが実行されるスケジュール。 スケジュールを変更できます。 詳細については、「TTL テーブルの定義と作成」トピックの「クリーンアップジョブの実行スケジュールの変更」セクションをご参照ください。 |
SCHEDULE_COMMENT | SCHEDULE_EXPR フィールドの値の説明。 |
SCHEDULE_TIMEZONE | クリーンアップジョブをスケジュールするためのタイムゾーン。 |
SCHEDULE_LAST_FIRE_TIME | 自動スケジューリングが最後にトリガーされた時刻。 初期値は 1970-01-01 08:00:00 で、自動スケジューリングがトリガーされていないことを示します。 |
SCHEDULE_NEXT_FIRE_TIME | 自動スケジューリングが次回トリガーされる時刻。 初期値は 1970-01-01 08:00:00 で、自動スケジューリングがトリガーされていないことを示します。 |
TTL_CURR_TTL_COL_MIN_VAL | クリーンアップジョブの TTL 定義で指定された time 列の最小値。 |
TTL_CURR_JOB_STAGE | クリーンアップジョブの現在のフェーズ。 |
TTL_CURR_CLEANUP_BOUND | クリーンアップジョブによってクリーンアップされている time 列の値。 |
TTL_CURR_CLEANUP_UPPER_BOUND | クリーンアップジョブの上限。 クリーンアップされる既存データの時間値は、上限よりも前です。 |
TTL_CURR_NEW_DATETIME_VAL | 現在の時刻。 |
TTL_CURR_DN_ROWS_SPEED_LIMIT | クリーンアップジョブの速度制限。これは、各ストレージノードで |
TTL_CURR_CLEANUP_ROWS | クリーンアップジョブによってクリーンアップされる行の総数。 |
TTL_CURR_CLEANUP_ROWS_SPEED | クリーンアップジョブのリアルタイムのクリーンアップ速度。 値は、1 秒あたりにクリーンアップされる行数です。 |
TTL_CURR_CLEANUP_DATA_LENGTH | クリーンアップジョブによってクリーンアップされる推定バイト数の合計。 |
TTL_CURR_CLEANUP_SPEED | クリーンアップジョブのリアルタイムのクリーンアップ速度。 値は、1 秒あたりにクリーンアップされる推定バイト数です。 |
TTL_CURR_SELECT_SQL_AVG_RT | クリーンアップジョブによって実行される |
TTL_CURR_DELETE_SQL_AVG_RT | クリーンアップジョブによって実行される |
TTL_CURR_JOB_PERCENT | クリーンアップジョブの完了率。 |
TTL_CURR_CLEANED_PHY_PART_COUNT | クリーンアップジョブによってクリーンアップされる物理パーティションの数。 |
TTL_CURR_TOTAL_PHY_PART_COUNT | クリーンアップジョブによってクリーンアップされる必要がある物理パーティションの総数。 |
クリーンアップジョブの管理
クリーンアップジョブを管理して、適切な時間と速度でデータをクリーンアップできます。 これにより、クリーンアップジョブがビジネスに与える影響を最小限に抑えることができます。
メンテナンスウィンドウの変更
PolarDB-X 2.0 のバックグラウンドクリーンアップジョブのデフォルトのメンテナンスウィンドウは、毎日 02:00 から 05:00 です。 次の文を実行して、メンテナンスウィンドウを毎日 01:00 から 06:00 に変更できます。
set global MAINTENANCE_TIME_START = '01:00';
set global MAINTENANCE_TIME_END = '06:00';クリーンアップ速度制限の変更
デフォルトでは、単一のストレージノードのクリーンアップ速度制限は 1 秒あたり 1,000 行です。 ノード上のすべてのクリーンアップジョブの合計クリーンアップ速度は、制限を超えません。 インスタンス内のストレージノードの数を増やすと、合計クリーンアップ速度が増加します。
次の文を実行して、単一のストレージノードのクリーンアップ速度制限を 1 秒あたり 10,000 行に変更できます。
set global TTL_ENABLE_CLEANUP_ROWS_SPEED_LIMIT=10000クリーンアップ速度制限を上げると、より多くの CPU と IOPS リソースが消費されます。 ストレージノードの実際のパフォーマンスに基づいて、適切なクリーンアップ速度制限を指定することをお勧めします。 これにより、クリーンアップジョブがストレージノードで過剰な CPU と IOPS リソースを消費し、ビジネスに影響を与えることを防ぎます。
ストレージノードの CPU と IOPS リソースがフル稼働している場合、前の文を実行してクリーンアップ速度制限を上げても、クリーンアップ速度が向上しない可能性があります。
クリーンアップ時間範囲の変更
デフォルトでは、TTL テーブルのクリーンアップジョブによってクリーンアップされるデータの時間範囲は、主に TTL_CLEANUP_BOUND_INTERVAL_COUNT パラメーターによって制御されます。
次の文を実行して、クリーンアップされるデータの時間範囲を変更できます。
set global TTL_CLEANUP_BOUND_INTERVAL_COUNT = 6;TTL_CLEANUP_BOUND_INTERVAL_COUNT パラメーターのデフォルト値は 3 で、クリーンアップジョブのクリーンアップ時間範囲がデータ保持期間の 3 倍であることを指定します。 前の文を実行して、クリーンアップ時間範囲をデータ保持期間の 6 倍に設定できます。 デフォルトのクリーンアップ範囲は、TTL 定義で指定した時間単位によって異なります。 例:
TTL_EXPR 属性を
'time' EXPIRE AFTER NUM DAY TIMEZONE '+08:00'に設定して、TTL 定義の時間単位を DAY として指定した場合、デフォルトのクリーンアップ範囲は毎回 6 日間のデータです。 次の条件を満たす時間値を持つデータがクリーンアップされます。最小値 ≤ 時間 < (最小値 + 6 日)。TTL_EXPR 属性を
'time' EXPIRE AFTER NUM MONTH TIMEZONE '+08:00'に設定して、TTL 定義の時間単位を MONTH として指定した場合、デフォルトのクリーンアップ範囲は毎回 6 か月のデータです。 次の条件を満たす時間値を持つデータがクリーンアップされます。最小値 ≤ 時間 < (最小値 + 6 か月)。TTL_EXPR 属性を
'time' EXPIRE AFTER NUM YEAR TIMEZONE '+08:00'に設定して、TTL 定義の時間単位を YEAR として指定した場合、デフォルトのクリーンアップ範囲は毎回 6 年間のデータです。 次の条件を満たす時間値を持つデータがクリーンアップされます。最小値 ≤ 時間 < (最小値 + 6 年)。
クリーンアップジョブの一時停止
次の
SHOW FULL DDL文を実行して、すべてのクリーンアップジョブのジョブ IDをクエリします。show full ddl\G;*************************** 1. row *************************** JOB_ID: 1771694362409848832 OBJECT_SCHEMA: ttldb OBJECT_NAME: my_ttl_tbl ENGINE: DAG DDL_TYPE: ALTER_TABLE STATE: RUNNING TOTAL_BACKFILL_PROGRESS: -- CURRENT_PHY_DDL_PROGRESS: 0% PROGRESS: 33% FASTCHECKER_TASK_NUM: 0 FASTCHECKER_TASK_FINISHED: 0 START_TIME: 2024-09-14 15:55:12.991 END_TIME: 2024-09-14 15:55:16.959 ELAPSED_TIME(MS): 3968 PHY_PROCESS: CANCELABLE: true PARENT_JOB_ID: -- RESPONSE_NODE: 10.57.104.154:3067 EXECUTION_NODE: 10.57.104.154:3067 TRACE_ID: 189652a2bc805000 DDL_STMT: alter table my_ttl_tbl cleanup expired data REMARK: -- LEGACY_ENGINE_INFO: -- 1 row in set (0.01 sec)手順 1 の結果から、管理する TTL テーブルの
ジョブ IDを取得します。 取得したジョブ ID を使用して次の文を実行し、TTL テーブルのクリーンアップジョブを一時停止します。pause ddl 1771694362409848832;
クリーンアップジョブは、リアルタイムで一時停止またはロールバックできます。 クリーンアップジョブをロールバックすると、ジョブのみがロールバックされます。 クリーンアップされたデータはロールバックできません。 詳細については、「DDL 管理文」をご参照ください。
クリーンアップジョブの再開
一時停止されたクリーンアップジョブを再開するには、次の文を実行します。
CONTINUE DDL 1771694362409848832;