Oracle FlashBack 學習筆記

gdutllf2006發表於2011-08-07

這部分的內容,其實早在10年年初就學習過,也記錄了相關的筆記.但很多知識不用就慢慢被遺忘了.今天無意中聽到同事在討論問題:為什麼刪除了一個佔用空間大的表後,表空間並沒有釋放呢? 

職業的原因,自己在想Oracle Drop table的過程是怎麼實現的,是不是要做個跟蹤看下.後來想起在10g後,Oracle有了Flashback的功能,刪除表的時候會先放在RecycleBin中,並不真正的物理刪除,所以表空間dba_free_space是不是不會有變化?

今天重新翻了下之前的筆記,並做了試驗,發現dba_free_space也是會體現變化的,這是不是哪個環節理解上有問題,還需要再測試下.

 

目錄

1 Flashback Database 架構

2 Flashback Database

3 Flashback Drop

4 Flashback Query and Flashback Table

5 小結


#####################################################
1 Flashback Database 架構
#####################################################

Flashback Database 整個架構包括一個程式Recover Writer(RVWR)後臺程式,Flashback Database Log日誌和Flash Recovery Area

一旦資料庫啟用了Flash Database, RVWR程式會啟動,RVWR程式會向Flash Recovery Area內寫入Flashback Database Log, 這些日誌包括資料塊的"前映象"


#####################################################
2 Flashback Database
#####################################################

1 啟用Flashback Database


1.1 配置Flash Recovery Area

1)啟用Flash Recovery Area

Alter system set db_recovery_file_dest_size=1G scope=both;

Alter system set db_recovery_file_dest='/u01/backup/fb' scope=both;

注意這個目錄必須是Oracle:dba,屬主


col name format a32 heading 'Parameter'
col value format a32 heading 'Setting'
select name, value from v$parameter where name like '%flash%' or name like '%recovery%' order by name;


2) 啟用資料庫Flashback功能
資料庫必須處於歸檔模式

#重啟資料庫
startup mount(在Open下也可以開啟)

#檢查有沒有開啟Flashback功能
select name, current_scn, flashback_on from v$database;

#啟動Flashback功能
alter database flashback on;

#確認啟動
select name, current_scn, flashback_on from v$database;

#確認Flashback Log生成在/u01/backup/fb/目錄下,該目錄為OMF管理
> ll /u01/backup/fb/MOUSE/flashback
total 8020
-rw-r-----  1 oracle dba 8200192 Aug  2 16:32 o1_mf_65f0nym9_.flb

# 設定db_flashback_retention_target引數

Alter system set db_flashback_retention_target=1440 scope=both;
單位為分鐘

如果/u01/backup/fb/目錄下的空間不夠儲存一天的回退資料怎麼辦呢?
Override;

#開啟資料庫
Alter database open;


2 Flashback Database


1) 確認能夠恢復的時間點
SQL> desc v$flashback_database_log;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 OLDEST_FLASHBACK_SCN                               NUMBER
 OLDEST_FLASHBACK_TIME                              DATE
 RETENTION_TARGET                                   NUMBER
 FLASHBACK_SIZE                                     NUMBER
 ESTIMATED_FLASHBACK_SIZE                           NUMBER


OLDEST_FLASHBACK_SCN: 資料庫能回退的最早SCN

OLDEST_FLASHBACK_TIME: 資料庫能回退的最早時間

RETENTION_TARGET:當前系統設定引數

FLASHBACK_SIZE: Current size (in bytes) of the flashback data 當前的Flashback Log空間

ESTIMATED_FLASHBACK_SIZE: 為了達到Retention_target定義的要求,預計需要多大的空間,這個值用於指導設定Flash Recovery Area大小
這個會改變


2) Flashback database

Flashback Database 實際上是對資料庫的一個不完全恢復操作,因此需要關閉資料庫,重啟資料庫到Mount狀態;但與不完全恢復不同的是,它不需要執行restore操作。

flashback之前,先對資料庫做個備份
 
#backup database;

#Shutdown immediate

#startup mount


#flashback database to timestamp to_timestamp('2010-08-02 17:10:04','yyyy-mm-dd hh24:mi:ss');
如何精確到找到恢復時間點呢?SCN_TO_TIMESTATMP()函式可以將SCN號轉換成TimeStamp

如何找到某個操作的精確時間點,AUDIT?


#alter database open read only;

#select count(*) from xxx; 確認資料被找回

#shutdown immediate;

#Startup mount;

#alter database open resetlogs;

#backup database;

 

3 命令和檢視


1) 檢查是否啟用了Flashback database 功能
Select flashback_on from v$database

2) v$flashback_database_log

這個檢視用來描述Flashback log對Flash Recovery Area的佔用情況

select * from v$flashback_database_log;


3) v$flashback_database_stat
這個檢視用來對Flashback log的空間情況進行更細粒度的記錄和估計


4) Flashback命令
 
這個命令既可以在SQL*Plus中使用,也可以在RMAN中使用,
Flashback [device type = ] database
to [before] scn =
to [before] sequence = [ thread = ]
to [before] time = ''

Oracle允許使用3種方式指定回退的時間點,SCN,時間,日誌序列號,
TO     -- 代表回退到指定點
Before -- 代表恢復到指定點之前的一點就可以。

 

 

#####################################################
3 Flashback Drop
#####################################################

這個功能是從Oracle 10g開始出現的,用於恢復使用者誤刪的物件(表,索引)。這個技術依賴於Tablespace Recycle Bin(表空間回收).功能類似於Windows的回收站。

1 Tablespace Recycle Bin

從10g開始,每個表空間都會有一個叫作回收站的邏輯區域(佔用表空間所在的空間),當使用者執行Drop 命令時,被刪除的表和表的關聯物件(包括索引,約束,觸發器,LOB段,LOB Index段)
不會被物理刪除,而是先轉移到回收站中,使用Flashback Table命令可以恢復這個物件和所有的關聯物件。

不會物理清楚,是不是說明佔用的物理空間仍沒有釋放,從dba_free_space能否反映空間的變化呢?

預設情況下recyclebin功能是開啟的
SQL> show parameter recyclebin

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      on

show recyclebin 檢視Recyclebin的物件列表(注意 RecycleBin是表空間級的,每個表空間都對應一個RecycleBin物件池)

也可以透過檢視來檢視Recyclebin物件列表

select object_name, original_name from recyclebin;
既然是表空間級的,那這個語句反映的是哪個Recycelbin 池的內容呢?是執行語句的使用者的預設表空間吧;

可以像檢視普通表一樣,檢視Recycle Bin中的物件內容

select count(*) from "BIN$jOLWvgYhgyXgQOYKHREVtA==$0";

對Recyclebin中的物件執行DDL/DML動作是不允許的.

SQL> delete from "BIN$jOLWvgYhgyXgQOYKHREVtA==$0";
delete from "BIN$jOLWvgYhgyXgQOYKHREVtA==$0"
            *
ERROR at line 1:
ORA-38301: can not perform. DDL/DML over objects in Recycle Bin

 

2 Flashback Drop 操作

flashback table t to before drop;

如果在recyclebin中有同名的物件,如兩個表T都被刪除,則恢復:

flashback table "BIN$jOLWvgYhgyXgQOYKHREVtA==$0" to before drop;

在恢復表的同時還可以重新命名

flashback table t to before drop rename to t_bak;


Note: 一旦完成恢復,RecycleBin中的物件就消失

 

3 Recycle Bin的維護


Recycle Bin 是和普通物件共用表空間儲存區域的,或者說RecycelBin的物件要和普通物件搶奪儲存空間。如果發生空間不夠,Oracle會按照先入先出的順序,
也就是物件被刪除的時間順序覆蓋Recycle Bin中的物件。也可以透過如下辦法手動清除Recycle Bin佔用的空間。

1) #清空某個表空間的RecycleBin池
Purge tablespace tablespace_name;

2) #清空某個表空間內的某個使用者的物件
Purge tablespace tablespace_name user user_name;

3) 清除刪除當前使用者的物件
purge recyclebin

4) 清除所有使用者的物件
Purge dba_recyclebin

需要Sysdba許可權

5) Drop table xxx purge 永久刪除

6) purge index object_name  清除物件的關聯索引

 

4 Flashback Drop 的侷限性


Flashback drop 是一個非常實用的技術,減少了很多不完全恢復的需要。 但仍存在一些侷限性:
1) 只能用於非系統表空間和本地管理表空間

2) 不能對Recycle Bin中的物件執行DDL,DML操作,只支援查詢

3)物件的參考約束不會被恢復,也就是外來鍵約束需要重建

 


#####################################################
4 Flashback Query and Flashback Table
#####################################################
這些功能的實現也依賴於Flashback 功能的開啟嗎?是的;

Flashback Query 實際包含3個工具,即Flashback Query, Flashback Version Query 和 Flashback Transaction Query. 這些工具都是利用Undo的內容來實現回退功能。
前兩個屬於分析工具,用於找出想要回退到的時間點,而Flashback Table才真正完成回退的操作。

1 Flashback Query

#查詢過去某個時間點時的資料
select * from emp as of timestamp to_timestamp('2010-08-03 10:55:15','yyyy-mm-dd hh24:mi:ss');

# 恢復資料
Insert into emp select * from emp as of timestamp to_timestamp('2010-08-03 10:55:15','yyyy-mm-dd hh24:mi:ss');


2 Flashback Version Query

相對於Flashback Query只能看到某一點的物件狀態,Oracle 10g引入的Flashback Version Query可以看到過去某個時間段內,記錄如何變化的。
根據這個變化的歷史,可以決斷資料是在什麼時間點發生了錯誤。


#檢視錶EMP的操作歷史

col versions_xid format a16 heading 'XID'
col versions_startscn format 99999999 heading 'Vsn|Start|SCN'
col versions_endscn  format 99999999 heading 'Vsn|End|SCN'
col versions_operation format a12  heading 'Operation'
select versions_xid, versions_startscn, versions_endscn,
decode( versions_operation, 'I', 'Insert', 'U', 'Update', 'D', 'Delete', 'Original') "operation",
id, name
from emp
versions between scn minvalue and maxvalue;

注意結果主從下向上看。Original代表最開始的資料。

 

3 相關的偽列

1) ORA_ROWSCN
記錄最後一次被修改時的SCN, 這裡的修改是指"被提交的修改",如果沒有提交,那麼這個偽列不會發生變化。

ORA_ROWSCN 預設是資料塊級別的,也就是一個資料塊內的所有記錄都是一個ORA_ROWSCN. 資料塊內的任意一條記錄被修改,這個資料塊內的所有記錄ORA_ROWSCN都會同時改變。

透過在建表時使用關鍵字rowdependencies, 可以改變這我們預設行為。使用這個關鍵字後,每條記錄都有自己的ORA_ROWSCN.


建立表時,如果沒有使用rowdependencies關鍵字,則ORA_ROWSCN使用的是資料塊頭的SCN,因此在一個資料塊內所有記錄的ORA_ROWSCN都一樣。

如果使用了rowdependencies關鍵字,則每個記錄都有自己的ORA_ROWSCN。這個值來自於ITL或dscn欄位。

2)VERSIONS_STARTSCN
表示這行記錄獲得的值是在哪個SCN獲得的,如果為NULL,則表明這一行的值早於versions between scn MINVALUE and MAXVALUE中的MINVALUE。

3) VERSIONS_STARTTIME
同上

4) VERSIONS_ENDSCN
這行記錄的這個值是到哪個SCN過期的。

5) VERSIONS_TIME
同上

6) VERSIONS_XID
導致事務修改的事務號

7) VERSIONS_OPERATION
修改型別
U: update
I: insert
D: delete

兩個函式:

SCN_TO_TIMESTAMP(current_scn)
select current_scn,scn_to_timestamp(current_scn) curr_time  from v$database;


TIMESTAMP_TO_SCN('yyyy-mm-dd hh24:mi:ss1')


Notes

要使用Flashback Version Query, 使用者首先要有物件的Select, flashback許可權,對錶執行過DDL語句之後,就只能檢視DDL語句之後的版本,
也就是說Flashback Version Query 不會跨越DDL操作。
Oracle 11g有沒有改變,如果可以跨越DDL的話,就可以作為小範圍內的審計了;??

 

4 Flashback Transaction Query

Flashback Transaction Query 與Flashback Version Query類似,也是使用UNDO資訊來實現,利用這個功能可以檢視某個事務執行的所有變化。

使用這個功能,需要訪問Flashback_transaction_query檢視

select xid, operation, commit_scn, undo_sql
from flashback_transaction_query
where xid in(
select versions_xid
from emp
versions between scn minvalue and maxvalue);

XID              OPERATION                        COMMIT_SCN UNDO_SQL
---------------- -------------------------------- ---------- --------------------------------------------------------------------------------
0500260003030000 INSERT                              2160333 delete from "GZDC"."EMP" where ROWID = 'AAANPcAAEAAAABUAAB';
0500260003030000 BEGIN                               2160333
0A00050086020000 INSERT                              2160316 delete from "GZDC"."EMP" where ROWID = 'AAANPcAAEAAAABUAAA';
0A00050086020000 INSERT                              2160316 delete from "GZDC"."DEP" where ROWID = 'AAANPbAAEAAAABMAAA';
0A00050086020000 BEGIN                               2160316


可以看到每個事務的操作歷史。


5 Flashback table

Flashback table 真正進行資料的回退。
如果想對錶進行Flashback,必須允許row movement.

alter table t1 enable row movement;

flashback table emp,dep to scn xxxx;


6 UNDO Retention

UNDO_RETENTION引數定義的是提交修改後的UNDO記錄還要保留多長時間,但是Oracle並不強制保留,如果UNDO空間不夠,即使時間沒有達到限制,這些記錄還是會被覆蓋。

可以透過在UNDO表空間或者資料庫設定Retention Guanrantee來強制保留,預設沒有開啟這個功能。


select tablespace_name, retention from dba_tablespaces;
TABLESPACE_NAME                RETENTION
------------------------------ -----------
SYSTEM                         NOT APPLY
UNDOTBS1                       NOGUARANTEE
SYSAUX                         NOT APPLY
TEMP                           NOT APPLY
USERS                          NOT APPLY

alter tablespace UNDOTBS1 retention guarantee;

SQL> select tablespace_name, retention from dba_tablespaces;

TABLESPACE_NAME                RETENTION
------------------------------ -----------
SYSTEM                         NOT APPLY
UNDOTBS1                       GUARANTEE
SYSAUX                         NOT APPLY
TEMP                           NOT APPLY
USERS                          NOT APPLY

即使強制後,如果空間出現不夠時,如何處理?

 

#####################################################
5 小結
#####################################################

Flashback 家族技術總結:
工具 -- 相關技術 -- 目的
1) Flashback database -- Flashback Log -- 回滾資料庫

2) Flashback drop -- Tablespace Bin -- 恢復使用者誤刪的物件

3) Flashback Version Query -- UNDO -- 恢復使用者誤刪的操作

4) Flashback Transaction Query -- UNDO -- 恢復使用者誤刪的操作

5) Flashback table -- UNDO -- 恢復使用者誤刪的操作,在表級別上的操作

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10248702/viewspace-704337/,如需轉載,請註明出處,否則將追究法律責任。

相關文章