oracle rac 備份

wuyuanyong發表於2010-07-03

RAC環境資料庫的備份與恢復

RAC環境的備份、恢復和普通資料庫的備份、恢復是有一些區別的。這個區別主要體現在RAC環境的特殊性上。根據OracleRAC環境的不同,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,直接recoverOracle自動會去找到合適的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):

[@more@]

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

相關文章