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

相关推荐
Zan1 小时前
SQLite + SQLx 实战:为什么已经发布的数据库迁移文件,绝对不能再修改?
数据库·后端·面试
2601_967987371 小时前
安装 Redis 或 Redis Stack
linux·windows·redis·macos·安装
feng_you_ying_li1 小时前
linux之数据链路层
linux·网络·智能路由器
修己xj2 小时前
服务器无法解析域名?一次 DNS 配置缺失的排查与修复
运维
这个DBA有点耶2 小时前
数据同步的三个工程底线:DDL同步、断点续传、一致性校验——开源CDC的边界与KFS的路径
数据库·dba·代码规范
GeW3 小时前
高端化走到深处,是数据库和Linux的事
linux
aiks_yuan3 小时前
MySQL GROUP BY 很慢怎么优化:加了索引反而从 1 秒变 7 秒,Using temporary 该不该消(MySQL 8.2 实测 400 万行)
mysql
SelectDB3 小时前
列式存储为什么适合分析类负载?原理、限制与日志场景应用
数据库
程序员初一4 小时前
Linux 远程桌面有四种做法
linux·ssh