RMAN備份之備份多個備份集到帶庫(二)

yangtingkun發表於2007-07-20

使用RMAN備份到帶庫時,同時備份多個備份集,需要注意一些問題。

RMAN備份之備份多個備份集到帶庫(一):http://yangtingkun.itpub.net/post/468/309044


上一篇文章簡單介紹瞭如何才能在磁帶上備份多個備份集,這裡要說明一下采用這種方法可能遇到的問題。

首先如果要備份多個備份集的話,要求磁帶庫必須要用多個驅動器。這時由於多個備份集需要同時進行寫操作。

這個測試環境中的帶庫是PX502,有兩個驅動器,也就是說,最多支援COPIES = 2。不過這裡還隱藏著一個比較嚴重的問題。

上面的備份都是針對一個物件進行的。雖然分配了兩個CHANNEL,但是隻有一個CHANNEL執行備份操作(另一個CHANNEL空閒,但是由於設定了BACKUP COPIES 2,因此另一個CHANNEL用來進行第二個備份集的生成)。

但是如果備份的目標超過一個,這時Oracle的RMAN會自動將其分配到兩個CHANNEL上去,而且由於設定了BACKUP COPIES 2,每個備份集都有備份在兩個CHANNEL上,因此,實際上後臺存在4個任務,且每個備份和它的備份COPY必須同時進行,而系統只有兩個驅動器,這就造成了兩個驅動器都在等待它的COPIES準備就緒,從而整個備份陷入死鎖狀態。

如果已經造成了死鎖,可以透過下面的方法來完成備份。透過圖形化介面,找到正在備份的JOB,殺掉其中一個,使得一個CHANNEL的備份出現失敗,從而使另一個CHANNEL的備份可以獲取資源。

由於設定了兩個CHANNEL,一個CHANNEL的備份失敗後,會在另一個CHANNEL上進行重試,這樣,就改變了4個備份任務的實現順序,使得兩個備份都可以和它的COPIES同時進行:

RMAN> run
2> {
3> set backup copies 2;
4> allocate channel c1 device type sbt;
5> allocate channel c2 device type sbt;
6> send 'NB_ORA_CLIENT=backup,CPF1_POLICY=testoracle,CPF1_SCHED=Default-Application-Backup';
7> send 'NB_ORA_CLIENT=backup,CPF2_POLICY=testoracle,CPF2_SCHED=test_multi_copy';
8> backup tablespace users, ndindex;
9> }

正在執行命令: SET BACKUP COPIES

分配的通道: c1
通道 c1: sid=287 例項=testrac2 devtype=SBT_TAPE
通道c1: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)

分配的通道: c2
通道 c2: sid=285 例項=testrac2 devtype=SBT_TAPE
通道c2: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)

向通道發命令: c1
向通道發命令: c2

向通道發命令: c1
向通道發命令: c2

啟動 backup 於 14-6月 -07
通道 c1: 啟動全部資料檔案備份集
通道 c1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00010 name=+DISK/testrac/datafile/ndindex01.dbf
通道 c1: 正在啟動段 1 於 14-6月 -07
通道 c2: 啟動全部資料檔案備份集
通道 c2: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00005 name=+DISK/testrac/datafile/users.267.618591279
通道 c2: 正在啟動段 1 於 14-6月 -07
通道 c1: 已完成段 1 於 14-6月 -07, 有 2 個副本和標記 TAG20070614T163039
段 handle=i0ik93hf_1_1 comment=API Version 2.0,MMS Version 5.0.0.0
段 handle=i0ik93hf_1_2 comment=API Version 2.0,MMS Version 5.0.0.0
通道 c1: 備份集已完成, 經過時間:00:14:56
MAN-03009: backup 命令 (c2 通道上, 在 06/14/2007 16:46:00 上) 失敗
ORA-27192: skgfcls: sbtclose2 返回錯誤 - 無法關閉檔案
ORA-19511: 從介質管理器層接收到錯誤, 錯誤文字為:
Failed to process backup file
ORA-19502: 檔案 "i1ik93hf_1_1", 塊編號 1 寫錯誤 (塊大小 = 512)
ORA-27030: skgfwrt: sbtwrite2 返回錯誤
ORA-19511: 從介質管理器層接收到錯誤, 錯誤文字為:
VxBSASendData: Failed with error:
Server Status: Communication with the server has not been iniatated or the server status has not been retrieved from the server.
通道 c2 已禁用, 將在另一個通道上執行該通道上失敗的作業
通道 c1: 啟動全部資料檔案備份集
通道 c1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00005 name=+DISK/testrac/datafile/users.267.618591279
通道 c1: 正在啟動段 1 於 14-6月 -07
通道 c1: 已完成段 1 於 14-6月 -07, 有 2 個副本和標記 TAG20070614T163039
段 handle=i2ik94e8_1_1 comment=API Version 2.0,MMS Version 5.0.0.0
段 handle=i2ik94e8_1_2 comment=API Version 2.0,MMS Version 5.0.0.0
通道 c1: 備份集已完成, 經過時間:00:02:15
完成 backup 於 14-6月 -07
釋放的通道: c1
釋放的通道: c2

但是這樣的備份需要人為的干預,這種方式對於自動備份是不可行的。而且,關閉CHANNEL的JOB任務時,應該等待JOB執行到WRITING狀態,過早的關閉會造成型別下面的錯誤:

RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> set backup copies 2;
6> send 'NB_ORA_CLIENT=backup,CPF1_POLICY=testoracle,CPF1_SCHED=Default-Application-Backup';
7> send 'NB_ORA_CLIENT=backup,CPF2_POLICY=testoracle,CPF2_SCHED=test_multi_copy';
8> backup archivelog all;
9> }

分配的通道: c1
通道 c1: sid=308 例項=testrac2 devtype=SBT_TAPE
通道c1: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)

分配的通道: c2
通道 c2: sid=285 例項=testrac2 devtype=SBT_TAPE
通道c2: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)

正在執行命令: SET BACKUP COPIES

向通道發命令: c1
向通道發命令: c2

向通道發命令: c1
向通道發命令: c2

啟動 backup 於 14-6月 -07
當前日誌已存檔
通道 c1: 正在啟動存檔日誌備份集
通道 c1: 正在指定備份集中的存檔日誌
輸入存檔日誌執行緒 =1 序列 =336 記錄 ID=869 時間戳=625248441
通道 c1: 正在啟動段 1 於 14-6月 -07
通道 c2: 正在啟動存檔日誌備份集
通道 c2: 正在指定備份集中的存檔日誌
輸入存檔日誌執行緒 =2 序列 =251 記錄 ID=868 時間戳=625248441
通道 c2: 正在啟動段 1 於 14-6月 -07
MAN-03009: backup 命令 (c2 通道上, 在 06/14/2007 16:08:38 上) 失敗
ORA-00447: 後臺程式出現致命錯誤
繼續執行其它作業步驟, 將不重新執行失敗的作業
MAN-03009: backup 命令 (c1 通道上, 在 06/14/2007 16:10:23 上) 失敗
ORA-19506: 無法建立順序檔案, 名稱 = "hqik925q_1_2", 引數 = ""
ORA-27028: skgfqcre: sbtbackup 返回錯誤
ORA-19511: 從介質管理器層接收到錯誤, 錯誤文字為:
No policy or schedule name is explicitly specified for copy number <2>.
通道 c1 已禁用, 將在另一個通道上執行該通道上失敗的作業
通道 c2: 正在啟動存檔日誌備份集
通道 c2: 正在指定備份集中的存檔日誌
輸入存檔日誌執行緒 =1 序列 =336 記錄 ID=869 時間戳=625248441
通道 c2: 正在啟動段 1 於 14-6月 -07
釋放的通道: c1
釋放的通道: c2
MAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: backup 命令 (c2 通道上, 在 06/14/2007 16:10:27 上) 失敗
ORA-19506: 無法建立順序檔案, 名稱 = "hsik92bf_1_2", 引數 = ""
ORA-27028: skgfqcre: sbtbackup 返回錯誤
ORA-19511: 從介質管理器層接收到錯誤, 錯誤文字為:
No policy or schedule name is explicitly specified for copy number <2>.

上面就是過早的關閉了備份的JOB,造成了一個CHANNEL出現了問題,隨後的分配CHANNEL操作都會造成下面的問題,直到RMAN退出並重新登陸:

RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> set backup copies 2;
6> send 'NB_ORA_CLIENT=backup,CPF1_POLICY=testoracle,CPF1_SCHED=Default-Application-Backup';
7> send 'NB_ORA_CLIENT=backup,CPF2_POLICY=testoracle,CPF2_SCHED=test_multi_copy';
8> backup tablespace users;
9> }

分配的通道: c1
通道 c1: sid=308 例項=testrac2 devtype=SBT_TAPE
通道c1: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)

釋放的通道: c1
釋放的通道: c2
MAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: allocate 命令 (c2 通道上, 在 06/14/2007 16:13:28 上) 失敗
ORA-06502: PL/SQL: 數字或值錯誤 : 字元到數值的轉換錯誤

RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> }

分配的通道: c1
通道 c1: sid=308 例項=testrac2 devtype=SBT_TAPE
通道c1: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)

釋放的通道: c1
釋放的通道: c2
MAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: allocate 命令 (c2 通道上, 在 06/14/2007 16:14:30 上) 失敗
ORA-06502: PL/SQL: 數字或值錯誤 : 字元到數值的轉換錯誤

RMAN> exit


恢復管理器完成。
$ rman target /

恢復管理器: Release 10.2.0.3.0 - Production on 星期四 6月 14 16:15:02 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.

連線到目標資料庫: TESTRAC (DBID=4291216984)

RMAN> run
2> {
3> allocate channel c1 device type sbt;
4> allocate channel c2 device type sbt;
5> }

使用目標資料庫控制檔案替代恢復目錄
分配的通道: c1
通道 c1: sid=287 例項=testrac2 devtype=SBT_TAPE
通道c1: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)

分配的通道: c2
通道 c2: sid=285 例項=testrac2 devtype=SBT_TAPE
通道c2: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)
釋放的通道: c1
釋放的通道: c2

那麼有沒有一個比較簡單的方法來解決上面的死鎖問題呢,其實這個方法也很簡單,只有人為的指定CHANNEL去進行備份就可以了。

RMAN> run
2> {
3> set backup copies 2;
4> allocate channel c1 device type sbt;
5> allocate channel c2 device type sbt;
6> send 'NB_ORA_CLIENT=backup,CPF1_POLICY=testoracle,CPF1_SCHED=Default-Application-Backup';
7> send 'NB_ORA_CLIENT=backup,CPF2_POLICY=testoracle,CPF2_SCHED=test_multi_copy';
8> backup channel c1 tablespace users, ndindex;
9> }

正在執行命令: SET BACKUP COPIES

分配的通道: c1
通道 c1: sid=287 例項=testrac2 devtype=SBT_TAPE
通道c1: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)

分配的通道: c2
通道 c2: sid=285 例項=testrac2 devtype=SBT_TAPE
通道c2: VERITAS NetBackup for Oracle - Release 6.0 (2006110304)

向通道發命令: c1
向通道發命令: c2

向通道發命令: c1
向通道發命令: c2

啟動 backup 於 14-6月 -07
通道 c1: 啟動全部資料檔案備份集
通道 c1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00010 name=+DISK/testrac/datafile/ndindex01.dbf
輸入資料檔案 fno=00005 name=+DISK/testrac/datafile/users.267.618591279
通道 c1: 正在啟動段 1 於 14-6月 -07
通道 c1: 已完成段 1 於 14-6月 -07, 有 2 個副本和標記 TAG20070614T170141
段 handle=i3ik95bm_1_1 comment=API Version 2.0,MMS Version 5.0.0.0
段 handle=i3ik95bm_1_2 comment=API Version 2.0,MMS Version 5.0.0.0
通道 c1: 備份集已完成, 經過時間:00:08:55
完成 backup 於 14-6月 -07
釋放的通道: c1
釋放的通道: c2

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

相關文章