加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flashback drop后表空间不足直接删除回收站中删除表所占空间的演

发布时间:2020-12-15 17:56:20 所属栏目:百科 来源:网络整理
导读:结论: DROP表后还可以从回收站中查到表,但是在DBA_FREESPACE中已经把DROP的表的空间回收为可用了。 要是此时在表空间建表并空间不断增长,回收站中DROP表 最终会被覆盖或者叫被删除来释放空间,此时闪回DROP的表会报错 : ORA-38305: object not in RECYCL
结论:
DROP表后还可以从回收站中查到表,但是在DBA_FREESPACE中已经把DROP的表的空间回收为可用了。
要是此时在表空间建表并空间不断增长,回收站中DROP表 最终会被覆盖或者叫被删除来释放空间,此时闪回DROP的表会报错 ORA-38305: object not in RECYCLE BIN
如果创建的表空间是自动扩展的,则 会首先先将回收站中表彻底删除,如表空间内的可用空间还不够,才会自动扩展
实验如下:

1.建一个空间小点的表空间,表空间允许自动扩展。

SQL> create tablespace test1 datafile'/u01/app/oracle/oradata/bys001/test1.dbf' size 15m autoextend on;
Tablespace created
SQL> select file#,name,bytes/1024/1024 MB from v$datafile;
? ???FILE# NAME? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? MB
---------- -------------------------------------------------------------------------------- ----------
? ?? ?? ?1 /u01/app/oracle/oradata/bys001/system01.dbf? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?700
? ?? ?? ?2 /u01/app/oracle/oradata/bys001/sysaux01.dbf? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?570
? ?? ?? ?3 /u01/app/oracle/oradata/bys001/undotbs01.dbf? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?85
? ?? ?? ?4 /u01/app/oracle/oradata/bys001/users01.dbf? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?37.5
? ?? ?? ?5 /u01/app/oracle/oradata/bys001/example01.dbf? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???100
? ?? ?? ?6 /u01/app/oracle/oradata/bys001/catalog1.dbf? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 50
? ?? ?? ?7 /u01/app/oracle/oradata/bys001/test1.dbf? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 15
? ?? ?? ?8 /u01/app/oracle/oradata/bys001/bys_flashback.dbf? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???10

2.创建一个占空间大比较的表

SQL> create table test9 tablespace test1 as select * from dba_objects where 1=0;
Table created
SQL> select? tablespace_name,bytes/1024/1024 mb from dba_free_space where tablespace_name='TEST1';
TABLESPACE_NAME? ?? ?? ?? ?? ?? ?? ?? ?MB
------------------------------ ----------
TEST1? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 14??? ------- -test1表空间空闲大小是14M,
SQL> insert into test9 select * from dba_objects;
72751 rows inserted
SQL> select tablespace_name,bytes/1024/1024 mb from dba_free_space where tablespace_name='TEST1';
TABLESPACE_NAME? ?? ?? ?? ?? ?? ?? ?? ?MB
------------------------------ ----------
TEST1? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???5????? ----在test9表空间插入数据后,test1表空间空闲大小是5M
SQL> commit;
Commit complete
SQL> col segment_name for a15
SQL> col tablespace_name for a15
SQL> select segment_name,segment_type,tablespace_name,extents,bytes/1024 KB from dba_segments where segment_name like 'TEST9%';
SEGMENT_NAME? ? SEGMENT_TYPE? ?? ? TABLESPACE_NAME? ? EXTENTS? ?? ?? ?KB
--------------- ------------------ --------------- ---------- ----------
TEST9? ?? ?? ???TABLE? ?? ?? ?? ???TEST1? ?? ?? ?? ?? ?? ? 24? ?? ? 9216???? ---test9的大小是9M
SQL> select * from tab;
TNAME? ?? ?? ?? ?? ?? ?? ?? ???TABTYPE??CLUSTERID
------------------------------ ------- ----------
TEST9? ?? ?? ?? ?? ?? ?? ?? ???TABLE? ?

3.删除表并查询回收站

SQL> drop table test9;
Table dropped
SQL> select * from tab;
TNAME? ?? ?? ?? ?? ?? ?? ?? ???TABTYPE??CLUSTERID
------------------------------ ------- ----------
BIN$4LABIoAgQQ7gQFXeqEBxZg==$0 TABLE? ?

4.查询表空间的剩余空间,发现删除到回收站的表的空间在dba_free_space中已经被释放了。

SQL> select segment_name,bytes/1024 KB from dba_segments where segment_name like 'TEST9%';

SEGMENT_NAME? ? SEGMENT_TYPE? ?? ? TABLESPACE_NAME? ? EXTENTS? ?? ?? ?KB
--------------- ------------------ --------------- ---------- ----------

SQL>??select tablespace_name,sum(bytes/1024/1024) as freespace from dba_free_space where tablespace_name='TEST1' group by tablespace_name;

TABLESPACE_NAME??FREESPACE
--------------- ----------

TEST1? ?? ?? ?? ?? ?? ? 14?????????????????????? ---表空间空闲空间14M,回到test9插入数据前的状态

SQL>show recyclebin;
ORIGINAL NAME??? RECYCLEBIN NAME??????????????? OBJECT TYPE? DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST9??????????? BIN$5hvFkoUf4jjgQKjA0wFMJg==$0 TABLE??????? 2013-09-11:21:41:00

SQL> select count(*) from "BIN$4LABIoAgQQ7gQFXeqEBxZg==$0";
? COUNT(*)
----------
??? 72553

5.建一个占空间大的新表,发现回收站中删除表test9已经被彻底删除

SQL> create table test3 tablespace test1 as select * from dba_objects;
Table created
SQL> select * from tab;
TNAME? ?? ?? ?? ?? ?? ?? ?? ???TABTYPE??CLUSTERID
------------------------------ ------- ----------
TEST3? ?? ?? ?? ?? ?? ?? ?? ???TABLE??
SQL> select segment_name,bytes/1024 KB from dba_segments where segment_name like 'TEST3%';
SEGMENT_NAME? ? SEGMENT_TYPE? ?? ? TABLESPACE_NAME? ? EXTENTS? ?? ?? ?KB
--------------- ------------------ --------------- ---------- ----------
TEST3? ?? ?? ???TABLE? ?? ?? ?? ???TEST1? ?? ?? ?? ?? ?? ? 24? ?? ? 9216?? ? ----这里因为创建的表空间是15M,第一次创建的表是9M大小并删除到回收站。此时再创建一个9M的表,原表删除后只是标记为删除,剩余的6M不足以容纳现在创建的TEST3的9M,所以会删除回收站中的BIN$表。
SQL> select tablespace_name,bytes/1024/1024 mb from dba_free_space where tablespace_name='TEST1';
TABLESPACE_NAME? ?? ?? ?MB
--------------- ----------
TEST1? ?? ?? ?? ?? ?? ???5

6.此时执行闪回DROP,报这个错:

SQL> flashback table test9 to before drop;
flashback table test9 to before drop


ORA-38305: object not in RECYCLE BIN

7.test1表空间再创建一个9M大约的表,此时才会自动扩展表空间大小----这一步实验好像意义不大

。验证最前面的观点。

SQL> create table test4 tablespace test1 as select * from dba_objects; Table created SQL> select tablespace_name,bytes/1024/1024 mb from dba_free_space where tablespace_name='TEST1'; TABLESPACE_NAME? ?? ?? ?MB --------------- ---------- SQL> select file#,bytes/1024/1024 MB from v$datafile where file#=7; ? ???FILE# NAME? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? MB ---------- -------------------------------------------------------------------------------- ---------- ? ?? ?? ?7 /u01/app/oracle/oradata/bys001/test1.dbf? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 19

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读