首批通过分布式安全可靠测评,为关键业务系统打造
闪回查询
更新时间:2026-04-10 11:58:01
OceanBase 数据库提供了记录级别的闪回查询(Flashback Query)功能,该功能允许用户获取某个历史版本的数据。其中,Oracle 模式支持 AS OF SCN和 AS OF TIMESTAMP 两种语法来查询;MySQL 模式支持通过 AS OF SNAPSHOT 语法来查询。
OceanBase 数据库当前支持用户通过设置租户级配置项 undo_retention 的方式来进行闪回查询。当用户设置 undo_retention 后,即可使用闪回查询功能查询 T - undo_retention 到当前时间 T 时间范围内的任意多版本数据。租户级配置项 undo_retention 的默认值为 1800,单位为秒,有关租户级配置项 undo_retention 的更多信息,参见 undo_retention。
注意事项
使用租户级配置项 undo_retention 进行闪回查询时,需要注意以下事项:
假设
undo_retention设置的时间为 T0,设置后对 T0 之前的数据不起作用,对 T0 之后的数据才起作用。如果被查询的表已经被删除进了回收站,则需要先将该表从回收站中恢复。
关于恢复回收站对象的相关操作,参见 恢复回收站对象。
假设当前时间为
T,设置undo_retention后,如果在T - undo_retention时间段内有 DDL 操作,则:对于添加列操作,闪回查询操作发生前的数据时,所有新添加的列均为 Default 值。
对于创建表、删除表或删除列等操作,闪回查询操作发生前的数据时,系统会报错。
闪回查询需要额外的存储空间来保留历史数据,如果调大
undo_retention会导致存储空间的放大。建议调大undo_retention后,留意存储空间的变化。
前提条件
在通过租户级配置项 undo_retention 进行闪回查询前,需要先修改 undo_retention 的值。undo_retention 的默认值为 1800,单位为秒。
租户管理员登录到数据库。
说明
MySQL 租户的管理员用户为
root用户,Oracle 租户的管理员用户为SYS用户。连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql#demo -p***** -A有关更加详细的连接数据库的操作指引,参见 连接数据库概述(MySQL 模式) 和 连接数据库概述(Oracle 模式)。
执行以下语句,修改租户级配置项
undo_retention的值。示例如下:
obclient [(none)]> ALTER SYSTEM SET undo_retention=900;有关租户级配置项
undo_retention的更多信息,参见 undo_retention。
MySQL 模式下的闪回查询
MySQL 租户登录到数据库。
连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uinfo@mysql#demo -p***** -A有关更加详细的连接数据库的操作指引,请参见 连接数据库。
对表执行闪回查询。
假设当前
undo_retention设置的值为900,用户有一个表table1。通过AS OF SNAPSHOT指定历史时间并闪回查询单表在该历史时间点的状态的数据的示例如下:obclient [(none)]> SELECT * FROM table1 AS OF SNAPSHOT 1597306800000000000;其中,
1597306800000000000为时间戳,单位为纳秒。时间戳的起点时间为北京时间 1970 年 01 月 01 日 08 点 00 分 00 秒。您可以根据需要将待查询的时间转换为时间戳格式。例如,本示例中,需要闪回查询 2020 年 08 月 13 日 16 点 20 分 00 秒的表数据,转换时间的方法如下:
obclient [(none)]> SELECT time_to_usec('2020-08-13 16:20:00') * 1000; +--------------------------------------------+ | time_to_usec('2022-01-01 00:00:00') * 1000 | +--------------------------------------------+ | 1597306800000000000 | +--------------------------------------------+ 1 row in set
Oracle 模式下的闪回查询
Oracle 租户登录到数据库。
连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uinfo@oracle#demo -p***** -A有关更加详细的连接数据库的操作指引,请参见 连接数据库。
对表执行闪回查询。
假设当前
undo_retention配置的值为900,用户有 3 个表table1、table2、expr1。闪回查询的使用示例如下:通过
TIMESTAMP指定的历史时间并闪回查询一张单表在该历史时间中的状态的数据。obclient [SYS]> SELECT * FROM table1 AS OF TIMESTAMP TO_TIMESTAMP('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss');通过
TIMESTAMP指定的历史时间并闪回查询多表在该历史时间中的状态的数据。obclient [SYS]> SELECT * FROM table1,table2 AS OF TIMESTAMP TO_TIMESTAMP('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss');通过
SCN指定历史时间并闪回查询单表在该历史时间点的状态的数据。obclient [SYS]> SELECT * FROM table1 AS OF SCN 1597306800000000000;其中,
1597306800000000000为时间戳,单位为纳秒。时间戳的起点时间为北京时间 1970 年 01 月 01 日 08 点 00 分 00 秒。您可以根据需要将待查询的时间转换为时间戳格式。例如,本示例中,需要闪回查询 2020 年 08 月 13 日 16 点 20 分 00 秒的表数据,转换时间的方法如下:
obclient [(none)]> SELECT (to_date('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss') - to_date('1970-01-01 08:00:00', 'yyyy-mm-dd hh24:mi:ss')) * 86400 * 1000 * 1000 * 1000 AS unix_nsec_timestamp FROM DUAL; +---------------------+ | UNIX_NSEC_TIMESTAMP | +---------------------+ | 1597306800000000000 | +---------------------+ 1 row in set