长时间重复执行同一个sql后,疑似存在缓存数据,返回数据未及时更新

OceanBase 产品名称及详细版本 : 5.7.25-0ceanBase CE-v4.1.0.1

租户模式 : MySQL 模式

问题详情 : 我们的业务逻辑为查询以下sql,来判断是否是交易日:
SELECT COUNT(1) AS QUANTITY
FROM TIFP_TRD_DT
WHERE DT = TRD_DT AND DT = TO_CHAR(SYSDATE, ‘YYYYMMDD’)
问题现象是在周一的时候发现,这个sql查询的结果一直是0(即非交易日),重启之后恢复正常。

排查步骤,我们尝试了只使用jdbc来查询数据库,分别执行了两个sql,一个sql中的TO_CHAR(SYSDATE, ‘YYYYMMDD’)改成使用java生成日期后拼接,另一个sql与出问题的sql保持一致。当非交易日切换到交易日时观察日志, 发现如果sql中的dt直接使用java生成的当天日期去拼接,可以立即查询到数据库中真实的结果,而使用了TO_CHAR(SYSDATE, ‘YYYYMMDD’)的sql查询结果还是为0。

其他信息:截图中我们在执行jdbc查询前,还执行了select TO_CHAR(SYSDATE, ‘YYYYMMDD’)并打印结果,数据是正常。也将tifp_trd_dt表的数据查询出来,也是正常的。

该问题如果重启会立即恢复,如果一直不重启,也会恢复,但是时间不固定。

3 个赞

建议更新下ob数据库 4.1版本太老了,当前已不进行维护了

3 个赞

评估是老版本oceanbase会可能存在这个问题吗

3 个赞
  1. to_char 是 oracle 租户用法,截图里是 date_format 这是 mysql 租户用法。所以你的问题是 mysql 租户问题 还是 oracle 租户问题?
  2. OB 里 sql 不存在会读到 “缓存数据” 或者 “未提交数据”这种。虽然 OB 4.1 版本不是 LTS 版本,有不少 BUG ,但是 读数据这点存在 BUG 的可能性几乎没有。如果要深究, 你还需要更详细的描述你的问题现象和你的推理证据。
  3. 目前最紧急的应该是尽快升级这个版本到 4.2.1 或 4.2.5 版本。
3 个赞

mysql租户,描述里面写错写成oracle写法了。从日志截图可以看到实际执行的sql

3 个赞

– 查看 TO_CHAR(SYSDATE) 的当前值
SELECT TO_CHAR(SYSDATE, ‘YYYYMMDD’) FROM DUAL;

– 同时查询 Java 端拼接的日期值,看是否不同

– 检查 observer 是否存活,是否有节点 SYSDATE 不同步
SELECT SVR_IP, SVR_PORT, TENANT_ID, VALUE FROM GV$OB_PARAMETERS WHERE NAME = ‘ob_timestamp_service’;

– 检查租户逻辑时间
SELECT tenant_id, cur_ts, sync_ts FROM __all_tenant_info;

3 个赞

这个还真没有试过,不过理论上有数据缓存和sql游标缓存应该是正常的

2 个赞

换个角度,再数据库里面去找下这两条执行过的SQL,抓取出来手动执行对比下
不过我感觉可能跟版本也有关系。。

2 个赞

1 个赞

sql语句手动执行是没有发现问题。我们程序逻辑是每5分钟就执行一次,之前试过一启动就马上改表数据,能马上查出来数据变化了。但是让程序一直跑着,第二天,非交易日变成交易日时,是会复现这个问题的。

2 个赞


这张截图可以看到早上6点的时候自动恢复了

1 个赞

OB 里 sql 不存在会读到 “缓存数据” 或者 “未提交数据”这种。
建议更新下ob数据库原因是4.1版本已经不维护了,如遇到bug问题这边也很难联系到相关研发协助排查

1 个赞

你上面给的图,就短短的几分钟内查询出来的结果都不一样。。?是不是传的参数不一样啊