一直以來搭建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之類的檔案),改進處理後放入備庫。大體的流程圖如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcucTZzIDMhFTN0YWZ0MWY2cTM5Q2MldzMzkDMyMjNkF2NfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
首先第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;
腳本已經開始寫了,感覺越寫發現有很多的細節需要準備,越是這樣,越覺得這件事情還是值得去做的。