Data Guard搭建困境突圍(一)

kunlunzhiying發表於2016-12-01
    在Oracle 10g的中搭建Data Guard環境真是一個糾結,目前大體都是採用兩種方式,一種是rman備份,一種是duplicate的方式,但是這兩個地方不夠讓我滿意,一來是rman備份資料量不小,需要先在本地生成備份,然後拷貝到備庫去,這個搭建週期略長,另外一個就是推薦的方式duplicate,在10g中有些雞肋的味道,本地備份,然後拷貝到備庫,然後動用duplicate的方式,這樣的方式還不如手工rman的方式同步來得順心順意,所以在10g中我是不怎麼喜歡duplicate方式。當然11g終於改進了一把,這種方式成了我搭建Data Guard的不可之選。
     最近碰到一個比較糾結的問題就是在主備庫空間資源不足的情況下,如何在10g版本中順利搭建Data Guard環境。大體的情況如下:

    主備庫的檔案分佈略有一些差別,資料庫資料量大概在800G左右,資料庫版本為10gR2.
這讓我很糾結,到底該怎麼處理,一來是檔案的路徑對映,至少Oracle的convert引數還處理不了這麼智慧,如何這麼平均的分配空間和資料。所以哪怕備庫的空間總量夠,我還是懸著心,這個需求至少通過rman的異機恢復還是有難度。那麼試試duplicate,當然我們知道檔案路徑可以重新修改,所以主要的問題還是在於空間,10g的duplicate需要在主庫端生成備份集,然後在備庫開啟duplicate選項而已。所以實現起來還是有難度。
    Oracle如何通過rman的方式實現遠端備份,這是個難題,如果是在11g可能這個問題就能夠大大化和,在10g上如何突圍呢。
假設資料庫主庫為primary,備庫為standby
則我在備庫嘗試使用下面的方式,我們在/home/oracle/下建立一個臨時目錄tmp,看看到底能夠在備庫環境生成。
rman target sys/oracle@primary
COPY DATAFILE 1 to '/home/oracle/tmp/system01.dbf';
執行時提示檔案無法建立,因為在伺服器主庫環境沒有這個目錄。所以初戰失敗。
然後嘗試使用duplicate的方式。
rman target sys/oracle@primaryauxiliary sys/oracle@standby nocatalog
這種方式是我們一直使用的方式,當然這種方式沒有給我帶來任何驚喜,依舊是在當前環境不大適合。
在備庫端我們可以這麼試試。
rman target sys/oracle@standby auxiliary sys/oracle@primary  nocatalog
COPY DATAFILE 1 to '/home/oracle/tmp/system01.dbf';
這種方式就可以順利在備庫端生成系統表空間的資料檔案了。
所以我們的改進方式就是參考這個主要的 解決思路。
當然我們可以在主庫生成相應的命令,直接批量執行即可。假設我們存在下面的資料檔案。
 select 'copy datafile '||file_id ||' to '||chr(39)||file_name ||chr(39)||';'from dba_data_files;
copy datafile 4 to '/U01/app/oracle/oradata/newtest2/users01.dbf';
copy datafile 3 to '/U01/app/oracle/oradata/newtest2/undotbs01.dbf';
copy datafile 2 to '/U01/app/oracle/oradata/newtest2/sysaux01.dbf';
copy datafile 1 to '/U01/app/oracle/oradata/newtest2/system01.dbf';
copy datafile 5 to '/U01/app/oracle/oradata/newtest2/users2.dbf';
copy datafile 6 to '/U01/app/oracle/oradata/newtest2/fbarch01.dbf';
以其中的兩個資料檔案為例,日誌如下:
RMAN> copy datafile 5 to '/home/oracle/tmp/users2.dbf';
Starting backup at 2016-09-09 22:46:30
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00005 name=/U01/app/oracle/oradata/newtest2/users2.dbf
output file name=/home/oracle/tmp/users2.dbf tag=TAG20160909T224630 RECID=28 STAMP=922142791
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 2016-09-09 22:46:32

RMAN> copy datafile 6 to '/home/oracle/tmp/fbarch01.dbf';
Starting backup at 2016-09-09 22:46:39
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00006 name=/U01/app/oracle/oradata/newtest2/fbarch01.dbf
output file name=/home/oracle/tmp/fbarch01.dbf tag=TAG20160909T224639 RECID=29 STAMP=922142800
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 2016-09-09 22:46:40
在主備庫資料檔案路徑的情況下,就批量生成一個檔案就可以立刻在備庫使用。如果確認生成沒有問題,直接拷貝覆蓋原來備庫檔案,或者直接替換已有的備庫資料檔案即可。
DGMGRL> show configuration;
Configuration - dg_newtest2
  Protection Mode: MaxPerformance
  Databases:
    primaryxx- Primary database
    standbyxx- Physical standby database
Fast-Start Failover: DISABLED
Configuration Status
SUCCESS
在10g中其實已經可以這樣使用duplicate的方式來,但是Oracle卻沒有建議這麼用,我覺得主要的考慮還是安全吧。
10g中這樣用: Duplicate target database for standby nofilenamecheck ;
11g中這樣用:Duplicate target database for standby from active database nofilenamecheck
可以看出主要的差別還是一個active的字樣,我看到有很多人搭建Data Guard在主庫端duplicate,這樣在10g就很不規範而且有一定的風險。
儘管在11g做了這樣的改進,但是還是很容易混淆關係,這也是我猜測的原因,當然手頭的工作就是嘗試在這種情況下儘快使用新方案搭建Data Guard環境。
當然對於很多老司機來說,這已經不是什麼新方法了。

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

相關文章