閃回技術(shù)在數(shù)據(jù)庫誤刪除中的應(yīng)用
引言
傳統(tǒng)上,誤刪除了 Oracle數(shù)據(jù)庫中的重要表或表中的記 錄,提交(COMMIT)成功后,再想恢復(fù)被誤刪除的表格或 表格中的數(shù)據(jù),那只能釆用數(shù)據(jù)庫備份和恢復(fù)技術(shù),其步驟為: 首先利用誤刪除前備份的全部數(shù)據(jù)文件和控制文件將數(shù)據(jù)庫 還原到備份狀態(tài),再應(yīng)用在線重做日志文件和歸檔日志文件, 將數(shù)據(jù)庫恢復(fù)到誤刪除前的狀態(tài),即執(zhí)行數(shù)據(jù)庫的不完全恢 復(fù),這樣做不但需要數(shù)據(jù)庫全備份,且操作復(fù)雜,耗費時間 較長,在恢復(fù)期間數(shù)據(jù)庫還必需關(guān)閉,不能使用。從Oracle 9i開始,利用新提供的閃回功能,被誤刪除的表或表中的數(shù) 據(jù)恢復(fù)可以更加方便、快捷。Oracle閃回功能在10 g、11 g又 分別得到了加強。
1閃回技術(shù)的功能
為了演示閃回功能,先在sql*plus中執(zhí)行以下語句,創(chuàng)建 測試表testta,表中插入3條新記錄后,提交插入事務(wù)。
SQL>CREATE TABLE testta( id INT,name VARCHAR2(4));
SQL>INSERT INTO testta VALUES。,'aaaa'); SQL>INSERT INTO testta VALUES(2,'bbbb'); SQL>INSERT INTO testta VALUES。,'cccc'); SQL>COMMIT ;
再執(zhí)行以下語句,設(shè)置顯示當(dāng)前時間:
SQL>SET TIME ON
刪除testta表中全部3條記錄:
14 : 11 : 29 SQL>DELETE testta ;
提交刪除事務(wù):
14 : 12 : 30 SQL>COMMIT ;
收稿日期:2014-01-08
14 : 12 : 34 SQL> SELECT * FROM testta ;
表testta中已沒有記錄。由于刪除事務(wù)已提交成功,如想 恢復(fù)被刪除的記錄,傳統(tǒng)的方法只能是執(zhí)行數(shù)據(jù)庫的不完全 恢復(fù)?,F(xiàn)在釆用閃回數(shù)據(jù)庫(Flashback Database)的方法恢 復(fù)刪除數(shù)據(jù),操作如下。
關(guān)閉數(shù)據(jù)庫,將數(shù)據(jù)庫設(shè)置到裝載(mount)狀態(tài)。
14 : 14 : 47 SQL>SHUTDOWN IMMEDIATE
14 : 15 : 04 SQL>STARTUP MOUNT
利用閃回數(shù)據(jù)庫的方法,將數(shù)據(jù)庫整體調(diào)整到刪除數(shù)據(jù) 前的某一時間。
14 : 16 : 10 SQL>FLASHBACK DATABASE TO TIMESTAMP TO_DATE( '2013-12-23 14 : 11 : 27',,yyyy-mm-dd hh24 : mi: ss'); 使用RESETLOGS選項,打開數(shù)據(jù)庫。
14 : 17 : 07 SQL>ALTER DATABASE OPEN RESETLOGS;
查詢testta表內(nèi)容。
14 : 17: 42 SQL>SELECT * FROM testta ;
執(zhí)行后,部分顯示結(jié)果如下:
ID NAME
aaaa
bbbb
cccc
結(jié)果顯示說明,testta表中被刪除的數(shù)據(jù)已經(jīng)恢復(fù)。
2閃回數(shù)據(jù)庫的操作
閃回數(shù)據(jù)庫就像數(shù)據(jù)庫上的倒帶按鈕,可以把整個數(shù)據(jù) 庫回退到過去的某個時點狀態(tài),其最終結(jié)果就像執(zhí)行了不完整恢復(fù)。因此,閃回數(shù)據(jù)庫不但能恢復(fù)像以上例子中被刪除表中的記錄,也能恢復(fù)被刪除的表、視圖等數(shù)據(jù)庫其他對象,還能恢復(fù)被刪除了的用戶等。但此種方法也有其局限性,一是恢復(fù)到過去某一時間點后,則數(shù)據(jù)庫的全部內(nèi)容都被恢復(fù)到當(dāng)時時間點狀態(tài),如果只是誤刪除了某個表中的記錄,而只想恢復(fù)該表的內(nèi)容,則不宜采用閃回數(shù)據(jù)庫的方法 ;二是采用閃回數(shù)據(jù)庫的方法,必須要先關(guān)閉數(shù)據(jù)庫。為了克服閃回數(shù)據(jù)庫的缺陷,可采用以下閃回表(Flashback Table)的方法,恢復(fù)被刪除的記錄,操作如下:
創(chuàng)建測試表 testtb,在表中插入 3 條新記錄后,提交插入事務(wù) :
14 :43 :09 SQL> CREATE TABLE testtb( id INT,
name
VARCHAR2(4)) ;
1 4 :4 3 :2 0 S Q L > I N S E R T I N T O t e s t t b
VALUES(1,’aaaa’) ;
1 4 :4 3 :2 0 S Q L > I N S E R T I N T O t e s t t b
VALUES(2,’bbbb’) ;
1 4 :4 3 :2 0 S Q L > I N S E R T I N T O t e s t t b
VALUES(3,’cccc’) ;
14 :43 :20 SQL> COMMIT;
刪除 testtb 表中全部 3 條記錄 :
14 :44 :16 SQL>DELETE testtb ;
提交刪除事務(wù) :
14 :44 :26 SQL>COMMIT;
14 :44 :28 SQL> SELECT * FROM testtb ;
刪除事務(wù)已提交成功,testtb 表中已沒有記錄?,F(xiàn)采用閃回表的方法恢復(fù)刪除數(shù)據(jù)。
閃回表的前提是啟動被操作表的行移動(ROW MOVEMENT)特性。先啟動表 testtb 的行移動特性 :
14 :44 :32 SQL> ALTER TABLE testtb ENABLE ROW
MOVEMENT;
利用閃回表的方法,將 testtb 表恢復(fù)到刪除數(shù)據(jù)前的某一時間。
14 :45 :27 SQL> FLASHBACK TABLE testtb TO
TIMESTAMP TO_TIMESTAMP(‘
2013-12-23 14 :44 :
00’,
‘
YYYY-MM-DD HH24 :MI :SS’) ;
查詢 testtb 表內(nèi)容 :
14 :45 :28 SQL>SELECT * FROM testtb ;
執(zhí)行后,部分顯示結(jié)果如下:
ID NAME
---------- ----
1 aaaa
2 bbbb
3 cccc
結(jié)果顯示說明,testtb 表中被刪除的數(shù)據(jù)已經(jīng)恢復(fù)。
3 閃回表
閃回表能夠恢復(fù)指定表中的記錄內(nèi)容,而不改變數(shù)據(jù)庫其他對象的內(nèi)容。但數(shù)據(jù)恢復(fù)中,閃回表必須啟用被操作表的行移動特性,且只能進(jìn)行閃回表的 DML 操作,不能進(jìn)行閃回 DDL 操作。如果用戶刪除了(DROP)表,則不能采用閃回表的方法恢復(fù),此時可以有采用上面介紹的閃回數(shù)據(jù)庫的方法恢復(fù)整個數(shù)據(jù)庫,也可以采用以下閃回刪除(Flashback Drop)的方法,其操作如下:
創(chuàng)建測試表 testtc,表中插入 3 條新記錄后,提交插入事務(wù) :
16 :10 :43 SQL> CREATE TABLE testtc( id INT,
name
VARCHAR2(4)) ;
1 6 :1 0 :4 4 S Q L > I N S E R T I N T O t e s t t c
VALUES(1,’aaaa’) ;
1 6 :1 0 :4 4 S Q L > I N S E R T I N T O t e s t t c
VALUES(2,’bbbb’) ;
1 6 :1 0 :4 4 S Q L > I N S E R T I N T O t e s t t c
VALUES(3,’cccc’) ;
16 :10 :46 SQL>COMMIT;
刪除 testtb 表 :
16 :11 :55 SQL> DROP TABLE testtc ;
從回收站中閃回刪除的 testtc 表 :
16 :12 :34 SQL> FLASHBACK TABLE testtc TO
BEFORE DROP;
查詢 testtc 表內(nèi)容 :
16 :13 :19 SQL> SELECT * FROM testtc ;
執(zhí)行后,部分顯示結(jié)果如下:
ID NAME
---------- ----
1 aaaa
2 bbbb
3 cccc
結(jié)果顯示說明,被刪除 testtc 表已從回收站中恢復(fù)。
Oracle 在刪除一個表時,并不立即丟棄它,而是把它放在回收站中,并保留盡可能長的時間。閃回刪除能夠像Windows 操作系統(tǒng)一樣,將回收站中被刪除的對象方便地恢復(fù),但閃回刪除只能恢復(fù)表、索引等對象,對于用戶等對象,閃回刪除無能為力。
通過以上驗證可能看出,采用閃回技術(shù),可以針對行級 和事務(wù)級發(fā)生過變化的數(shù)據(jù)進(jìn)行恢復(fù),縮短數(shù)據(jù)恢復(fù)的時間, 且操作簡單,這樣做大大提高了數(shù)據(jù)庫恢復(fù)的效率。
4結(jié)語
最后,我們需要再說明以下幾點:一是閃回技術(shù)具有強 大且簡便的數(shù)據(jù)庫恢復(fù)功能,是否就不需要再做數(shù)據(jù)庫備份 和不完全恢復(fù)了呢?答案是否定的,因為當(dāng)出現(xiàn)介質(zhì)損壞時, 任何閃回方法都是毫無用處,此時,只能執(zhí)行標(biāo)準(zhǔn)的備份、還 原與恢復(fù)過程;二是要實現(xiàn)各種閃回功能,必須要先對數(shù)據(jù) 庫進(jìn)行相應(yīng)設(shè)置,如啟動閃回數(shù)據(jù)庫、啟動數(shù)據(jù)庫的“回收站”、 啟動表的行移動等;三是除了以上介紹的3種閃回技術(shù)外,還要有閃回版本查詢(Flashback Version Query)、閃回事務(wù)查詢 (Flashback Transaction Query)、閃回查詢(Flashback Query) 和閃回數(shù)據(jù)歸檔(Flashback Data Archive)等閃回方法。
20211120_6198f2c06decf__閃回技術(shù)在數(shù)據(jù)庫誤刪除中的應(yīng)用