×
技术社区 >  技术博客 >  OceanBase误删表别慌!回收站秒级恢复DROP误删全流程(附避坑SQL)

OceanBase误删表别慌!回收站秒级恢复DROP误删全流程(附避坑SQL)

OceanBase回收站功能仅用于恢复被DROP删除的数据库对象(如表、库、租户),无法恢复被DELETE删除的表内数据。
区分场景:

一、操作前关键确认

1. 确认回收站已开启

  • 回收站默认可能关闭,关闭状态下对象被物理删除,无法恢复。
  • 检查命令:
SHOW VARIABLES LIKE 'recyclebin';  -- 值为ON表示开启  
  • 开启命令(需租户管理员权限):
SET GLOBAL recyclebin = ON;  

> 注意:未开启回收站时,只能通过备份恢复租户再导出表,耗时较长。

2. 确认操作权限

  • 恢复表/库:需原租户管理员账号(MySQL模式为root,Oracle模式为SYS)。
  • 恢复租户:需系统租户(sys)管理员账号。

3. 确认磁盘空间

  • 被删除对象仍占用磁盘空间,恢复操作仅修改元数据(速度极快)。
  • 需确保当前租户剩余空间充足,避免后续写入失败。

二、标准恢复操作流程

核心原则(执行前必读)

  • 必须先选库:执行恢复命令前,必须先执行 USE (ODC需在目标库下操作)。
  • 禁止跨库恢复FLASHBACK 不支持直接将表恢复到其他数据库(如 RENAME TO db2.table 会报错)。
  • 索引自动恢复:恢复表时,关联索引会自动一并恢复,无需单独操作。

操作步骤

1. 查找回收站对象

  • 任意数据库下执行:
SHOW RECYCLEBIN;  
  • 记录关键信息:
  • 找到 ORIGINAL_NAME 为误删表名(如 t1)的记录。
  • 复制对应的系统生成名称 OBJECT_NAME(如 __recycle_$_1757091924_1777000065164040)。

2. 切换到原属数据库

  • 根据业务确认原表所属库(假设为 test2),执行:
USE test2;  -- ODC需在目标库界面操作  

3. 执行恢复命令

  • 情况A:原库无同名表(直接恢复)
FLASHBACK TABLE `__recycle_$_1757091924_1777000065164040` TO BEFORE DROP;  
  • 情况B:原库已有同名表(改名恢复)
FLASHBACK TABLE `__recycle_$_1757091924_1777000065164040` TO BEFORE DROP RENAME TO t1_bak;  

> 注意RENAME TO只能写新表名(如 t1_bak),不可加库名。

三、关键注意事项

1. 常见报错与解决方案

报错信息 原因分析 解决方案
ERROR 5270 (HY000): table 'xxx' is not in RECYCLE BIN 未在原属数据库下操作 执行 USE 后重试
ERROR 1046 (3D000): No database selected 未选择数据库 执行 USE
ERROR 1050 (42S01): Table 'xxx' already exists 原库存在同名表 使用 RENAME TO 新表名 改名恢复

2. 核心限制

  • 时间窗口:回收站对象默认保留7天(由参数 recyclebin_object_expire_time 控制),超期后自动清除。
  • 物理删除:执行 PURGE 后对象永久丢失,无法恢复。
  • DDL影响:若原表被删除后,原库执行过 ALTER DATABASE 等操作,恢复可能失败。

3. 风险规避

  • 恢复前务必验证 SHOW RECYCLEBIN 中的对象归属,避免误操作。
  • 改名恢复时,新表名需符合命名规范且无冲突。

四、替代方案

若回收站不可用(如对象已超期或被 PURGE):
1. 备份恢复表

ALTER SYSTEM RECOVER TABLE db_name.original_table  
TO TENANT target_tenant  
UNTIL TIME='误删前时间点';  
  • 适用场景:回收站失效或需恢复整库。
  • 前提:已配置备份策略且备份有效。

2. 租户级恢复

  • 通过备份将租户恢复到误删前状态,再导出目标表数据。

重要建议

  1. 关键业务必开回收站:执行 SET GLOBAL recyclebin = ON 并写入配置文件。
  2. 定期清理回收站:避免空间浪费(PURGE RECYCLEBIN;)。
  3. 与闪回查询互补使用
  • DELETE 误删 → 闪回查询(undo_retention 窗口内)
  • DROP 误删 → 回收站恢复(recyclebin 窗口内)
  • 超窗口场景 → 依赖备份恢复。

精选推荐