【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】
OceanBase_CE 4.2.5.4
【问题描述】清晰明确描述问题
undo_retention为默认的1800
执行
SELECT * FROM test.t_test AS OF SNAPSHOT 1760075400000;
时间戳为半小时内,提示
ERROR 1412 (HY000): Unable to read data – Table definition has changed
ddl没有修改过
参考文档
https://www.oceanbase.com/docs/common-oceanbase-database-standalone-1000000003577365
【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):
【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)
【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手 ] 即可召唤小助手,欢迎试用!
2 个赞
论坛小助手
2025 年10 月 10 日 14:19
#3
推荐使用 obdiag 工具进行日志采集,以帮助定位问题原因。由于当前情况涉及闪回查询失败,可能是由于事务日志被清理导致数据不可用或其它内部机制问题。
日志采集场景: SQL 执行出错
日志采集命令: obdiag gather scene run --scene=observer.sql_err --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”
请注意替换 db_connect 中的连接信息为实际的数据库连接参数,包括主机地址、端口、用户名、密码和数据库名。同时,将 trace_id 替换为触发该错误的实际跟踪ID。
为了更好地理解并解决问题,请提供以下信息:
能否提供具体的 SQL 语句,特别是导致上述错误的闪回查询?
表结构是否确实没有发生变化?请检查最近是否有相关的 DDL 操作被执行过。
能否确认 undo_retention 参数值及最后一次修改的时间?
系统中是否有其他异常日志或警告信息?
执行闪回查询的时间点与表最后一次 DDL 操作的时间点相隔多久?
通过以上信息,我们将能够更准确地分析问题并提供解决方案。
附上敏捷诊断工具 obdiag 使用帮助链接
1 个赞
可以查下建表的时间,是不是指定的闪回scn点比建表的时间还早
1 个赞
旭辉
2025 年10 月 10 日 14:37
#5
在租户内查下这张表是否发生过DDL变更
select o.tenant_id, o.gmt_create, o.database_id, d.database_name, o.table_id, t.table_name, o.operation_type, o.ddl_stmt_str
from oceanbase.__all_ddl_operation o left join oceanbase.`__all_database` d on (o.database_id=d.database_id)
left join oceanbase.__all_table t on (o.table_id=t.table_id)
where o.ddl_stmt_str != '' and t.table_name = 't_test'
order by o.gmt_create ;
1 个赞
另外可以用select * from t1 as of snapshot timestamp_to_scn(‘2025-10-10 14:00:00’); 这种语法指定快照scn,更加直观
1 个赞
用SELECT UNIX_TIMESTAMP(‘2025-10-10 14:44:00’)* 1000;
SELECT * FROM t_test AS OF SNAPSHOT 1760078640000;
失败
但是用select * from t_test as of snapshot timestamp_to_scn(‘2025-10-10 14:44:00’);成功
2 个赞
旭辉
2025 年10 月 10 日 15:14
#10
按说两种方式都应该可以,我再看看,有进度会反馈给你
1 个赞
AntTech_ZBUNF0:
AS OF SNAPSHOT
应该是用错函数了,看操作是用UNIX_TIMESTAMP (‘2025-10-10 14:44:00’)* 1000;生成的scn,正常应该是用time_to_usec (‘2025-10-10 14:44:00’) * 1000
obclient [test]> SELECT UNIX_TIMESTAMP('2025-10-10 15:19:30') * 1000;
+----------------------------------------------+
| UNIX_TIMESTAMP('2025-10-10 15:19:30') * 1000 |
+----------------------------------------------+
| 1760080770000 |
+----------------------------------------------+
1 row in set (0.002 sec)
-- 报错
obclient [test]> select * from t1 AS OF SNAPSHOT 1760080770000;
ERROR 1412 (HY000): Unable to read data -- Table definition has changed
obclient [test]> SELECT time_to_usec('2025-10-10 15:19:30') * 1000;
+--------------------------------------------+
| time_to_usec('2025-10-10 15:19:30') * 1000 |
+--------------------------------------------+
| 1760080770000000000 |
+--------------------------------------------+
1 row in set (0.002 sec)
-- 正常
obclient [test]> select * from t1 AS OF SNAPSHOT 1760080770000000000;
+------+------+
| id | name |
+------+------+
| 1 | A |
| 2 | B |
| 3 | C |
+------+------+
3 rows in set (0.002 sec)
1 个赞