RAC環境的備份、恢復和普通資料庫的備份、恢復是有一些區別的。這個區別主要體現在RAC環境的特殊性上。根據Oracle的RAC環境的不同,RMAN備份、恢復操作也是不同的。如果RAC環境是建立在CLUSTER檔案系統上的,或者是建立在ASM上的,那麼備份和恢復過程可能會很簡單,基本上和普通的資料庫環境沒有太多的區別。如果RAC環境是建立在裸裝置上的,由於歸檔日誌無法儲存在裸裝置上,那麼歸檔日誌檔案必須放在多個節點的本地硬碟上,這時備份和恢復就變得和普通的資料庫環境有所差異。
1. 這裡先討論一下ASM環境上建立的RAC資料庫的備份。如果將歸檔日誌放在ASM上,那麼兩個節點都是可以備份的,這個時候,備份和普通的單例項資料庫沒有差別。
SQL> SHOW PARAMETER LOG_ARCHIVE_DEST_1 ------------------------------------ ----------- ------------------------------ log_archive_dest_1 string LOCATION=+DISK/testrac/
$ rman target /
RMAN> configure channel device type disk format '/data1/backup/%U';
RMAN> backup database plus archivelog delete all input;資料庫的恢復也很簡單,先修改一些資料:
SQL> CONN TEST/TEST已連線。 SQL> SELECT COUNT(*) FROM T;
COUNT(*) ---------- 0
SQL> INSERT INTO T SELECT ROWNUM FROM DBA_OBJECTS;已建立51880行。
SQL> COMMIT;提交完成。下面開始還原和恢復:
$ rman target /
RMAN> startup mount RMAN> restore database; RMAN> restore archivelog sequence between 134 and 136 thread 1; ====這個可以省略 RMAN> restore archivelog sequence between 56 and 58 thread 2; ====這個可以省略 RMAN> recover database; RMAN> alter database open;檢查恢復是否已經完成:
$ sqlplus "/ as sysdba"
SQL> startup SQL> CONN TEST/TEST已連線。 SQL> SELECT COUNT(*) FROM T;
COUNT(*) ---------- 51880
===說明
restore archivelog all會恢復所有的歸檔。其實對於分rac資料庫,根本沒有必要去restore archivelog,直接recover,Oracle自動會去找到合適的archivelog去恢復。
2. 基於裸裝置的RAC環境下的備份。對於建立在裸裝置上的RAC環境,由於歸檔不能存放到裸裝置上,因此,所有的歸檔都必須儲存在本地的磁碟上。直接透過RMAN備份會導致錯誤。首先模仿裸裝置的情況,修改原來LOG_ARCHIVE_DEST_1的配置,將每個例項的歸檔改在本地硬碟:
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 = 'LOCATION=/data1/archivelog' SID ='testrac1';
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_1 = 'LOCATION=/data1/archivelog' SID ='testrac2';然後嘗試直接備份資料庫:
$ rman target /
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U'; 4> backup database plus archivelog delete all input; 5> }使用目標資料庫控制檔案替代恢復目錄分配的通道: c1通道 c1: sid=301 例項=testrac1 devtype=DISK啟動 backup 於 11-5月 -07當前日誌已存檔釋放的通道: c1 MAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: backup plus archivelog 命令 (在 05/11/2007 16:08:09 上) 失敗 RMAN-06059: 沒有找到預期的歸檔日誌, 歸檔日誌的丟失將影響可恢復性 ORA-19625: 識別檔案/data1/archivelog/2_89_618591128.dbf時出錯 ORA-27037: 無法獲得檔案狀態 SVR4 Error: 2: No such file or directory Additional information: 3
RMAN>由於節點1上無法訪問到節點2上的歸檔,所以出現了上面的錯誤。對於這種情況,可以使用帶CONNECT語句的ALLOCATE來分配CHANNEL:
RMAN> run 2> {3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; 4> allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; 5> backup database plus archivelog delete all input; 6> }
RMAN>採用這種方法後可以成功的備份。而在恢復之前,需要將資料庫關閉,透過rman啟動例項並準備恢復:
$srvctl stop db -d testrac下面準備透過RMAN進行資料庫的恢復。由於RAC的備份是同時備份到兩個節點的本地硬碟上,因此恢復的時候也應該兩個節點同時進行RESTORE操作。可以在兩個節點上分別啟動RMAN,將資料庫處於STARTUP MOUNT狀態,然後就可以在任意一個節點上執行RESTORE操作:
$ rman target /
RMAN> startup mount
RMAN> exit另一個節點:
$ rman target /
RMAN> startup mount
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; 4> allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; 5> restore database; 6> }如果只啟動了RAC的一個節點,則會導致RMAN出現下面的錯誤:
MAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: restore 命令 (在 05/11/2007 17:55:17 上) 失敗 RMAN-06026: 有些目標沒有找到 - 終止恢復 RMAN-06100: 沒有通道來恢復資料檔案14的備份或是副本 RMAN-06100: 沒有通道來恢復資料檔案13的備份或是副本 RMAN-06100: 沒有通道來恢復資料檔案11的備份或是副本 RMAN-06100: 沒有通道來恢復資料檔案7的備份或是副本 RMAN-06100: 沒有通道來恢復資料檔案4的備份或是副本 RMAN-06100: 沒有通道來恢復資料檔案3的備份或是副本 RMAN-06100: 沒有通道來恢復資料檔案2的備份或是副本下面恢復歸檔日誌:
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; 4> allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; 5> restore archivelog sequence between 179 and 183 thread 1 6> archivelog sequence between 99 and 103 thread 2; 7> }現在面臨一個問題,對於還原(RESTORE)操作,可以兩個例項同時進行(一個例項mount,一個例項mount+restore),但是對於恢復(RECOVER)操作,只能一個例項完成。 這就要求 一個例項必須能同時看到兩個例項的歸檔日誌。可以透過nfs mount等方式來實現,這裡採用最簡單的方法,將節點2上的歸檔複製到節點1的歸檔目錄下(我們在節點1進行恢復)。
RMAN> host 'rcp 172.25.198.223:/data1/archivelog/* /data1/archivelog';主機命令完成
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; 4> allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; 5> recover database; 6> }
RMAN>如果沒有將歸檔日誌檔案複製到恢復節點上,則會出現下面的錯誤:
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; 4> allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; 5> recover database; 6> }分配的通道: c1通道 c1: sid=313 例項=testrac1 devtype=DISK分配的通道: c2通道 c2: sid=316 例項=testrac2 devtype=DISK啟動 recover 於 14-5月 -07正在開始介質的恢復存檔日誌執行緒 1 序列 179 已作為檔案 /data1/archivelog/1_179_618591128.dbf 存在於磁碟上存檔日誌執行緒 1 序列 180 已作為檔案 /data1/archivelog/1_180_618591128.dbf 存在於磁碟上存檔日誌執行緒 1 序列 181 已作為檔案 /data1/archivelog/1_181_618591128.dbf 存在於磁碟上存檔日誌執行緒 1 序列 182 已作為檔案 /data1/archivelog/1_182_618591128.dbf 存在於磁碟上存檔日誌執行緒 1 序列 183 已作為檔案 /data1/archivelog/1_183_618591128.dbf 存在於磁碟上存檔日誌檔名 =/data1/archivelog/1_179_618591128.dbf 執行緒 =1 序列 =179通道 c2: 正在啟動到預設目標的存檔日誌恢復通道 c2: 正在恢復存檔日誌存檔日誌執行緒 =2 序列=99通道 c2: 正在恢復存檔日誌存檔日誌執行緒 =2 序列=100通道 c2: 正在讀取備份段 /data1/backup/2pihmq8b_1_1通道 c2: 已恢復備份段 1段控制程式碼 = /data1/backup/2pihmq8b_1_1 標記 = TAG20070514T112919通道 c2: 恢復完成, 用時: 00:00:25故障轉移到上一個備份存檔日誌檔名 =/data1/archivelog/2_99_618591128.dbf 執行緒 =2 序列 =99釋放的通道: c1釋放的通道: c2 MAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: recover 命令 (在 05/14/2007 15:01:38 上) 失敗 RMAN-11003: 在分析/執行 SQL 語句期間失敗: alter database recover logfile '/data1/archivelog/2_99_618591128.dbf' ORA-00308: 無法開啟歸檔日誌 '/data1/archivelog/2_99_618591128.dbf' ORA-27037: 無法獲得檔案狀態 SVR4 Error: 2: No such file or directory Additional information: 3
4. 帶庫狀態下RAC資料庫的備份和恢復
RAC環境備份到帶庫如果是基於CLUSTER檔案系統或者ASM,那麼和備份到本地硬碟的區別不大,只需要在安裝了帶庫驅動(備份軟體)的節點上進行備份和恢復就可以了。如果是建立在裸裝置上的RAC環境,那麼最簡單的方式是在兩個節點上都安裝備份軟體,這樣,每個節點都可以同時進行備份,不但配置簡單,而且可以提高備份的效率。
$ rman target /恢復管理器: Release 10.2.0.3.0 - Production on 星期四 5月 17 09:40:04 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.連線到目標資料庫: TESTRAC (DBID=4291216984)
RMAN> { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; backup database plus archivelog delete all input; }對於帶庫的恢復過程,首先仍然是先備份現有的所有日誌檔案:
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; backup archivelog all delete all input; }對於資料庫日誌檔案的恢復仍然是透過兩個例項同時進行(兩個instance都在mount狀態下):
$ srvctl stop db -d testrac $ srvctl start inst -d testrac -i testrac1 -o mount $ srvctl start inst -d testrac -i testrac2 -o mount
$ rman target /恢復管理器: Release 10.2.0.3.0 - Production on 星期四 5月 17 13:33:02 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.已連線到目標資料庫: TESTRAC (DBID=4291216984, 未開啟)
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; restore database; restore archivelog sequence between 205 and 208 thread 1 archivelog sequence between 123 and 126 thread 2; }首先關閉資料庫,然後將兩個例項都啟動到mount狀態,然後透過RMAN進行恢復。
RMAN> host 'rcp racnode1:/data1/archivelog/* /data1/archivelog';主機命令完成
RMAN> run { allocate channel c1 device type sbt; recover database; }需要注意的是,如果嘗試在一個例項上恢復所有的日誌,將會出現類似下面的錯誤:
RMAN> run { allocate channel c1 device type sbt; allocate channel c2 device type sbt; restore archivelog sequence between 205 and 208 thread 1; restore archivelog sequence between 123 and 126 thread 2; }分配的通道: c1通道 c1: sid=305 例項=testrac2 devtype=SBT_TAPE通道c1: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)分配的通道: c2通道 c2: sid=311 例項=testrac2 devtype=SBT_TAPE通道c2: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)啟動 restore 於 17-5月 -07通道 c1: 正在啟動到預設目標的存檔日誌恢復通道 c2: 正在啟動到預設目標的存檔日誌恢復通道 c1: 正在恢復存檔日誌存檔日誌執行緒 =1 序列=205通道 c2: 正在恢復存檔日誌存檔日誌執行緒 =1 序列=207通道 c2: 正在恢復存檔日誌存檔日誌執行緒 =1 序列=208通道 c2: 正在讀取備份段 4jihutok_1_1通道 c1: 正在恢復存檔日誌存檔日誌執行緒 =1 序列=206通道 c1: 正在讀取備份段 4hihujs0_1_1故障轉移到上一個備份釋放的通道: c1釋放的通道: c2 MAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: restore 命令 (在 05/17/2007 16:46:59 上) 失敗 RMAN-06026: 有些目標沒有找到 - 終止恢復 RMAN-06025: 未找到要恢復的日誌執行緒 1 seq 208 lowscn 4324373343 的備份 RMAN-06025: 未找到要恢復的日誌執行緒 1 seq 207 lowscn 4324334789 的備份 RMAN-06025: 未找到要恢復的日誌執行緒 1 seq 206 lowscn 4324326867 的備份 RMAN-06025: 未找到要恢復的日誌執行緒 1 seq 205 lowscn 4324259225 的備份很多時候,為了效能考慮,會將最近的備份在本地磁碟上保留一段時間。也就是說,在備份的時候,首先備份到本地磁碟上,然後在備份到帶庫中。但是這種方式對於RAC環境並非是那麼簡單。由於備份集和Oracle資料庫的資料檔案、日誌檔案不同。Oracle並不能區分備份集儲存在那個例項的節點上,因此,即使配置了CONNECT連線,在備份時經常會碰到下面的錯誤:
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; backup backupset all delete all input; }分配的通道: c1通道 c1: sid=297 例項=testrac1 devtype=SBT_TAPE通道c1: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)分配的通道: c2通道 c2: sid=293 例項=testrac2 devtype=SBT_TAPE通道c2: VERITAS NetBackup for Oracle - Release 6.0 (2006110304) ...... RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03009: backup 命令 (unknown 通道上, 在 05/18/2007 14:56:04 上) 失敗 RMAN-12009: 由於找不到某些備份片段, 因此命令中止 RMAN-12008: 無法定位備份段 /data1/backup/53ii1lk9_1_1 RMAN-12008: 無法定位備份段 /data1/backup/54ii1lk5_1_1 RMAN-12008: 無法定位備份段 /data1/backup/4vii1knl_1_1 RMAN-12008: 無法定位備份段 /data1/backup/52ii1lbt_1_1 RMAN-12008: 無法定位備份段 /data1/backup/51ii1lbp_1_1 RMAN-12008: 無法定位備份段 /data1/backup/50ii1knh_1_1為了解決這個問題,必須透過crosscheck命令使得Oracle瞭解結果集的分佈情況,完整的步驟如下:
$ rman target /恢復管理器: Release 10.2.0.3.0 - Production on 星期五 5月 18 16:51:33 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.連線到目標資料庫: TESTRAC (DBID=4291216984)
RMAN> run { allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; backup database plus archivelog delete all input; }備份到磁碟後,開始將磁碟上的備份集備份到帶庫中:
RMAN> allocate channel for maintenance device type disk format '/data1/backup/%U' connect sys/test@testrac1;
RMAN> crosscheck backupset device type disk;
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; backup backupset all delete all input; }
RMAN> allocate channel for maintenance device type disk format '/data1/backup/%U' connect sys/test@testrac2;
RMAN> crosscheck backupset device type disk;
RMAN> run { allocate channel c2 device type sbt connect sys/test@testrac2; backup backupset all delete all input; }
RMAN>至此,備份集以及成功的備份到帶庫上。其實本地的備份集如果備份到了帶庫上,那麼就和直接備份到帶庫上的備份沒有什麼區別。整個恢復過程如下:
$ srvctl stop db -d testrac $ srvctl start inst -d testrac -i testrac1 -o mount $ srvctl start inst -d testrac -i testrac2 -o mount保證兩個例項都啟動到mount狀態,就可以進行資料檔案的還原了,仍然是兩個例項同時進行還原操作:
$ rman target /恢復管理器: Release 10.2.0.3.0 - Production on 星期一 5月 21 15:22:01 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.已連線到目標資料庫: TESTRAC (DBID=4291216984, 未開啟)
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; restore database; }
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; restore archivelog sequence between 134 and 136 thread 2 archivelog sequence between 216 and 220 thread 1; }
RMAN> host 'rcp racnode1:/data1/archivelog/*.dbf /data1/archivelog';
RMAN> run { allocate channel c1 device type sbt connect sys/test@testrac1; allocate channel c2 device type sbt connect sys/test@testrac2; recover database; }在備份、恢復過程中,發現了一個小問題。備份到磁碟上的備份集要比直接備份到帶庫上的備份集要小。備份到磁碟的資料檔案的備份集每個只有15G左右,加在一起是30G。而如果直接備份到帶庫上,那麼每個備份集都有27G左右,加在一起是54G。可能備份到磁碟可以更方便的壓縮備份集的大小。同時備份集的大小也直接影響了備份和恢復時間。如果直接備份到帶庫上,大約需要45分鐘。而將磁碟上的備份集備份到帶庫上只需要30分鐘。當然,直接備份到本地磁碟還需要將近15分鐘的時間。可以認為對於備份來說,二者消耗的時間差不多。但是恢復由於只需要一個步驟,因此備份集越小恢復速度就越快。恢復時間分別是30分鐘和45分鐘。綜合考慮備份和恢復,發現先備份到磁碟雖然麻煩一下,但是備份和恢復的速度更快,而且更省空間。
5. 最為省事的一種恢復對於備份到磁碟上的備份,如果將備份集都複製到一個節點上,是可以透過一個節點來完成恢復的。
$ rman target /恢復管理器: Release 10.2.0.3.0 - Production on 星期一 5月 21 17:22:25 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.連線到目標資料庫: TESTRAC (DBID=4291216984)
RMAN> run { allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; backup database plus archivelog delete all input; }為了取保一個節點上可以完成所有的恢復,還應該把當前的所有歸檔日誌備份一下,並複製到目標節點上:
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U' connect sys/test@testrac1; allocate channel c2 device type disk format '/data1/backup/%U' connect sys/test@testrac2; backup archivelog all delete all input; 6> }將所有的備份集複製到節點1上
$ rcp racnode2:/data1/backup/* /data1/backup/下面完全可以透過節點1來獨立進行恢復過程。
$ srvctl stop db -d testrac $ rman target /恢復管理器: Release 10.2.0.3.0 - Production on 星期四 5月 24 11:18:55 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.已連線到目標資料庫 (未啟動)
RMAN> startup mount
Oracle 例項已啟動資料庫已裝載系統全域性區域總計 2147483648 位元組
Fixed Size 2031480 位元組 Variable Size 318767240 位元組 Database Buffers 1811939328 位元組 Redo Buffers 14745600 位元組
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U'; 4> allocate channel c2 device type disk format '/data1/backup/%U'; 5> restore database; }
RMAN> run 2> { 3> allocate channel c1 device type disk format '/data1/backup/%U'; 4> allocate channel c2 device type disk format '/data1/backup/%U'; 5> recover database; }對於這種情況,甚至不需要去單獨還原歸檔日誌,而可以直接使用RECOVER命令,由Oracle自動來完成所需歸檔日誌的還原工作。 連結地址: 物理standby滾動升級: 跳躍式索引(Skip Scan Index): |