flashback drop(2015-2-3学习日记)
??知识面是由知识点组成的,你在研究某一个知识点的时候常常会遇到另一个知识点,然后你去研究那个知识点,又会带出更多的知识点,最终组成了知识面。 ? 今天在看书的时候看到一个删除表的语句: ? DROP TABLE AAA CASCADE CONSTRAINTS PURGE; ? 平时自己删除表,用的仅仅是DROP TABLE TABLENAME,后边从来没加过这几个参数,感觉好奇就找了几个资料研究了一番。 先说参数 CASCADE CONSTRAINTS 抄袭开始: ---------------------------------------------------------------------------- 关于 cascade constraints 假设A为主表(既含有某一主键的表),B为从表(即引用了A的主键作为外键)。 则当删除A表时,如不特殊说明,则 drop table A 系统会出现错误警告的讯息而不会允许执行。 此时必须用,drop table A cascade constraints; SQL> select CONSTRAINT_NAME,TABLE_NAME from dba_constraints where owner = 'SYS' and TABLE_NAME = 'B'? -------------------------------------------------------------------------------------------------------------------------- 再说参数 PURGE 这个参数比较有意思,看了几篇文章才搞明白。 参考文章: DROP TABLE ** CASCADE CONSTRAINTS PURGE 浅谈Oracle闪回删除表限制 ========================【拿来主义】======================== Oracle从10G开始支持DDL语句闪回,免去了之前误删除(DROP)表后恢复起来很困难的麻烦。9i版本恢复误删除的表很困难,具体怎么困难,我不知道。但是,10G后恢复就很简单了,那就是Oracle提供了flashback drop新特性。 使用flashback drop功能的注意事项(一下情况不能使用次功能): 1:表的存储表空间不能为system (题外话:这个4和5对我来说又是新的知识点,哎,抽时间再研究吧。) 开启回收站功能:
实验测试flashback drop功能: ? ? 创建表AAA: SQL> create table aaa (name varchar2(20)); ? Table created 向表AAA插入数据: SQL> insert into aaa values ('1234'); ? 1 row inserted ? SQL> insert into aaa values ('1234'); ? 1 row inserted 查询数据: SQL> select * from aaa; ? NAME -------------------- 1234 1234 查询user_recyclebin中有没有关于AAA的记录: SQL> select * from user_recyclebin where original_name ='AAA'; ? OBJECT_NAME ? ? ? ? ? ? ? ? ? ?ORIGINAL_NAME ? ? ? ? ? ? ? ? ? ?OPERATION TYPE ? ? ? ? ? ? ? ? ? ? ?TS_NAME ? ? ? ? ? ? ? ? ? ? ? ?CREATETIME ? ? ? ? ?DROPTIME ? ? ? ? ? ? ? DROPSCN PARTITION_NAME ? ? ? ? ? ? ? ? ? CAN_UNDROP CAN_PURGE ? ?RELATED BASE_OBJECT PURGE_OBJECT ? ? ?SPACE ------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ---------- ?(没有数据) 删除AAA: SQL> drop table aaa; ? Table dropped ? SQL> select * from user_recyclebin where original_name ='AAA'; ? OBJECT_NAME ? ? ? ? ? ? ? ? ? ?ORIGINAL_NAME ? ? ? ? ? ? ? ? ? ?OPERATION TYPE ? ? ? ? ? ? ? ? ? ? ?TS_NAME ? ? ? ? ? ? ? ? ? ? ? ?CREATETIME ? ? ? ? ?DROPTIME ? ? ? ? ? ? ? DROPSCN PARTITION_NAME ? ? ? ? ? ? ? ? ? CAN_UNDROP CAN_PURGE ? ?RELATED BASE_OBJECT PURGE_OBJECT ? ? ?SPACE ------------------------------ -------------------------------- --------- ------------------------- ------------------------------ ------------------- ------------------- ---------- -------------------------------- ---------- --------- ---------- ----------- ------------ ---------- BIN$ljh1zkU8SUqaTs8kGHS6mg==$0 AAA ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?DROP ? ? ?TABLE ? ? ? ? ? ? ? ? ? ? TS_FPZX_DAT ? ? ? ? ? ? ? ? ? ?2015-02-03:16:50:10 2015-02-03:16:51:05 ? 29344784 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?YES ? ? ? ?YES ? ? ? ? ? ?94499 ? ? ? 94499 ? ? ? ?94499 ? ? ? ? ?8 再次查询表(已经被删除) SQL> select * from aaa; ? select * from aaa ? ORA-00942: 表或视图不存在 再次建立表AAA: SQL> create table aaa (name varchar2(20)); ? Table created 插入数据: SQL> insert into aaa values ('abcd'); ? 1 row inserted ? SQL> insert into aaa values ('abcd'); ? 1 row inserted 不查询了,直接删除吧: SQL> drop table aaa; ? Table dropped 再次查询变化: SQL> select OBJECT_NAME,ORIGINAL_NAME,OPERATION,TYPE,CREATETIME,DROPTIME from user_recyclebin where original_name ='AAA'; ? OBJECT_NAME ? ? ? ? ? ? ? ? ? ?ORIGINAL_NAME ?OPERATION ? ?TYPE ? CREATETIME ? ? ? ? ? ?DROPTIME ? ? ? ? ? ? ? ? ------------------------------ ------------- --------- --------- ----------------- ? ? ----------------- BIN$ljh1zkU8SUqaTs8kGHS6mg==$0 AAA ? ? ? ? ? ? DROP ? ? ? TABLE ? 2015-02-03:16:50:10 ?2015-02-03:16:51:05 ? ? ? ? ? ? BIN$pk7Yt+SeRhOpF7UvsMuTrg==$0 AAA ? ? ? ? ? ? DROP ? ? ? TABLE ? 2015-02-03:16:52:04 ?2015-02-03:16:52:20 ? 此时user_recyclebin中有两条关于AAA的记录,我们此时要是用语句恢复数据的话,恢复的是第二次删除的表中的数据: SQL> flashback table aaa to before drop; ? Done 查询数据: SQL> select * from aaa; ? NAME -------------------- abcd abcd 此时user_recyclebin 表中只剩一条数据了,这个数据中的表AAA,保存的就是第一张表里边的‘1234’的数据。我们来还原它的话需要另命名,因为已经恢复了AAA: SQL> select OBJECT_NAME,DROPTIME from user_recyclebin where original_name ='AAA'; ? OBJECT_NAME ? ? ? ? ? ? ? ? ? ?ORIGINAL_NAME ?OPERATION ? ?TYPE ? CREATETIME ? ? ? ? ? ?DROPTIME ? ? ? ? ? ? ? ? ------------------------------ ------------- --------- --------- ----------------- ? ? ----------------- BIN$ljh1zkU8SUqaTs8kGHS6mg==$0 AAA ? ? ? ? ? ? DROP ? ? ? TABLE ? 2015-02-03:16:50:10 ?2015-02-03:16:51:05 ? 闪回第一张AAA,加上rename关键字: SQL> flashback table aaa to before drop rename to AAA2; ? Done 查询数据: SQL> select * from aaa2; ? NAME -------------------- 1234 1234 另: >>>>>>PURGE TABLESPACE USER SCOTT; ?//清除特定表空间特定用户的回收站 >>>>>>PURGE DBA_RECYCLEBIN; ? ? ?//清除任何表空间中的所有对象 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |