本节主要介绍 OceanBase 数据库的闪回查询示例和使用限制。

Oracle 提供了记录级别的闪回查询(Flashback Query)功能,该功能允许用户获取某个历史版本的数据。OceanBase 数据库在 V2.x.x 版本后也支持了该功能,且同时支持 MySQL 和 Oracle 两种模式下的查询,Oracle 模式从 V2.2.30 版本开始支持,MySQL 模式从 V2.2.71 版本开始支持,二者语法有些区别。

Oracle 模式支持 SCN(System Change Number)和 TIMESTAMP 两种维度的查询,MySQL 模式支持 SNAPSHOT 维度的查询,在 OceanBase 数据库中,SCNSNAPSHOT 都是指事务版本号,只是因为 Oracle 和 MySQL 中概念不同,起了不同的名字。

示例(MySQL 模式)

下述语句展示了如何通过 SNAPSHOT 指定历史时间并闪回查询单表在该历史时间点的状态的数据:

  1. obclient> SELECT * FROM table1 AS OF SNAPSHOT 1582807800000000;

示例(Oracle 模式)

闪回查询的使用示例如下:

  • 通过 TIMESTAMP 指定的历史时间并闪回查询一张单表在该历史时间中的状态的数据。

    1. obclient> SELECT * FROM table1 AS OF TIMESTAMP TO_TIMESTMP('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss');
  • 通过 TIMESTAMP 指定的历史时间并闪回查询多表在该历史时间中的状态的数据。

    1. obclient> SELECT * FROM table1 AS OF TIMESTAMP expr1,tbl2 AS of timestamp TO_TIMESTMP('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss');
  • 通过 SCN 指定历史时间并闪回查询单表在该历史时间点的状态的数据。

    1. obclient> SELECT * FROM table1 AS OF SCN 1582807800000000;

限制

闪回查询的使用限制如下:

  • 可以闪回查询的最近一小段时间与 undo_retention 变量的设置有关,该参数的默认为值 0,单位为秒。假如 t1 时间点设置为了保留时间,且 t2 = t1 + 900s,那么 t2 时间点可以查询 [t1,t2] 区间内的数据,参数设置后对之前的数据不起作用,对之后的数据才起作用。

    以下语句展示了如何设置 undo_retention 变量:

    1. obclient> SET GLOBAL undo_retention=900;
  • OceanBase 数据库的 SCN 可以通过视图 v$ob_timestamp_service 获取,在系统租户下查询时会展示所有租户的信息,在租户下查询会展示租户自己的信息。

  • 通过查询固定时间点可以查询最近的一次合并版本。如果您在 t1 时间点发起了集群合并,您最早可以查询到 t1 时间点的数据。

  • 如果被查询的表已经被删除进了回收站,则需要先将该表从回收站中恢复。

  • 闪回查询受限于转储,如果发生转储,且 undo_retention 变量未设置,则无法查询。设置 undo_retention 变量后可以查询 t1(转储时间点)+undo_retention 变量设置的时间范围。