---
title: "体验数据保护与恢复 - OceanBase 数据库 V5.0.1 | OceanBase 文档中心"
description: 体验数据保护与恢复 误更新、误删除数据、误删表等误操作是数据库使用中最常见的数据安全风险。OceanBase 数据库提供了多层数据保护能力：记录级的闪回查询可以查看并找回近期任意历史版本的数据；对象级的回收站可以让被误删的表、数据库快速恢复；物理级的备份恢复则提供最终兜底。本文将通过模拟两类典型误操作，帮助您直观体验…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

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

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

# 体验数据保护与恢复

更新时间：2026-10-27 15:56:46

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V5.0.1/zh-CN/200.quickstart/900.experience-data-protection-and-recovery.md)  

误更新、误删除数据、误删表等误操作是数据库使用中最常见的数据安全风险。OceanBase 数据库提供了多层数据保护能力：记录级的闪回查询可以查看并找回近期任意历史版本的数据；对象级的回收站可以让被误删的表、数据库快速恢复；物理级的备份恢复则提供最终兜底。本文将通过模拟两类典型误操作，帮助您直观体验 OceanBase 数据库面向误操作的数据保护能力。

本文将引导您完成以下体验：

- **体验闪回查询**：模拟误删除全表数据，通过闪回查询查看并找回 `undo_retention` 时间窗口内的历史数据。
 - **体验闪回删除**：模拟误删表，通过回收站将表连同数据一并恢复。
 - **了解备份恢复**：了解超出闪回窗口后的物理备份恢复等完整数据保护能力。

#### 说明

本文基于 OceanBase 数据库 V5.0.1（社区版）撰写，文中相关命令和功能说明均以 V5.0.1 版本为准。本文以 [部署 OceanBase](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615008) 中使用 All in One 安装包部署的单节点环境为例，全部操作均可在单节点环境中完成。

## 前提条件

在开始本文操作前，确保满足以下条件：

| 项目 | 描述 |
| --- | --- |
| OceanBase 数据库 | 已使用 All in One 安装包完成部署并成功启动（部署名为 `demo`），参见 [部署 OceanBase](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615008)。 |
| obclient | 已安装 obclient 并可正常连接 OceanBase 数据库。使用 All in One 安装包部署时已自动安装。 |
| sys 租户访问 | 可使用 root 用户登录集群的 sys 租户执行管理操作。sys 租户 root 用户的密码为部署时随机生成的密码，可在部署输出或 `obd cluster display demo` 命令的输出中查看。 |
| 多租户基础 | 本文会创建一个体验租户，租户与资源池的概念参见 [体验多租户与资源隔离](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000007140973)。 |

## 数据保护能力简介

OceanBase 数据库面向误操作和数据恢复提供多层保护能力，各层能力相互补充：

| 能力 | 保护层级 | 典型场景 | 恢复方式 |
| --- | --- | --- | --- |
| 闪回查询 | 记录级 | 误 `UPDATE`、误 `DELETE` 导致数据被改写或丢失 | 通过 `AS OF SNAPSHOT` 查询历史版本数据，并将数据补回 |
| 回收站（闪回删除） | 对象级 | 误 `DROP` 表或数据库 | 通过 `FLASHBACK TABLE ... TO BEFORE DROP` 从回收站恢复 |
| 备份恢复 | 物理级 | 存储介质故障、数据损坏、超出闪回窗口的历史数据 | 通过日志归档与数据备份恢复到指定时间点 |

其中，闪回查询依赖多版本数据：OceanBase 数据库通过租户级配置项 `undo_retention` 控制历史版本的保留时长，默认值为 `1800`（单位为秒，即 30 分钟）。设置后，可以查询 `T - undo_retention` 到当前时间 `T` 范围内的任意多版本数据。该取值可在 `flash_tenant` 中通过 `SHOW PARAMETERS LIKE 'undo_retention';` 查看（它为租户级配置项，使用 `SHOW VARIABLES` 无法查询到）。

#### 说明

- 本文的误操作与恢复均在数分钟内完成，处于默认 `undo_retention` 窗口内，无需调整该配置项。如需调整，可由租户管理员执行 `ALTER SYSTEM SET undo_retention=900;`，详细信息请参见 [undo_retention](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006618698)。
 - 闪回查询需要额外的存储空间保留历史数据，调大 `undo_retention` 会导致存储空间放大，调整后请留意存储空间变化。

## 创建测试租户

1. 使用 root 用户登录集群的 sys 租户（密码为部署时随机生成的密码，获取方式见上文前提条件）：

   ```shell
   obclient -h127.0.0.1 -uroot@sys -P2881 -p -A oceanbase

   ```
 2. 创建一个 2C4G 规格的资源单元、资源池和租户 `flash_tenant`：

   ```sql
   obclient [oceanbase]> CREATE RESOURCE UNIT flash_unit MAX_CPU=2, MIN_CPU=2, MEMORY_SIZE='4G';
   obclient [oceanbase]> CREATE RESOURCE POOL flash_pool UNIT='flash_unit', UNIT_NUM=1, ZONE_LIST=('zone1');
   obclient [oceanbase]> CREATE TENANT IF NOT EXISTS flash_tenant CHARSET='utf8mb4', PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('flash_pool') SET ob_tcp_invited_nodes='%';

   ```

   租户创建需要数十秒（本文环境实测约 6 秒），期间命令行没有输出，属正常现象，等待命令返回即可。
 3. 登录 `flash_tenant`。新创建的租户 root 用户默认密码为空，提示输入密码时直接回车即可，后续操作均在此租户中进行：

   ```shell
   obclient -h127.0.0.1 -uroot@flash_tenant -P2881 -p -A test

   ```

## 体验闪回查询

本节先创建一张业务表并写入数据，记录误操作前的时间点，然后模拟一次误删除全表数据的操作，最后通过闪回查询查看历史数据并将其恢复。

### 操作步骤

1. 创建测试表 `flash_tbl` 并写入业务数据：

   ```sql
   obclient [test]> CREATE TABLE flash_tbl (
                       id INT PRIMARY KEY,
                       name VARCHAR(32),
                       amount INT
                    );
   obclient [test]> INSERT INTO flash_tbl VALUES (1,'alice',1000),(2,'bob',2000),(3,'carol',3000);

   ```
 2. 确认数据写入成功：

   ```sql
   obclient [test]> SELECT * FROM flash_tbl;

   ```

   返回结果如下：

   ```shell
   +----+-------+--------+
   | id | name  | amount |
   +----+-------+--------+
   |  1 | alice |   1000 |
   |  2 | bob   |   2000 |
   |  3 | carol |   3000 |
   +----+-------+--------+
   3 rows in set

   ```
 3. 记录误操作前的时间点，执行以下语句并记录返回的时间（本文以 `2026-10-12 15:54:41` 为例，请以您实际查询返回的时间为准）：

   ```sql
   obclient [test]> SELECT NOW();

   ```

   ```shell
   +---------------------+
   | NOW()               |
   +---------------------+
   | 2026-10-12 15:54:41 |
   +---------------------+
   1 row in set

   ```
 4. 模拟误操作：执行一条缺少 `WHERE` 条件的 `DELETE` 语句，误删除全表数据：

   ```sql
   obclient [test]> DELETE FROM flash_tbl;
   Query OK, 3 rows affected

   ```

   再次查询表，数据已丢失：

   ```sql
   obclient [test]> SELECT * FROM flash_tbl;
   Empty set

   ```
 5. 将第 3 步记录的时间转换为纳秒时间戳。MySQL 模式下闪回查询通过 `AS OF SNAPSHOT` 指定历史时间，时间戳单位为纳秒，可使用 `time_to_usec` 函数转换（请将示例中的时间替换为您在第 3 步记录的实际时间）：

   ```sql
   obclient [test]> SELECT time_to_usec('2026-10-12 15:54:41') * 1000;

   ```

   ```shell
   +---------------------------------------------+
   | time_to_usec('2026-10-12 15:54:41') * 1000 |
   +---------------------------------------------+
   |                         1791791681000000000 |
   +---------------------------------------------+
   1 row in set

   ```

   记录返回的数值（本文示例中为 `1791791681000000000`），后续闪回查询将使用该值指定历史时间点。
 6. 执行闪回查询，查看误删除前的数据：

   ```sql
   obclient [test]> SELECT * FROM flash_tbl AS OF SNAPSHOT 1791791681000000000;

   ```

   返回结果中可以看到误删除前的 3 行数据：

   ```
 7. 确认历史数据无误后，将闪回查询的结果作为数据源，把误删除的数据补回表中：

   ```sql
   obclient [test]> INSERT INTO flash_tbl SELECT * FROM flash_tbl AS OF SNAPSHOT 1791791681000000000;

   ```

   ```shell
   Query OK, 3 rows affected
   Records: 3  Duplicates: 0  Warnings: 0

   ```
 8. 验证数据已恢复：

   ```

   返回结果与误操作前完全一致，表示数据恢复成功：

   ```

### 结果解读

| 观察项 | 预期现象 | 说明 |
| --- | --- | --- |
| **误删除后的常规查询** | `Empty set` | 数据已被删除，常规查询无法看到历史数据 |
| **闪回查询** | 返回误删除前的全部数据 | 基于多版本数据读取指定历史时间点的快照 |
| **数据恢复** | 补回后表恢复 3 行数据 | 闪回查询结果作为数据源，通过 `INSERT INTO SELECT` 在线补回 |
| **恢复方式** | 在线完成，无需备份集 | 在 `undo_retention` 窗口内可直接找回数据 |

#### 说明

- 闪回查询的语法因租户模式而异：MySQL 模式使用 `AS OF SNAPSHOT`，Oracle 模式使用 `AS OF SCN` 和 `AS OF TIMESTAMP`。时间戳的起点时间为北京时间 1970 年 01 月 01 日 08 点 00 分 00 秒。
 - 闪回查询是查询语句，数据恢复需将查询结果通过 `INSERT INTO SELECT` 等方式补回，建议先用闪回查询确认历史数据无误后再执行恢复。
 - 如果在 `undo_retention` 时间窗口内有 DDL 操作，则对于创建表、删除表或删除列的操作，闪回查询 DDL 操作发生前的数据时系统会报错（如 `ERROR 1412`，`Unable to read data -- Table definition has changed`；实测中快照时间点距离建表操作过近时也会触发该报错，等待数秒后使用更晚的时间点重新转换与查询即可）；对于添加列的操作，闪回查询时所有新添加的列均为 Default 值。
 - 如果被查询的表已被删除进回收站，需要先将该表从回收站中恢复，参见本文[体验闪回删除](#体验闪回删除)一节。
 - 闪回查询的详细操作与注意事项请参见 [闪回查询](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615145)。

## 体验闪回删除

误删表是比误删数据更严重的误操作。OceanBase 数据库提供回收站功能：开启回收站后，执行 `DROP` 操作删除的表、数据库等对象会先进入回收站而非被直接删除，可通过 `FLASHBACK` 语句快速恢复。

### 操作步骤

1. 创建另一张测试表 `flash_drop_tbl` 并写入数据：

   ```sql
   obclient [test]> CREATE TABLE flash_drop_tbl (
                       id INT PRIMARY KEY,
                       remark VARCHAR(64)
                    );
   obclient [test]> INSERT INTO flash_drop_tbl VALUES (1,'critical data'),(2,'daily report');
   Query OK, 2 rows affected

   ```
 2. 确认回收站功能状态。回收站由系统变量 `recyclebin` 控制，新建租户默认未开启：

   ```sql
   obclient [test]> SHOW VARIABLES LIKE 'recyclebin';

   ```

   ```shell
   +---------------+-------+
   | Variable_name | Value |
   +---------------+-------+
   | recyclebin    | OFF   |
   +---------------+-------+
   1 row in set

   ```

   建议开启回收站后再模拟误删操作。开启方式如下：

      - **全局开启（推荐）**：执行 `SET GLOBAL recyclebin = on;`。全局变量的修改对当前会话不生效，需要退出当前会话并重新登录 `flash_tenant` 后生效；
      - **仅当前会话开启**：执行 `SET @@recyclebin = on;`，仅对当前会话生效。

   开启后重新执行 `SHOW VARIABLES LIKE 'recyclebin';`，确认返回 `ON` 再继续后续步骤（本文后续步骤基于回收站已开启执行）。
 3. 模拟误操作：误删表 `flash_drop_tbl`：

   ```sql
   obclient [test]> DROP TABLE flash_drop_tbl;
   Query OK, 0 rows affected

   ```
 4. 查看回收站，确认被删除的表已进入回收站：

   ```sql
   obclient [test]> SHOW RECYCLEBIN;

   ```

   返回结果示例如下（`OBJECT_NAME` 由系统自动生成，格式为 `__recycle_$_<内部编号>_<时间戳>`，与租户的外部 `TENANT_ID` 不同，请记录您环境中实际返回的对象名）：

   ```shell
   +------------------------------------+----------------+-------+----------------------------+
   | OBJECT_NAME                        | ORIGINAL_NAME  | TYPE  | CREATETIME                 |
   +------------------------------------+----------------+-------+----------------------------+
   | __recycle_$_10001_1791791724617904 | flash_drop_tbl | TABLE | 2026-10-12 15:55:24.617397 |
   +------------------------------------+----------------+-------+----------------------------+
   1 row in set

   ```

   结果中各字段说明：

   | 字段 | 说明 |
   | --- | --- |
   | `OBJECT_NAME` | 对象在回收站中的名称，全局唯一 |
   | `ORIGINAL_NAME` | 对象被删除前的名称 |
   | `TYPE` | 对象类型，如表、数据库、索引、租户 |
   | `CREATETIME` | 对象进入回收站的时间 |
 5. 从回收站中恢复表：

   ```sql
   obclient [test]> FLASHBACK TABLE flash_drop_tbl TO BEFORE DROP;
   Query OK, 0 rows affected

   ```

   `FLASHBACK TABLE` 语句中除了使用表的原始名称（如本例的 `flash_drop_tbl`），也可以使用回收站中的对象名（如 `__recycle_$_10001_1791791724617904`）。由于回收站中的对象名全局唯一，当回收站中存在多个同名的原始对象时，建议使用回收站中的对象名，确保恢复的是预期对象。
 6. 验证表与数据已恢复：

   ```sql
   obclient [test]> SELECT * FROM flash_drop_tbl;

   ```

   ```shell
   +----+---------------+
   | id | remark        |
   +----+---------------+
   |  1 | critical data |
   |  2 | daily report  |
   +----+---------------+
   2 rows in set

   ```

### 结果解读

| 观察项 | 预期现象 | 说明 |
| --- | --- | --- |
| **DROP TABLE 后** | 表进入回收站而非直接删除 | 回收站开启时，被删除对象仍占用存储空间 |
| **SHOW RECYCLEBIN** | 可见表对象的回收站记录 | 包含回收站对象名、原始名、类型与入站时间 |
| **FLASHBACK TABLE 后** | 表连同数据、索引一并恢复 | 恢复后的表仍从属于删除前的数据库 |
| **恢复方式** | 在线完成，无需备份集 | 适合误删后快速找回 |

#### 注意

- 进入回收站的对象仍占用存储空间，确认无需恢复后，可使用 `PURGE` 语句清理回收站释放空间，操作方法请参见 [清理回收站](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615533)。
 - 恢复回收站对象时可修改待恢复对象的名称（`RENAME TO`），但不能与已有对象重名。对于 MySQL 租户，从回收站中恢复表前，如果该表从属的数据库已删除，需要先恢复数据库再恢复表。
 - MySQL 用户租户支持管理的回收站对象包括数据库、表和索引；直接删除索引时，该索引不会进入回收站，删除表时表上的索引会随主表一起进入回收站。

## 更多数据保护能力

闪回查询与回收站适用于误操作发生后短时间内的数据找回。当误操作超出 `undo_retention` 时间窗口，或发生存储介质故障、机房级灾难等场景时，需要依靠备份恢复能力兜底：

- **物理备份**：由日志归档和数据备份两大功能组成。日志备份持续维护租户产生的日志，数据备份维护快照点的备份，两者结合可以将数据恢复到指定的时间点。
 - **恢复能力**：支持恢复租户到指定时间点，也支持表级恢复，将指定表从备份数据恢复到一个已存在的租户中。

#### 说明

备份恢复的架构与完整操作请参见 [备份架构](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006616446)；首次体验物理备份与恢复可参见 [极简化体验物理备份与恢复](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615183)，该文档提供了发起日志归档、数据备份与恢复的极简示例。

## 下一步

完成本文的数据保护与恢复体验后，您可以继续以下探索之旅：

1. **体验在线 DDL**：在有持续读写的测试表上执行新增列、创建索引等常见 DDL，观察业务连续性，参见 [体验在线 DDL](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000007140969)。
 2. **深入备份恢复**：体验日志归档与数据备份的完整流程，参见 [极简化体验物理备份与恢复](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615183)。
 3. **回顾数据效率能力**：体验并行导入与高压缩，参见 [体验并行导入与高压缩](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000007140976)。

## 相关文档

- 闪回查询的详细操作与示例请参见 [闪回查询](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615145)。
 - 闪回查询的原理介绍请参见 [闪回查询（数据保护）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006616448)。
 - 租户级配置项 `undo_retention` 的详细说明请参见 [undo_retention](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006618698)。
 - 回收站的功能与使用限制请参见 [回收站概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615532)。
 - 回收站的开关控制请参见 [开启或关闭回收站](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615535)。
 - 查看回收站对象的操作请参见 [查看回收站对象](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615536)。
 - 恢复回收站对象的完整语法请参见 [恢复回收站对象](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615534)。
 - 清理回收空间的操作请参见 [清理回收站](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615533)。
 - 备份恢复的架构说明请参见 [备份架构](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006616446)。
 - 物理备份与恢复的极简体验请参见 [极简化体验物理备份与恢复](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000006615183)。

 上一篇 下一篇 ![有帮助](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) 咨询热线
