undo retention 字面意思是 Undo 的保留位点,即从当前时间回溯多长时间的 Undo 日志是保留下来的。对于 OceanBase 数据库来说,是将该段时间的所有数据多版本保留下来。可以通过系统变量 undo_retention 进行设置,默认单位为秒。
Flashback Query
闪回查询(Flashback Query)允许用户查询某个历史版本的数据。社区版 OceanBase 数据库提供 AS OF SNAPSHOT 语法进行查询:
用户配置系统变量 undo_retention 后,可以使用 Flashback Query 查询当前时间 T 到 T - undo_retention 时间范围内的任意多版本。
查询副本选择
当用户指定查询某个历史版本数据时,并不会像普通查询一样总去查 Leader,而是优先查本地机器的副本,如果本地副本不存在,则优先查本 Zone 其他机器上的副本,最后再去查 Leader。
如下图所示,集群包含两个 Zone,数据分为三副本,其中副本 Replica 1 和 Replica 2 都在 Zone1,副本 Replica 3 在 Zone2,Leader 是 Replica 3。如果处理查询的 SQL 层在 server 1 上,则查询副本优先选择 Replica 1,其次选择 Replica 2,最后才会选择 Replica 3。

注意事项
如果在 T - undo_retention 时间段内有 DDL 操作,OceanBase 数据库会用最新的数据字典解释表的数据。对于 DDL 操作发生前产生的数据,删掉列的数据将变成删掉的状态,新添加列的数据则设为 Default 值。
闪回查询示例
前提条件
在通过租户级配置项 undo_retention 进行闪回查询前,需要先修改 undo_retention 的值。undo_retention 的默认值为 1800,单位为秒。
租户管理员登录到对应的租户。
执行以下语句,修改租户级配置项
undo_retention的值。示例如下:
obclient> ALTER SYSTEM SET undo_retention=900;更多租户级配置项
undo_retention的说明信息请参见 undo_retention。
闪回查询
假设,当前 undo_retention 变量设置的值为 900,用户有一个表 table1。
通过 AS OF SNAPSHOT指定历史时间并闪回查询单表在该历史时间点的状态的数据的示例如下:
obclient> SELECT * FROM table1 AS OF SNAPSHOT 1582807800000000;
其中,1582807800000000 为时间戳,需要您根据待查询的时间自行转换,单位为微秒。




