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 或存储备份。

相关推荐
zt1985q21 小时前
本地部署开源智能家居集成平台 ioBroker 并实现外部访问( Windows 版本)
运维·服务器·智能家居
云和恩墨21 小时前
数据库一体机简史:从ODA到zData X,命名之中的玄机
数据库·vr
万亿少女的梦16821 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
万亿少女的梦16821 小时前
基于SpringBoot与Vue的历史博物馆展品展示与游客管理系统设计
spring boot·mysql·vue·系统设计·博物馆管理系统
大卡片21 小时前
linux内核驱动开发
linux·运维·驱动开发
数据库小学妹1 天前
KES是什么?国产数据库技术架构、核心能力与选型实战解析
数据库·经验分享·架构·国产数据库·数据库选型·信创数据库
衍生星球1 天前
SpringBoot3 + Vue3 + 微信小程序如何学习,以及学哪些技术,组件
sql·微信小程序·uni-app·vue·springboot
心心喵1 天前
[linux] nohup和pm2的区别 进程保活
linux·运维·服务器
Database_Cool_1 天前
向量检索加速首选:阿里云 Tair 内置向量能力毫秒级召回
数据库·阿里云
强健的石头1 天前
django文件对象是什么?
数据库·django·sqlite