基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
体验数据保护与恢复
更新时间:2026-10-27 15:56:46
误更新、误删除数据、误删表等误操作是数据库使用中最常见的数据安全风险。OceanBase 数据库提供了多层数据保护能力:记录级的闪回查询可以查看并找回近期任意历史版本的数据;对象级的回收站可以让被误删的表、数据库快速恢复;物理级的备份恢复则提供最终兜底。本文将通过模拟两类典型误操作,帮助您直观体验 OceanBase 数据库面向误操作的数据保护能力。
本文将引导您完成以下体验:
- 体验闪回查询:模拟误删除全表数据,通过闪回查询查看并找回
undo_retention时间窗口内的历史数据。 - 体验闪回删除:模拟误删表,通过回收站将表连同数据一并恢复。
- 了解备份恢复:了解超出闪回窗口后的物理备份恢复等完整数据保护能力。
说明
本文基于 OceanBase 数据库 V5.0.1(社区版)撰写,文中相关命令和功能说明均以 V5.0.1 版本为准。本文以 部署 OceanBase 中使用 All in One 安装包部署的单节点环境为例,全部操作均可在单节点环境中完成。
前提条件
在开始本文操作前,确保满足以下条件:
| 项目 | 描述 |
|---|---|
| OceanBase 数据库 | 已使用 All in One 安装包完成部署并成功启动(部署名为 demo),参见 部署 OceanBase。 |
| obclient | 已安装 obclient 并可正常连接 OceanBase 数据库。使用 All in One 安装包部署时已自动安装。 |
| sys 租户访问 | 可使用 root 用户登录集群的 sys 租户执行管理操作。sys 租户 root 用户的密码为部署时随机生成的密码,可在部署输出或 obd cluster display demo 命令的输出中查看。 |
| 多租户基础 | 本文会创建一个体验租户,租户与资源池的概念参见 体验多租户与资源隔离。 |
数据保护能力简介
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。 - 闪回查询需要额外的存储空间保留历史数据,调大
undo_retention会导致存储空间放大,调整后请留意存储空间变化。
创建测试租户
使用 root 用户登录集群的 sys 租户(密码为部署时随机生成的密码,获取方式见上文前提条件):
obclient -h127.0.0.1 -uroot@sys -P2881 -p -A oceanbase创建一个 2C4G 规格的资源单元、资源池和租户
flash_tenant: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 秒),期间命令行没有输出,属正常现象,等待命令返回即可。
登录
flash_tenant。新创建的租户 root 用户默认密码为空,提示输入密码时直接回车即可,后续操作均在此租户中进行:obclient -h127.0.0.1 -uroot@flash_tenant -P2881 -p -A test
体验闪回查询
本节先创建一张业务表并写入数据,记录误操作前的时间点,然后模拟一次误删除全表数据的操作,最后通过闪回查询查看历史数据并将其恢复。
操作步骤
创建测试表
flash_tbl并写入业务数据: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);确认数据写入成功:
obclient [test]> SELECT * FROM flash_tbl;返回结果如下:
+----+-------+--------+ | id | name | amount | +----+-------+--------+ | 1 | alice | 1000 | | 2 | bob | 2000 | | 3 | carol | 3000 | +----+-------+--------+ 3 rows in set记录误操作前的时间点,执行以下语句并记录返回的时间(本文以
2026-10-12 15:54:41为例,请以您实际查询返回的时间为准):obclient [test]> SELECT NOW();+---------------------+ | NOW() | +---------------------+ | 2026-10-12 15:54:41 | +---------------------+ 1 row in set模拟误操作:执行一条缺少
WHERE条件的DELETE语句,误删除全表数据:obclient [test]> DELETE FROM flash_tbl; Query OK, 3 rows affected再次查询表,数据已丢失:
obclient [test]> SELECT * FROM flash_tbl; Empty set将第 3 步记录的时间转换为纳秒时间戳。MySQL 模式下闪回查询通过
AS OF SNAPSHOT指定历史时间,时间戳单位为纳秒,可使用time_to_usec函数转换(请将示例中的时间替换为您在第 3 步记录的实际时间):obclient [test]> SELECT time_to_usec('2026-10-12 15:54:41') * 1000;+---------------------------------------------+ | time_to_usec('2026-10-12 15:54:41') * 1000 | +---------------------------------------------+ | 1791791681000000000 | +---------------------------------------------+ 1 row in set记录返回的数值(本文示例中为
1791791681000000000),后续闪回查询将使用该值指定历史时间点。执行闪回查询,查看误删除前的数据:
obclient [test]> SELECT * FROM flash_tbl AS OF SNAPSHOT 1791791681000000000;返回结果中可以看到误删除前的 3 行数据:
+----+-------+--------+ | id | name | amount | +----+-------+--------+ | 1 | alice | 1000 | | 2 | bob | 2000 | | 3 | carol | 3000 | +----+-------+--------+ 3 rows in set确认历史数据无误后,将闪回查询的结果作为数据源,把误删除的数据补回表中:
obclient [test]> INSERT INTO flash_tbl SELECT * FROM flash_tbl AS OF SNAPSHOT 1791791681000000000;Query OK, 3 rows affected Records: 3 Duplicates: 0 Warnings: 0验证数据已恢复:
obclient [test]> SELECT * FROM flash_tbl;返回结果与误操作前完全一致,表示数据恢复成功:
+----+-------+--------+ | id | name | amount | +----+-------+--------+ | 1 | alice | 1000 | | 2 | bob | 2000 | | 3 | carol | 3000 | +----+-------+--------+ 3 rows in set
结果解读
| 观察项 | 预期现象 | 说明 |
|---|---|---|
| 误删除后的常规查询 | 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 值。 - 如果被查询的表已被删除进回收站,需要先将该表从回收站中恢复,参见本文体验闪回删除一节。
- 闪回查询的详细操作与注意事项请参见 闪回查询。
体验闪回删除
误删表是比误删数据更严重的误操作。OceanBase 数据库提供回收站功能:开启回收站后,执行 DROP 操作删除的表、数据库等对象会先进入回收站而非被直接删除,可通过 FLASHBACK 语句快速恢复。
操作步骤
创建另一张测试表
flash_drop_tbl并写入数据: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确认回收站功能状态。回收站由系统变量
recyclebin控制,新建租户默认未开启:obclient [test]> SHOW VARIABLES LIKE 'recyclebin';+---------------+-------+ | Variable_name | Value | +---------------+-------+ | recyclebin | OFF | +---------------+-------+ 1 row in set建议开启回收站后再模拟误删操作。开启方式如下:
- 全局开启(推荐):执行
SET GLOBAL recyclebin = on;。全局变量的修改对当前会话不生效,需要退出当前会话并重新登录flash_tenant后生效; - 仅当前会话开启:执行
SET @@recyclebin = on;,仅对当前会话生效。
开启后重新执行
SHOW VARIABLES LIKE 'recyclebin';,确认返回ON再继续后续步骤(本文后续步骤基于回收站已开启执行)。- 全局开启(推荐):执行
模拟误操作:误删表
flash_drop_tbl:obclient [test]> DROP TABLE flash_drop_tbl; Query OK, 0 rows affected查看回收站,确认被删除的表已进入回收站:
obclient [test]> SHOW RECYCLEBIN;返回结果示例如下(
OBJECT_NAME由系统自动生成,格式为__recycle_$_<内部编号>_<时间戳>,与租户的外部TENANT_ID不同,请记录您环境中实际返回的对象名):+------------------------------------+----------------+-------+----------------------------+ | 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对象进入回收站的时间 从回收站中恢复表:
obclient [test]> FLASHBACK TABLE flash_drop_tbl TO BEFORE DROP; Query OK, 0 rows affectedFLASHBACK TABLE语句中除了使用表的原始名称(如本例的flash_drop_tbl),也可以使用回收站中的对象名(如__recycle_$_10001_1791791724617904)。由于回收站中的对象名全局唯一,当回收站中存在多个同名的原始对象时,建议使用回收站中的对象名,确保恢复的是预期对象。验证表与数据已恢复:
obclient [test]> SELECT * FROM flash_drop_tbl;+----+---------------+ | id | remark | +----+---------------+ | 1 | critical data | | 2 | daily report | +----+---------------+ 2 rows in set
结果解读
| 观察项 | 预期现象 | 说明 |
|---|---|---|
| DROP TABLE 后 | 表进入回收站而非直接删除 | 回收站开启时,被删除对象仍占用存储空间 |
| SHOW RECYCLEBIN | 可见表对象的回收站记录 | 包含回收站对象名、原始名、类型与入站时间 |
| FLASHBACK TABLE 后 | 表连同数据、索引一并恢复 | 恢复后的表仍从属于删除前的数据库 |
| 恢复方式 | 在线完成,无需备份集 | 适合误删后快速找回 |
注意
- 进入回收站的对象仍占用存储空间,确认无需恢复后,可使用
PURGE语句清理回收站释放空间,操作方法请参见 清理回收站。 - 恢复回收站对象时可修改待恢复对象的名称(
RENAME TO),但不能与已有对象重名。对于 MySQL 租户,从回收站中恢复表前,如果该表从属的数据库已删除,需要先恢复数据库再恢复表。 - MySQL 用户租户支持管理的回收站对象包括数据库、表和索引;直接删除索引时,该索引不会进入回收站,删除表时表上的索引会随主表一起进入回收站。
更多数据保护能力
闪回查询与回收站适用于误操作发生后短时间内的数据找回。当误操作超出 undo_retention 时间窗口,或发生存储介质故障、机房级灾难等场景时,需要依靠备份恢复能力兜底:
- 物理备份:由日志归档和数据备份两大功能组成。日志备份持续维护租户产生的日志,数据备份维护快照点的备份,两者结合可以将数据恢复到指定的时间点。
- 恢复能力:支持恢复租户到指定时间点,也支持表级恢复,将指定表从备份数据恢复到一个已存在的租户中。
说明
备份恢复的架构与完整操作请参见 备份架构;首次体验物理备份与恢复可参见 极简化体验物理备份与恢复,该文档提供了发起日志归档、数据备份与恢复的极简示例。
下一步
完成本文的数据保护与恢复体验后,您可以继续以下探索之旅:
- 体验在线 DDL:在有持续读写的测试表上执行新增列、创建索引等常见 DDL,观察业务连续性,参见 体验在线 DDL。
- 深入备份恢复:体验日志归档与数据备份的完整流程,参见 极简化体验物理备份与恢复。
- 回顾数据效率能力:体验并行导入与高压缩,参见 体验并行导入与高压缩。
相关文档
- 闪回查询的详细操作与示例请参见 闪回查询。
- 闪回查询的原理介绍请参见 闪回查询(数据保护)。
- 租户级配置项
undo_retention的详细说明请参见 undo_retention。 - 回收站的功能与使用限制请参见 回收站概述。
- 回收站的开关控制请参见 开启或关闭回收站。
- 查看回收站对象的操作请参见 查看回收站对象。
- 恢复回收站对象的完整语法请参见 恢复回收站对象。
- 清理回收空间的操作请参见 清理回收站。
- 备份恢复的架构说明请参见 备份架构。
- 物理备份与恢复的极简体验请参见 极简化体验物理备份与恢复。