摘 要: 在Oracle 9i之前的版本,要恢復(fù)用戶(hù)誤操作的數(shù)據(jù),必須通過(guò)邏輯備份或者物理備份進(jìn)行恢復(fù)以糾正錯(cuò)誤,這種方法是極其復(fù)雜和低效的。為提高數(shù)據(jù)庫(kù)的可用性,從Oracle 9i開(kāi)始引入了閃回技術(shù),使數(shù)據(jù)恢復(fù)的方式和手段更加豐富,操作更加簡(jiǎn)易。主要分析介紹Oracle閃回技術(shù)的概念、功能,并結(jié)合實(shí)例介紹閃回技術(shù)在數(shù)據(jù)恢復(fù)中的應(yīng)用。
關(guān)鍵詞: Oracle 9i;Oracle 10g;閃回技術(shù);數(shù)據(jù)恢復(fù)
Oracle數(shù)據(jù)庫(kù)是世界上最流行的關(guān)系數(shù)據(jù)庫(kù)之一。由于它的系統(tǒng)可移植性好、使用方便、功能強(qiáng),在國(guó)內(nèi)外企事業(yè)單位中應(yīng)用廣泛。本文介紹了Oracle閃回技術(shù),它最大的特點(diǎn)是能實(shí)現(xiàn)自動(dòng)備份,有效減少管理開(kāi)銷(xiāo)。數(shù)據(jù)庫(kù)發(fā)生故障具有隨機(jī)性,大多數(shù)情況下沒(méi)有事先人為備份,這時(shí)就可以利用閃回技術(shù)快捷方便地恢復(fù)數(shù)據(jù)。從Oracle 9i推出閃回查詢(xún)(Flashback Query)特性,到Oracle 10g閃回技術(shù)得到了進(jìn)一步的發(fā)展。隨著閃回功能不斷擴(kuò)充和加強(qiáng),新的應(yīng)用也大量出現(xiàn)在系統(tǒng)管理中。
1 Oracle 9i閃回技術(shù)的數(shù)據(jù)恢復(fù)
1.1 Oracle 9i閃回技術(shù)原理
在Oracle 9i中,閃回技術(shù)確切地說(shuō)是閃回查詢(xún)(Flashback Query)。閃回查詢(xún)可以按照時(shí)間戳或SCN向前查詢(xún),獲取回滾段(undo)中的數(shù)據(jù)鏡像。自動(dòng)回滾段管理(AUM)是Oracle 9i引入的新特性,閃回查詢(xún)必須依賴(lài)于它。之前的Oracle數(shù)據(jù)庫(kù)版本,在事務(wù)提交后,段中的數(shù)據(jù)鏡像是可以被覆蓋的。而現(xiàn)在可以在自動(dòng)回滾段管理模式下調(diào)整參數(shù)UNDO_RETENTION設(shè)置數(shù)據(jù)庫(kù)UNDO信息的最大可以閃回查詢(xún)的時(shí)間段,只要在這個(gè)時(shí)間范圍內(nèi)數(shù)據(jù)鏡像沒(méi)有被覆蓋,數(shù)據(jù)被恢復(fù)的可能性是比較大的,就算不能完全恢復(fù),也至少可以恢復(fù)到某個(gè)時(shí)間點(diǎn)比較好的狀態(tài)[1-3]。同時(shí),UNDO信息被覆蓋也跟UNDO表空間的存儲(chǔ)空間大小有關(guān)。
閃回查詢(xún)?cè)谑褂们?,?shù)據(jù)庫(kù)要處于Automatic Undo Management狀態(tài)。
SQL>show parameter undo_management
NAME TYPE VALUE
--------------------------
undo_management string AUTO
最大可以閃回查詢(xún)的時(shí)間段可以在UNDO_RETENTION 參數(shù)(單位為秒)中設(shè)置。
SQL>show parameter undo_retention
NAME TYPE VALUE
------------------------
undo_retention integer 10800
Oracle 9i是基于時(shí)間點(diǎn)的閃回,需要查詢(xún)SCN或時(shí)間戳。若要獲得當(dāng)前的SCN必須確保用戶(hù)對(duì)DBMS_FLASHBACK包有執(zhí)行的權(quán)限:grant execute on dbms_flashback to User[4-6]。除了查詢(xún)SCN估算向前進(jìn)行查詢(xún),還可以根據(jù)事務(wù)提交時(shí)間估算向前推移查詢(xún)。由于一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)表SMON_SCN_TIME構(gòu)建了SCN→TIME的跟蹤關(guān)系,而且不同實(shí)例只能維護(hù)一個(gè)SCN→TIME的映射關(guān)系。數(shù)據(jù)庫(kù)通過(guò)后臺(tái)監(jiān)控進(jìn)程SMON每隔5分鐘更新一次表,記錄一次時(shí)間戳和當(dāng)前的SCN。此表總共能記錄保存1 440條記錄,相當(dāng)于5天的信息。
1.2 數(shù)據(jù)恢復(fù)應(yīng)用
下面從一個(gè)誤操作實(shí)例看Oracle 9i閃回技術(shù)是如何恢復(fù)數(shù)據(jù)的。在用戶(hù)GERENZHULI下復(fù)制一張表:create table test as select * from relation。初始時(shí)test表有9個(gè)用戶(hù)記錄,由于疏忽刪除幾條數(shù)據(jù)記錄,現(xiàn)將其還原。
(1)誤操作之后,查詢(xún)當(dāng)前的數(shù)據(jù)記錄為5條。
(2)查詢(xún)獲得當(dāng)前的SCN。
SQL>select dbms_flashback.get_system_change_number scn from dual;
SCN
----------------
5664842
(3)為數(shù)據(jù)恢復(fù)創(chuàng)建一張表test_for_recov,供數(shù)據(jù)閃回時(shí)插入記錄。
SQL> create table test_for_recov as select * from test where 1=0;
表已創(chuàng)建。
(4)選擇一個(gè)比當(dāng)前小的SCN,向前恢復(fù)數(shù)據(jù),多次嘗試SCN值,以獲得滿(mǎn)足自己需要的數(shù)據(jù)狀態(tài)。
SQL> select count(*) from test as of scn 5659000;
COUNT(*)
----------------------------
9
(5)從上面SCN的嘗試,利用閃回技術(shù)恢復(fù)數(shù)據(jù),將數(shù)據(jù)插入到表test_for_recov。
SQL> insert into test_for_recov select * from test as of scn 5659000;
已創(chuàng)建9行。
SQL> commit;
提交完成。
至此,將數(shù)據(jù)恢復(fù)到了誤操作之前的狀態(tài)。
2 Oracle 10g閃回技術(shù)的數(shù)據(jù)恢復(fù)
2.1 參數(shù)設(shè)置
Oracle 10g閃回技術(shù)主要包括閃回?cái)?shù)據(jù)庫(kù)﹑閃回表﹑閃回刪除﹑閃回查詢(xún)﹑閃回版本查詢(xún)和閃回事務(wù)查詢(xún)[2,5]。使用閃回技術(shù)前,首先設(shè)置閃回恢復(fù)區(qū)的位置參數(shù)db_recovery_file_dest;其次設(shè)置閃回的最大時(shí)間限制參數(shù)db_flashback_retention_target;再把數(shù)據(jù)庫(kù)設(shè)置為歸檔模式:alter database archivelog。如沒(méi)有這個(gè)設(shè)置,在將數(shù)據(jù)庫(kù)打開(kāi)為Flashback模式時(shí)會(huì)出現(xiàn)ORA-38706錯(cuò)誤。在以上所有的設(shè)置完成之后,關(guān)閉數(shù)據(jù)庫(kù)后又重啟到Mount狀態(tài)下,使用命令alter database flashback on改變數(shù)據(jù)庫(kù)模式為閃回狀態(tài)。
SQL> alter database flashback on;
Database altered.
2.2 Oracle 10g閃回技術(shù)應(yīng)用
(1)閃回?cái)?shù)據(jù)庫(kù)
閃回?cái)?shù)據(jù)庫(kù)(Flashback Database)是Oracle 10g新增的功能。Oracle 10g閃回?cái)?shù)據(jù)庫(kù)功能啟用后,數(shù)據(jù)庫(kù)會(huì)定期將發(fā)生變化的數(shù)據(jù)塊的前鏡像寫(xiě)入閃回日志的日志文件中,這些日志文件并不是傳統(tǒng)的LGWR進(jìn)程寫(xiě)入的,而是由一個(gè)新進(jìn)程RVWR寫(xiě)入。
SQL> select sid , program from v$session where program like '%RVWR%';
SID PROGRAM
---------------------------
160 ORACLE.EXE (RVWR)
下面看一下閃回?cái)?shù)據(jù)庫(kù)功能恢復(fù)數(shù)據(jù)庫(kù)實(shí)例。
①查詢(xún)數(shù)據(jù)庫(kù)的閃回狀態(tài)。
SQL>select dbid,name,flashback_on,current_scn from v$database;
DBID NAME FLASHBACK_ON CURRENT_SCN
--------------------------
1239861505 ORCL YES 2603302
②連接到用戶(hù)scott下,新建一張表customer并插入12條數(shù)據(jù),之后把數(shù)據(jù)從表中截?cái)?,截?cái)嗲暗臅r(shí)間查詢(xún)到(2010-03-27 20:59:16)為止,查詢(xún)截?cái)嗪蟮谋頂?shù)據(jù)信息和當(dāng)前的時(shí)間
SQL> truncate table customer;
Table truncated.
表中數(shù)據(jù)已被截?cái)?,查?xún)信息被刪除后的時(shí)間:
SQL>select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')
NOW_TIME from dual;
NOW_TIME
-------------------------
2010-03-27 21:02:37
③關(guān)閉數(shù)據(jù)庫(kù)并重啟到Mount狀態(tài),用flashback database將數(shù)據(jù)庫(kù)閃回到時(shí)間點(diǎn)(2010-03-27 20:59:16)
SQL> flashback database to timestamp to_timestamp('2010-03-27 20:59:16','yyyy-mm-dd hh24:mi:ss');
Flashback complete
④閃回恢復(fù)后,再打開(kāi)數(shù)據(jù)庫(kù)實(shí)例時(shí),需要使用參數(shù)resetlogs或noresetlogs:
SQL> alter database open resetlogs;
Database altered
經(jīng)查詢(xún),表的數(shù)據(jù)已恢復(fù)。
(2)閃回表
閃回?cái)?shù)據(jù)庫(kù)可以將整個(gè)數(shù)據(jù)庫(kù)恢復(fù)到指定的時(shí)間點(diǎn)。但用戶(hù)只希望對(duì)指定的表進(jìn)行恢復(fù),Oracle 10g提供了閃回表(Flashback Table)功能,可以將指定表中的數(shù)據(jù)﹑索引﹑觸發(fā)器等恢復(fù)到指定的SCN或時(shí)間點(diǎn)。由于flashback table 技術(shù)使用DML操作恢復(fù)數(shù)據(jù),不能保證Rownum不變,所以在閃回之前先執(zhí)行alter table Tablename enable row movement,后flashback table Tablename to timestamp|scn<timestamp|scn>。
(3)閃回刪除
Oracle 10g閃回刪除(Flashback Drop)功能可以從數(shù)據(jù)庫(kù)中恢復(fù)一個(gè)被刪除的對(duì)象。在執(zhí)行刪除(Drop)操作時(shí),并不是真刪除,而是將該對(duì)象放入回收站(RecycleBin)中,并將對(duì)象重命名。這個(gè)回收站是虛擬出來(lái)的,被刪除的對(duì)象在其上也占用刪除前的存儲(chǔ)空間,甚至可以查詢(xún)被刪除的對(duì)象,也可以用Flashback Drop恢復(fù)[7-8]。其原理如圖1所示。
下面分析閃回刪除的使用。
14:43:50 SQL> drop table utest;
Table dropped.
14:44:39 SQL> show recyclebin;
ORIGINAL NAME RECYCLEBI NNAME OBJECT TYPE DROP TIME
------------------------------
UTEST BIN$uzhndNgOQ6+GNkipYhcK/A==$0 TABLE 2010-03-28:14:44:39
14:44:49 SQL> flashback table utest to before drop;
Flashback complete
要清除回收站所有的對(duì)象,可以使用purge recyclebin;要徹底刪除表,不想將它放入回收站可以這樣刪除表:drop table Tablename purge。
(4)閃回版本查詢(xún)(Flashback Version Query)和閃回事務(wù)查詢(xún)(Flashback Transaction Query)。
Oracle 9i閃回查詢(xún)只能得到過(guò)去某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)版本,由于當(dāng)前時(shí)間與過(guò)去某個(gè)時(shí)間之間,一個(gè)表中的數(shù)據(jù)可能被更新多次,一個(gè)時(shí)間點(diǎn)的數(shù)據(jù)版本可能無(wú)法滿(mǎn)足恢復(fù)需要。Oracle 10g通過(guò)閃回版本查詢(xún)可以查詢(xún)不同時(shí)間點(diǎn)的不同版本數(shù)據(jù)。它只能查詢(xún)提交后的數(shù)據(jù)。建立表test11,并在其上進(jìn)行數(shù)據(jù)insert﹑delete﹑update操作并提交,而后查詢(xún)數(shù)據(jù)的版本信息。
13:30:02SQL>select versions_starttime , versions_operation , user_id from test11 versions between timestamp minvalue and maxvalue;
VERSIONS_STARTTIME V USER_ID
-------------------------------
28-3月 -10 01.30.01 下午 D 1
28-3月 -10 01.29.27 下午 U 1
28-3月 -10 01.28.53 下午 I 3
在閃回版本查詢(xún)的基礎(chǔ)上,就可以進(jìn)行閃回事務(wù)查詢(xún)(Flashback Transaction Query)恢復(fù)。閃回事務(wù)的歷史信息以及Undo_SQL保存在FLASHBACK_TRANSATION _QUERY表中。查詢(xún)?cè)摫淼腢ndo_SQL,使用UNDO語(yǔ)句就可以撤消事務(wù)。
本文分別介紹了數(shù)據(jù)庫(kù)Oracle 9i和10g閃回技術(shù)在恢復(fù)數(shù)據(jù)的應(yīng)用。根據(jù)上面的應(yīng)用分析,Oracle 9i與Oracle 10g閃回技術(shù)對(duì)比如表1所示。
從對(duì)比中可以看到,閃回處理手段Oracle 10g比Oracle 9i靈活﹑快捷﹑實(shí)用、安全。這一技術(shù)在數(shù)據(jù)恢復(fù)上具有諸多優(yōu)點(diǎn),在以后的學(xué)習(xí)研究領(lǐng)域中還有待擴(kuò)展。
參考文獻(xiàn)
[1] 蓋國(guó)強(qiáng).Oracle數(shù)據(jù)庫(kù)管理﹑優(yōu)化與備份恢復(fù)[M].北京:人民郵電出版社,2007:226-365.
[2] THOMAS K.Expert Oracle database architecture 9i and 10g programming techniques and solutions[M].USA:Apress Expert.2005.
[3] QUN Li,HONG Lin Xu.Research on the backup bechanism of oracle database[J].IEEE Computer Soc:2009(2):423-426.
[4] 王晨,胡艷,宣海榮.Oracle10g新特性Flashback探究[J]. 計(jì)算機(jī)時(shí)代:2007,25(7):58-59.
[5] MATTBEW H,SCOTT J.Oracle database 10g高可用性實(shí)現(xiàn)方案-運(yùn)用RAC、Flashback和Data Guard技術(shù)[M].劉永健,孔令梅,譯.北京:清華大學(xué)出版社,2005.
[6] JOHNSON J.Ready to recover[J].Oracle Magazine:2003,17 (5):85-88
[7] Oracle官方網(wǎng).Oracle flashback technology[EB/OL].http:// www.oracle.com/technology/deploy/availability/htdocs/Flash-back_Overview.htm.
[8] KUNDERSMA R.Feature enthusiasm:Oracle flashback database[EB/OL].http://blogs.oracle.com/XPSONHA/2009/ 07/feature_enthusiasm_oracle_flas.html:2009/7/31.