使用冷備份與冷備份後的資料庫歸檔日誌檔案進行資料庫不完整恢復

djb1008發表於2011-05-16

1.1 應用場景

1.1.1 應用場景條件

u 擁有資料庫一個時間點上冷備份(注意:這裡的全備份不是rmanfull database backup,而是全庫資料檔案的複製)

u 擁有從那個時間點開始的所有的歸檔日誌檔案。

1.1.2 應用場景目標

使用全庫時間點全庫備份和時間點後的歸檔日誌檔案,進行資料庫恢復,恢復資料庫到最後一個歸檔日誌檔案確定的時間點。

[@more@]

1.1 實驗內容

1.1.1 實驗環境初始狀態

SQL> select * from v$version;

BANNER

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Prod

SQL> select name from v$datafile;

C:ORACLEORADATAAIDUSYSTEM01.DBF

C:ORACLEORADATAAIDUUNDOTBS01.DBF

C:ORACLEORADATAAIDUSYSAUX01.DBF

C:ORACLEORADATAAIDUUSERS01.DBF

C:ORACLEORADATAAIDUAIDU01.DBF

SQL> archive log list;

資料庫日誌模式 存檔模式

自動存檔 啟用

存檔終點 c:oraclearchivelog

最早的聯機日誌序列 1

下一個存檔日誌序列 1

當前日誌序列 1

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#

201351

SQL> select checkpoint_change# from v$datafile;

CHECKPOINT_CHANGE#

201351

201351

201351

201351

201351

SQL> select username,default_tablespace from dba_users;

USERNAME DEFAULT_TABLESPACE

SYS SYSTEM

SYSTEM SYSTEM

DBSNMP SYSAUX

SYSMAN SYSAUX

AIDU AIDU

1.1.2 停止資料庫執行,進行資料庫全庫冷備份

Sqlplus / as sysdba

SQL>shutdown immediate;

C:>cp c:oracleoradataaidu*.* c:oracleoradataaidu_bak

Sqlplus / as sysdba

SQL>startup

1.1.3 插入實驗資料,生成兩個歸檔日誌檔案

Sqlplus / as sysdba

SQL>startup

Sqlplus /nolog

SQL>conn aidu/*******

SQL>create table test01(id number(10,2),name varchar2(200),primary key(id));

SQL> insert into test01(id,name) values(1,’test for restore db from full db copy’);

已建立 1 行。

SQL> insert into test01(id,name) select id+(select count(1) from test01),name from test01;

已建立 1 行。

SQL> /

已建立2行。

SQL> /

已建立4行。

SQL> /

已建立8行。

SQL> /

已建立16行。

SQL> /

已建立32行。

SQL> commit;

提交完成。

SQL> select count(1) from test02;

COUNT(1)

----------

64

在表test02裡插入了64條記錄後,進行一次歸檔日誌的切換,將這個變化儲存到歸檔日誌檔案中。

SQL>conn / as sysdba

SQL> alter system switch logfile;

系統已更改。

再次向aidu.test02表中插入記錄

SQL>conn aidu/*******

SQL> insert into test02(id,name) select id+(select count(1) from test02),name from t

已建立64行。

SQL> /

已建立128行。

SQL> /

已建立256行。 ####此時test01表裡有512條記錄.

再次進行歸檔日誌的切換,將新的變化儲存到資料庫歸檔日誌檔案中.

SQL>conn / as sysdba

SQL>alter system switch logfile;

系統已更改。

SQL>alter system switch logfile;

系統已更改。

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#

205547

SQL> select first_change#,next_change#,name,sequence# from v$archived_log

FIRST_CHANGE#NEXT_CHANGE# NAME SEQUENCE#

201348 203621 C:ORACLEARCHIVELOGARC00001_0751290496.001 1

203621 203684 C:ORACLEARCHIVELOGARC00002_0751290496.001 2

203684 204036 C:ORACLEARCHIVELOGARC00003_0751290496.001 3

204036 204387 C:ORACLEARCHIVELOGARC00004_0751290496.001 4

204387 204405 C:ORACLEARCHIVELOGARC00005_0751290496.001 5

204405 204885 C:ORACLEARCHIVELOGARC00006_0751290496.001 6

204885 205360 C:ORACLEARCHIVELOGARC00007_0751290496.001 7

205360 205383 C:ORACLEARCHIVELOGARC00008_0751290496.001 8

205383 205734 C:ORACLEARCHIVELOGARC00009_0751290496.001 9

1.1.4 關閉資料庫,模擬災難發生

1.1.4.1 停止資料庫執行

Sqlplus / as sysdba

SQL>shutdown immediate;

此時可以去歸檔日誌目錄檢查一下,在資料庫停止時,會產生一個歸檔日誌檔案,本例為(c:oraclearchivelog ARC00009_0751290496.001),後面的恢復,如果使用到這個歸檔日誌檔案,則說明恢復是成功的。

1.1.4.2 模擬資料庫災難發生

修改當前的資料庫檔案目錄名稱,模擬資料庫檔案全部丟失(因為資料庫檔案目錄c:oracleoradataaidu 已經不存在了)

Ren c:oracleoradataaidu c:oracleoradataaidu_new

1.1.4.3 模擬使用資料庫冷備份進行資料庫檔案的物理恢復

將原來的冷備份目錄更改為資料庫檔案目錄名,模擬使用資料庫的冷備份,將資料庫檔案恢復回來.

Ren c:oracleoradataaidu_bak c:oracleoradataaidu

注意:此時c:oracleoradataaidu 目錄存放的資料庫檔案是冷備份的資料庫檔案.

1.1.5 進行資料庫恢復操作

1.1.5.1 啟動資料庫到mount狀態(注意千萬不要啟動到open狀態)

SQL> startup mount;

ORACLE 例程已經啟動。

Total System Global Area 612368384 bytes

Fixed Size 1304728 bytes

Variable Size 167774056 bytes

Database Buffers 436207616 bytes

Redo Buffers 7081984 bytes

資料庫裝載完畢。

資料庫已經開啟。

因為使用冷備份的介質,所以啟動資料庫到mount狀態應該沒有任何問題.啟動到mount狀態而不是open狀態,是為了不更改資料檔案的scn.(曾經嘗試啟動資料庫到open狀態,然後進行後面的恢復,結果失敗,分析一下原因,發現問題出在了啟動資料庫後,很多資料庫檔案的scn發生了變化,導致與歸檔日誌裡的記錄不吻合,從而導致恢復失敗).

1.1.5.2 建立生成controlfiletrace檔案,編輯建立控制檔案的指令碼

SQL> alter database backup controlfile to trace;

資料庫已更改。

開啟$ORACLE_BASE/admin/udump/目錄下最新的trace檔案,找出該檔案中建立controlfile檔案的指令碼(注意選擇resetlog那一節的指令碼).建立新建控制檔案的指令碼,內容如下:

CREATE CONTROLFILE REUSE DATABASE "AIDU" RESETLOGS ARCHIVELOG

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 292

LOGFILE

GROUP 1 'C:ORACLEORADATAAIDUREDO01.LOG' SIZE 50M,

GROUP 2 'C:ORACLEORADATAAIDUREDO02.LOG' SIZE 50M,

GROUP 3 'C:ORACLEORADATAAIDUREDO03.LOG' SIZE 50M

-- STANDBY LOGFILE

DATAFILE

'C:ORACLEORADATAAIDUSYSTEM01.DBF',

'C:ORACLEORADATAAIDUUNDOTBS01.DBF',

'C:ORACLEORADATAAIDUSYSAUX01.DBF',

'C:ORACLEORADATAAIDUUSERS01.DBF',

'C:ORACLEORADATAAIDUAIDU01.DBF'

CHARACTER SET ZHS16GBK;

1.1.5.3 關閉資料庫

SQL> shutdown immediate;

資料庫已經關閉。

已經解除安裝資料庫。

ORACLE 例程已經關閉。

1.1.5.4 啟動資料庫到nomount狀態,建立新的控制檔案

SQL> startup nomount;

ORACLE 例程已經啟動。

Total System Global Area 612368384 bytes

Fixed Size 1304728 bytes

Variable Size 167774056 bytes

Database Buffers 436207616 bytes

Redo Buffers 7081984 bytes

SQL> CREATE CONTROLFILE REUSE DATABASE "AIDU" RESETLOGS ARCHIVELOG

2 MAXLOGFILES 16

3 MAXLOGMEMBERS 3

4 MAXDATAFILES 100

5 MAXINSTANCES 8

6 MAXLOGHISTORY 292

7 LOGFILE

8 GROUP 1 'C:ORACLEORADATAAIDUREDO01.LOG' SIZE 50M,

9 GROUP 2 'C:ORACLEORADATAAIDUREDO02.LOG' SIZE 50M,

10 GROUP 3 'C:ORACLEORADATAAIDUREDO03.LOG' SIZE 50M

11 -- STANDBY LOGFILE

12 DATAFILE

13 'C:ORACLEORADATAAIDUSYSTEM01.DBF',

14 'C:ORACLEORADATAAIDUUNDOTBS01.DBF',

15 'C:ORACLEORADATAAIDUSYSAUX01.DBF',

16 'C:ORACLEORADATAAIDUUSERS01.DBF',

17 'C:ORACLEORADATAAIDUAIDU01.DBF'

18 CHARACTER SET ZHS16GBK;

控制檔案已建立。

1.1.5.5 進行資料庫恢復

SQL> recover database using backup controlfile until cancel;

ORA-00279: change 205046 generated at 05/16/2011 15:04:02 needed for thread 1

ORA-00289: suggestion : C:ORACLEARCHIVELOGARC00007_0751290496.001

ORA-00280: change 205046 for thread 1 is in sequence #7

Specify log: {=suggested | filename | AUTO | CANCEL}

AUTO ####注意:這裡回答AUTO 就可以了

ORA-00279: change 205360 generated at 05/16/2011 15:13:05 needed for thread 1

ORA-00289: suggestion : C:ORACLEARCHIVELOGARC00008_0751290496.001

ORA-00280: change 205360 for thread 1 is in sequence #8

ORA-00278: log file 'C:ORACLEARCHIVELOGARC00007_0751290496.001' no longer

needed for this recovery

ORA-00279: change 205383 generated at 05/16/2011 15:14:10 needed for thread 1

ORA-00289: suggestion : C:ORACLEARCHIVELOGARC00009_0751290496.001

ORA-00280: change 205383 for thread 1 is in sequence #9

ORA-00278: log file 'C:ORACLEARCHIVELOGARC00008_0751290496.001' no longer

needed for this recovery

ORA-00279: change 205734 generated at 05/16/2011 15:18:32 needed for thread 1

ORA-00289: suggestion : C:ORACLEARCHIVELOGARC00010_0751290496.001

ORA-00280: change 205734 for thread 1 is in sequence #10

ORA-00278: log file 'C:ORACLEARCHIVELOGARC00009_0751290496.001' no longer

needed for this recovery

ORA-00308: cannot open archived log

'C:ORACLEARCHIVELOGARC00010_0751290496.001'

ORA-27041: unable to open file

最終以找不到新的歸檔日誌序列檔案的錯誤提示結束,這屬於正常的情況,因為ORACLE 會在auto方式下窮盡尋找,直至最後,然後報一個找不到下一個的錯誤.

SQL> alter database open resetlogs;

Database altered.

1.1.5.6 檢驗資料庫是否恢復到最新的資料狀態.

u 檢查恢復後的資料庫SCN

SQL> select checkpoint_change# from v$database;

CHECKPOINT_CHANGE#

------------------

205738 ####大於停庫前的205734

u 檢查特徵表的記錄

SQL> conn aidu/*****

Connected.

SQL> select count(1) from test01;

COUNT(1)

512 ####與恢復前的資料記錄數完全相同,恢復成功.

1.2 總結

通常我們使用資料庫的冷備份,可以將資料庫回覆到冷備份的時間點。但如果只恢復到時間點還不滿足要求,同時我們又有冷備份後的所有歸檔日誌檔案,我們就可以使用上文提到的方法,進行更有效的資料庫不完整恢復,減少資料庫資料的丟失。

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

相關文章