Oracle Recycle Bin 回收站详解:DROP TABLE 后还能找回吗?

一、先说结论

Oracle Recycle Bin 主要用于恢复 误执行 DROP TABLE 删除的表

它不是万能回收站,不能恢复所有对象。重点记住:

复制代码
DROP TABLE         看 Recycle Bin
DROP TABLE PURGE   看备份
DELETE / UPDATE    看 Undo
DROP VIEW          看脚本或备份

能不能恢复,不看过了几天,核心看:

复制代码
show recyclebin;
select * from user_recyclebin;
select * from dba_recyclebin;

里还在不在。

只要回收站里还能查到,并且:

复制代码
CAN_UNDROP = YES

一般就可以恢复。


二、回收站能恢复什么?

主要恢复的是:

复制代码
被 DROP 的表
表数据
表相关索引
LOB 段
LOB 索引
嵌套表
IOT 相关段

简单理解:表和表相关的存储对象可以进回收站。


三、回收站不能恢复什么?

以下对象通常不能靠 Recycle Bin 恢复:

复制代码
视图 VIEW
存储过程 PROCEDURE
函数 FUNCTION
包 PACKAGE
序列 SEQUENCE
同义词 SYNONYM
触发器 TRIGGER
TRUNCATE 清空的数据
DELETE / UPDATE 修改的数据
DROP TABLE PURGE 删除的表

特别注意:

复制代码
drop view 视图名;

普通视图不会进入回收站。视图误删后,一般只能从脚本、备份库、Data Pump、版本管理或 DDL 审计中找回定义。


四、查看回收站是否开启

复制代码
show parameter recyclebin;

本次测试环境中,GGMKBAK PDB 下已确认:

复制代码
recyclebin = on

说明回收站功能已开启。


五、普通删除和 purge 删除的区别

1. 普通删除:进入回收站,可恢复

复制代码
drop table 用户名.表名;

特点:

复制代码
进入回收站
表名变成 BIN$... 格式
仍占用原表空间
可以 flashback 恢复

恢复命令:

复制代码
flashback table 用户名.表名 to before drop;

2. purge 删除:彻底删除,不可恢复

复制代码
drop table 用户名.表名 purge;

特点:

复制代码
不进入回收站
直接释放空间
不能通过 flashback table 恢复
只能依赖备份恢复

六、怎么查看是否还能恢复?

DBA/SYS 查看全库回收站:

复制代码
select * from dba_recyclebin;

判断规则:

复制代码
查得到 + CAN_UNDROP = YES  → 可以尝试恢复
查不到                   → 不能靠回收站恢复

当前用户查看自己的回收站:

复制代码
show recyclebin;

或者:

复制代码
select * from user_recyclebin;

七、Recycle回收站保留规则

Oracle Recycle Bin 没有固定保留天数

不是:

复制代码
保留 7 天
保留 30 天
保留 90 天

而是取决于:

复制代码
是否手工 purge
表空间是否紧张
用户 quota 是否紧张
是否 drop table purge
是否 drop user cascade
是否 drop tablespace including contents

一句话:

回收站不是按时间保留,而是按空间和清理动作决定。能不能恢复,主要看 DBA_RECYCLEBIN 里对象还在不在。

可以理解为:**Oracle Recycle Bin 是自动管理的,但不是按固定时间自动清理。**回收站对象进入以后,Oracle 会先保留着;什么时候清掉,主要由空间压力、用户配额压力和人工清理动作决定。

Oracle 会在什么情况下自动清理?

  1. 表空间空间不够时

Oracle 为了给新对象分配空间,可能会自动清理回收站对象。

复制代码
表空间空间紧张
↓
Oracle 需要分配新空间
↓
自动 purge 回收站对象
↓
释放空间
  1. 用户 quota 不够时

如果这个用户后续建表空间不够,Oracle 也可能清理该用户回收站对象来释放 quota。

  1. 人工清理

八、回收站对象属于谁?

回收站按 对象所属 Schema 管理,不是按执行删除命令的人管理。

例如:

复制代码
drop table RB_TEST.RECYCLEBIN_TEST;

即使是 SYS 执行删除,回收站里显示的 owner 仍然是:

复制代码
RB_TEST

所以:

复制代码
show recyclebin;

只能看当前用户自己的回收站。

SYS/DBA 要看其他用户的回收站,要查:

复制代码
select * from dba_recyclebin;

九、常用清理命令---很少用

清理当前用户回收站:

复制代码
purge recyclebin;

清理指定表:

复制代码
purge table 表名;

清理指定表空间回收站对象:

复制代码
purge tablespace 表空间名;

清理全库回收站:

复制代码
purge dba_recyclebin;

生产环境不建议随便执行:

复制代码
purge dba_recyclebin;

因为这是全库级清理,清完后就不能通过回收站恢复了。


十、生产建议

建议保持:

复制代码
recyclebin = on

它可以防止误删表,是一个低成本保护机制。

但需要定期巡检回收站空间占用:

复制代码
select owner,
       ts_name,
       count(*) object_count,
       round(sum(space) * 8 / 1024, 2) space_mb
from dba_recyclebin
group by owner, ts_name
order by space_mb desc;

如果发现某个用户或表空间回收站占用过大,再确认后定向清理。


十一、最终总结

Oracle Recycle Bin 是 DROP TABLE 的临时保护机制,主要用于找回误删表及其相关存储对象。它不能恢复视图、过程、函数、序列等普通非表对象,也不能恢复 DELETE / UPDATE / TRUNCATE 操作。回收站没有固定保留时间,能否恢复不看过了几天,核心看 DBA_RECYCLEBIN 中对象是否仍存在,并且 CAN_UNDROP 是否为 YES。生产环境中,Recycle Bin 可以作为误删表的临时保险,但不能替代 RMAN、Data Pump 或存储备份。

相关推荐
大树8813 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠13 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质14 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush414 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52014 小时前
Linux 11 动态监控指令top
linux
Inhand陈工15 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智15 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
麦聪聊数据15 小时前
数据服务化时代:企业数据能力输出的核心路径
数据库
不会C语言的男孩15 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
ApacheSeaTunnel15 小时前
实战演示 | 基于 Apache SeaTunnel 与 Apache DolphinScheduler 实现 MySQL 到 Doris 离线定时增量同步
大数据·mysql·开源·doris·数据集成·seatunnel·数据同步