標籤:scott 包括 回收 產生 selected 實施 tps sel color
轉載自:6105327
FLASHBACK DROP 特性允許在不丟失任何資料庫的情況下將指定的表恢複至其被刪除的時間點,並保持資料庫為目前狀態。閃回刪除並不是
真正的刪除表,而是把該表重新命名並清除,類似於Windows的資源回收筒一樣。當某個使用中的物件需要使用該表所佔用的空間時,該表才會被真
正刪除。只要空間未被複用,該表即可恢複。本文主要講述了FLASHBACK DROP特性以及閃回特性中資源回收筒(RECYCLEBIN)的管理。
一、FLASHBACK DROP 的功能
將先前刪除的表恢複到刪除之前的狀態恢複該表的索引以及觸發器,授權恢複該表的約束,包括唯一約束、主鍵約束、非空約束。外鍵約束不可恢複可以實現基於系統和基於會話的flash drop操作 alter system set recyclebin = on | off; alter session set recyclebin = on | off;drop table(oracle 10g)命令並不真正刪除表,在內部被映射為rename命令,即是將其重新命名之後清除。
二、理解表重名的過程
[email protected]> create table tb_emp as select * from emp; --基於emp表來建立表tb_emp[email protected]> alter table tb_emp add constraint empno_pk primary key(empno); --添加主鍵約束,將產生主鍵索引[email protected]> alter table tb_emp add constraint ename_uk unique(ename); --添加唯一約束,將產生唯一索引 [email protected]> alter table tb_emp add constraint sal_ck check(sal>0); --添加check約束[email protected]> alter table tb_emp modify job constraint job_nn not null; --添加非空約束[email protected]> alter table tb_emp add constraint dept_fk foreign key(deptno) references dept(deptno) on delete cascade; --添加外鍵約束[email protected]> select constraint_name,constraint_type from user_constraints where table_name=‘TB_EMP‘; --查看tb_emp表上的所有約束 CONSTRAINT_NAME C--------------- -EMPNO_PK PENAME_UK USAL_CK CJOB_NN CDEPT_FK R --下面查看錶tb_emp所在檔案的id,塊的起始id,大小,以及該對象的對象id等 [email protected]> select file_id,block_id,bytes from dba_extents where segment_name=‘TB_EMP‘; FILE_ID BLOCK_ID BYTES---------- ---------- ---------- 4 393 65536 [email protected]> select object_name,object_id from dba_objects where object_name = ‘TB_EMP‘; --查看錶tb_emp的對象ID OBJECT_NAME OBJECT_ID-------------------- ----------TB_EMP 54493 --對錶進行重新命名[email protected]> alter table tb_emp rename to tb_employees; [email protected]> select file_id,block_id,bytes from dba_extents where segment_name=‘TB_EMPLOYEES‘; --重新命名後所在檔案的id,塊的起始id,大小沒有發生變化 FILE_ID BLOCK_ID BYTES---------- ---------- ---------- 4 393 65536 [email protected]> select object_name,object_id from dba_objects where object_name = ‘TB_EMPLOYEES‘; --重新命名後對象ID沒有發生變化 OBJECT_NAME OBJECT_ID-------------------- ----------TB_EMPLOYEES 54493[email protected]> select index_name,index_type --重新命名後索引和約束也沒有發生變化 2 from user_indexes where table_name=‘TB_EMPLOYEES‘ 3 union all 4 select constraint_name,constraint_type 5 from user_constraints where table_name=‘TB_EMPLOYEES‘;INDEX_NAME INDEX_TYPE------------------------------ ---------------------------EMPNO_PK NORMALENAME_UK NORMALEMPNO_PK PENAME_UK USAL_CK CJOB_NN CDEPT_FK R從上面的示範可以看出對於表的重新命名僅僅是修改了表名,而對於表對象的ID,以及表存放的位置,塊的起始,大小等並未發生實質性的變化。
三、刪除表並實施閃回
--1.刪除表tb_employees並查看資源回收筒的資訊[email protected]> drop table tb_employees; [email protected]> select object_name,original_name,can_undrop,base_object from user_recyclebin;OBJECT_NAME ORIGINAL_NAME CAN BASE_OBJECT------------------------------ -------------------------------- --- -----------BIN$k1zC3yEiwZvgQAB/AQBRVw==$0 TB_EMPLOYEES YES 54493BIN$k1zC3yEhwZvgQAB/AQBRVw==$0 ENAME_UK NO 54493BIN$k1zC3yEgwZvgQAB/AQBRVw==$0 EMPNO_PK NO 54493[email protected]> select count(1) from "BIN$k1zC3yEiwZvgQAB/AQBRVw==$0"; --可以使用資源回收筒名來訪問對象,但要對對象加雙引號 COUNT(1)---------- 13--2.實施閃回並查看閃回後的情況[email protected]> flashback table tb_employees to before drop; --進行閃回 Flashback complete.[email protected]> select count(1) from tb_employees; --閃回後表存在並且可以訪問 COUNT(1)---------- 13[email protected]> select index_name,index_type --查看閃回後索引,約束的情況,發現其名稱仍然為BIN$名稱 2 from user_indexes where table_name=‘TB_EMPLOYEES‘ 3 union all 4 select constraint_name,constraint_type 5 from user_constraints where table_name=‘TB_EMPLOYEES‘;INDEX_NAME INDEX_TYPE------------------------------ ---------------------------BIN$k1zC3yEgwZvgQAB/AQBRVw==$0 NORMALBIN$k1zC3yEhwZvgQAB/AQBRVw==$0 NORMALBIN$k1zC3yEcwZvgQAB/AQBRVw==$0 PBIN$k1zC3yEdwZvgQAB/AQBRVw==$0 UBIN$k1zC3yEewZvgQAB/AQBRVw==$0 CBIN$k1zC3yEfwZvgQAB/AQBRVw==$0 C 從上面的查詢可以看出閃回之後索引約束的名字還是使用了以BIN開頭,由系統產生的名字,可以將其改回,但外鍵約束已經不存在了。--3.嘗試對錶DML操作[email protected]> insert into tb_employees(empno,ename,job,sal,deptno) select 9999,‘Robinson‘,‘DBA‘,3000,50 from dual; 1 row created. --可以成功插入,deptno列的外鍵約束已經被刪除,故deptno為號成功插入[email protected]> alter index "BIN$k1zC3yEgwZvgQAB/AQBRVw==$0" rename to EMPNO_PK; Index altered. --將BIN開頭的索引改回原來的名字,其餘的約束名修改在此省略--4.下面示範資料表空間不足時無法閃回表刪除的問題 [email protected]> select tablespace_name,sum(bytes/1024/1024) ||‘ M‘ 2 from dba_free_space where tablespace_name=‘TBS1‘ 3 group by tablespace_name; --資料表空間tbs1的可用空間為MTABLESPACE_NAME SUM(BYTES/1024/1024)||‘M‘------------------------------ ---------------------------------TBS1 .9375 M [email protected]> create table tb1 tablespace tbs1 as select * from dba_objects where rownum < 6000;[email protected]> select tablespace_name,sum(bytes/1024/1024) ||‘ M‘ 2 from dba_free_space where tablespace_name=‘TBS1‘ 3 group by tablespace_name; --在該資料表空間建立表tb1之後,可用空間為.25MTABLESPACE_NAME SUM(BYTES/1024/1024)||‘M‘------------------------------ ---------------------------------TBS1 .25 M[email protected]> drop table tb1; --將表tb1刪除[email protected]> show recyclebin; --刪除後的對象位於資源回收筒中ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME---------------- ------------------------------ ------------ -------------------TB1 BIN$k2oZsEiaG7LgQAB/AQAZMA==$0 TABLE 2010-10-25:12:05:18 [email protected]> select object_name,original_name,can_undrop, base_object from user_recyclebin;OBJECT_NAME ORIGINAL_N CAN BASE_OBJECT------------------------------ ---------- --- -----------BIN$k2oZsEiaG7LgQAB/AQAZMA==$0 TB1 YES 54531[email protected]> select tablespace_name,sum(bytes/1024/1024) ||‘ M‘ 2 from dba_free_space where tablespace_name=‘TBS1‘ 3 group by tablespace_name; --資料表空間tbs1顯示的可用空間已返還為1M --但並不是真正為M,在需要資料表空間時,將自動清除資源回收筒最老的對象,以滿足當前空間需求TABLESPACE_NAME SUM(BYTES/1024/1024)||‘M‘------------------------------ -------------------------------TBS1 .9375 M[email protected]> select tablespace_name,autoextensible --這個查詢可以看出資料表空間tbs1不能自動擴充 2 from dba_data_files where tablespace_name =‘TBS1‘;TABLESPACE_NAME AUT--------------- ---TBS1 NO[email protected]> create table tb2 tablespace tbs1 as select * from dba_objects --再次在資料表空間建立新表tb2 2 where rownum < 6000; [email protected]> show recyclebin; --此時資源回收筒中原來的表tb1記錄被自動清除[email protected]> select object_name,original_name,can_undrop, 2 base_object from user_recyclebin;no rows selected[email protected]> flashback table tb1 to before drop; --此時表tb1不能被閃回flashback table tb1 to before drop*ERROR at line 1:ORA-38305: object not in RECYCLE BIN
四、資源回收筒的管理
每個使用者都擁有自己的資源回收筒,且可以查看在自己模式中刪除的表使用purge命令可以永久刪除對象,回收空間purge命令的幾種常用形式 drop table tbname purge --直接刪除表,而不置於資源回收筒 purge table tbname --清除資源回收筒中的tbname表 purge index idx_name --清除資源回收筒中的索引idx_name purge tablespace tablespace_name --清除該資料表空間中所有已刪除的對象 purge tablespace tablespace_name user user_name --清除資料表空間中指定使用者刪除的對象 purge user_recyclebin --清除指定使用者已刪除的所有對象 purge dba_recyclebin --清除所有已刪除的對象
五、總結
通過對上述表的刪除及空間分配情況,總結如下:1.表的刪除被映射為將表的重新命名,然後將其置於資源回收筒2.表的索引,觸發器,授權閃回後將不受到影響.索引,觸發器名字可以根據需要變更回原來名稱3.對於約束,如果是外鍵約束,表刪除之後將不可恢複,其餘的約束不受影響4.如果要查詢資源回收筒中的對象,建議將對象名使用雙引號括起來5.閃回的實質並不能撤銷已提交的事務,而是構造倒退原有事務影響的另一個事務6.對於已經刪除的表如果在所在的資料表空間新增對象由於空間不足的壓力而被重用將導致閃回失敗7.對於資料表空間不足時,系統會自動清除資源回收筒中最老的對象,以滿足當前需求,即採用FIFO原則8.閃回表的常用方法 flashback table tbname to before drop ; flashback table tbname to before drop rename to newtbname; 第二條語句用於被刪除的表名已經被再次重用,故閃回之前必須將其改名為新表名,schema不變化9.如資源回收筒中存在兩個相同的原表名,則閃回時總是閃回最近的版本,如果閃回特定的表,需要指定 該表在資源回收筒中的名稱。如 flashback table "BIN$k1zC3yEiwZvgQAB/AQBRVw==$0" to before drop;10.flashback drop 不能閃回truncate命令截斷的表,而是只能恢複drop 之後的表11.flashback drop 不能閃回drop user scott cascade刪除方案的操作,此只能用flashback database12.在system資料表空間中儲存的表無法啟用flashback drop,且這些表會被立即刪除與資源回收筒相關兩個重要的視圖:dba_recyclebinuser_recyclebin
2.Oracle 閃回特性(FLASHBACK DROP & RECYCLEBIN)