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

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

可以先看看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,代表着任务执行过程中没有删除数据
随时重现,不知道在6.5.3版本是否有类似情况
datetime是很常用的类型,我们业务时间类型都是用这个类型
确实,而且时间戳还有2038年的问题。
用这个类型没错。
不过,和文档对不上也是事实啊。
可能真的是个bug。
没有对datetime类型做支持。
可以去github提个issue。
Datetime
类型应该是支持的,只是文档里没有这样的例子
出问题的版本是?另外如果把 ttl_job_interval 设置短一点也能复现么?我本地测了下只删除了一条
如果能重现的话可以先把 tidb_gc_run_interval
调大,比如 24h,然后重现后执行 curl http://{tidbhost}:10080/mvcc/key/test/t3/3
去看下被删除的那行纪录的 mvcc 信息,看看是否能和 ttl job 的执行时间匹配
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
本地测试无法重现
我也没测出来
看下被删的日志