社区版mysql模式闪回查询提示ERROR 1412 (HY000): Unable to read data -- Table definition has changed

【 使用环境 】生产环境 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 个赞

推荐使用 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。

为了更好地理解并解决问题,请提供以下信息:

  1. 能否提供具体的 SQL 语句,特别是导致上述错误的闪回查询?
  2. 表结构是否确实没有发生变化?请检查最近是否有相关的 DDL 操作被执行过。
  3. 能否确认 undo_retention 参数值及最后一次修改的时间?
  4. 系统中是否有其他异常日志或警告信息?
  5. 执行闪回查询的时间点与表最后一次 DDL 操作的时间点相隔多久?

通过以上信息,我们将能够更准确地分析问题并提供解决方案。

附上敏捷诊断工具 obdiag 使用帮助链接

1 个赞

可以查下建表的时间,是不是指定的闪回scn点比建表的时间还早

1 个赞

在租户内查下这张表是否发生过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 个赞

大佬,感谢,用你的这个查询语句就成功了

2 个赞

用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 个赞

1 个赞

按说两种方式都应该可以,我再看看,有进度会反馈给你

1 个赞

应该是用错函数了,看操作是用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 个赞

确实是用错函数了,:+1:

1 个赞

学习了。

openai坑我