flashback drop(2015-2-3學習日記)

知識面是由知識點組成的,你在研究某一個知識點的時候經常會遇到另外一個知識點,而後你去研究那個知識點,又會帶出更多的知識點,最終組成了知識面。html

今天在看書的時候看到一個刪除表的語句:測試

DROP TABLE AAA CASCADE CONSTRAINTS PURGE;spa

平時本身刪除表,用的僅僅是DROP TABLE TABLENAME,後邊歷來沒加過這幾個參數,感受好奇就找了幾個資料研究了一番。htm

先說參數 CASCADE CONSTRAINTS對象

抄襲開始:blog

----------------------------------------------------------------------------get

關於 cascade constraintsstring

假設A爲主表(既含有某一主鍵的表),B爲從表(即引用了A的主鍵做爲外鍵)。flash

則當刪除A表時,如不特殊說明,則 drop table A 系統會出現錯誤警告的訊息而不會容許執行。table

此時必須用,drop table A cascade constraints;

SQL> select CONSTRAINT_NAME,TABLE_NAME from dba_constraints where owner = 'SYS' and TABLE_NAME = 'B'
no rows selected
咱們能夠發現利用Drop table cascade constraints能夠刪除從表的constraint來達成你drop table t的目的,原來屬於B的foreign key constraint已經跟隨着被刪除掉了,可是,儲存在table B中的資料不會被刪除,也就是說Drop table cascade constraints 是不影響到存儲於objec裏的row data。

--------------------------------------------------------------------------------------------------------------------------

再說參數 PURGE

這個參數比較有意思,看了幾篇文章才搞明白。

參考文章:

DROP TABLE ** CASCADE CONSTRAINTS PURGE

淺談Oracle閃回刪除表限制

========================【拿來主義】========================

Oracle從10G開始支持DDL語句閃回,免去了以前誤刪除(DROP)表後恢復起來很困難的麻煩。9i版本恢復誤刪除的表很困難,具體怎麼困難,我不知道。可是,10G後恢復就很簡單了,那就是Oracle提供了flashback drop新特性。

使用flashback drop功能的注意事項(一下狀況不能使用次功能):

1:表的存儲表空間不能爲system
2: 表被刪除的時候不能帶purge參數
3:存在空間壓力的時候
4:表上面啓用了細粒度審計
5:表啓用了VPD

(題外話:這個4和5對我來講又是新的知識點,哎,抽時間再研究吧。)

開啓回收站功能:

  1. SQL> show parameter recyclebin; 

  2. NAME                                 TYPE        VALUE 

  3. ------------------------------------ ----------- ------------------------------

  4. recyclebin                           string      on

實驗測試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,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  

閃回第一張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;      //清除任何表空間中的全部對象

相關文章
相關標籤/搜索