• Oracle中recyclebin的保留策略


    我们知道,Oracle 10g引入了recyclebin的概念,当我们删除一个表的时候,若不指定purge,系统只是将这个表重命名为BIN$开头的名称,并在数据字典中修改相关的数据。        Administrator's Guide中是这么描述recyclebin的:recycle bin实际上是一个包含了删除的对象的相关信息的数据字典表。被删除的表以及相关的对象(比如索引、约束、嵌套表等等)并没有被移除,并且依然占用着空间。它们会继续使用用户的空间配额,直到明确将它们从回收站中清除,或者是另一种很少见的情况:由于表空间的空间限制,数据库必须将它们清除。        由此我们可以知道,在Oracle 10g以后,若启用了recyclebin功能,当你drop一个表的时候,它会仍然占用着原来的空间。        我们可以使用user_recyclebin或dba_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 MB    SQL> 

    一张表占用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==$0  B    W1 BIN$r6HZooW+xpzgQKjAb01Spw==$0  A    W1 BIN$r6HZooXAxpzgQKjAb01Spw==$0  C    SQL> col owner format a4  SQL> col segment_name format a35  SQL> col m format a10  SQL> 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 MB  W1 BIN$r6HZooW+xpzgQKjAb01Spw==$0 6 MB  W1 BIN$r6HZooW/xpzgQKjAb01Spw==$0 6 MB    SQL> 

    可以看到,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 B  W1 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

    然后释放掉所占用的空间

  • 相关阅读:
    Spring Cloud Gateway配置自定义异常返回
    C#开机启动,托盘图标等小功能
    微信内置浏览器搞事情之调试模式
    物联网架构成长之路(56)-SpringCloudGateway+JWT实现网关鉴权
    物联网架构成长之路(55)-Gateway+Sentinel实现限流、熔断
    物联网架构成长之路(53)-Sentinel流量控制中间件入门
    物联网架构成长之路(54)-基于Nacos+Gateway实现动态路由
    物联网架构成长之路(52)-基于Nacos+prometheus+grafana的监控
    物联网架构成长之路(51)-Nacos微服务配置中心、服务注册服务发现
    物联网架构成长之路(50)-EMQ配置SSL证书,实现MQTTs协议
  • 原文地址:https://www.cnblogs.com/arcer/p/3202313.html
Copyright © 2020-2023  润新知