注意事项:关闭回收站不会Purge已经在回收站中的对象。
二、回收站操作1.查看回收站内容
通过dba_recyclebin视图可查看回收站内容; 回收站中的对象名为BIN$打头,可以单独访问: SELECT * FROM "BIN$iB6Z3f+5QOGjw0iKVisLqg==$0"
2.开启/关闭回收站
ALTER SESSION/SYSTEM SET recyclebin = OFF SCOPE = SPFILE;
ALTER SESSION/SYSTEM SET recyclebin = ON SCOPE = SPFILE;
SYSTEM级别修改的话记得重启数据库!
三、通过Purge删除回收站的内容 purge的用处:1.purge table/index
1)purge+原始对象名
若回收站里有多个该对象的记录,系统会删除存在时间最久的那条记录。
eg.
① 新建表test12并删除(重复两次)
CREATE TABLE test12 (ID INT ,NAME VARCHAR(20));
DROP TABLE test12;
CREATE TABLE test12 (ID INT ,NAME VARCHAR(20));
DROP TABLE test12;
② 可以看到这张表在回收站里有两个版本的记录:
③ 删除回收站记录:
PURGE TABLE TEST12;
④ 可以看到,时间更早的记录被删除,稍晚的一条还保留:
2)purge+系统生成对象名
可以直接删除该对象($BIN打头的对象名是唯一的)
purge table "BIN$45AAQxL7ToqPBYeUevning==$0" ;
---注意这里是有双引号的!!!
2.purge+表空间名
1)清除指定表空间:
PURGE TABLESPACE users
2)清除表空间中指定用户的空间:
purge tablespace users user test;
3.purge+回收站名
1)清理当前用户下的回收站:
PURGE recyclebin;
---这里recyclebin就是user_recyclebin的同义词,数据字典差不多都是这个套路
2)清理整个回收站:
PURGE dba_recyclebin;
四、通过recover恢复回收站的内容
1.通过对象名来恢复
FLASHBACK TABLE test12 TO BEFORE DROP RENAME TO xxx;
注意:若一张表被删除多次,recover的是时间最新的一条记录。
2.通过系统分配的BIN$名字来恢复
FLASHBACK TABLE "BIN$lDtXq9XET3uBQFMHEdQJag==$0" TO BEFORE DROP RENAME TO xxx;
注意:
这里有个比较奇怪的情况。如果一张表上建有索引,将这张表recover后,索引名字恢复不了原来的名字,为BIN$打头,需要手动修改:
DROP TABLE test12;
FLASHBACK TABLE test12 TO BEFORE DROP;
SELECT * from Dba_Indexes WHERE TABLE_name='TEST12'
这里看到dba_indexes表里的INDEX_NAME还是旧的:
需要手动修改:
ALTER INDEX "BIN$vOK1sd8sS86Yvzbl4JVmTQ==$0" RENAME TO PK_TEST;
五、案例说明
该场景是为了说明定期清理回收站释放空间的必要性~
背景:数据库中的users表空间数据文件占用存储太多,但是实际上利用率仅 0.06%,需要清理Users表空间大小。
PS:USERS表空间不要放用户数据,我这个也是因为本地测试环境之前手抖扔了数据进去,这个原理等我理解了再来补充~
1.查看表空间使用率
原创文章 30获赞 10访问量 6669
关注
私信
展开阅读全文
作者:蓝田~