16.Oracle10g服務器管理恢復--RMAN恢復(練習27.28.29)
1、還原(restore)
還原(restore)是指從RMAN所創建的備份中還原文件。這些還原文件可以通過增量備份以及重做等進行恢復。在前面練習中解釋了RMAN將備份控制文件和歸檔重做日志所有數據塊,對于數據文件則只備份使用過的數據塊或者只備份根據定義的增量級別的最近一次備份以來所更改過的數據塊。當使用RMAN還原文件后,這個數據文件都會與該文件備份時的原始狀態一樣,對于控制文件和歸檔重做日志,則需要對所有的數據塊進行還原。
如果使用“RMAN備份(練習21.22.23)中RMAN的部署”的增量備份策略,那么restore命令將只還原基準文件,例如:在每個星期天進行增量級別0的備份而每個星期進行增量級別為1和2的備份,則RMAN將還原最近一次級別為0的備份,后續的增量備份需要在恢復(recover)命令中應用。
Restore命令使用的RMAN基準備份可以是以下這些數據文件備份類型的一種:映像拷貝、完全備份以及增量級別為0的備份。具體選擇哪種數據文件基準很大程度上決定于文件的創建時間以及需要恢復到的時間。當還原數據文件時,RMAN可以還原一個單個數據文件、一個或多個數據表空間的所有數據文件,或者數據庫中的所有數據文件。當指定RMAN還原一個數據文件時,RMAN將會尋找最適合的備份或拷貝來還原該數據文件。
當還原數據庫文件時,數據庫應該處于什么狀態?下表提供了快速解答。其基本原則是:當一個文件正在還原時,該數據庫文件不能被實例使用,因為當一個數據庫文件正在被還原時,該實例不能對其進行寫入操作。在任何數據庫文件還原期間,目標數據庫的實例必須已經啟動,當從備份集中還原任何非系統數據文件時,為了確保成功還原,這些數據文件必須處于脫機狀態。如果還原任何系統表空間文件,則數據庫必須以加載模式啟動。當還原一個控制文件時,實例必須以非加載模式啟動,歸檔日志在目標數據庫加載或打開時都可以進行還原。
|
數據庫文件 |
數據庫狀態 |
|
任何非系統數據文件 |
加載或者打開,但這些文件或表空間必須脫機 |
|
系統數據文件 |
加載 |
|
數據庫(所有數據文件) |
加載 |
|
歸檔日志 |
非加載、加載或打開 |
|
控制文件 |
非加載 |
為什么RMAN要求數據庫在數據文件和歸檔日志還原期間處于加載狀態?因為RMAN備份和數據庫結構信息保存在控制文件中,而且RMAN需要訪問它們。
2、恢復(recover)
一旦數據文件還原以后,就可以進行恢復(recover)命令將數據庫回退到以前的狀態。RMAN將使用來自恢復目錄或目標控制文件的信息來確定需要哪種增量備份以及應用哪些重做日志。
RMAN應用恢復操作需要經過四個獨立的階段,分別是:
1、 更新目標控制文件來反映存儲在恢復目錄中最新的信息;
2、 應用所有可以被應用的增量備份;
3、 檢查所有還原的數據文件是否存在以及是否可以恢復。不應該出現的數據文件將從數據庫刪除。在磁盤上查找需要的重做日志,應用并將數據庫回退;
4、 磁盤上不存在的或需要應用恢復重做日志文件都將還原到磁盤上,并應用到數據文件上。
每個增量備份都建立在前一個增量備份之上,所以只需要更改替換的數據塊。如果可以這樣操作,則RMAN會選擇還原增量備份,而不是從歸檔日志文件中應用重做操作(應用增量備份比應用重做操作速度快)。一旦沒有更多的增量備份可以應用,則需要應用重做操作將數據庫文件返回到恢復的狀態。恢復操作一直持續到所有的重做信息都應用到指定的數據文件的停止點上。默認情況下,RMAN執行完全恢復(所有數據文件都回退到當前聯機重做日志文件中最后一次改變的時間),如果控制文件還原了,則RMAN不能應用聯機重做文件,也就不能進行不完全恢復。
為了便于理解還原、恢復和增量備份,參看下圖,該圖描述了前面所討論的增量備份策略,假設在星期六早晨級別為2的增量備份執行之前有一個數據文件丟了,當RMAN還原并恢復該丟失的數據文件時,需要執行下列步驟進行完全恢復:
1、 還原數據文件 應用備份集120,RMAN可以從星期天進行的整個數據庫增量級別為0的備份中還原整個丟失的數據文件。這個基準備份包括了該數據文件所使用過的數據塊,該級別為0的備份作為后續還原工作的基準;
2、 恢復數據文件 一旦通過了基準備份還原了數據文件,RMAN將使用適當的增量備份來恢復該數據文件。第一個應用的增量備份是備份集124(星期四的增量備份,級別為1)。備份集121、122和123并不需要,因為這些備份集中所有更改過的數據塊都包含在備份集124中。然后,RMAN發現備份集125包含的數據塊可以應用到這個已經還原的數據文件上,并能使其恢復到當前狀態。如果備份集125中沒有該數據文件的任何更改過的數據塊,則該備份集不能應用,接下來,RMAN發現不再需要其他的增量備份,則查找需要的重做日志文件;如果這些文件在磁盤上,則從磁盤上讀取;如果沒有找到任何歸檔文件,則RMAN將查找包含所需要重做文件的映像拷貝或備份集,并將其還原到磁盤上。還原完成以后,通過當前聯機重做日志文件,這些文件就可以完全恢復了。
(圖1)
默認情況下,RMAN將會把所有數據文件還原到文件備份時的初始位置,例如RMAN將把D:\oracle\PRACTICE\users01.dbf還原到目錄D:\oracle\PRACTICE,文件名為users01.dbf。歸檔日志在默認情況下還原到歸檔轉儲目的的路徑下,控制文件則還原到數據庫初始化文件(inin.ora)中的CONTROL_FILES參數規定的路徑下。可以在運行塊中通過set屬性來更改還原文件的位置,set屬性將在一個運行塊中為命令定義數值,set屬性也可以指定恢復的時間點以及歸檔日志文件被還原以及恢復期間讀取的位置。下表提供了運行塊set屬性用于還原和恢復選項的快速一覽表,注意,set命令與運行塊set屬性不同,在RMAN提示符下的set命令可以在表空間時間點恢復和復制數據庫命令中定義文件名和其他事項。
|
Set關鍵字 |
描 述 |
|
為數據文件設置新名稱 |
為特定的數據文件指定新的文件名和路徑,如果沒有定義該項,則RMAN將文件還原到當前的路徑和文件名 |
|
設置歸檔日志路徑 |
為還原和恢復命令的歸檔日志文件定義不同的路徑,如果沒有定義該項,RMAN使用目標init.ora文件定義的第一個歸檔存儲目的的路徑作為定義 |
|
Set until |
為恢復定義停止點,不完全恢復可以完成到特定時間、日志序列號或者SCN。如果沒有定義該項,RMAN將還原基準備份,并用增量備份和重做將所有數據文件恢復到當前狀態 |
當使用RMAN進行還原和恢復時,環境變量起了重要的作用,有時需要設置環境變量使會話的字符集和數據庫的字符集保持一致,設置NLS_LANG環境變量使它與目標數據庫的字符集匹配。如果在RMAN的LIST、REPORT、SET UNTIL等命令中要使用特定的時間,則應該設置NLS_DATE環境變量與命令的日期字符串匹配,也可以在腳本中使用TO_DATE函數指向特定的日期。
2 WIN>set NLS_LAND=AMERICAN_AMERICAN.WE8ISO8859P1;
以下練習將使用練習21中的備份腳本生成兩個新的備份,通過使用這些備份,RMAN可以恢復PRACTICE數據庫。
練習27:還原整個數據庫
當遇到災難性事故,丟失了數據庫中所有的數據文件,但控制文件和聯機重做日志卻完整無缺,那么如何使用RMAN備份從這樣的失效中恢復呢?下面這個練習將講述如何進行RMAN還原與恢復。在該練習中,要執行兩個整體數據庫備份,然后在PRACTICE數據庫中刪除所有數據文件,通過整體數據庫備份,可以還原并恢復PRACTICE數據庫的所有數據文件。
步驟一:執行整個數據庫備份
用練習21中生成的腳本創建兩個PRACTICE數據庫備份,第一個進行的備份是一個整體數據庫增量級別為0的備份,其中包含了當前的控制文件。在進行第二個備份之前,打開一個SQL*Plus會話更改數據庫中一個表的數據。提交該更改后,返回到RMAN提示符下,運行第二個備份操作。第二個備份是整理數據庫增量級別為1的備份,只拷貝自剛才級別為0的備份以來更改過的數據塊,輸入如下命令:
2 RMAN>connect target sys/practice@practice
3 RMAN>connect catllog rman1010/rman@rcat
4 RMAN>@D:\oracle\CODE\chap12\b_whole_inc0.rcv

(圖3)
2 WIN>sqlplus /nolog
3 SQL>connect system/system@practice
4 SQL>DELETE FROM tina.date_log WHERE create_date > SYSDATE;
5 SQL>INSERT INTO tina.date_log VALUES (SYSDATE + (365*14));
6 SQL>COMMIT;
7 SQL>exit;
8 WIN>exit
9 RMAN>@D:\oracle\CODE\chap12\b_whole_inc1.rcv;

(圖5)

(圖7)
當這些命令運行結束時,將得到一下備份和數據,這些備份片將位于D:\oracle\CODE\chap12目錄下:
- 備份:增量級別0 第一個備份是運行練習21名為b_whole_inc0的備份文件得到的。這個備份為PRACTICE數據庫生成一個獨立的備份集,其備份片包含了所有數據文件中使用過的數據庫和當前的控制文件。這個備份集的備份集號為738和739,備份片的鍵值為742和743;
- 表數據 當第一個備份完成后,TINA.DATE_LOG表將做如下修改,在create-date列中插入一行表示未來14年日期的記錄,表數據的更改引起了TOOLS表空間數據文件中數據塊的改變,被更改的數據塊將在后續的增量備份中選中;
- 備份:增量級別1 第二個備份是運行練習21名為b_whole_inc1的備份腳本文件得到,這個備份生成一個獨立的備份集,其備份片包含了所有數據文件使用過的數據塊和自上次備份以來更改過的當前控制文件。TINA.DATE_LOG表更改過的數據塊寫入到這個備份中,這個備份集的編號為759和760,備份片鍵值為763和764。第二個備份是運行練習21名為b_whole_inc1的備份腳本文件得到,這個備份生成一個獨立的備份集,其備份片包含了所有數據文件使用過的數據塊和自上次備份以來更改過的當前控制文件。TINA.DATE_LOG表更改過的數據塊寫入到這個備份中,這個備份集的編號為759和760,備份片鍵值為763和764。
步驟二:模擬PRACTICE失效
在操作系統中從D:\oracle\PRACTICE目錄下刪除除聯機重做日志和控制文件外所有的數據文件。在Window系統中需要關閉數據庫才能夠刪除數據庫文件,刪除數據文件的方式可以使用命令行刪除或者直接在窗口瀏覽器選中文件刪除。
2 RMAN>connect target system/system@practice
3 RMAN>connect catalog rman1010/rman@rcat
4 RMAN>shutdown abort
5 RMAN>host;
6 WIN>del D:\oracle\PRACTICE\*.dbf
7 RMAN>exit;

(圖9)
既然數據庫文件已經刪除,那么在啟動數據庫時就會發生錯誤,當實例啟動后并加載了控制文件后,該實例將查找編號為1的數據文件(system01.dbf)。因為該文件不存在,所有RMAN將顯示一個錯誤消息,這個消息與視圖用Sql*Plus啟動數據庫得到的消息是一樣的:

(圖11)
此時,實例啟動了,數據庫控制文件加載了,但數據庫沒有打開;
步驟三:還原與恢復數據庫
在RMAN提示符下,列出步驟一中生成的兩個備份,使用tag和時間(最近1天)選項,執行下列list命令列出兩個增量備份:
2 RMAN>list backup completed after 'sysdate-1' tag=WHOLE_INC1;

(圖13)

(圖15)
請注意列出的備份級別、set數以及備份片的名稱。應用RMAN,使用以下腳本還原并恢復PRACTICE數據庫:
2 shutdown abort;
3 startup mount;
4 run {
5 allocate channel d1 type disk;
6 restore database;
7 recover database;
8 }
恢復腳本內容不多,但每一行都完成許多工作。下面將詳細解釋這些命令,在還原整個數據庫時,數據庫必須處于沒有打開的狀態。Shutdown abort是有意義的,因為磁盤上不再有數據文件:
- Run restore還原與恢復recover命令必須位于運行塊之內,該塊內的所有命令都在功能上加以分組;
- Allocate 分配的通道將在restore命令中讀取備份片文件并重新生成數據文件,在應用增量備份和重做進行恢復數據文件時也需要這個通道;
- Restore 通過RMAN目錄可以知道整個數據庫有哪些文件存在,通過這個信息,restore database命令會找到最新的基準備份(完全備份、映像拷貝或級別為0的增量備份);
- Recover 當數據文件還原之后,recover命令將尋找并應用任何后續的增量備份。備份片中的數據塊將被寫入到已經從基準備份還原的數據文件中,因為這個練習場景中包括了級別為0的備份和級別為1的備份,所以級別為1的備份將被用于回退包含在其備份片中的更改的數據塊。當應用了增量備份后,需要進行重做應用,以便使數據文件返回到當前包含有控制文件的狀態。RMAN將將尋找并應用(如果需要)所需要的歸檔日志文件,然后使用當前使用的聯機重做日志文件。很可能第一次恢復時只需要當前聯機重做日志文件,這是因為PRACTICE數據庫上沒有發生更多的動作。
當RMAN完成還原與恢復后,RMAN將釋放d1磁盤通道,最后就可以為用戶打開數據庫。運行前面講述腳本中的命令,并觀察RMAN如何工作,下面是RMAN命令的輸出:

(圖17)
- channel d1:sid=160 devtype=DISK 當分配了一種磁盤類型的通道時,該通道將產生一個連續目標數據庫實例的連接,當連接在目標實例上獲得一個目標標識(SID),這個標識可以通通過SQL*Plus連接后在v$session中查詢得到;
- db_PRACTICE_25_1_737458836備份集單一備份片包含了還原需要的所有數據塊,這個操作系統文件將被查詢、讀取,并用于重新構建每一個數據文件;
- resotre complete 基準備份完畢后,完成還原;
- db_PRACTICE_27_1_737460224 通過通道d1從該文件中讀取數據塊并應用到剛才還原的數據文件中;
- restore complete 當第二個備份集應用后,RMAN將會通知這個增量數據塊的還原工作已經完成,一旦還原完成,這個數據文件將會擁有與b_whole_inc1備份集腳本運行時一樣的數據;
- starting media recovery 當所有最近的增量備份應用后,需要進行重做以將數據庫恢復到知道的恢復停止的狀態。將要讀取重做日志,并應用到還原的數據文件上,重做工作包括前滾數據庫修改操作,回退沒有提交的修改操作。
- media recovery complete 當介質恢復將數據庫的當前狀態輸入到控制文件中時,RMAN將會通知:數據庫已經準備好,可以打開。
步驟四:驗證還原與恢復的數據庫
檢查還原的數據文件是否存在于操作系統上,在操作系統提示符下查找D:\oracle\PRACTICE目錄下的內容。其中的數據文件應該與步驟而中刪除這些數據文件之前一樣。打開一個SQL*Plus會話,檢查TINA.TIME_LOG表,在表中查找最大的create_date以確認最新的修改是否存在。
2 SQL>SELECT max(create_date) FROM tina.date_log;
如果看到一個未來14年的日期記錄,驗證該表已經進行了最新的數據更改。

(圖19)
練習28:還原并恢復數據庫
如果個別數據文件發生丟失或損壞,則數據庫處于打開狀態時可以用RMAN輕松地恢復該文件(只要該文件不屬于系統表空間并不包含有激活的回退段),RMAN可以對一個或多個表空間中的數據文件進行還原與恢復。
步驟一:模擬PRACTICE失效
在中斷數據庫之前,需要向SCOTT的一個表增加一行記錄:用插入語句在department表中增加一個部門,然后再增加一個部門,但回退該更改。一旦還原與恢復完成,將出現Support部門卻沒有MIS部門。
2 SQL>INSERT INTO scott.dept(deptno, dname, loc) VALUES (50, 'SUPPORT', 'ATLANTA');
3 SQL>COMMIT;
4 SQL>INSERT INTO scott.dept(deptno, dname, loc) VALUES (60, 'MIS', 'DENVER');
5 SQL>ROLLBACK;
6 SQL>ALTER SYSTEM SWITCH LOGFILE;
7 SQL>ALTER SYSTEM SWITCH LOGFILE;
8 SQL>ALTER SYSTEM SWITCH LOGFILE;
(圖21)

接下來,從USERS表空間中刪除第一個數據文件,在操作系統中刪除該文件,由于Window操作系統對于聯機的數據文件加鎖,所以該數據文件在刪除之前應先脫機。
2 SQL>host;
3 WIN>del D:\oracle\PRACTICE\users01.dbf;
4 WIN>exit;
5 SQL>ALTER TABLESPACE USERS ONLINE;

(圖23)
步驟二:還原并恢復數據庫文件
當需要恢復一個數據文件時,可以用下面的命令來恢復單個數據文件。包含該數據文件的表空間需要先脫機,然后還原并恢復該數據文件,然后再將表空間聯機。
2 run {
3 allocate channel d1 type disk;
4 restore datafile 4; #specify the datafile number of name
5 recover tablespace users;
6 sql 'alter tablespace users online';
7 }
下面是對這個恢復情況各命令做簡要的解釋:
- Restore RMAN應用目錄或者目標控制文件查找最新的映像拷貝、完全或已經還原的增量級別為0的備份的數據文件。通過使用適當的備份片,還原該數據文件。
- Recover 一旦通過增量級別為0的備份片文件還原了丟失的數據文件,該文件必須被恢復到數據庫的當前狀態。恢復命令首先確定是否從增量備份中向數據文件拷貝了任何數據塊,當向還原的數據文件還原數據塊時,RMAN讀取重做日志,并將這些重做應用到USERS表空間的數據文件上。除了當前還原的數據文件外,其他的數據文件都是當前狀態,所有只有對剛才還原的D:\oracle\PRACTICE\users01.dbf文件和D:\oracle\PRACTICE\users02.dbf文件應用重做。增加的Support和MIS部門并沒有包含在RMAN備份中,這些記錄包含在重做日志文件中。因此,通過重做操作將進行插入Support部門的操作,而插入MIS部門和后續的回退操作也將應用。
為了將表空間或數據局文件恢復到脫機之前,最好先檢查這樣操作將影響哪些對象已經短時間的不連續性。下面兩個SQL語句可以完成該工作:
2 SQL>SELECT owner , segment_name, segment_type
3 FROM dba_extents
4 WHERE tablespace_name = 'users'
5 ORDER BY owner, segment_type, segment_name;
6 SQL>rem For offlining a datafile;
7 SQL>SELECT owner, segment_name, segment_type, count(*) extents
8 FROM dba_extents
9 WHERE file_id = <file number being offlined>
10 GROUP BY owner, segment_name, segment_type;
與前面的練習類似,可以把前面恢復的腳本保存成r_datafile.rcv,然后在RMAN命令提示符下運行列出的腳本文件:
2 SQL>connect target system/system@practice;
3 SQL>connect catalog rman1010/rman@rcat;
4 SQL>@D:\oracle\CODE\chap14\r_datafile.rcv;
當還原與恢復腳本運行時,其輸出類似于前面屏幕上的輸出結果,以下摘錄幾個片段說明腳本運行時RMAN進行的操作:RMAN為還原與恢復數據文件分配通道,RMAN自動選擇備份集來還原USER01.DBF數據文件:

(圖25)
當數據文件還原后,恢復命令繼續進行,RMAN選擇所有最新的增量備份應用到數據文件中, RMAN讀取這個備份片文件并為這個新建的還原文件應用所有更改過的數據塊。

(圖27)
一旦RMAN向還原的數據文件應用了所有需要的增量備份之后,介質恢復就開始工作。接下來,通過介質恢復能將還原的數據文件返回到數據庫其他部分的當前狀態。在恢復期間,必須要讀取并應用重做日志文件使還原的數據文件保持一致。在這個過程中增加了三個日志切換命令,確保在恢復期間能獲得歸檔日志文件;當最后一部分備份被應用之后,需要當前重做日志文件序列號的重做操作。

RMAN將找到磁盤上的這些歸檔日志文件,一旦所有的日志文件被應用后,將出現介質恢復完成的消息。這些工作完成之后,該表空間就成功地恢復到聯機狀態。
當然也可以還原丟失一個數據文件的整個表空間,還原這個表空間將導致RMAN覆蓋該表空間所有已經存在的數據文件。
2 run {
3 allocate channel d1 type disk;
4 restore tablespace users;
5 recover tablespace users;
6 sql 'alter tablespace users online';
7 }
步驟三:驗證表空間恢復
成功對丟失USERS表空間數據文件進行還原與恢復后,可以在操作系統下檢查RMAN還原的文件,同樣也可以查詢SCOTT的department表,這時應該看到Support部門而找不到MIS部門。
2 SQL>select * from dept;

(圖31)
步驟四:用備份的歸檔日志還原與恢復
在前面三個步驟中,介紹了如何使用增量備份和磁盤上已經存在的歸檔日志文件還原和恢復一個單一的數據文件。如果在恢復期間有一些恢復所需要的歸檔日志文件并沒有在磁盤上找到,又如何處理呢?如果歸檔日志文件存在于可用的備份或映像拷貝中,則RMAN為了恢復工作將還原并應用這些所需的歸檔日志。
為了試驗RMAN如何向磁盤上還原日志文件和在恢復期間使用還原的文件,本步驟將重復步驟1-3并恢復一個丟失數據文件。但這次需要繞一個小彎路,在幾個日志切換命令之后向磁盤備份歸檔日志文件,備份之后重新命名這些最新歸檔日志文件。當RMAN進行恢復操作時,將在磁盤上查找這些重命名的歸檔日志文件。如果RMAN沒有找到,則將從磁盤上的備份還原這些歸檔文件。通過使用這些還原的歸檔文件,RMAN就完成了恢復還原users01.dbf數據文件的任務。(本步驟中只重新命名而不刪除這些文件是防止某些錯誤的發生)
2 RMAN>connect catalog rman1010/rman@rcat
3 RMAN>@D:\oracle\CODE\chap12\b_archive_2days.rcv
4 RMAN>host;
5 WIN>cd D:\oracle\PRACTICE\ARCHIVE
6 WIN>rename ARC00031_0735213562.001 ARC00031_0735213562.001.bak
7 WIN>rename ARC00032_0735213562.001 ARC00032_0735213562.001.bak
8 WIN>rename ARC00033_0735213562.001 ARC00033_0735213562.001.bak
9 RMAN>exit;
在練習24中創建了名為b_archive_2days.rcv的腳本,這個腳本主要是為了備份最近兩天之內生成的備份日志文件。在該腳本的執行過程中,會出現以下的消息:

(圖33)

(圖35)
這意味著位于歸檔轉儲目的路徑的歸檔日志拷貝到備份集中,當備份這些文件時,會顯示他們的重做日志文件序列。
備份完成之后,將刪除歸檔日志。RMAN在磁盤上找不到這些文件,為響應r_datafile.rcv中的恢復命令,RMAN必須使用執行腳本文件b_archive_2days.rcv產生歸檔文件的備份。由于Window操作系統對聯機數據文件都加鎖,刪除數據文件之前需要將表空間脫機,然后刪除USERS表空間的第一個數據文件。
2 SQL>host;
3 WIN>del D:\oracle\PRACTICE\users01.dbf;
4 WIN>exit;
5 SQL>ALTER TABLESPACE USERS ONLINE;

(圖37)
已經備份的歸檔文件和磁盤上的歸檔文件都被刪除,RMAN恢復時就不能使用這些文件了,運行本練習步驟二中的恢復命令:
2 RMAN>connect target system/system@practice
3 RMAN>connect catalog rman1010/rman@rcat
4 RMAN>@D:\oracle\CODE\chap14\r_datafile.rcv;
在還原過程中,因為在最近一次步驟中沒有其他新的備份,所以恢復將使用與前面相同的數據文件的增量備份。與前面的恢復不同的是:恢復所需要的歸檔日志文件需要從備份中還原,這時將出現一個說明歸檔日志文件正在被還原到默認路徑的消息,并讀取名為AR_PRACTICE_29_1_737486414的備份片,并應用于創建D:\oracle\PRACTICE\ARCHIVE目錄下的歸檔日志文件ARC00031_0735213562.001、ARC00032_0735213562.001以及ARC00033_0735213562.001.arc。一旦還原部分完成,還原的歸檔日志文件將被用于恢復已被還原的數據文件。

(圖39)

(圖41)
RMAN知道備份及其名為AR_PRACTICE_29_1_737486414的備份片文件。作為恢復的一個步驟,這個歸檔文件將被還原到默認的歸檔轉儲路徑下。一旦所需要的歸檔日志還原后,歸檔日志文件將應用于還原的數據文件使其前滾,這樣RMAN才能在出現歸檔文件在磁盤上的情況下進行恢復操作。
因為RMAN在歸檔存儲路徑下還原了重新命名的歸檔日志文件,所以可以刪除前面重新命名的原始歸檔日志文件:

(圖43)
練習29:不完全數據庫恢復
為了恢復用戶或開發者偶然刪除的表,可以執行練習4、練習8中的不完全數據庫恢復,如果使用RMAN則在數據庫關閉時通過發布還原與恢復數據庫的命令就可以恢復數據庫的命令并可以恢復所有的數據文件。通過指定時間、日志序列號或者SCN都可以設置RMAN恢復停止點。根據停止點,RMAN將選擇合適的備份以及映像拷貝將數據庫還原到與停止點要求最新的狀態。重做操作也持續到定義的停止點,當RMAN完成這些工作后就是重置日志并打開數據庫。
在本練習中,將演示RMAN如何將數據庫恢復到過去某一個時間點。
步驟一:模擬PRACTICE失效
在本步驟中,將從PRACTICE數據庫中刪除一個名為SCOTT.EMP的表。為確認能如期進行不完全恢復,需要對TINA.DATE_LOG表進行清理和設置,在PRACTICE數據庫的TINA表中插入日期標識時間。為了演示在該表中插入未來的日期記錄,在刪除employee表之前,刪除這些未來的日期記錄,只保留過的日期記錄,當刪除employee表之后,在TINA.DATE_LOG表中插入一行表示14年的記錄,最后進行三次日志切換。這些日志切換確保稍后進行恢復操作使用歸檔的重做日志。
2 SQL>SET TIME ON
3 SQL>ALTER SESSION SET nls_date_format='yyyy-MM-dd HH24:mi:ss';
4 SQL>DELETE FROM tina.date_log WHERE create_date > SYSDATE;
5 SQL>COMMIT;
6 SQL>DROP TABLE SCOTT.EMP;
7 SQL>INSERT INTO tina.date_log VALUES (SYSDATE+(365*14));
8 SQL>COMMIT;
9 SQL>SELECT MAX(create_date) FROM tina.date_log;

(圖45)
在07:28:58時DATE_LOG表中任何有關未來時間的記錄將被刪除,在07:29:06時employee表刪除,當刪除表之后,在DATE_LOG表中插入一個未來的日期記錄。在PRACTICE數據庫恢復到刪除表語句之前的時間點,找不到一個未來14年的CREATE_DATE的記錄(最新插入的日期記錄),恢復操作將在刪除表語句之前停止應用重做記錄。
步驟二:不完全還原與恢復數據庫
不完全恢復首先還原期望恢復時間點之前的備份集,RMAN將自動選擇最合適的一個備份。
2 #set time to just before data was lost
3 Set until time "to_date('12/13/2010 07:29:02', 'MM/DD/YYYY HH24:MI:SS')";
4 Shutdown immediate;
5 Startup mount;
6 allocate channel d1 type disk;
7 restore database;
8 recover database;
9 alter database open resetlogs;
10 }

(圖47)

(圖49)

(圖51)
不完全恢復意味這整個數據庫必須還原到以前的某個時間點,包括控制文件。有效執行時間點恢復的技巧在于set命令,set until命令通知RMAN用恢復時間最新的備份來還原數據庫,這樣恢復才能將數據文件返回到指定的時間點。在本示例中,刪除employee表的確切時間是知道的,可以將恢復最后時間設置到這個時間點之前,當然也可以選擇指定日志序列號或者SCN來設置恢復的停止點。
在刪除表的練習中,基于時間的恢復是有意義的,可以用前面講述過的各種方法來進行不完全恢復。如果恢復到一個日志序列號的停止點,可以修改設置運行的屬性如下:
這個set命令將一直應用歸檔日志文件直到序列號1399為止。
比較少見的不完全恢復選項是基于SCN的恢復,可以修改set的運行屬性,指定一個100000的SCN停止點:
如果數據庫發生了某些損害而且警告日志在損壞發生時提供一個相關的SCN值,那么可以使用這一種恢復。一旦設置了恢復的停止,就可以將所有的工作交給RMAN來處理。在查看以前的r_whole_incomplete.rcv腳本時,注意下列相關RMAN不完全恢復的幾個問題:
- 在還原與恢復之前,關閉數據庫;
- 分配通道的語句必須在數據庫實例重新啟動之后執行,分配通道命令打開一個數據庫連接,該連接在數據庫關閉時斷開;
- 更改數據庫打開的命令可以在運行塊之外執行
RMAN進行的不完全恢復只有以下兩個地方與完全恢復不同:
- RMAN在恢復停止點之前從基準備份還原所有的數據文件,這些還原的文件根據停止點可能是最新的基準備份,也可能不是;
- 恢復一致持續到停止點,RMAN比較智能,能夠知道還原并應用哪些增量備份。RMAN將會找到并應用歸檔重做日志,一直到停止點為止。
不完全恢復的輸出結果非常類似練習27中的完全恢復的結果,在輸出中并沒有什么信息說明是時間點恢復。當以重置日志打開數據庫時,RMAN將更新目錄中的新紀錄,有效地執行RESET DATABASE命令,RESET DATABASE命令從目標數據庫控制文件中獲取更新RMAN目錄新記錄的信息。

(圖53)
在驗證恢復結果之前,也可以用以下命令在其后面使用了一個until語句為還原和恢復增加一個停止點:
2 recover database until time "TO_DATE('01/14/2002 12:02:10', 'MM/DD/YYYY HH24:MI:SS')";
還原和恢復命令中的停止點可以通過日志序列號或SCN當做時間來定義,同樣,還原與恢復的停止點不能具有相同的時間。
步驟三:驗證表空間恢復
進行重置日志操作之后,得到數據庫的一個新的形態,可以使用LIST INCARNATION命令觀察該數據庫的新形態。

(圖55)
注意:在該狀態的日期將是重置日志操作的日期,同時也是重置數據庫的SCN值。盡管重做日志將被重置,而且日志序列號也從1開始計數,但數據文件的頭部以及控制文件的SCN并沒有重置,而且繼續沿用重置日志操作之后的序列。
當不完全恢復完成之后,檢查是否已經恢復了Scott的employee表,打開一個SQL*Plus會話并從該表中查詢,看到不完全恢復已經完成。

(圖57)
接下來檢查DATE_LOG表中最大創建日期的值,查看是否在該表中有一個未來14年日期的記錄。這條記錄不應該出現在表中,因為恢復停止在刪除語句之前,也應該在插入未來14年這個日期記錄之前。因此,在DATE_LOG表中插入語句的重做并沒有應用。
2 SQL>set linesize 1000
3 SQL>SELECT MAX(create_date) FROM tina.date_log;

(圖59)
當PRACTICE數據庫恢復之后,還需要完成許多重要的事情,因為日志被重置以確保進行一下的操作:
- 執行新的基準備份 通過重置日志操作并不能輕易地進行數據庫恢復;
- 保護或刪除任何現存的日志備份 雖然可以使用當前日志備份來恢復數據庫,但是要通過重置日志操作來前滾是非常困難的。因此,在重置日志之前至少保留一個基準備份。在一段時間之后,如果沒有在重置日志之前恢復數據庫的潛在需要,則可以針對以前的數據庫狀態刪除所有備份。使用REPORT OBSOLETE ORPHAN命令可以顯示應用到以前數據庫形態的備份;
- 在歸檔存儲的路徑中清理歸檔日志文件,只要序列號增長,新的歸檔重做日志文件將覆蓋任何以前存在的歸檔日志文件。可以將這些已經存在的歸檔日志文件轉移到新的路徑下或者刪除。
恢復的技巧
下面的恢復技巧是從其他一些方面考慮,或是如何在更復雜的恢復情況下發揮優勢作用:
1、還原多個備份集和備份片時,還原數據庫應增加多個通道,額外的通道將使數據文件還原以并行方式進行:
2 allocate channel d1 type disk;
3 allocate channel d2 type disk;
4 allocate channel d3 type disk;
5 restore database;
6 recover database;
7 }
2、如果丟失了數據文件需要從映像拷貝中快速恢復,則可以采用如下方式通知RMAN切換到新的數據文件拷貝上:
2 allocate channel d1 type disk;
3 sql 'alter database datafile 5 offline';
4 switch datafile 5 to datafilecopy 'D:\oracle\PRACTICE\tools.dbf';
5 recover datafile 5;
6 sql 'alter database datafile 5 online'
7 }
3、如果丟失了數據庫服務器上的文件系統,則需要從原始的位置向其他還原數據文件以恢復數據庫。在還原和恢復丟失的數據文件的執行工作中可以使用SET NEWNAME屬性,同時也可以使用SWITCH屬性通知目標控制文件使用新位置下已經還原的數據文件,可以按如下方式在新的路徑中還原與恢復數據文件:
2 allocate channel d1 type disk;
3 set newname for datafile 5 to 'D:\oracle\PRACTICE\tools.dbf';
4 sql 'alter database datafile 5 offline';
5 restore datafile 5;
6 switch datafile 5 to datafilecopy 'D:\oracle\PRACTICE\tools.dbf';
7 recover datafile 5;
8 sql 'alter database datafile 5 online'
9 }
4、如果丟失了當前控制文件的所有拷貝,但還原數據庫當前日期的目錄,則使用RESTORE CONTROLFILE命令重新生成控制文件,該控制文件與以前的備份類似。RMAN將自動把控制文件存放在init.ora文件指定的路徑下。還原與恢復之后,必須重置日志并打開數據庫,可以按照如下方式還原控制文件:
2 allocate channel d1 type disk;
3 restore contolfile;
4 }
5、可以從RMAN備份中還原歸檔日志文件,并手工在SQL*Plus中恢復操作;
6、默認情況下,RMAN將歸檔日志文件還原到歸檔轉儲目的的路徑下,可以如下所示,通過SET ARCHIVELOG DESTINATION名了那個在其他路徑下還原這些命令:
2 set archivelog destination to 'D:\oracle\CODE\tmp';
3 allocate channel d1 type disk;
4 restore archivelog from logseq 2 until logseq 4;
5 }
7、默認情況下,RMAN使用歸檔轉儲目的路徑下的歸檔日志文件來恢復數據庫文件,如果通知RMAN在運行期間在其他路徑下還原歸檔文件,則RMAN將在恢復期間自動查找還原的歸檔日志文件并應用。

浙公網安備 33010602011771號