天天看點

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

    一直以來搭建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之類的檔案),改進處理後放入備庫。大體的流程圖如下:

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

首先第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;

腳本已經開始寫了,感覺越寫發現有很多的細節需要準備,越是這樣,越覺得這件事情還是值得去做的。