1、oracle中有recyclebin表,用来保存用户删除的表的相关信息,相当于回收站。在recyclebin打开的情况下,用户drop掉的对象并没有被数据库删除,仍然会占用空间,除非用户手工进行purge或因为存储空间不够而被数据库清掉。
show parameter recyclebin;
--运行该SQL可以知道recyclebin这个表是否是开启的
a、recycle bin有dba_recyclebin和user_recyclebin两种视图
dba_recyclebin放置所有用户drop掉的对象,不含system表空间,包含以下字段
OWNER --drop掉的对象所属的用户 OBJECT_NAME --对象名,命名规范是BIN$unique_id$version,BIN代表RecycleBin,unique_id是数据库中该对象的唯一标志,24个字符长度,version表示该对象的版本号 ORIGINAL_NAME --原始表名 OPERATION --操作,有drop TYPE --类型,有index、table、lob、lob index TS_NAME --用户类型,有TS_ODS、USERS CREATETIME --创建时间 DROPTIME --drop时间 DROPSCN --drop的scn号 PARTITION_NAME CAN_UNDROP CAN_PURGE RELATED BASE_OBJECT PURGE_OBJECT SPACE
user_recyclebin放置当前用户drop掉的对象,字段比 dba_recyclebin少了一个OWNER
b、利用flashback还原回收站内容
语法:FLASHBACK TABLE [已删除TABLE名|”RECYCLEBIN中的名字”] TO BEFORE DROP;
flashback table "BIN$KI5DFtx9TnyUTUiZIuC8YA==$0" to before drop;
--这里是OBJECT_NAME,也可以是ORIGINAL_NAME
--再把这个表删除了通过ORIGINAL_NAME恢复也是一样的
flashback table sell to before drop;
--这里是ORIGINAL_NAME
c、如果有几个的ORIGINAL_NAME都是一样的,通过ORIGINAL_NAME恢复,只能恢复最后被drop掉的对象;若想明确某个对象就通过OBJECT_NAME恢复。
如果在数据库中存在和回收站相同对象名的表时,恢复回收站的对象时需要rename对选哪个名。如数据库中存在一个表名为atest,回收站中也存在一个atest
flashback table atest to before drop; --flashback table "BIN$6b6dC4BIR9CZLSfGZWvrVQ==$0" to before drop; --使用object_name或origin_name都会出现错误
flashback table atest to before drop rename to atest_bak;
--atest是原始名,atest_bak是重新的命名
d、清空回收站,之后不可以通过回收站恢复清空的数据
purge table stest; --清空某个特定对象,stest是表名
purge user_recyclebin; --purge dba_recyclebin;需要改用户拥有系统权限,否则不允许清空
参考文章https://blog.csdn.net/u010098331/article/details/50782395