适用版本
OceanBase 数据库 V4.x 版本。
问题描述
测试环境表中有一行设置了过期时间, 但是时间到了还能查到。需要查明为什么设置了过期时间无效?
表结构:
CREATE TABLE `xxx` (
`id` varchar(256) NOT NULL COMMENT '信号id',
`poi_id` varchar(256) DEFAULT NULL COMMENT 'poiId',
`name` varchar(256) DEFAULT NULL COMMENT '信号名称',
`x` varchar(32) DEFAULT NULL COMMENT '经度',
`y` varchar(32) DEFAULT NULL COMMENT '纬度',
`addr` varchar(1024) DEFAULT NULL COMMENT '地址',
`type` varchar(128) DEFAULT NULL COMMENT '类型',
`status` varchar(8) DEFAULT NULL COMMENT '状态',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`ext` longtext DEFAULT NULL COMMENT '扩展信息',
`exp_info` longtext DEFAULT NULL COMMENT '实验信息',
`expire_ts` timestamp NULL DEFAULT NULL COMMENT '过期时间',
PRIMARY KEY (`id`)
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8'
REPLICA_NUM = 2 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE
TABLET_SIZE = 134217728 PCTFREE = 0
TTL = (expire_ts + INTERVAL 0 SECOND) ...
以下数据都过期了还能查到。
select * FROM xxx where id = 'XXXX';
问题原因
数据过期之后不会立即删除,需要等待 TTL 任务执行的时候才会删除数据(可以通过设置定时任务在业务低峰期进行,避免对业务造成影响)。对于过期数据,需要使用 OBKV 的接口才能过滤掉,SQL 的接口暂时还没有支持过滤。
注意事项:暂时先不要在有定义 default current_timestamp 和 on update current_timestamp 的时间列上定义 TTL 规则。
数据可见性说明的更多信息,参见 过期数据删除功能。
解决方法
执行以下 SQL。
obclient> alter system set enable_kv_ttl = true
obclient> ALTER SYSTEM trigger ttl;