tidb表自动删除数据问题

创建表,保留一个月数据,一个小时候,数据都没有了,即没到期的数据也删除了!!!


image
一个小时候查,应该只删除一条过去数据,现在2条都没了
image

我有往表中插入2条数据,一条是一个月内,一条是一个月之前,1个小时候看数据自动删除情况

可以先看看mysql.tidb_ttl_job_history表信息怎么记录的

能把你测试的sql,完整发下吗?我在我的环境下面测试测试

这是测试语句
CREATE TABLE t3 (
id int(11) NOT NULL,
created_at datetime DEFAULT NULL,
PRIMARY KEY (id)
) TTL=created_at + INTERVAL 1 MONTH TTL_ENABLE=‘ON’

insert into t3 values(3,‘2023-07-06 11:11:11’);
insert into t3 values(4,‘2023-05-06 11:11:11’);

一个小时后,查数据,所有数据自动删除了

很像bug 我测测

不会是数据类型的问题吧。

https://docs.pingcap.com/zh/tidb/stable/time-to-live#创建具有-ttl-属性的表

文档中的created_at都是时间戳TIMESTAMP,而你的建表语句里面是个datetime。
换成TIMESTAMP试试看。

这个是可以重复复现么?看 history 表里面所有的执行的任务的 expired_rows 都是 0,代表着任务执行过程中没有删除数据

1 个赞

随时重现,不知道在6.5.3版本是否有类似情况

datetime是很常用的类型,我们业务时间类型都是用这个类型

确实,而且时间戳还有2038年的问题。
用这个类型没错。
不过,和文档对不上也是事实啊。
可能真的是个bug。
没有对datetime类型做支持。
可以去github提个issue。

Datetime 类型应该是支持的,只是文档里没有这样的例子 :thinking:

1 个赞

出问题的版本是?另外如果把 ttl_job_interval 设置短一点也能复现么?我本地测了下只删除了一条

1 个赞

如果能重现的话可以先把 tidb_gc_run_interval 调大,比如 24h,然后重现后执行 curl http://{tidbhost}:10080/mvcc/key/test/t3/3 去看下被删除的那行纪录的 mvcc 信息,看看是否能和 ttl job 的执行时间匹配

1 个赞

2

CREATE TABLE `t3` (
  `id` int(11) NOT NULL,
  `created_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![ttl] TTL=`created_at` + INTERVAL 1 MONTH */ /*T![ttl] TTL_ENABLE='ON' */ /*T![ttl] TTL_JOB_INTERVAL='1h' */

没有复现。

我的tidb版本:
Release Version: v7.1.0
Edition: Community
Git Commit Hash: 635a4362235e8a3c0043542e629532e3c7bb2756
Git Branch: heads/refs/tags/v7.1.0
UTC Build Time: 2023-05-30 10:58:57
GoVersion: go1.20.3
Race Enabled: false
TiKV Min Version: 6.2.0-alpha
Check Table Before Drop: false
Store: tikv

本地测试无法重现

1 个赞

我也没测出来

看下被删的日志