1. 程式人生 > >rac下rman備份

rac下rman備份

RMAN 備份資料庫時,要求目標庫必須處於歸檔模式,因此我們首先簡單描述一下RAC環境資料庫如何修改歸檔模式。 
修改歸檔模式的命令為MOUNT模式下執行ALTER DATABASE ARCHIVELOG/NOARCHIVELOG;命令,和單例項沒什麼區別。 
不過如果操作的是RAC資料庫,那麼必須所有例項都處於非OPEN狀態,然後在任意一個處於MOUNT狀態的例項執行ALTER DATABASE命令,操作成功後,再正常啟動其它例項即可。 
是不是和mount/dismount asm磁碟組的操作類似 
要留一個例項進行操作。 
這裡需要注意的一點是,RAC資料庫由於擁有多個例項,因此需要注意每個例項相關初始化引數:LOG_ARCHIVE_DEST_n的設定 
務必需要確保該引數設定的路徑合法有效,歸檔也能順利進行。 
下面列舉一個啟用RAC資料庫歸檔模式的演示: 以sysdba身份連線到ORACLE資料庫的任意例項,查詢歸檔狀態,以及當前例項的狀態: 
SQL > archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            /u01/app/oracle/product/10.2.0/db_1/dbs/arch
Oldest online log sequence     21 6
Current log sequence           21 7 
SQL >select inst_id,instance_name,version,archiver,status from gv$instance;
   INST_ID INSTANCE_NAME    VERSION           ARCHIVE STATUS
---------- ---------------- ----------------- ------- ------------
         1 devdb1          10.2.0.4.0        STOPPED MOUNTED
         2 devdb2          10.2.0.4.0        STOPPED MOUNTED 


上述返回的資料中可以獲得下列資訊: 
未啟動歸檔模式 ; 
10204 版本的雙節點資料庫並均啟動至MOUNT狀態 ; 
預設歸檔路徑未修改過 ; 
現在每個伺服器上建立歸檔路徑,注意是以oracle使用者身份: 
devdb1:
mkdir -p /u01/oradata/devdb1/archivelog
mkdir -p /u01/oradata/devdb2/archivelog
devdb2:
mkdir -p /u01/oradata/devdb1/archivelog
mkdir -p /u01/oradata/devdb2/archivelog


我們啟動2個devdb到mount狀態: 
首先: 
srvctl stop database -d devdb 
關閉資料庫 
然後devdb1進入mount模式,2先關閉: 
修改歸檔的預設路徑 : 
SQL> alter system set log_archive_dest_1="location=/u01/oradata/devdb1/archivelog" sid='devdb1';            
System altered. 
SQL>  alter system set log_archive_dest_1="location=/u01/oradata/devdb2/archivelog" sid='devdb2';
System altered. 
考慮到兩個節點的目錄結構可能不一致,因此這裡分別為節點1和節點2指定適當的路徑。 
接下來就可以啟動歸檔模式了,需要注意如果你所操作的環境中 例項狀態為OPEN 模式,一定要首先關閉例項 並重新啟動到MOUNT狀態 
注意關閉的時候是 全部關閉,而啟動時只需要啟動一個例項即可,其它例項可等歸檔狀態啟用後再正常啟動 
srvctl stop database -d devdb -o immediate 
這才是正確的,要乾淨的關閉,不指定-o那就是預設為normal,正式環境裡是不太可行的,關不掉的。 
SQL> alter database archivelog;
Database altered. 
SQL>  archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/oradata/devdb1/archivelog
Oldest online log sequence     56
Next log sequence to archive   57
Current log sequence           57 


當前歸檔模式已經啟動,接下來就可以正常啟動其它的例項了。 
在devdb2上還需要開啟歸檔嗎? 
不需要了 
直接: 
srvctl start database -d devdb 
資料歸檔就配置好了 
首先要明確一點,通過RMAN建立備份集時,必須保證連線到的例項能夠訪問所有節點所生成的歸檔日誌,否則會導致備份失敗(除非不備份歸檔檔案) 
對於單例項當然不存在這樣的問題,因為單例項資料庫的歸檔通常是放在本地,必然能夠訪問 
不過對於多例項的RAC資料庫這就可能會成為一個問題, 如何保證RMAN能夠訪問到所有節點生成的歸檔檔案呢 ? 
兩種方案: 
1、各節點生成的歸檔放到共享儲存上,這樣自然可以確保每個節點都能夠訪問到,比如將歸檔存放到ORACLE的ASM,或者是第三方提供的叢集檔案系統中; 
2、各節點除在本地生成歸檔檔案外,另外向其它節點或者說執行備份的節點發送歸檔日誌,以確保執行備份的那臺節點能夠訪問到所有的歸檔檔案。 
我們採用第一種方法。 
從RMAN易用的角度來說,將歸檔放置於共享儲存上無疑是最方便的,不過第三方叢集件的配置又會帶來一些其它額外的管理成本; 
ASM倒是簡單,但是我們的個人看法是這樣,ASM確實好用效率也不錯,不過由於ASM對DBA來說就像個黑匣子 
使用上了之後就得求天保佑千萬不要出現問題,一旦出現問題很有可能都不知該從何處著手處理 
因此,這裡我們決定採用另外的方案。 
這裡考慮使用NFS的自動掛載方式。 


2.1配置NFS
devdb1上root身份: 
vi /etc/exports 
內容: 
/u01/oradata/devdb1/archivelog *(rw) 
service portmap start 
 service nfs start 
這個是看狀態的,正常會這樣。 
showmount -e localhost 
顯示nfs的資訊。 
重新掛載exports檔案內容(防止重啟) 
exportfs -arv
節點1好了,其他節點也類似配置。 
然後在devdb2上以root身份: 
showmount -e devdb1
umount /u01/oradata/devdb1/archivelog
mount -t nfs -o nosuid,noexec,nodev,rw devdb1:/u01/oradata/devdb1/archivelog /u01/oradata/devdb1/archivelog
ls /u01/oradata/devdb1/archivelog 
devdb2設定nfs: 
vi /etc/exports 
內容: 
/u01/oradata/devdb2/archivelog *(rw) 
啟動服務 
service portmap start
service nfs start
/etc/init.d/nfslock start 
然後修改啟動級別
chkconfig portmap on
chkconfig nfs on
chkconfig nfslock on 
tail /var/log/messages
netstat -tulnp| grep -E '(rpc|nfs)'
rpcinfo -t localhost nfs
showmount -e localhost
tail /var/lib/nfs/etab 
以上步驟是我們編輯nfs啟動對映檔案的過程 
devdb1上root身份: 
vi /root/nfsdevdb1.sh 
內容: 
#!/bin/bash
umount /u01/oradata/devdb2/archivelog
mount -t nfs -o nosuid,noexec,nodev,rw devdb2:/u01/oradata/devdb2/archivelog /u01/oradata/devdb2/archivelog
存檔退出: 
chmod 777 nfsdevdb1.sh
./nfsdevdb1.sh
ls /u01/oradata/devdb2/archivelog
檢查下有沒有問題。 
devdb2上root身份: 
vi /root/nfsdevdb2.sh 
內容: 
#!/bin/bash
umount /u01/oradata/devdb1/archivelog
mount -t nfs -o nosuid,noexec,nodev,rw devdb1:/u01/oradata/devdb1/archivelog /u01/oradata/devdb1/archivelog
存檔退出: 
chmod 777 nfsdevdb2.sh
./nfsdevdb2.sh
ls /u01/oradata/devdb1/archivelog
為了驗證可以手動做個歸檔:alter system switch logfile;
都可以看到了,到此設定完畢 
nfs的內容大家可以下去研究一下,特別是linux的 
第二種方法 
ORACLE 的重做日誌傳送機制非常靈活,在10g版本中可以同時向10個目標地寫入歸檔(11g增加到了30個),這裡我們準備利用這種特性 
將各節點生成的歸檔傳送到執行備份的節點中,來實現該節點能夠訪問所需的歸檔檔案 
操作非常簡單,其實上就是給LOG_ARCHIVE_DEST_n初始化引數設定適當的值 2
例如當下的測試環境中,我們經過慎重考慮,決定將備份操作放在節點2端執行 
因此,只需要在節點1中,設定傳送節點1生成的歸檔檔案到節點2即可,操作如下: 
SQL> alter system set log_archive_dest_2=¨service=devdb2¨ sid=¨devdb1¨;
System altered. 
命令中設定的devdb2是指tnsnames.ora檔案中配置的連線節點2的網路服務名 
除此之外呢,還有一個初始化引數LOG_ARCHIVE_LOCAL_FIRST,用來設定是否首先歸檔檔案到本地 
預設為true,將其改為false,同樣只修改節點1的設定即可,操作如下: 
SQL> alter system set log_archive_local_first=false sid=¨devdb1¨;
System altered. 
測試一下效果,嘗試手動觸發歸檔操作,然後檢視是否成功歸檔至各節點的適當位置: 
SQL> alter system switch logfile;
System altered. 
SQL> select inst_id,recid,dest_id,name from gv$archived_log where sequence#=219;
   INST_ID RECID DEST_ID NAME
---------- ----- ------- ------------------------------------------------------------
         1     8       2 /u01/oradata/devdb2/archivelog/1_219_703671669.dbf
         1     9       1 /u01/oradata/devdb1/archivelog/1_219_703671669.dbf
         2     8       2 /u01/oradata/devdb2/archivelog/1_219_703671669.dbf
         2     9       1 /u01/oradata/devdb1/archivelog/1_219_703671669.dbf 
歸檔檔案成功生成併發送到節點2端 
提示: 
RAC 資料庫各例項擁有各自的REDO執行緒 
因此還需要考慮各節點生成的歸檔檔名稱規則的問題,不要因為檔名生成規則不合適造成檔名重複,導致歸檔失敗 
歸檔檔名的生成規則由LOG_ARCHIVE_FORMAT初始化引數控制,還好預設情況下是 %t_%s_%r.dbf,不會導致重複的發生。 
下面我們來考慮一個問題 
丟失了幾個歸檔怎麼辦? 
比如說由於山崩地裂洪水海嘯等等這些最近幾年我們耳熟能詳的事件原因導致節點1的某幾個歸檔沒能成功傳送至節點2 
結果節點2執行備份時報錯(一般是提示找不到歸檔檔案),那麼手工複製缺少的幾個歸檔到節點2的適當路徑下就好了 
用什麼複製呢? 
方式很多,如果檔案數目不多的話,直接用scp命令吧 
比如說這裡我們複製seq為218的歸檔檔案到節點2,操作如下 
首先是找到要複製的檔案詳細路徑,最簡單的方式就是從v$archived_log檢視中查詢: 
SQL> select sequence#,name from v$archived_log where sequence#=218;
NAME
------------------------------------------------------------
/u01/oradata/devdb1/archivelog/1_218_703671669.dbf 
接下來通過scp命令來複制檔案,scp可以在任意節點上操作,語法也比較簡單,就是指明源路徑和目標路徑就好,例如: 
[
[email protected]
~]$ scp /u01/oradata/devdb1/archivelog/1_218_703671669.dbf devdb2:/u01/oradata/devdb2/archivelog/1_218_703671669.dbf
1_218_703671669.dbf                                                                               100%   34MB  17.1MB/s   00:02 
然後在節點2註冊該歸檔檔案,操作如下: 
SQL>alter database register physical logfile ¨/u01/oradata/devdb2/archivelog/1_218_703671669.dbf¨;
Database altered. 
再次查詢gv$archived_log,確定歸檔檔案已被註冊: 
SQL>select inst_id,recid,dest_id,name from gv$archived_log where sequence#=218;
   INST_ID RECID DEST_ID NAME
---------- ----- ------- ------------------------------------------------------------
         2     7       1 /u01/oradata/devdb1/archivelog/1_218_703671669.dbf
         2    10       1 /u01/oradata/devdb2/archivelog/1_218_703671669.dbf
         1     7       1 /u01/oradata/devdb1/archivelog/1_218_703671669.dbf
         1    10       1 /u01/oradata/devdb2/archivelog/1_218_703671669.dbf 


3、執行rac資料庫備份:
rac rman備份核心指令碼
RMAN> run{
2> allocate channel c0 device type disk format "/u01/backup/%U";
3> backup database plus archivelog;
4> release channel c0;
5> }


allocated channel: c0
channel c0: sid=132 instance=racdb1 devtype=DISK




Starting backup at 25-MAR-15
current log archived
channel c0: starting archive log backupset
channel c0: specifying archive log(s) in backup set
input archive log thread=1 sequence=48 recid=2 stamp=875275353
input archive log thread=1 sequence=49 recid=3 stamp=875283961
input archive log thread=2 sequence=6 recid=1 stamp=865947333
input archive log thread=2 sequence=7 recid=4 stamp=875283974
channel c0: starting piece 1 at 25-MAR-15
channel c0: finished piece 1 at 25-MAR-15
piece handle=/u01/backup/01q2nhg7_1_1 tag=TAG20150325T142614 comment=NONE
channel c0: backup set complete, elapsed time: 00:00:36
Finished backup at 25-MAR-15


Starting backup at 25-MAR-15
channel c0: starting full datafile backupset
channel c0: specifying datafile(s) in backupset
input datafile fno=00001 name=+DATA/racdb/datafile/system.262.862924783
input datafile fno=00005 name=+DATA/racdb/datafile/users.267.862924915
input datafile fno=00002 name=+DATA/racdb/datafile/undotbs1.263.862924831
input datafile fno=00004 name=+DATA/racdb/datafile/undotbs2.266.862924893
input datafile fno=00003 name=+DATA/racdb/datafile/sysaux.264.862924853
channel c0: starting piece 1 at 25-MAR-15
channel c0: finished piece 1 at 25-MAR-15
piece handle=/u01/backup/02q2nhhf_1_1 tag=TAG20150325T142654 comment=NONE
channel c0: backup set complete, elapsed time: 00:04:47
channel c0: starting full datafile backupset
channel c0: specifying datafile(s) in backupset
including current control file in backupset
including current SPFILE in backupset
channel c0: starting piece 1 at 25-MAR-15
channel c0: finished piece 1 at 25-MAR-15
piece handle=/u01/backup/03q2nhqe_1_1 tag=TAG20150325T142654 comment=NONE
channel c0: backup set complete, elapsed time: 00:00:11
Finished backup at 25-MAR-15


Starting backup at 25-MAR-15
current log archived
channel c0: starting archive log backupset
channel c0: specifying archive log(s) in backup set
input archive log thread=1 sequence=50 recid=6 stamp=875284317
input archive log thread=2 sequence=8 recid=5 stamp=875284315
channel c0: starting piece 1 at 25-MAR-15
channel c0: finished piece 1 at 25-MAR-15
piece handle=/u01/backup/04q2nhqu_1_1 tag=TAG20150325T143158 comment=NONE
channel c0: backup set complete, elapsed time: 00:00:02
Finished backup at 25-MAR-15


released channel: c0


刪除已經備份過的歸檔日誌
RMAN> delete noprompt archivelog all backed up 1 times to device type disk;


using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=148 instance=racdb1 devtype=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: sid=145 instance=racdb1 devtype=DISK


List of Archived Log Copies
Key     Thrd Seq     S Low Time  Name
------- ---- ------- - --------- ----
2       1    48      A 10-DEC-14 /u01/oradata/racdb1/archivelog/1_48_862924734.dbf
3       1    49      A 25-MAR-15 /u01/oradata/racdb1/archivelog/1_49_862924734.dbf
6       1    50      A 25-MAR-15 /u01/oradata/racdb1/archivelog/1_50_862924734.dbf
1       2    6       A 09-DEC-14 /u01/oradata/racdb2/archivelog/2_6_862924734.dbf
4       2    7       A 10-DEC-14 /u01/oradata/racdb1/archivelog/2_7_862924734.dbf
5       2    8       A 25-MAR-15 /u01/oradata/racdb2/archivelog/2_8_862924734.dbf
deleted archive log
archive log filename=/u01/oradata/racdb1/archivelog/1_48_862924734.dbf recid=2 stamp=875275353
deleted archive log
archive log filename=/u01/oradata/racdb1/archivelog/1_49_862924734.dbf recid=3 stamp=875283961
deleted archive log
archive log filename=/u01/oradata/racdb1/archivelog/1_50_862924734.dbf recid=6 stamp=875284317
deleted archive log
archive log filename=/u01/oradata/racdb2/archivelog/2_6_862924734.dbf recid=1 stamp=865947333
deleted archive log
archive log filename=/u01/oradata/racdb1/archivelog/2_7_862924734.dbf recid=4 stamp=875283974
deleted archive log
archive log filename=/u01/oradata/racdb2/archivelog/2_8_862924734.dbf recid=5 stamp=875284315
Deleted 6 objects