## モジュール 2: Time to Live (TTL)を使用します

このモジュールでは、受講者は3つのテーブルを作成します。最初の2つのテーブルにはTTL属性が設定されており、3つ目のテーブルにはTTL属性が設定されていません。その後、tiup benchツールを使用して、1秒ごとに3つのテーブルにそれぞれ1行のランダムデータを挿入します。`TiUP bench`については、こちらをご参照ください：<https://docs.pingcap.com/ja/tidb/stable/tiup-bench/>。受講者は、3つのテーブルのデータが設定されたライフサイクルに従って自動的に削除されるかどうか、またTTL機能をオンラインで有効または無効にする方法を観察します。最後に、FLASHBACK TABLE機能がテーブルのTTL属性に与える影響をテストします。

### 手順 1. TiUP コントロールマシンに2つのターミナルで接続します

+ 以下のリンクをクリックして、演習用仮想マシンへの2つのSSH接続を開きます：
  + [ターミナル 1](ssh://monitor1-ssh#1)
  + [ターミナル 2](ssh://monitor1-ssh#2)

+ これで2つのアクティブなターミナルセッションが開かれます。

### 手順 2. テーブルの作成

+ [ターミナル 1](ssh://monitor1-ssh#1) で、TiDBサーバーインスタンスに接続します。

  ```bash
  mysql -h ${HOST_DB1_PRIVATE_IP} --port 4000 -u root
  ```

  ```output
  mysql> 
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、`test` の下に `tbl_ttl_1`、`tbl_ttl_2`、および `tbl_ttl_3` のテーブルを作成し、テーブル作成に使用される DDL ステートメントについて理解します。

  ```sql
  DROP TABLE IF EXISTS test.tbl_ttl_1;
  CREATE TABLE test.tbl_ttl_1 (
  `ID` bigint PRIMARY KEY AUTO_RANDOM,
  `pState` varchar (100) NOT NULL,
  `cState` tinyint (4) DEFAULT NULL,
  `created_at` DATETIME,
  `updated_at` DATETIME,
  `txt` varchar(64) DEFAULT 'TTLTEST',
  KEY `pcStateIndex` (`pState`, `cState`)
  ) PRE_SPLIT_REGIONS=4, TTL = `created_at` + INTERVAL 1 MINUTE;

  DROP TABLE IF EXISTS test.tbl_ttl_2;
  CREATE TABLE test.tbl_ttl_2 (
  `ID` bigint PRIMARY KEY AUTO_RANDOM,
  `pState` varchar (100) NOT NULL,
  `cState` tinyint (4) DEFAULT NULL,
  `created_at` DATETIME,
  `updated_at` DATETIME,
  `expire_at` DATETIME AS( IF (cState=1, created_at + INTERVAL 1 MINUTE, created_at + INTERVAL 2 DAY) ),
  `txt` varchar(64) DEFAULT 'TTLTEST',
  KEY `pcStateIndex` (`pState`, `cState`)
  ) PRE_SPLIT_REGIONS=4, TTL = `expire_at` + INTERVAL 0 MINUTE;

  DROP TABLE IF EXISTS test.tbl_ttl_3;
  CREATE TABLE test.tbl_ttl_3 (
  `ID` bigint PRIMARY KEY AUTO_RANDOM,
  `pState` varchar (100) NOT NULL,
  `cState` tinyint (4) DEFAULT NULL,
  `created_at` DATETIME,
  `updated_at` DATETIME,
  `txt` varchar(64) DEFAULT 'TTLTEST',
  KEY `pcStateIndex` (`pState`, `cState`)
  ) PRE_SPLIT_REGIONS=4;
  ```

  ```output
  mysql> CREATE TABLE test.tbl_ttl_1 (
      -> `ID` bigint PRIMARY KEY AUTO_RANDOM,
      -> `pState` varchar (100) NOT NULL,
      -> `cState` tinyint (4) DEFAULT NULL,
      -> `created_at` DATETIME,
      -> `updated_at` DATETIME,
      -> `txt` varchar(64) DEFAULT 'TTLTEST',
      -> KEY `pcStateIndex` (`pState`, `cState`)
      -> ) PRE_SPLIT_REGIONS=4, TTL = `created_at` + INTERVAL 1 MINUTE;
  Query OK, 0 rows affected, 2 warnings (0.07 sec)

  mysql> 
  mysql> DROP TABLE IF EXISTS test.tbl_ttl_2;
  Query OK, 0 rows affected, 1 warning (0.00 sec)

  mysql> CREATE TABLE test.tbl_ttl_2 (
      -> `ID` bigint PRIMARY KEY AUTO_RANDOM,
      -> `pState` varchar (100) NOT NULL,
      -> `cState` tinyint (4) DEFAULT NULL,
      -> `created_at` DATETIME,
      -> `updated_at` DATETIME,
      -> `expire_at` DATETIME AS( IF (cState=1, created_at + INTERVAL 1 MINUTE, created_at + INTERVAL 2 DAY) ),
      -> `txt` varchar(64) DEFAULT 'TTLTEST',
      -> KEY `pcStateIndex` (`pState`, `cState`)
      -> ) PRE_SPLIT_REGIONS=4, TTL = `expire_at` + INTERVAL 0 MINUTE;
  Query OK, 0 rows affected, 2 warnings (0.07 sec)

  mysql> 
  mysql> DROP TABLE IF EXISTS test.tbl_ttl_3;
  Query OK, 0 rows affected, 1 warning (0.00 sec)

  mysql> CREATE TABLE test.tbl_ttl_3 (
      -> `ID` bigint PRIMARY KEY AUTO_RANDOM,
      -> `pState` varchar (100) NOT NULL,
      -> `cState` tinyint (4) DEFAULT NULL,
      -> `created_at` DATETIME,
      -> `updated_at` DATETIME,
      -> `txt` varchar(64) DEFAULT 'TTLTEST',
      -> KEY `pcStateIndex` (`pState`, `cState`)
      -> ) PRE_SPLIT_REGIONS=4;
  Query OK, 0 rows affected, 2 warnings (0.06 sec)
  ```

+ テーブル作成のDDL文から次のことがわかります：
  + テーブル `test.tbl_ttl_1` のデータの有効期限は `created_at` 列の時間値に1分を加えたものです。
  + テーブル `test.tbl_ttl_2` のデータは、列 `cState` の値が `1` の場合、有効期限は `created_at` 列の時間値に1分を加えたものとなります。それ以外の場合は、`created_at` 列の時間値に2日を加えたものです。
  + テーブル `test.tbl_ttl_3` にはTTL属性が設定されていません。

+ [ターミナル 2](ssh://monitor1-ssh#2) で、tiup benchツールを使用して、テーブル `test.tbl_ttl_1`、`test.tbl_ttl_2`、および `test.tbl_ttl_3` にそれぞれ1,000行のランダムデータを挿入します。`TiUP bench`については、こちらをご参照ください：<https://docs.pingcap.com/ja/tidb/stable/tiup-bench/>

  ```bash
  cat > tbl_ttl_insert_1.sql <<EOF
  INSERT INTO test.tbl_ttl_1 (pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  INSERT INTO test.tbl_ttl_2(pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  INSERT INTO test.tbl_ttl_3 (pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  EOF
  export PATH="$PATH:/home/ec2-user/.tiup/bin"
  tiup bench rawsql run -H ${HOST_DB1_PRIVATE_IP} -P 4000 --count 1000 --threads 1 --query-files tbl_ttl_insert_1.sql
  ```

  ```output
  [ec2-user@ip-10-90-4-53 ~]$ cat > tbl_ttl_insert_1.sql <<EOF
  > INSERT INTO test.tbl_ttl_1 (pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  > INSERT INTO test.tbl_ttl_2(pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  > INSERT INTO test.tbl_ttl_3 (pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  > EOF
  [ec2-user@ip-10-90-4-53 ~]$ export PATH="$PATH:/home/ec2-user/.tiup/bin"
  [ec2-user@ip-10-90-4-53 ~]$ tiup bench rawsql run -H ${HOST_DB1_PRIVATE_IP} -P 4000 --count 1000 --threads 1 --query-files tbl_ttl_insert_1.sql
  Starting component bench: /home/ec2-user/.tiup/components/bench/v1.12.0/tiup-bench rawsql run -H 10.90.1.183 -P 4000 --count 1000 --threads 1 --query-files tbl_ttl_insert_1.sql
  Finished
  [Summary] TBL_TTL_INSERT_1: 0.01s
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、3つのテーブルのデータ量を確認し、テーブル `test.tbl_ttl_2` については列 `cState` の値が `1` のデータ行数、つまり有効期限が1分のデータのみを確認します。注意：出力結果は異なる場合があります。

  ```sql
  SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  ```

  ```output
  mysql> SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  +----------+
  | COUNT(*) |
  +----------+
  |     1000 |
  +----------+
  1 row in set (0.00 sec)

  +----------+
  | COUNT(*) |
  +----------+
  |      505 |
  +----------+
  1 row in set (0.01 sec)

  +----------+
  | COUNT(*) |
  +----------+
  |     1000 |
  +----------+
  1 row in set (0.00 sec)
  ```

### 手順 3. テーブルのTTL属性の設定

+ [ターミナル 1](ssh://monitor1-ssh#1) で、システムテーブル `information_schema.tables` と `mysql.tidb_ttl_table_status` を使用して、現在のTTLタスクの情報を確認します。`mysql.tidb_ttl_table_status` テーブルには、すべてのTTLテーブルの最後の実行と現在実行中のTTLタスクに関する情報が含まれています。

  ```sql
  SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  ```

  ```output
  mysql> SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  *************************** 1. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_2
                        table_id: 112
                parent_table_id: 112
                table_statistics: NULL
                    last_job_id: NULL
            last_job_start_time: NULL
            last_job_finish_time: NULL
            last_job_ttl_expire: NULL
                last_job_summary: NULL
                  current_job_id: 1ab86f3817964e41a0ef90209a57b23a
            current_job_owner_id: 84823e1f-e42a-4dc8-bc6e-e4fdaf2ba114
          current_job_owner_addr: NULL
      current_job_owner_hb_time: 2025-09-07 10:36:40
          current_job_start_time: 2025-09-07 10:33:14
          current_job_ttl_expire: 2025-09-07 10:33:14
              current_job_state: NULL
              current_job_status: running
  current_job_status_update_time: 2025-09-07 10:33:14
  1 row in set (0.02 sec)
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、初めて実行した際には、1つのテーブルの情報のみが出力されることがありますが、何度か繰り返し実行すると2つのテーブルの情報が表示されるようになります。注意点として、テーブル `test.tbl_ttl_3` はTTL属性が設定されていないため、現在出力結果には含まれません。

  ```sql
  SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  ```

  ```output
  mysql> SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  *************************** 1. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_1
                        table_id: 110
                parent_table_id: 110
                table_statistics: NULL
                    last_job_id: NULL
            last_job_start_time: NULL
            last_job_finish_time: NULL
            last_job_ttl_expire: NULL
                last_job_summary: NULL
                  current_job_id: 9e46c3c8dc3c4be8992a9d4cb856363a
            current_job_owner_id: 84823e1f-e42a-4dc8-bc6e-e4fdaf2ba114
          current_job_owner_addr: NULL
      current_job_owner_hb_time: 2025-09-07 10:37:20
          current_job_start_time: 2025-09-07 10:37:18
          current_job_ttl_expire: 2025-09-07 10:36:18
              current_job_state: NULL
              current_job_status: running
  current_job_status_update_time: 2025-09-07 10:37:18
  *************************** 2. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_2
                        table_id: 112
                parent_table_id: 112
                table_statistics: NULL
                    last_job_id: NULL
            last_job_start_time: NULL
            last_job_finish_time: NULL
            last_job_ttl_expire: NULL
                last_job_summary: NULL
                  current_job_id: 1ab86f3817964e41a0ef90209a57b23a
            current_job_owner_id: 84823e1f-e42a-4dc8-bc6e-e4fdaf2ba114
          current_job_owner_addr: NULL
      current_job_owner_hb_time: 2025-09-07 10:37:20
          current_job_start_time: 2025-09-07 10:33:14
          current_job_ttl_expire: 2025-09-07 10:33:14
              current_job_state: NULL
              current_job_status: running
  current_job_status_update_time: 2025-09-07 10:33:14
  2 rows in set (0.02 sec)
  ```

  + [ターミナル 1](ssh://monitor1-ssh#1) で、テーブル `test.tbl_ttl_1` とテーブル `test.tbl_ttl_2` のDDL文を確認すると、TTL属性の `TTL_JOB_INTERVAL` の値はデフォルトで `1h` となっており、これはTTLのバックグラウンドクリーニングタスクが1時間ごとに実行されることを示しています。

  ```sql
  SHOW CREATE TABLE test.tbl_ttl_1\G
  SHOW CREATE TABLE test.tbl_ttl_2\G
  ```

  ```output
  mysql> SHOW CREATE TABLE test.tbl_ttl_1\G
  *************************** 1. row ***************************
        Table: tbl_ttl_1
  Create Table: CREATE TABLE `tbl_ttl_1` (
    `ID` bigint NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,
    `pState` varchar(100) NOT NULL,
    `cState` tinyint DEFAULT NULL,
    `created_at` datetime DEFAULT NULL,
    `updated_at` datetime DEFAULT NULL,
    `txt` varchar(64) DEFAULT 'TTLTEST',
    PRIMARY KEY (`ID`) /*T![clustered_index] CLUSTERED */,
    KEY `pcStateIndex` (`pState`,`cState`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_rand_base] AUTO_RANDOM_BASE=30001 */ /*T! PRE_SPLIT_REGIONS=4 */ /*T![ttl] TTL=`created_at` + INTERVAL 1 MINUTE */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */
  1 row in set (0.00 sec)

  mysql> SHOW CREATE TABLE test.tbl_ttl_2\G
  *************************** 1. row ***************************
        Table: tbl_ttl_2
  Create Table: CREATE TABLE `tbl_ttl_2` (
    `ID` bigint NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,
    `pState` varchar(100) NOT NULL,
    `cState` tinyint DEFAULT NULL,
    `created_at` datetime DEFAULT NULL,
    `updated_at` datetime DEFAULT NULL,
    `expire_at` datetime GENERATED ALWAYS AS (if(`cState` = 1, date_add(`created_at`, interval 1 minute), date_add(`created_at`, interval 2 day))) VIRTUAL,
    `txt` varchar(64) DEFAULT 'TTLTEST',
    PRIMARY KEY (`ID`) /*T![clustered_index] CLUSTERED */,
    KEY `pcStateIndex` (`pState`,`cState`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_rand_base] AUTO_RANDOM_BASE=30001 */ /*T! PRE_SPLIT_REGIONS=4 */ /*T![ttl] TTL=`expire_at` + INTERVAL 0 MINUTE */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */
  1 row in set (0.00 sec)
  ```

  + [ターミナル 1](ssh://monitor1-ssh#1) で、以下のコマンドを使用して、TTLのバックグラウンドクリーニングタスクを1分ごとに実行するように設定します。テーブル `test.tbl_ttl_3` については、TTL設定が有効になっていないため、コマンドは失敗します。

  ```sql
  ALTER TABLE test.tbl_ttl_1 TTL_JOB_INTERVAL = '1m';
  ALTER TABLE test.tbl_ttl_2 TTL_JOB_INTERVAL = '1m';
  ALTER TABLE test.tbl_ttl_3 TTL_JOB_INTERVAL = '1m';
  ```

  ```output
  mysql> ALTER TABLE test.tbl_ttl_1 TTL_JOB_INTERVAL = '1m';
  Query OK, 0 rows affected (0.06 sec)

  mysql> ALTER TABLE test.tbl_ttl_2 TTL_JOB_INTERVAL = '1m';
  Query OK, 0 rows affected (0.06 sec)

  mysql> ALTER TABLE test.tbl_ttl_3 TTL_JOB_INTERVAL = '1m';
  ERROR 8150 (HY000): Cannot set TTL_JOB_INTERVAL on a table without TTL config
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、3つのテーブルのデータ量を確認し、テーブル `test.tbl_ttl_2` については列 `cstate` の値が `1` のデータ行数、つまり有効期限が `created_at` 列の値に1分を加えたデータのみを確認します。TTLのバックグラウンドでの実行タイミングが異なるため、出力結果が以下の結果と異なる可能性がありますが、テーブル `test.tbl_ttl_1` とテーブル `test.tbl_ttl_2` のデータがTTLによってクリーニングされ始めたことが確認できます。

  ```sql
  SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  ```

  ```output
  mysql> SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  +----------+
  | COUNT(*) |
  +----------+
  |      699 |
  +----------+
  1 row in set (0.00 sec)

  +----------+
  | COUNT(*) |
  +----------+
  |      289 |
  +----------+
  1 row in set (0.00 sec)

  +----------+
  | COUNT(*) |
  +----------+
  |     1000 |
  +----------+
  1 row in set (0.00 sec)
  ```

+ 1分後に再度同じクエリを実行すると、テーブルのデータ量が再び減少していることが確認でき、TTLタスクが実行されていることが示されます。TTLのバックグラウンドでの実行タイミングが異なるため、出力結果が以下の結果と異なる可能性がありますが、テーブル `test.tbl_ttl_1` とテーブル `test.tbl_ttl_2` のデータがTTLによってクリーニングされ始めたことが確認できます。

  ```sql
  SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  ```

  ```output
  mysql> SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  +----------+
  | COUNT(*) |
  +----------+
  |      510 |
  +----------+
  1 row in set (0.01 sec)

  +----------+
  | COUNT(*) |
  +----------+
  |      191 |
  +----------+
  1 row in set (0.00 sec)

  +----------+
  | COUNT(*) |
  +----------+
  |     1000 |
  +----------+
  1 row in set (0.00 sec)
  ```

### 手順 4. テーブルにTTL属性を追加します

+ [ターミナル 1](ssh://monitor1-ssh#1) で、テーブル `test.tbl_ttl_3` にTTL属性を設定し、データの有効期限を `created_at` 列の値に1分を加えたものとし、TTLのバックグラウンドクリーニングタスクを1分ごとに実行するように設定します。

  ```sql
  ALTER TABLE test.tbl_ttl_3 TTL = `created_at` + INTERVAL 1 MINUTE;
  ALTER TABLE test.tbl_ttl_3 TTL_JOB_INTERVAL = '1m';
  ```

  ```output
  mysql> ALTER TABLE test.tbl_ttl_3 TTL = `created_at` + INTERVAL 1 MINUTE;
  Query OK, 0 rows affected (0.06 sec)
  mysql> ALTER TABLE test.tbl_ttl_3 TTL_JOB_INTERVAL = '1m';
  Query OK, 0 rows affected (0.52 sec)
  ```

### 手順 5. テーブルに定期的にデータを挿入します

+ [ターミナル 2](ssh://monitor1-ssh#2) で、tiup benchツールを使用して、テーブル `tbl_ttl_1`、`tbl_ttl_2`、および `tbl_ttl_3` に定期的に1行のランダムデータを挿入します。各周期の間隔は1秒で、合計3600回実行します。

  ```bash
  cat > tbl_ttl_insert_2.sql <<EOF
  INSERT INTO test.tbl_ttl_1 (pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  INSERT INTO test.tbl_ttl_2(pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  INSERT INTO test.tbl_ttl_3 (pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  SELECT SLEEP(1);
  EOF
  export PATH="$PATH:/home/ec2-user/.tiup/bin"
  tiup bench rawsql run -H ${HOST_DB1_PRIVATE_IP} -P 4000 --count 3600 --threads 1 --query-files tbl_ttl_insert_2.sql
  ```

  ```output
  [ec2-user@ip-10-90-4-151 ~]$ cat > tbl_ttl_insert_2.sql <<EOF
  > INSERT INTO test.tbl_ttl_1 (pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  > INSERT INTO test.tbl_ttl_2(pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  > INSERT INTO test.tbl_ttl_3 (pState, cState, created_at, updated_at) VALUES (ELT(1 + FLOOR(RAND() * 9), 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's0'), 1 + FLOOR(RAND() * 2), NOW(), NOW());
  > SELECT SLEEP(1);
  > EOF
  [ec2-user@ip-10-90-4-151 ~]$ export PATH="$PATH:/home/ec2-user/.tiup/bin"
  [ec2-user@ip-10-90-4-151 ~]$ tiup bench rawsql run -H ${HOST_DB1_PRIVATE_IP} -P 4000 --count 3600 --threads 1 --query-files tbl_ttl_insert_2.sql
  Starting component bench: /home/ec2-user/.tiup/components/bench/v1.12.0/tiup-bench rawsql run -H 10.90.2.64 -P 4000 --count 3600 --threads 1 --query-files tbl_ttl_insert_2.sql
  [Current] TBL_TTL_INSERT_2: 1.01s
  [Current] TBL_TTL_INSERT_2: 1.01s
  [Current] TBL_TTL_INSERT_2: 1.01s
  [Current] TBL_TTL_INSERT_2: 1.01s
  ...
  ```

[ターミナル 1](ssh://monitor1-ssh#1) で、3つのテーブルのデータ量を確認し、テーブル `test.tbl_ttl_2` については列 `cstate` の値が `1` のデータ行数、つまり有効期限が `created_at` 列の値に1分を加えたデータのみを確認します。データ量が増加し始めることがわかります。

  ```sql
  SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  ```

  ```output
  mysql> SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  +----------+
  | COUNT(*) |
  +----------+
  |      220 |
  +----------+
  1 row in set (0.01 sec)

  +----------+
  | COUNT(*) |
  +----------+
  |      118 |
  +----------+
  1 row in set (0.00 sec)

  +----------+
  | COUNT(*) |
  +----------+
  |      220 |
  +----------+
  1 row in set (0.00 sec)
  ```

### 手順 6. TiDBのTTL属性の無効化と有効化

+ [ターミナル 1](ssh://monitor1-ssh#1) で、グローバル変数 `tidb_ttl_job_enable` を `OFF` に設定します。

  ```sql
  SHOW GLOBAL VARIABLES LIKE 'tidb_ttl_job_enable';
  SET GLOBAL tidb_ttl_job_enable='OFF';
  SHOW GLOBAL VARIABLES LIKE 'tidb_ttl_job_enable';
  ```

  ```output
  mysql> SHOW GLOBAL VARIABLES LIKE 'tidb_ttl_job_enable';
  +---------------------+-------+
  | Variable_name       | Value |
  +---------------------+-------+
  | tidb_ttl_job_enable | ON    |
  +---------------------+-------+
  1 row in set (0.00 sec)

  mysql> SET GLOBAL tidb_ttl_job_enable='OFF';
  Query OK, 0 rows affected (0.02 sec)

  mysql> SHOW GLOBAL VARIABLES LIKE 'tidb_ttl_job_enable';
  +---------------------+-------+
  | Variable_name       | Value |
  +---------------------+-------+
  | tidb_ttl_job_enable | OFF   |
  +---------------------+-------+
  1 row in set (0.00 sec)
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、システムテーブル `information_schema.tables` と `mysql.tidb_ttl_table_status` を使用して、現在のTTLタスクの情報を確認します。3つのテーブルにはTTLタスクが実行されていないことがわかります。

  ```sql
  SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  ```

  ```output
  mysql> SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  *************************** 1. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_1
                        table_id: 110
                parent_table_id: 110
                table_statistics: NULL
                    last_job_id: 85188517dd1342cb980eab52b9a77475
            last_job_start_time: 2025-09-07 10:51:01
            last_job_finish_time: 2025-09-07 10:53:10
            last_job_ttl_expire: 2025-09-07 10:50:01
                last_job_summary: {"total_rows":0,"success_rows":0,"error_rows":0,"total_scan_task":16,"scheduled_scan_task":16,"finished_scan_task":16}
                  current_job_id: NULL
            current_job_owner_id: NULL
          current_job_owner_addr: NULL
      current_job_owner_hb_time: NULL
          current_job_start_time: NULL
          current_job_ttl_expire: NULL
              current_job_state: NULL
              current_job_status: NULL
  current_job_status_update_time: NULL
  *************************** 2. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_2
                        table_id: 112
                parent_table_id: 112
                table_statistics: NULL
                    last_job_id: a25399e2b753437b8987c2ea5c1a6369
            last_job_start_time: 2025-09-07 10:53:02
            last_job_finish_time: 2025-09-07 10:55:19
            last_job_ttl_expire: 2025-09-07 10:53:02
                last_job_summary: {"total_rows":0,"success_rows":0,"error_rows":0,"total_scan_task":0,"scheduled_scan_task":0,"finished_scan_task":0,"scan_task_err":"tidb_ttl_job_enable turned off"}
                  current_job_id: NULL
            current_job_owner_id: NULL
          current_job_owner_addr: NULL
      current_job_owner_hb_time: NULL
          current_job_start_time: NULL
          current_job_ttl_expire: NULL
              current_job_state: NULL
              current_job_status: NULL
  current_job_status_update_time: NULL
  *************************** 3. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_3
                        table_id: 114
                parent_table_id: 114
                table_statistics: NULL
                    last_job_id: 22b7914f44ca4243b09e97e18cbb80d0
            last_job_start_time: 2025-09-07 10:47:57
            last_job_finish_time: 2025-09-07 10:51:10
            last_job_ttl_expire: 2025-09-07 10:46:57
                last_job_summary: {"total_rows":1000,"success_rows":1000,"error_rows":0,"total_scan_task":16,"scheduled_scan_task":16,"finished_scan_task":16}
                  current_job_id: NULL
            current_job_owner_id: NULL
          current_job_owner_addr: NULL
      current_job_owner_hb_time: NULL
          current_job_start_time: NULL
          current_job_ttl_expire: NULL
              current_job_state: NULL
              current_job_status: NULL
  current_job_status_update_time: NULL
  3 rows in set (0.02 sec)
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、グローバル変数 `tidb_ttl_job_enable` を `ON` に設定します。

  ```sql
  SHOW GLOBAL VARIABLES LIKE 'tidb_ttl_job_enable';
  SET GLOBAL tidb_ttl_job_enable='ON';
  SHOW GLOBAL VARIABLES LIKE 'tidb_ttl_job_enable';
  ```

  ```output
  mysql> SHOW GLOBAL VARIABLES LIKE 'tidb_ttl_job_enable';
  +---------------------+-------+
  | Variable_name       | Value |
  +---------------------+-------+
  | tidb_ttl_job_enable | OFF   |
  +---------------------+-------+
  1 row in set (0.00 sec)

  mysql> SET GLOBAL tidb_ttl_job_enable='ON';
  Query OK, 0 rows affected (0.01 sec)

  mysql> SHOW GLOBAL VARIABLES LIKE 'tidb_ttl_job_enable';
  +---------------------+-------+
  | Variable_name       | Value |
  +---------------------+-------+
  | tidb_ttl_job_enable | ON    |
  +---------------------+-------+
  1 row in set (0.00 sec)
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、再度、システムテーブル `information_schema.tables` と `mysql.tidb_ttl_table_status` を使用して、現在のTTLタスクの情報を確認します。何度か繰り返し実行すると、TTLタスクがテーブル上で再び実行され始めたことが確認できます。注：期待どおりの結果が出るまで3～5分かかる場合がありますので、しばらくお待ちください。または、以下の操作を続行することもできます。これは以降の手順に影響しません。

  ```sql
  SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  ```

  ```output
  mysql> SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  *************************** 1. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_1
                        table_id: 110
                parent_table_id: 110
                table_statistics: NULL
                    last_job_id: 85188517dd1342cb980eab52b9a77475
            last_job_start_time: 2025-09-07 10:51:01
            last_job_finish_time: 2025-09-07 10:53:10
            last_job_ttl_expire: 2025-09-07 10:50:01
                last_job_summary: {"total_rows":0,"success_rows":0,"error_rows":0,"total_scan_task":16,"scheduled_scan_task":16,"finished_scan_task":16}
                  current_job_id: NULL
            current_job_owner_id: NULL
          current_job_owner_addr: NULL
      current_job_owner_hb_time: NULL
          current_job_start_time: NULL
          current_job_ttl_expire: NULL
              current_job_state: NULL
              current_job_status: NULL
  current_job_status_update_time: NULL
  *************************** 2. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_2
                        table_id: 112
                parent_table_id: 112
                table_statistics: NULL
                    last_job_id: a25399e2b753437b8987c2ea5c1a6369
            last_job_start_time: 2025-09-07 10:53:02
            last_job_finish_time: 2025-09-07 10:55:19
            last_job_ttl_expire: 2025-09-07 10:53:02
                last_job_summary: {"total_rows":0,"success_rows":0,"error_rows":0,"total_scan_task":0,"scheduled_scan_task":0,"finished_scan_task":0,"scan_task_err":"tidb_ttl_job_enable turned off"}
                  current_job_id: NULL
            current_job_owner_id: NULL
          current_job_owner_addr: NULL
      current_job_owner_hb_time: NULL
          current_job_start_time: NULL
          current_job_ttl_expire: NULL
              current_job_state: NULL
              current_job_status: NULL
  current_job_status_update_time: NULL
  *************************** 3. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_3
                        table_id: 114
                parent_table_id: 114
                table_statistics: NULL
                    last_job_id: 22b7914f44ca4243b09e97e18cbb80d0
            last_job_start_time: 2025-09-07 10:47:57
            last_job_finish_time: 2025-09-07 10:51:10
            last_job_ttl_expire: 2025-09-07 10:46:57
                last_job_summary: {"total_rows":1000,"success_rows":1000,"error_rows":0,"total_scan_task":16,"scheduled_scan_task":16,"finished_scan_task":16}
                  current_job_id: 2722bcbe1fe544839ccaa6c1d31d7e10
            current_job_owner_id: 84823e1f-e42a-4dc8-bc6e-e4fdaf2ba114
          current_job_owner_addr: NULL
      current_job_owner_hb_time: 2025-09-07 11:02:50
          current_job_start_time: 2025-09-07 11:01:18
          current_job_ttl_expire: 2025-09-07 11:00:18
              current_job_state: NULL
              current_job_status: running
  current_job_status_update_time: 2025-09-07 11:01:18
  3 rows in set (0.02 sec)
  ```

### 手順 7. テーブルのTTL属性の無効化と有効化

+ [ターミナル 1](ssh://monitor1-ssh#1) で、テーブル `test.tbl_ttl_2` とテーブル `test.tbl_ttl_3` の TTL_ENABLE 属性を `OFF` に設定し、テーブル `test.tbl_ttl_1` のすべてのTTL属性を削除します。

  ```sql
  ALTER TABLE test.tbl_ttl_2 TTL_ENABLE = 'OFF';
  ALTER TABLE test.tbl_ttl_3 TTL_ENABLE = 'OFF';
  ALTER TABLE test.tbl_ttl_1 REMOVE TTL;
  ```

  ```output
  mysql> ALTER TABLE test.tbl_ttl_2 TTL_ENABLE = 'OFF';
  Query OK, 0 rows affected (0.06 sec)

  mysql> ALTER TABLE test.tbl_ttl_3 TTL_ENABLE = 'OFF';
  Query OK, 0 rows affected (0.06 sec)

  mysql> ALTER TABLE test.tbl_ttl_1 REMOVE TTL;
  Query OK, 0 rows affected (0.07 sec)
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、システムテーブル `information_schema.tables` と `mysql.tidb_ttl_table_status` を使用して、現在のTTLタスクの情報を確認します。何度か繰り返し実行すると、結果が空であることがわかります。注：期待どおりの結果が出るまで3～5分かかる場合がありますので、しばらくお待ちください。または、以下の操作を続行することもできます。これは以降の手順に影響しません。

  ```sql
  SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  ```

  ```output
  mysql> SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  *************************** 1. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_1
                        table_id: 116
                parent_table_id: 116
                table_statistics: NULL
                    last_job_id: 2b6d5038ff0547f3a3fc757c3249fdce
            last_job_start_time: 2025-09-07 06:21:27
            last_job_finish_time: 2025-09-07 06:22:28
            last_job_ttl_expire: 2025-09-07 06:20:27
                last_job_summary: {"total_rows":0,"success_rows":0,"error_rows":0,"total_scan_task":0,"scheduled_scan_task":0,"finished_scan_task":0,"scan_task_err":"TTL table has been removed or the TTL on this table has been stopped"}
                  current_job_id: NULL
            current_job_owner_id: NULL
          current_job_owner_addr: NULL
      current_job_owner_hb_time: NULL
          current_job_start_time: NULL
          current_job_ttl_expire: NULL
              current_job_state: NULL
              current_job_status: NULL
  current_job_status_update_time: NULL
  *************************** 2. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_2
                        table_id: 118
                parent_table_id: 118
                table_statistics: NULL
                    last_job_id: f37814e4203846d0b6529041dd3457d3
            last_job_start_time: 2025-09-07 05:56:43
            last_job_finish_time: 2025-09-07 06:00:09
            last_job_ttl_expire: 2025-09-07 05:56:43
                last_job_summary: {"total_rows":0,"success_rows":0,"error_rows":0,"total_scan_task":16,"scheduled_scan_task":16,"finished_scan_task":16}
                  current_job_id: NULL
            current_job_owner_id: NULL
          current_job_owner_addr: NULL
      current_job_owner_hb_time: NULL
          current_job_start_time: NULL
          current_job_ttl_expire: NULL
              current_job_state: NULL
              current_job_status: NULL
  current_job_status_update_time: NULL
  *************************** 3. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_3
                        table_id: 120
                parent_table_id: 120
                table_statistics: NULL
                    last_job_id: 2daa646b1eed4c49a101a4d3df1515a1
            last_job_start_time: 2025-09-07 06:19:03
            last_job_finish_time: 2025-09-07 06:21:19
            last_job_ttl_expire: 2025-09-07 06:18:03
                last_job_summary: {"total_rows":0,"success_rows":0,"error_rows":0,"total_scan_task":0,"scheduled_scan_task":0,"finished_scan_task":0,"scan_task_err":"TTL table has been removed or the TTL on this table has been stopped"}
                  current_job_id: NULL
            current_job_owner_id: NULL
          current_job_owner_addr: NULL
      current_job_owner_hb_time: NULL
          current_job_start_time: NULL
          current_job_ttl_expire: NULL
              current_job_state: NULL
              current_job_status: NULL
  current_job_status_update_time: NULL
  3 rows in set (0.02 sec)
  ```

+ 3～5分後に再度クエリを実行すると、結果が空であることが確認できます。

  ```sql
  SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  ```

  ```output
  mysql> SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  Empty set (0.02 sec)
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、テーブル `test.tbl_ttl_1`、テーブル `test.tbl_ttl_2`、およびテーブル `test.tbl_ttl_3` の TTL_ENABLE 属性を `ON` に設定します。テーブル `test.tbl_ttl_1` の設定コマンドが失敗することがわかります。これは、そのテーブルのTTL属性がすべて削除されているためです。

  ```sql
  ALTER TABLE test.tbl_ttl_2 TTL_ENABLE = 'ON';
  ALTER TABLE test.tbl_ttl_3 TTL_ENABLE = 'ON';
  ALTER TABLE test.tbl_ttl_1 TTL_ENABLE = 'ON';
  ```

  ```output
  mysql> ALTER TABLE test.tbl_ttl_2 TTL_ENABLE = 'ON';
  Query OK, 0 rows affected (0.51 sec)

  mysql> ALTER TABLE test.tbl_ttl_3 TTL_ENABLE = 'ON';
  Query OK, 0 rows affected (0.51 sec)

  mysql> ALTER TABLE test.tbl_ttl_1 TTL_ENABLE = 'ON';
  ERROR 8150 (HY000): Cannot set TTL_ENABLE on a table without TTL config
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、システムテーブル `information_schema.tables` と `mysql.tidb_ttl_table_status` を使用して、現在のTTLタスクの情報を確認します。何度か繰り返し実行すると、TTLタスクがテーブル `test.tbl_ttl_2` とテーブル `test.tbl_ttl_3` で再び実行され始めたことが確認できます。注：期待どおりの結果が出るまで3～5分かかる場合がありますので、しばらくお待ちください。または、以下の操作を続行することもできます。これは以降の手順に影響しません。

  ```sql
  SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  ```

  ```output
  mysql> SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  *************************** 1. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_2
                        table_id: 118
                parent_table_id: 118
                table_statistics: NULL
                    last_job_id: aef75a31eb844b70862d37abe1445837
            last_job_start_time: 2025-09-07 06:46:34
            last_job_finish_time: 2025-09-07 06:46:39
            last_job_ttl_expire: 2025-09-07 06:46:34
                last_job_summary: {"total_rows":0,"success_rows":0,"error_rows":0,"total_scan_task":1,"scheduled_scan_task":1,"finished_scan_task":1}
                  current_job_id: NULL
            current_job_owner_id: NULL
          current_job_owner_addr: NULL
      current_job_owner_hb_time: NULL
          current_job_start_time: NULL
          current_job_ttl_expire: NULL
              current_job_state: NULL
              current_job_status: NULL
  current_job_status_update_time: NULL
  *************************** 2. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_3
                        table_id: 120
                parent_table_id: 120
                table_statistics: NULL
                    last_job_id: c3b0bda2789c4c2580e8a4a1c29b3f46
            last_job_start_time: 2025-09-07 06:45:55
            last_job_finish_time: 2025-09-07 06:46:09
            last_job_ttl_expire: 2025-09-07 06:44:55
                last_job_summary: {"total_rows":0,"success_rows":0,"error_rows":0,"total_scan_task":1,"scheduled_scan_task":1,"finished_scan_task":1}
                  current_job_id: be5877fc6b724882aef1ebd289f29545
            current_job_owner_id: 52b4aed5-367c-45d9-b421-29b9772061d1
          current_job_owner_addr: NULL
      current_job_owner_hb_time: 2025-09-07 06:46:59
          current_job_start_time: 2025-09-07 06:46:55
          current_job_ttl_expire: 2025-09-07 06:45:55
              current_job_state: NULL
              current_job_status: running
  current_job_status_update_time: 2025-09-07 06:46:55
  2 rows in set (0.02 sec)
  ```

### 手順 8. FLASHBACK TABLEがテーブルのTTL属性に与える影響の確認

+ [ターミナル 1](ssh://monitor1-ssh#1) で、まず、テーブル `test.tbl_ttl_2` を削除して実行します。次に、テーブル `test.tbl_ttl_1`、テーブル `test.tbl_ttl_2`、およびテーブル `test.tbl_ttl_3` のデータ量を確認するコマンドを実行します。その結果から、テーブル `test.tbl_ttl_2` が既に存在しないことがわかります。

  ```sql
  DROP TABLE test.tbl_ttl_2;
  SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  ```

  ```output
  mysql> DROP TABLE test.tbl_ttl_2;
  Query OK, 0 rows affected (0.51 sec)
  mysql> SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  +----------+
  | COUNT(*) |
  +----------+
  |     3581 |
  +----------+
  1 row in set (0.01 sec)

  ERROR 1146 (42S02): Table 'test.tbl_ttl_2' doesn't exist
  +----------+
  | COUNT(*) |
  +----------+
  |      172 |
  +----------+
  1 row in set (0.01 sec)
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、削除したばかりのテーブル `test.tbl_ttl_2` に対して、FLASHBACK TABLE コマンドを実行します。

  ```sql
  FLASHBACK TABLE test.tbl_ttl_2;
  ```

  ```output
  mysql> FLASHBACK TABLE test.tbl_ttl_2;
  Query OK, 0 rows affected (0.52 sec)
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、再度、3つのテーブルのデータ量を確認し、テーブル `test.tbl_ttl_2` については、列 `cstate` の値が `1` のデータ行数、つまり有効期限が `created_at` 列の値に1分を加えたデータのみを確認します。テーブル `test.tbl_ttl_2` が復元されたことが確認できます。

  ```sql
  SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  ```

  ```output
  mysql> SELECT COUNT(*) FROM test.tbl_ttl_1;SELECT COUNT(*) FROM test.tbl_ttl_2 WHERE cState=1;SELECT COUNT(*) FROM test.tbl_ttl_3;
  +----------+
  | COUNT(*) |
  +----------+
  |     3581 |
  +----------+
  1 row in set (0.01 sec)

  +----------+
  | COUNT(*) |
  +----------+
  |      101 |
  +----------+
  1 row in set (0.01 sec)

  +----------+
  | COUNT(*) |
  +----------+
  |       54 |
  +----------+
  1 row in set (0.01 sec)
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、テーブル `test.tbl_ttl_2` の定義を確認すると、FLASHBACK TABLE 後にTTL属性のTTL_ENABLEの値が 'OFF' となっており、このテーブルのTTL属性が自動的に無効化されたことがわかります。

  ```sql
  SHOW CREATE TABLE test.tbl_ttl_2\G
  ```

  ```output
  mysql> SHOW CREATE TABLE test.tbl_ttl_2\G
  *************************** 1. row ***************************
        Table: tbl_ttl_2
  Create Table: CREATE TABLE `tbl_ttl_2` (
    `ID` bigint NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,
    `pState` varchar(100) NOT NULL,
    `cState` tinyint DEFAULT NULL,
    `created_at` datetime DEFAULT NULL,
    `updated_at` datetime DEFAULT NULL,
    `expire_at` datetime GENERATED ALWAYS AS (if(`cState` = 1, date_add(`created_at`, interval 1 minute), date_add(`created_at`, interval 2 day))) VIRTUAL,
    `txt` varchar(64) DEFAULT 'TTLTEST',
    PRIMARY KEY (`ID`) /*T![clustered_index] CLUSTERED */,
    KEY `pcStateIndex` (`pState`,`cState`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_rand_base] AUTO_RANDOM_BASE=30001 */ /*T! PRE_SPLIT_REGIONS=4 */ /*T![ttl] TTL=`expire_at` + INTERVAL 0 MINUTE */ /*T![ttl] TTL_ENABLE='OFF' */ /*T![ttl] TTL_JOB_INTERVAL='1m' */
  1 row in set (0.01 sec)
  ```

+ [ターミナル 1](ssh://monitor1-ssh#1) で、システムテーブル `information_schema.tables` と `mysql.tidb_ttl_table_status` を使用して、現在のTTLタスクの情報を確認します。何度か繰り返し実行すると、テーブル `test.tbl_ttl_3` のみでTTLタスクが実行されていることが確認できます。注：期待どおりの結果が出るまで3～5分かかる場合がありますので、しばらくお待ちください。または、以下の操作を続行することもできます。これは以降の手順に影響しません。

  ```sql
  SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  ```

  ```output
  mysql> SELECT A.TABLE_SCHEMA, A.TABLE_NAME, B.* FROM information_schema.tables A, mysql.tidb_ttl_table_status B WHERE A.tidb_table_ID=B.table_id\G
  *************************** 1. row ***************************
                    TABLE_SCHEMA: test
                      TABLE_NAME: tbl_ttl_3
                        table_id: 120
                parent_table_id: 120
                table_statistics: NULL
                    last_job_id: e0b4af3e300841758dfa3f470dafad18
            last_job_start_time: 2025-09-07 06:54:55
            last_job_finish_time: 2025-09-07 06:55:09
            last_job_ttl_expire: 2025-09-07 06:53:55
                last_job_summary: {"total_rows":0,"success_rows":0,"error_rows":0,"total_scan_task":1,"scheduled_scan_task":1,"finished_scan_task":1}
                  current_job_id: NULL
            current_job_owner_id: NULL
          current_job_owner_addr: NULL
      current_job_owner_hb_time: NULL
          current_job_start_time: NULL
          current_job_ttl_expire: NULL
              current_job_state: NULL
              current_job_status: NULL
  current_job_status_update_time: NULL
  1 row in set (0.02 sec)
  ```

### 手順 9. データのクリーンアップ

+ [ターミナル 1](ssh://monitor1-ssh#1) で、`test` 下のテーブル `tbl_ttl_1`、`tbl_ttl_2`、および `tbl_ttl_3` を削除します。

  ```sql
  DROP TABLE test.tbl_ttl_1;
  DROP TABLE test.tbl_ttl_2;
  DROP TABLE test.tbl_ttl_3;
  ```

  ```output
  mysql> DROP TABLE test.tbl_ttl_1;
  Query OK, 0 rows affected (0.52 sec)

  mysql> DROP TABLE test.tbl_ttl_2;
  Query OK, 0 rows affected (0.52 sec)

  mysql> DROP TABLE test.tbl_ttl_3;
  Query OK, 0 rows affected (0.51 sec)
  ```

+ 本モジュールはここで終了します。
