【产品名称】oceanbase
【产品版本】3.1.1
【问题描述】查询偶尔会报错:Request to read too old versioned data,语句为3个表做join,其中两个表是查询3天内的数据
【产品名称】oceanbase
【产品版本】3.1.1
【问题描述】查询偶尔会报错:Request to read too old versioned data,语句为3个表做join,其中两个表是查询3天内的数据
可以参考调整一下undo_retention参数
https://open.oceanbase.com/answer/detail?id=13700072
https://open.oceanbase.com/docs/observer-cn/V3.1.2/10000000000015277
查了下这个值为0,应该只有最新版本吧
是的
请问为什么还会报这个错误呢,报错看起来是访问的版本比较旧
我们知道,OB是使用MVCC的,RC隔离级别下,一条查询的sql语句发起的开始会生成对应的读取快照点,该查询后续的查询都是基于该快照执行的。
那么问题来了,一个大的查询在查询期间对应原来快照点的数据已经发生了变更且已触发转储,但undo_retention默认是0,即表示转储没有开启多版本,只保留最新的版本数据,那么这个sql查询老版本的数据的时候就找不到了,就会提示Request to read too old versioned data,undo_retention设置大于0,转储开启了多版本,并且多版本的转储会保留undo_retention指定的时间。
更正一下:
当前的OB默认的转储行为就是多版本的,
当undo_retention=0的时候表示每次转储不保留历史版本的转储,
当undo_retention>0的时候表示保留距离当前时间在undo_retention以内的版本的转储。
嗯嗯好的,如果解决的话就需要调大undo_retention的值对吧
是的,在有大的查询或者导数需求的时候,临时将该变量调大一些。
试 了下,调成10也不行,查了下count共有2000w条数据
10代表的十秒,你可以调大一下,任务完事在改回来。我传输数据都是改成86400,一天的时间,当然如果你的任务1一个小时可以跑完,那将值改为3600即可
查询语句能贴一下吗?
undo retention单位是秒,配置为10是仅保留10s的快照,可能有点小。
调大undo_retention的副作用是,在读取的数据量比较大时,如果期间集群写入压力也比较大,observer节点的表空间使用率会出现异常上涨情况,出现表空间使用率膨胀现象。