網域查詢: www.
返回首頁
當前位置: 首頁 > 站長學院 > 數據庫 > ORACLE >

RESETLOGS後沒有備份情況下的數據恢復

時間:2010-02-17 18:09來源: 作者: 點擊:
媒體恢復分完全恢復和不完全恢復。不完全恢復可以恢復到指定的時刻或系統更改號,但不完全恢復之後剩余日志文件就不可用,必須重置日志序列號,用RESETLOGS選項打開數據庫,此後
  

媒體恢復分完全恢復和不完全恢復。不完全恢復可以恢復到指定的時刻或系統更改號,但不完全恢復之後剩余日志文件就不可用,必須重置日志序列號,用RESETLOGS選項打開數據庫,此後數據庫變成一個新形體,為了將來的恢復,必須重做一致備份。而且,RESETLOGS之前的備份已不可用。但是,很可能在RESETLOGS後沒有做數據庫的一致備份,而數據庫又不認識RESETLOGS之前的備份,此時該如何恢復RESETLOGS後的數據呢?

雖說本文提供的技術能實現用RESETLOGS之前的備份恢復到RESETLOGS之後某一時刻的數據,但這也是挽救措施,筆者強烈建議讀者要做RESETLOGS之後的一致數據庫備份。

 

本文技術的理論基礎

Oracle僅根據系統更改號(SCN)進行恢復操作,所有數據文件必須恢復到同一時間點,並在該點後未作任何改動,才能打開數據庫。數據庫的SCN是唯一的,並隨著數據庫生存期間的操作事務增加而增加(可能不連續)。SCN的值永遠不會為0,除非重新創建數據庫。SCN的序列的遞增性不隨數據庫的任何操作而改變,即使是RESETLOGS也如此。RESETLOGS清除所有聯機日志文件中未應用的重做記錄,RESETLOGS只重置日志文件的序列號為1,但對SCN無影響,SCN仍按原序列遞增。

在控制文件中保存resetlogs SCN和計數器,以便唯一地標識用RESETLOGS選項執行的每一次打開數據庫的操作。這個值被寫進每個數據文件頭以及重做日志文件。如果重做日志文件的日志序列號與Oracle的要求值不相符,則在恢復中不能應用重做日志文件。執行不完全恢復後,數據庫要求日志序列號為1的日志文件,所以原來的日志序列中剩余的日志文件將不可用。RESETLOGS操作創建數據庫的新形體,即一個擁有從1開始的新的日志序列號流的數據庫。

根據以上理論,SCN為順序數據流,在數據庫存在期間始終遞增,而日志文件序列流也是遞增序列,只不過會因RESETLOGS而重置,但日志文件序列流中的SCN序列流卻保持遞增不便。因此可以用RESETLOGS之前的歸檔日志流和RESETLOGS之後的歸檔日志流來連接和延續SCN序列流,這樣就實現了用RESETLOGS之前的備份恢復RESETLOGS之後的數據。前提是保證兩股日志流(RESETLOGS之前的歸檔日志流和RESETLOGS之後的歸檔日志流)完整,並且有相應兩股日志流的控制文件。

即使能夠挽救數據,也要滿足下列條件

(1)Oracle版本等于或高于7.3.3。

(2)能夠成功實現RESETLOGS之前的不完全媒體恢復。

(3)RESETLOGS後沒有提供一致備份。

(4)RESETLOGS之前提供一致性備份(冷或熱)。

(5)必須備份RESETLOGS之前和之後的控制文件。

(6)分別保存RESETLOGS之前和之後的歸檔日志文件到不同位置,提供用于恢復的所有歸檔日志,並保證日志可用。

 

建議

(一)強烈建議RESETLOGS之後要備份數據庫。

(二)在RESETLOGS前保證數據庫以前備份的數據安全,在創建RESETLOGS之後的一個一致性備份之前,一定不可刪掉在RESETLOGS前創建的一致數據庫備份。如不是為了空間需要,建議永久保留RESETLOGS前創建的一致數據庫備份,包括數據文件、控制文件和歸檔日志。

(三)在RESETLOGS之後立即創建控制文件備份,並把歸檔日志單獨存放。

(四)在以RESETLOGS方式打開數據庫前,備份在恢復中用過的所有歸檔日志和聯機重做日志。

(五)進行RESETLOGS後,備份alter.log文件,因為該文件保存著point-in-time恢復後記錄的change#(系統更改號SCN)。

(六)把RESETLOGS之前和之後的歸檔日志文件保存到不同位置,用于恢復。因為可能存在如下情形︰如果RESETLOGS之前和之後的歸檔日志文件保存到相同位置,而RESETLOGS之後的歸檔日志文件序列號從1開始,隨著日志切換的不斷發生,新的日志序列號要增長到與RESETLOGS之前日志序列號相同的時候,那時RESETLOGS之前的歸檔日志文件將被新日志文件覆蓋,從而使RESETLOGS之前的日志序列出現空洞。

 

實例演示的詳細過程

系統環境

● 軟件環境︰Windows Server 2000、Oracle Enterprise Edition 9.0.1、數據庫SID︰TEST

● 數據庫文件的目錄(文件)及意義︰

f:\test 在線數據文件和歸檔日志文件

f:\test1、f:\test2、f:\test3 聯機重做日志和在線控制文件

f:\cool\coola 時刻A點的一致性冷備份數據文件目錄

f:\cool\archa_b 時刻A、B兩點間的歸檔日志備份目錄

f:\cool\archb_c 時刻B、C兩點間的歸檔日志備份目錄

f:\cool\ctl_a\ctl.ctl 時刻A點的控制文件備份

f:\cool\ctl_c\ctl.ctl 時刻C點的控制文件備份

操作過程

本例中首先建立試驗用戶demo和表空間demo,當前時刻記為A點,用戶demo建立表a後,插入數據1、2、3,之後的時刻記為B點,接著插入數據4、5、6後的時刻記為B'點,接著模擬丟失B'點的數據文件,從A點恢復到B點,用RESETLOGS選項打開數據庫後,再向表a插入數據7、8、9,之後的時刻記為C點。此時模擬丟失C點的數據文件,用A點的備份和A、B之間及B、C之間的歸檔日志加上A、C兩點的控制文件將數據庫恢復到C點。下列步驟中的第17步最為關鍵,詳細步驟如下︰

(1)準備工作︰建立表空間demo和臨時用戶demo。

create tablespace demo datafile 'f:\test\demo.dbf' size 5M;
            create user demo identified by demo
            default tablespace demo quota unlimited on demo
            temporary tablespace temp;
            grant connect,alter system to demo;
            alter user demo account unlock;

(2)以SYSDBA身份查看歸檔日志並關閉數據庫。

SQL> archive log list
            Database log mode              Archive Mode
            Automatic archival             Enabled
            Archive destination            f:\test
            Oldest online log sequence     18
            Next log sequence to archive   19
            Current log sequence           19
            SQL> shutdown;

(3)當前時刻記為A點,做數據庫的一致冷備份。

copy  f:\test\*.dbf  f:\cool\coola
            copy  f:\test1\ctl.ctl  f:\cool\ctl_a

(4)以試驗用戶demo登錄,並插入數據到表a中。

create table a (i number);
            commit;
            insert into a values(1);
            commit;
            alter system switch logfile;
            insert into a values(2);
            commit;
            alter system switch logfile;
            insert into a values(3);
            commit;
            alter system switch logfile;

(5)記錄當前時刻為B點。

SQL> select to_char(sysdate,'DD-MONTH-YYYY HH24:MI:SS') "DATE" from dual;
            DATE
            --------------------------
            04-OCTOBER  -2002 09:18:52

(6)繼續由用戶demo向表a插入數據。

insert into a values(4);
            commit;
            alter system switch logfile;
            insert into a values(5);
            commit;
            alter system switch logfile;
            insert into a values(6);
            commit;
            alter system switch logfile;
            alter system switch logfile;
            alter system switch logfile;

(7)記錄當前時刻為B'點。

SQL>  select to_char(sysdate,'DD-MONTH-YYYY HH24:MI:SS') "DATE" from dual;
            DATE
            --------------------------
            04-OCTOBER  -2002 09:21:13

(8)以SYSDBA身份查看歸檔日志並關閉數據庫。

SQL> archive log list
            Database log mode              Archive Mode
            Automatic archival             Enabled
            Archive destination            f:\test
            Oldest online log sequence     27
            Next log sequence to archive   28
            Current log sequence           28
            SQL> shutdown

(9)模擬丟失所有當前(B'點)數據文件和控制文件。首先保存歸檔日志文,再把點A的數據文件和控制文件恢復到在線數據文件的目錄。

del  f:\test\*.dbf
            copy  f:\test\*.arc  f:\cool\archa_b
            copy  f:\cool\coola\*.dbf  f:\test
            copy  f:\cool\ctl_a\ctl.ctl  f:\test1
            copy  f:\cool\ctl_a\ctl.ctl  f:\test2
            copy  f:\cool\ctl_a\ctl.ctl  f:\test3

(10)以SYSDBA身份登錄,執行從時刻A到時刻B的基于時間點的不完全媒體恢復,因為媒體恢復過程使用時刻A的控制文件,所以要加上using backup controlfile子句。

conn /@test as sysdba
            startup mount
            SQL> recover database until time '2002-10-04:09:18:52' using backup controlfile;
            ORA-00279: change 690619 generated at 10/04/2002 08:56:01 needed for thread 1
            ORA-00289: suggestion : F:\TEST\ARCH19.ARC
            ORA-00280: change 690619 for thread 1 is in sequence #19
            Specify log: {<RET&gt;=suggested | filename | AUTO | CANCEL}
            f:\cool\archa_b\arch19.arc
            ORA-00279: change 690763 generated at 10/04/2002 09:18:21 needed for thread 1
            ORA-00289: suggestion : F:\TEST\ARCH20.ARC
            ORA-00280: change 690763 for thread 1 is in sequence #20
            ORA-00278: log file 'f:\cool\archa_b\arch19.arc' no longer needed for this
            recovery
            ……  ……

接下來順序應用歸檔日志文件直到日志序列號為22的日志文件f:\cool\archa_b\arch22.arc,注意歸檔日志文件的目錄為f:\cool\archa_b。

(11)以SYSDBA身份打開數據庫,因為是不完全媒體恢復,所以要使用RESETLOGS選項。查看表demo.a,證實時刻B之前插入的數據已被恢復。

SQL> alter database open resetlogs;
            SQL> select * from demo.a;
            I
            ----------
            1
            2
            3

(12)以demo用戶登錄數據庫,接著向表a插入數據。

insert into a values(7);
            commit;
            alter system switch logfile;
            insert into a values(8);
            commit;
            alter system switch logfile;
            insert into a values(9);
            commit;
            alter system switch logfile;
            alter system switch logfile;
            alter system switch logfile;
            alter system switch logfile;

(13)記錄當前時刻為C點。

SQL> select to_char(sysdate,'DD-MONTH-YYYY HH24:MI:SS') "DATE" from dual;
            DATE
            --------------------------
            04-OCTOBER  -2002 10:04:46

(14)以SYSDBA身份查看歸檔日志並關閉數據庫。

SQL> conn /@test as sysdba
            Connected.
            SQL> archive log list
            Database log mode              Archive Mode
            Automatic archival             Enabled
            Archive destination            f:\test
            Oldest online log sequence     6
            Next log sequence to archive   7
            Current log sequence           7
            SQL> shutdown

由此可見,RESETLOGS後日志序列號從1重新開始。

(15)不備份C點的數據文件,但要備份C點的控制文件和時刻B和時刻C之間的歸檔日志。刪除當前(時刻C)數據文件,從A點復制數據文件和控制文件到當前位置。

del  f:\test\*.dbf
            copy  f:\test\*.arc  f:\cool\archb_c
            copy  f:\test1\ctl.ctl  f:\cool\ctl_c
            copy  f:\cool\coola\*.dbf  f:\test
            copy  f:\cool\ctl_a\ctl.ctl  f:\test1
            copy  f:\cool\ctl_a\ctl.ctl  f:\test2
            copy  f:\cool\ctl_a\ctl.ctl  f:\test3

(16)以SYSDBA身份登錄,執行從時刻A到時刻B的基于時間點的不完全媒體恢復,因為媒體恢復過程使用時刻A的控制文件,所以要加上using backup controlfile子句。該步驟類似于步驟(10)。

conn /@test as sysdba
            startup mount
            recover database until time '2002-10-04:09:18:52' using backup controlfile;

(17)該步驟最為關鍵!!不要打開數據庫。首先關閉數據庫,然後把C點的控制文件恢復到在線控制文件的位置,然後用C點的控制文件恢復步驟(16)結束之後的數據文件,恢復進程會自動應用時刻B和時刻C之間的歸檔日志文件,從序列號為1的歸檔日志arch1.arc開始。注意︰本例執行的是完全媒體恢復,必須在不丟失聯機重做日志文件的情況下。否則,要恢復聯機重做日志文件。當然,也可執行不完全媒體恢復,恢復到時刻B和時刻C之間的任一時刻。本步驟的關鍵技術在于要備份時刻C的控制文件,並用它實現跨越時刻B的媒體恢復。

SQL> shutdown
            copy  f:\cool\ctl_c\ctl.ctl  f:\test1
            copy  f:\cool\ctl_c\ctl.ctl  f:\test2
            copy  f:\cool\ctl_c\ctl.ctl  f:\test3
            SQL&gt; conn /@test as sysdba
            Connected to an idle instance.
            SQL&gt; startup mount
            SQL&gt; recover database;
            ORA-00279: change 690773 generated at 10/04/2002 09:59:31 needed for thread 1
            ORA-00289: suggestion : F:\TEST\ARCH1.ARC
            ORA-00280: change 690773 for thread 1 is in sequence #1
            Specify log: {&lt;RET&gt;=suggested | filename | AUTO | CANCEL}
            f:\cool\archb_c\arch1.arc
            ORA-00279: change 690989 generated at 10/04/2002 10:04:11 needed for thread 1
            ORA-00289: suggestion : F:\TEST\ARCH2.ARC
            ORA-00280: change 690989 for thread 1 is in sequence #2
            ORA-00278: log file 'f:\cool\archb_c\arch1.arc' no longer needed for this
            recovery
            ……  ……
            Log applied.
            Media recovery complete.

(18)打開數據庫,查看表demo.a,結果顯示沒有丟失時刻B和時刻C之間插入的數據7、8、9。

SQL> alter database open;
            Database altered.
            SQL> select * from demo.a;
            I
            ----------
            1
            2
            3
            7
            8
            9
            6 rows selected.

(19)馬上做數據庫的一致備份(冷備份或熱備份)。

 

附加說明

另外要指出,如果忘記或不能提供時刻B的準確時間,可以查看報警日志文件,搜索"change",找到系統更改號(SCN),也可在步驟(10)和步驟(16)中指定基于改變的恢復。命令格式如下︰

recover database until change integer_scn [using backup controlfile]

注︰integer_scn要用整數SCN替換。

本例中,數據庫TEST的報警日志文件為f:\test\bdump\testALRT.log,在其中找到以下片段︰

Fri Oct 04 09:57:15 2002
            ALTER DATABASE RECOVER    LOGFILE 'f:\cool\archa_b\arch22.arc'
            Media Recovery Log f:\cool\archa_b\arch22.arc
            Incomplete recovery done UNTIL CHANGE 690772
            Media Recovery Complete
            Completed: ALTER DATABASE RECOVER    LOGFILE 'f:\cool\archa_b
            Fri Oct 04 09:59:31 2002
            alter database open resetlogs
            Fri Oct 04 09:59:31 2002
            RESETLOGS after incomplete recovery UNTIL CHANGE 690772
            Resetting resetlogs activation ID 1770840999 (0x698ce3a7)

由此可發現恢復到時刻B(2002-10-04:09:18:52)的SCN為690772,可以在不完全恢復中指定恢復到更改號690772,如下語句所示︰

recover database until change 690773 using backup controlfile;

數據庫執行過不完全恢復後,並在以RESETLOGS選項打開之前,SCN已經記錄在報警日志文件中,也可以通過查詢

select  RESETLOGS_CHANGE#-1  from  v$database;

找到SCN,這個結果與報警日志中的SCN相同,這樣就可以恢復到該SCN。


頂一下
(0)
0%
踩一下
(0)
0%
------分隔線----------------------------
最新評論 查看所有評論
發表評論 查看所有評論
請自覺遵守互聯網相關的政策法規,嚴禁發佈色情、暴力、反動的言論。
評價:
表情:
用戶名: 密碼: 驗證碼:
推薦內容