闪回查询

1. 闪回查询

1.1. 前言

OceanBase 数据库提供了记录级别的闪回查询(Flashback Query)功能,该功能允许用户获取某个历史版本的数据。其中,Oracle 模式支持 AS OF SCN和 AS OF TIMESTAMP 两种语法来查询;MySQL 模式支持通过 AS OF SNAPSHOT 语法来查询。

OceanBase 数据库当前支持用户通过设置租户级配置项 undo_retention 的方式来进行闪回查询。当用户设置 undo_retention 后,即可使用闪回查询功能查询当前时间 T 到 T - undo_retention 时间范围内的任意多版本数据。租户级配置项 undo_retention 的默认值为 1800,单位为秒,有关租户级配置项 undo_retention 的更多信息,请参见 undo_retention。

1.2. 注意事项

使用租户级配置项 undo_retention 进行闪回查询时,需要注意以下事项:

  • 假设 undo_retention 设置的时间为 T0,设置后对 T0 之前的数据不起作用,对 T0 之后的数据才起作用。
  • 如果被查询的表已经被删除进了回收站,则需要先将该表从回收站中恢复。
  • 假设当前时间为 T,设置 undo_retention 后,如果在 T - undo_retention 时间段内有 DDL 操作,系统会用最新的数据字典解释表的数据。对于 DDL 操作发生前产生的数据,被删除的列的数据将变成删除状态,新添加列的数据则设为 Default 值。
  • 闪回查询需要额外的存储空间来保留历史数据,如果调大 undo_retention 会导致存储空间的放大。建议调大 undo_retention 后,留意存储空间的变化。

1.3. 前提条件

在通过租户级配置项 undo_retention 进行闪回查询前,需要先修改 undo_retention 的值。undo_retention 的默认值为 1800,单位为秒。

1.4. 操作流程

1.4.1. undo_retention设置

1.4.1.1. 租户管理员登录到数据库。

obclient -h10.xx.xx.xx -P2883 -uroot@mysql#demo -p***** -A

1.4.1.2. 执行以下语句,修改租户级配置项 undo_retention 的值。

ALTER SYSTEM SET undo_retention=900;

属性	                        描述
参数类型      	            INT
                            说明:该配置项从 V4.0.0 版本开始,参数类型由系统变量调整为配置项。
默认值	                    1800,单位为秒。
取值范围	                    [0, 4294967295]
是否可修改	                是,支持通过 ALTER SYSTEM SET 语句修改。
是否重启 OBServer 节点生效	否

1.4.2. MySQL 模式下的闪回查询

1.4.2.1. 对表执行闪回查询。

假设当前 undo_retention 设置的值为 900,用户有一个表 table1。通过 AS OF SNAPSHOT 指定历史时间并闪回查询单表在该历史时间点的状态的数据的示例如下:

SELECT * FROM table1 AS OF SNAPSHOT 1597306800000000000;

其中,1597306800000000000 为时间戳,单位为纳秒。时间戳的起点时间为北京时间 1970 年 08 点 00 分 00 秒。您可以根据需要将待查询的时间转换为时间戳格式。
例如,本示例中,需要闪回查询 2020 年 08 月 13 日 16 点 20 分 00 秒的表数据,转换时间的方法如下:

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

1.4.3. Oracle 模式下的闪回查询

1.4.3.1. 对表执行闪回查询。

假设当前 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 秒的表数据,转换时间的方法如下:

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
posted @ 2026-05-11 14:45  数据库小白(专注)  阅读(12)  评论(0)    收藏  举报