武哈哈
2025 年5 月 7 日 18:11
#1
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 个赞
辞霜
2025 年5 月 7 日 18:13
#3
建议更新下ob数据库 4.1版本太老了,当前已不进行维护了
3 个赞
武哈哈
2025 年5 月 7 日 18:24
#4
评估是老版本oceanbase会可能存在这个问题吗
3 个赞
武哈哈
2025 年5 月 8 日 08:52
#7
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 个赞
独善其身
2025 年5 月 8 日 08:55
#9
这个还真没有试过,不过理论上有数据缓存和sql游标缓存应该是正常的
2 个赞
皇甫侯
2025 年5 月 8 日 09:21
#10
换个角度,再数据库里面去找下这两条执行过的SQL,抓取出来手动执行对比下
不过我感觉可能跟版本也有关系。。
2 个赞
武哈哈
2025 年5 月 8 日 10:07
#12
sql语句手动执行是没有发现问题。我们程序逻辑是每5分钟就执行一次,之前试过一启动就马上改表数据,能马上查出来数据变化了。但是让程序一直跑着,第二天,非交易日变成交易日时,是会复现这个问题的。
2 个赞
辞霜
2025 年5 月 8 日 15:57
#14
OB 里 sql 不存在会读到 “缓存数据” 或者 “未提交数据”这种。
建议更新下ob数据库原因是4.1版本已经不维护了,如遇到bug问题这边也很难联系到相关研发协助排查
1 个赞
皇甫侯
2025 年5 月 8 日 17:10
#15
你上面给的图,就短短的几分钟内查询出来的结果都不一样。。?是不是传的参数不一样啊