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

相关推荐
L·S·P18 小时前
25MB 管理 100+ 种数据库:开源轻量客户端 DBX 介绍与上手
数据库·mysql·开源·database·dbx
网硕互联的小客服20 小时前
Linux服务器磁盘应该如何合理分区?
linux·运维·服务器
楚识科技20 小时前
合同比对全流程自动化:OCR识别+差异比对+法律风险字段抽取实战指南
运维·自动化·ocr
笃行35021 小时前
KingbaseES KSQL Developer 的连接管理、数据处理与对象管理
数据库
代码方舟21 小时前
零信任架构实战:基于天远人企关联构建自动化供应链金融网关
运维·人工智能·架构·自动化
ha_lydms21 小时前
MaxCompute中加密与解密函数
大数据·数据库·数据仓库·hadoop·dataworks·maxcompute·odps
Shadow(⊙o⊙)21 小时前
MySQL内置函数
数据库·mysql
笃行3501 天前
金仓 KingbaseES PL/SQL 开发全攻略:异常处理、数据类型、调试优化与过程语句
数据库
贵沫末1 天前
Ubuntu——常用软件安装
linux·运维·ubuntu
夜雪一千1 天前
MySQL 常用 DEFAULT 默认值一览表
mysql