在Oracle 10g中,Flash back家族分爲以下成員:Flashback Database | Flashback Drop | Flashback Table | Flashback Query(Flashback Query,Flashback Version Query,Flashback Transaction Query)。
閃回刪除表(dropped tables):
語法:FLASHBACK TABLE table_name TO BEFORE DROP [RENAME TO new_name];
Flashback Drop 是從Oracle 10g 開始出現的, 用於恢復用戶誤刪除的對象(包括表,索引等), 這個技術依賴於Tablespace Recycle Bin(表空間回收站),這個功能和windows的回收站非常類似。這個功能和數據庫閃回沒有關係,和flashback參數沒有關係,表也不要求row movement.Flashback 不支持sys用戶.
system表空間下的對象,也不能從回收站裏拿到。故使用SYS 或者SYSTEM用戶登陸時,show recyclebin 爲空。
Flashback Drop 是從Oracle 10g 開始出現的, 用於恢復用戶誤刪除的對象(包括表,索引等), 這個技術依賴於Tablespace Recycle Bin(表空間回收站),這個功能和windows的回收站非常類似。這個功能和數據庫閃回沒有關係,和flashback參數沒有關係,表也不要求row movement.Flashback 不支持sys用戶. system表空間下的對象,也不能從回收站裏拿到。故使用SYS 或者SYSTEM用戶登陸時,show recyclebin 爲空。
Tablespace
Recycle Bin
從Oracle 10g 開始, 每個表空間都會有一個叫作回收站的邏輯區域,當用戶執行drop命令時, 被刪除的表和表的關聯對象( 包括索引, 約束,觸發器,LOB段,LOB index 段) 不會被物理刪除, 這些對象先轉移到回收站中,這就給用戶提供了一個恢復的可能。初始化參數recyclebin 用於控制是否啓用recyclebin功能,缺省是ON, 可以使用OFF關閉。
SQL> show user
USER is "SH"
SQL>
SQL> set linesize 400
SQL>
SQL> show parameter recyclebin
NAME TYPE VALUE
----------------------------- -------------------------- -----------------
recyclebin string on
SQL>
禁用與開始該功能可以使用下面SQL:
SQL> alter system set recyclebin=off;
System altered.
SQL>
SQL> show parameter recyclebin
NAME TYPE VALUE
---------------------------- -------------------------- ------------------
recyclebin string OFF
SQL>
SQL>
SQL> alter system set recyclebin=on;
System altered.
SQL>
禁用後刪除的對象將直接刪除,不會寫到recyclebin中,當然在刪除時,指定purge 參數,表也將直接刪除,不會寫到recyclebin中。
表空間的Recycle Bin 區域只是一個邏輯區域,而不是從表空間上物理的劃出一塊區域固定用於回收站,因此Recycle Bin是和普通對象共用表空間的存儲區域,或者說是Recycle Bin的對象要和普通對象搶奪存儲空間。當發生空間不夠時,Oracle會按照先入先出的順序覆蓋Recycle Bin中的對象。也可以手動的刪除Recycle Bin佔用的空間。
1).
Purge tablespace tablespace_name : 用於清空表空間的Recycle Bin
2). Purge tablespace tablespace_name user user_name: 清空指定表空間的Recycle Bin中指定用戶的對象
3). Purge recyclebin: 刪除當前用戶的Recycle Bin中的對象
4). Purge dba_recyclebin: 刪除所有用戶的Recycle Bin中的對象,該命令要sysdba權限
5). Drop table table_name purge: 刪除對象並且不放在Recycle Bin中,即永久的刪除,不能用Flashback恢復。
6). Purge index recycle_bin_object_name: 當想釋放Recycle bin的空間,又想能恢復表時,可以通過釋放該對象的index所佔用的空間來緩解空間壓力。 因爲索引是可以重建的。
實驗開始:
一:創建相關測試表
SQL> create table emp as select * from scott.emp;
Table created.
SQL>
SQL> alter table emp add constraint EMP_PK primary key(empno);
Table altered.
SQL>
SQL> select file_id,block_id,blocks from dba_extents where segment_name='EMP' and owner='SH';
FILE_ID BLOCK_ID BLOCKS
---------- ---------- ----------
4 57 8
SQL>
二:刪除測試表,查看recyclebin內容
SQL> drop table emp;
Table dropped.
SQL>
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP BIN$ArIUf4D4N7ngUAoKiBsT3A==$0 TABLE 2014-09-10:15:34:19
SQL>
SQL>
SQL> col segment_name format a50
SQL> col blocks format 99
SQL> select segment_name,blocks from user_segments where segment_name='BIN$ArIUf4D4N7ngUAoKiBsT3A==$0';
SEGMENT_NAME BLOCKS
-------------------------------------------------- ------
BIN$ArIUf4D4N7ngUAoKiBsT3A==$0 8
SQL>
可以看到,“回收站”已經有表信息了。
三:查看原來表佔的數據文件
SQL> col TABLESPACE_NAME format a40
SQL> col FILE_ID format 99
SQL> col BLOCK_ID format 99
SQL> col BYTES format 999999
SQL> col BLOCKS format 99
SQL> col RELATIVE_FNO format 99
SQL>
SQL> select * from dba_free_space where file_id=4 and block_id=57;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
---------------------------------------- ------- -------- ------- ------ ------------
USERS 4 57 65536 8 4
SQL>
通過dba_free_space視圖,可以到原來的數據文件塊已經清空數據了。
四:閃回刪除表
SQL> flashback table emp to before drop;
Flashback complete. NUMBER(2)
SQL> select count(*) from emp;
COUNT(*)
----------
14
SQL>
表是回來,但是查詢剛纔的索引,發現索引也回來了,但是索引的名稱改變了。
SQL> select index_name from user_indexes where table_name='EMP';
INDEX_NAME
------------------------------------------------------------------------------------------
BIN$ArIUf4D3N7ngUAoKiBsT3A==$0
SQL>
SQL> alter index "BIN$ArIUf4D3N7ngUAoKiBsT3A==$0" rename to "EMP_PK_";
Index altered.
SQL>
追求完美的我們,還是把索引名稱改回來吧!
問題1:如果這個時候emp表,已經有其他表佔用“emp”的表名了,怎麼辦?
flashback table T to before drop rename to T2;
那只有改名了,在閃回的時候。附上一些常用語法給大家
SQL> purge index idx_t; --清除某個索引所佔用的空間
SQL> purge tablespace users; --清除回收站裏屬於users表空間的對象所佔用的空間
SQL> purge user_recyclebin; --清除回收站裏屬於當前用戶的所有對象所佔用的空間
SQL> purge dba_recyclebin; --清除回收站裏所有的對象所佔用的空間