rman備份rac的總結

shawnloong發表於2015-09-16
參考文件:http://blog.chinaunix.net/u1/38775/showart_468805.html

一、歸檔日誌分別存放在本地
備份部分:
對於建立在裸裝置上的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> 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進行資料庫的恢復。由於RAC的備份是同時備份到兩個節點的本地硬碟上,因此恢復的時候也應該兩個節點同時進行RESTORE操作。
可以在兩個節點上分別啟動RMAN,將資料庫處於STARTUP MOUNT狀態,然後就可以在任意一個節點上執行RESTORE操作:

分別在兩個節點上如下操作:
$ 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> }

下面恢復歸檔日誌:
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)操作,可以兩個例項同時進行,但是對於恢復(RECOVER)操作,只能一個例項完成。
這就要求一個例項必須能同時看到兩個例項的歸檔日誌。可以透過nfs mount等方式來實現,這裡採用最簡單的方法,將節點2上的歸檔複製到節點1的歸檔目錄下。
首先關閉資料庫,然後將兩個例項都啟動到mount狀態,然後透過RMAN進行恢復。
RMAN> host 'rcp 172.25.198.223:/data1/archivelog/* /data1/archivelog'
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> recover database;
6> }

二、歸檔日誌在本地放一份,在ASM上放一份
由於日誌檔案的備份和還原只能透過本地的例項進行,而對於恢復的例項來說,並非所有的歸檔日誌都是可見的。這就要求歸檔日誌在還原完成之後,必須透過手工的方式同步到恢復站點,就不僅增加了恢復的複雜性,而且效率比較低,還要求使用者必須清楚的知道需要還原的歸檔日誌有哪些。
解決方法一:將歸檔日誌放到ASM上
如果將歸檔日誌放到ASM上,那麼備份和恢復RAC資料庫就像備份和恢復一個單例項資料庫一樣簡單了。不過ASM有ASM的缺點,個人感覺ASM目前的bug還相對多一些,也許11g的時候,ASM會更加成熟。因此,把資料檔案放到ASM上還是有風險的,不過將歸檔放到ASM上就相對安全一些了。不過如果ASM出現了故障,仍然會導致無法完成歸檔使得資料庫停止響應。個人認為,最穩妥的方法仍然是將歸檔設定在本地的磁碟上,同時兩個例項設定第二歸檔目的地:ASM。利用RMAN的歸檔定位自動FAILOVER功能,來實現歸檔的備份和恢復。
設定log_archive_dest_2到ASM上:
SQL> alter system set log_archive_dest_2 = 'LOCATION=+DISK/testrac/';

備份部分:
1、先備份一次本地的日誌,並刪除
RMAN> run
2> {
3> allocate channel c1 device type sbt connect sys/test@testrac1;
4> allocate channel c2 device type sbt connect sys/test@testrac2;
5> backup archivelog all delete all input;
6> }
2、再整庫+歸檔日誌備份,因本地日誌已找不到,RMAN會找存在於ASM上的歸檔日誌
RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> backup database plus archivelog delete all input;
6> }

恢復部分:
$ srvctl stop db -d testrac
$ rman target /
RMAN> startup mount
RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> restore database;
6> }
由於設定了ASM,可以不必還原歸檔,而直接進行恢復:
RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> recover database;
6> }

問題:
但是這種備份方式存在問題,BACKUP DATABASE PLUS ARCHIVELOG DELETE ALL INPUT由於只連線一個例項,因此只會清除當前例項上的歸檔日誌和ASM上的歸檔日誌,對應另一個例項上的歸檔則無法清除。
解決這個問題的最簡單的辦法是在備份資料庫的時候不要使用DELETE語句,在備份完成後,另外分配合適的CHANNEL來刪除所有的歸檔日誌。

三、歸檔日誌放在本地,使用NFS解決
Oracle的官方文件給出的方法就是透過NFS MOUNT方式來實現。

準備部分:

採用這個方法需要保證每個節點的歸檔目的地都是唯一的,並將這個歸檔目的地以NFS MOUNT方式載入到遠端站點。
首先在兩個節點上分別建立歸檔的目的目錄:
# su - oracle
Sun Microsystems Inc. SunOS 5.8 Generic Patch October 2001
$ mkdir /data1/archivelog1 /data1/archivelog2
$ exit
# hostname
racnode1

# su - oracle
Sun Microsystems Inc. SunOS 5.8 Generic Patch October 2001
$ mkdir /data1/archivelog1 /data1/archivelog2
$ exit
# hostname
racnode2

在節點一設定目錄的共享:
# share -F nfs -o rw=racnode2 /data1/archivelog1
在節點二設定目錄的共享:
# share -F nfs -o rw=racnode1 /data1/archivelog2

在節點一載入節點二的目錄:
# mount racnode2:/data1/archivelog2 /data1/archivelog2
在節點二載入節點一的目錄:
# mount racnode1:/data1/archivelog1 /data1/archivelog1

分別在節點一和節點二上執行 df –k,確保NFS MOUNT已經載入成功。
注意,如果需要配置在系統重啟後生效,應該將share命令和mount命令的修改新增到主機的/etc/dfs/dfstab檔案和/etc/vfstab。詳細內容可以參考:http://yangtingkun.itpub.net/post/468/284160
如果希望系統重啟後自動進行mount,那麼在nfs客戶端,需要修改/etc/vfstab檔案:
racnode2:/data1/archivelog - /archivelog2 nfs - yes -
為了保證nfs的伺服器端重啟後,share資訊不丟失,可以在/etc/dfs/dfstab檔案中新增:
share -F nfs -o rw=racnode1 /data1/archivelog

下面修改資料庫的初始化引數:
$ sqlplus "/ as sysdba"
SQL> col value format a50
SQL> select inst_id, value from gv$parameter where name = 'log_archive_dest_1';
INST_ID VALUE
---------- --------------------------------------------------
2 LOCATION=/data1/archivelog
1 LOCATION=/data1/archivelog
SQL> alter system set log_archive_dest_1 = 'LOCATION=/data1/archivelog1' sid = 'testrac1';
SQL> alter system set log_archive_dest_1 = 'LOCATION=/data1/archivelog2' sid = 'testrac2';

備份部分:
備份現有歸檔日誌,確保新的設定對以後的備份生效。
RMAN> run
2> {
3> allocate channel c1 device type sbt connect sys/test@testrac1;
4> allocate channel c2 device type sbt connect sys/test@testrac2;
5> backup archivelog all delete all input;
6> }

下面就可以在任意一個節點上進行備份:
RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> backup database plus archivelog delete all input;
6> }

恢復部分:
$ srvctl stop db -d testrac
$ rman target /
RMAN> startup mount
RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> restore database;
6> recover database;
7> }

問題:
由於在主機上進行了NFS mount,資料庫的備份和恢復可以透過一個節點進行。但是這種情況存在著一個比較嚴重的問題。就是NFS mount在一個節點沒有啟動的情況下,會極大的影響另一個節點的效能。也就是說,如果RAC一個節點出現故障,導致機器無法正常啟動的話,另一個節點不但要承擔全部的資料庫壓力,而且還會受到nfs mount帶來的效能負載,基本上導致這個節點無法正常工作。
由於效能上的考慮,使用NFS mount的時候一定要慎重。

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

相關文章