设为首页 收藏本站
查看: 503|回复: 0

[经验分享] Oracle中recyclebin的保留策略

[复制链接]

尚未签到

发表于 2016-7-26 09:12:02 | 显示全部楼层 |阅读模式
我们知道,Oracle 10g引入了recyclebin的概念,当我们删除一个表的时候,若不指定purge,系统只是将这个表重命名为BIN$开头的名称,并在数据字典中修改相关的数据。
Administrator's Guide中是这么描述recyclebin的:recycle bin实际上是一个包含了删除的对象的相关信息的数据字典表。被删除的表以及相关的对象(比如索引、约束、嵌套表等等)并没有被移除,并且依然占用着空间。它们会继续使用用户的空间配额,直到明确将它们从回收站中清除,或者是另一种很少见的情况:由于表空间的空间限制,数据库必须将它们清除。
由此我们可以知道,在Oracle 10g以后,若启用了recyclebin功能,当你drop一个表的时候,它会仍然占用着原来的空间。
我们可以使用user_recyclebindba_recyclebin来查看回收站中的对象信息,或者使用recyclebin,它是user_recyclebin的公共同义词。
文档中提到了,除了手动purge,这些回收站中的对象只有在表空间出现空间不足情况时才会被清除。我们可以做个测试(测试环境为RAC10.2.0.1+ASM)

新建一个表空间,给它20m的容量
SQL> create tablespace test1 datafile size 20m;Tablespace created.

然后我们在这个表空间上创建一个测试表a
SQL> create table w1.a tablespace test1 as select * from dba_objects;Table created.SQL> select owner,segment_name,round(bytes/1024/1024,2)||' MB' m from dba_segments where tablespace_name='TEST1';OWNER SEGMENT_NAME M------------ ---------------------------------------------------------------------------------------W1 A 6 MBSQL>
一张表占用6M空间,我们再创建2张一样的测试表
SQL> create table w1.b tablespace test1 as select * from dba_objects;Table created.SQL> create table w1.c tablespace test1 as select * from dba_objects;Table created.SQL> select round(sum(bytes)/1024/1024,2)||' MB' from dba_segments where tablespace_name='TEST1';ROUND(SUM(BYTES)/1024/1024,2)||'MB'-------------------------------------------18 MB

此时表空间已经使用了18M。这时我们把这三张表都删除
SQL> drop table w1.a;Table dropped.SQL> drop table w1.b;Table dropped.SQL> drop table w1.c;Table dropped.SQL> select owner,object_name,original_name from dba_recyclebin where ts_name='TEST1';OWNER OBJECT_NAME------------------------------ ------------------------------ORIGINAL_NAME--------------------------------W1 BIN$r6HZooW/xpzgQKjAb01Spw==$0BW1 BIN$r6HZooW+xpzgQKjAb01Spw==$0AW1 BIN$r6HZooXAxpzgQKjAb01Spw==$0CSQL> col owner format a4SQL> col segment_name format a35SQL> col m format a10SQL> select owner,segment_name,round(bytes/1024/1024,2)||' MB' m from dba_segments where tablespace_name='TEST1';OWNE SEGMENT_NAME M---- ----------------------------------- ----------W1 BIN$r6HZooXAxpzgQKjAb01Spw==$0 6 MBW1 BIN$r6HZooW+xpzgQKjAb01Spw==$0 6 MBW1 BIN$r6HZooW/xpzgQKjAb01Spw==$0 6 MBSQL>
可以看到,3张表到了回收站中,空间也没有释放。
此时20m的表空间还剩余2m可用,如果我再创建一张同样的表呢
SQL> alter session set tracefile_identifier='rctest';Session altered.SQL> alter session set sql_trace=true;Session altered.SQL> create table w1.d tablespace test1 as select * from dba_objects;Table created.SQL> alter session set sql_trace=false;Session altered.SQL> select owner,object_name,original_name from dba_recyclebin where ts_name='TEST1';OWNE OBJECT_NAME ORIGINAL_NAME---- ------------------------------ --------------------------------W1 BIN$r6HZooW/xpzgQKjAb01Spw==$0 BW1 BIN$r6HZooXAxpzgQKjAb01Spw==$0 C  

可以看到,A表被干掉了。我们看看从trace文件里能找到些什么
执行create table前,系统先查询test1表空间是否online。执行create table时,先检查相同的命名空间中是否已经存在相同的名称。接下来开始更新相关的数据字典,准备插入数据。此时发现空间不够,怎么办?注意下面的信息:
  
select obj#, type#, flags, related, bo, purgeobj, con#
from
RecycleBin$ where ts#=:1 and to_number(bitand(flags, 16)) = 16 order
by dropscn

注意这个排序:order by dropscn
  接下来Oracle做了什么呢:
  
drop table "W1"."BIN$r6HZooW+xpzgQKjAb01Spw==$0" purge

删除了这个表以后,更新相关的数据字典,并插入新的数据
  
  我们可以得出这样的结论:当删除表的时候,若不指定purge,会将表放入到回收站中。在创建新的段时,若表空间中没有足够的剩余空间,Oracle会按dropscn顺序从回收站中删除一些对象。如果数据文件指定了autoextend,那么这个优先级次序是:先删除回收站中的对象,再扩展数据文件

在删除用户的时候,系统首先从回收站中purge相关的表,然后对用户下的表采用如下的删除命令
  
drop table "W1"."D" cascade constraints purge force

然后释放掉所占用的空间

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249435-1-1.html 上篇帖子: oracle安装过程中若干个说明 下篇帖子: Oracle 中文记录 及 乱码 判断 说明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表