---
title: "闪回查询 - OceanBase 数据库 V4.3.1 | OceanBase 文档中心"
description: 闪回查询 OceanBase 数据库提供了记录级别的闪回查询（Flashback Query）功能，该功能允许用户获取某个历史版本的数据。其中，Oracle 模式支持 AS OF SCN 和 AS OF TIMESTAMP 两种语法来查询；MySQL 模式支持通过 AS OF SNAPSHOT 语法来查询。 Ocea…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.3.1

# 闪回查询

更新时间：2026-04-10 11:58:01

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.3.1/zh-CN/600.manage/400.high-availability/600.manage-flashback-query.md)  

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](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000820934)。

## 注意事项

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

- 假设 `undo_retention` 设置的时间为 T0，设置后对 T0 之前的数据不起作用，对 T0 之后的数据才起作用。
 - 如果被查询的表已经被删除进了回收站，则需要先将该表从回收站中恢复。

  关于恢复回收站对象的相关操作，参见 [恢复回收站对象](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000818700)。
 - 假设当前时间为 `T`，设置 `undo_retention` 后，如果在 `T - undo_retention` 时间段内有 DDL 操作，则：

     - 对于添加列操作，闪回查询操作发生前的数据时，所有新添加的列均为 Default 值。
     - 对于创建表、删除表或删除列等操作，闪回查询操作发生前的数据时，系统会报错。
 - 闪回查询需要额外的存储空间来保留历史数据，如果调大 `undo_retention` 会导致存储空间的放大。建议调大 `undo_retention` 后，留意存储空间的变化。

## 前提条件

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

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

   #### 说明

   MySQL 租户的管理员用户为 `root` 用户，Oracle 租户的管理员用户为 `SYS` 用户。

   连接示例如下，连接数据库时请以实际环境为准。

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

   ```

   有关更加详细的连接数据库的操作指引，参见 [连接数据库概述（MySQL 模式）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000818874) 和 [连接数据库概述（Oracle 模式）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000818830)。
 2. 执行以下语句，修改租户级配置项 `undo_retention` 的值。

   示例如下：

   ```shell
   obclient [(none)]> ALTER SYSTEM SET undo_retention=900;

   ```

   有关租户级配置项 `undo_retention` 的更多信息，参见 [undo_retention](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000820934)。

## MySQL 模式下的闪回查询

1. MySQL 租户登录到数据库。

   ```shell
   obclient -h10.xx.xx.xx -P2883 -uinfo@mysql#demo -p***** -A

   ```

   有关更加详细的连接数据库的操作指引，请参见 [连接数据库](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000818874)。
 2. 对表执行闪回查询。

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

   ```shell
   obclient [(none)]> SELECT * FROM table1 AS OF SNAPSHOT 1597306800000000000;

   ```

   其中，`1597306800000000000` 为时间戳，单位为纳秒。时间戳的起点时间为北京时间 1970 年 01 月 01 日 08 点 00 分 00 秒。您可以根据需要将待查询的时间转换为时间戳格式。

   例如，本示例中，需要闪回查询 2020 年 08 月 13 日 16 点 20 分 00 秒的表数据，转换时间的方法如下：

   ```shell
   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 模式下的闪回查询

1. Oracle 租户登录到数据库。

   ```shell
   obclient -h10.xx.xx.xx -P2883 -uinfo@oracle#demo -p***** -A

   ```

   有关更加详细的连接数据库的操作指引，请参见 [连接数据库](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000818830)。
 2. 对表执行闪回查询。

   假设当前 `undo_retention` 配置的值为 `900`，用户有 3 个表 `table1`、`table2`、`expr1`。闪回查询的使用示例如下：

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

       ```shell
       obclient [SYS]> SELECT * FROM table1 AS OF TIMESTAMP TO_TIMESTAMP('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss');

       ```
      - 通过 `TIMESTAMP` 指定的历史时间并闪回查询多表在该历史时间中的状态的数据。

       ```shell
       obclient [SYS]> SELECT * FROM table1,table2 AS OF TIMESTAMP TO_TIMESTAMP('2020-08-13 16:20:00','yyyy-mm-dd hh24:mi:ss');

       ```
      - 通过 `SCN` 指定历史时间并闪回查询单表在该历史时间点的状态的数据。

       ```shell
       obclient [SYS]> SELECT * FROM table1 AS OF SCN 1597306800000000000;

       ```

       ```shell
       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

       ```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
