半自動化搭建Data Guard的想法和實踐(一)

jeanron100發表於2016-07-28
    一直以來搭建Data Guard是一件看起來還蠻有含量的工作,因為這其中涉及的工作比較瑣碎,比較細,況且手工搭建起來都會碰到各種各樣的問題,如果中途碰到一點兒小問題,那可能需要花點時間來排查,如果想要指令碼自動化,那簡直寸步難行。所以搭建Data Guard一方面會需要很多的提前準備和配置,另一方面這個工作自動化的驅動力不夠,畢竟環境不會像MySQL業務一樣動輒幾十成百上千的規模,所以由此而來,好像搭建一個套環境的成本也值了,如果嘗試自動化,半自動化,那花費的時間估計夠搭建10套環境了。所以目前來看,行業內也鮮有自動化搭建的案例。
      當然如果一件事情本來你需要花2個小時搞定,結果花了10分鐘就能搞定,那麼對於工作來說,這就是一種福利了,另一方面從規範角度來看,自動化,半自動化,一個重要的基礎就是標準化,規範化。這些基礎做不好,那麼自動化,半自動化也是磕磕絆絆。所以我也是借這個機會來完善規範一些我們做的不好的地方。舉個例子來說明就具體多了。
我在備庫配置網路的時候,把主庫的listener.ora複製到備庫,修改了HOST資訊,就準備啟動監聽,但是奇怪的是監聽怎麼都啟動不了。錯誤資訊如下:
$ lsnrctl start LISTENER_1529
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 28-JUL-2016 16:37:17
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
Starting /U01/app/oracle/product/11.2.0.4/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.4.0 - Production
System parameter file is /U01/app/oracle/product/11.2.0.4/network/admin/listener.ora
Log messages written to /U01/app/oracle/diag/tnslsnr/stest3/listener_1529/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=stest3.cyou.com)(PORT=1529)))
TNS-01201: Listener cannot find executable /U01/app/oracle/product/11.2.0.4/db_1/bin/oracle for SID test
Listener failed to start. See the error message(s) above...
對於網路監聽這塊,本身Oracle的解析就有些不是很健壯的地方,有些空格的約束問題,更多的細節,可以參考http://blog.itpub.net/23718752/viewspace-1061787/
所以根據錯誤,看起來和空格還沒有關係,但是我排除再三,排除了字符集,空格,DB資訊錯誤等,還是沒有找到問題的癥結。一籌莫展的時候,突然發現listener.ora中的ORACLE_HOME為/U01/app/oracle/product/11.2.0.4/db_1,在主庫則為/U01/app/oracle/product/11.2.0.4,最後發現是這樣一個問題,看起來著實讓人有些無奈。而這種問題說實在的解決了對自己的技術提高有多少,我看未必,但是又厄待解決。
    所以這也更加堅定了我簡化Data Guard配置的一個決心。
    而另外一個考慮就是基於安全和指令碼的健壯性,我決定使用半自動化搭建的方式,主庫就是主庫,容不得半點失誤,所以我不會考慮在主動自動化執行任何的指令碼,指令碼都需要確認稽核後執行,對於配置的新增和修改尤其需要注意,而對於備庫而言,自動化則大有可為,所以我需要在主庫中獲取一些基本的後設資料檔案(比如listener.ora之類的檔案),改進處理後放入備庫。大體的流程圖如下:

首先第1步就是從主庫中獲取這些後設資料檔案,只有抓取,沒有任何寫入。
第二步是在中控機器中進行後設資料檔案的處理,這大體涉及以下幾個方面:
1. 在tnsnames.ora中新增備庫的tns連線串,修改host
 2.istener.ora修改host為備庫主機名
 3. hosts中追加主機名的配置
 4. 新增db_unique_name到引數檔案中
 5. 新增local_listener
 6. 新增dg_broker_start
 7. 新增standby_file_management=auto
 8. 新增db_file_name_convert
 9. 新增log_file_name_convert
10.開通主備庫的防火牆許可權
第三步則是在主庫中進行配置,大體有如下的工作:
  1.修改/etc/hosts,追加備庫的配置
    10.127.133.190    stest2.cyou.com
   2. 追加配置到tnsnames.ora,修改host為主機名
        stest2=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = stest2.cyou.com)(PORT = 1529))) (CONNECT_DATA = (SERVICE_NAME = test)(server=dedicated)))
    3.檢查主庫是否force logging,是否含有standby logfile,是否啟用spfile,是否啟用dg broker,是否設定local_listener
第四步則是把生成的檔案,指令碼複製到備庫端,在備庫執行部署。有下面的一些工作需要考慮。
    1./sbin/ifconfig得到IP 根據db名改為主機名
    生成類似下面的形式,
            IP                         <db_unique_name><dg_number>.oracle.com
            10.127.133.190    stest2.oracle.com
    2.追加主庫的配置
    10.127.xxxx    test.oracle.com     --參考主庫的/etc/hosts
    3.hostname stest2.cyou.com    
    4.修改 /etc/sysconfig/network
    5.建立必要的目錄結構,比如審計日誌的目錄(基於引數audit_file_dest)
    6.啟動監聽
這些步驟做好了之後,80%的工作就完成了。我們就可以看看怎麼來搭建備庫了。一種方式是使用duplicate來線上從頭主庫同步資料到備庫,這種方式簡單快捷,也是推薦的方式。
兩個命令即可搞定。
 rman target sys@test auxiliary sys/xxxx@stest2 nocatalog
duplicate target database for standby from active database nofilenamecheck;
 這些工作都完成了,就完成了90%,還剩下最後一步,即配置DG Broker,這個是作為一個基本的標準規範,省時省力。
在主庫執行兩個命令即可搞定,這個步驟手動完成,因為是最後的收官階段,一旦有問題,這個階段一定會丟擲異常。
create configuration dg_test as
primary database is test
connect identifier is test;

add database stest2 as
connect identifier is test2
maintained as physical;
指令碼已經開始寫了,感覺越寫發現有很多的細節需要準備,越是這樣,越覺得這件事情還是值得去做的。


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

相關文章