1. 程式人生 > 其它 >主備切換的準備工作(二) (r7筆記第85天)

主備切換的準備工作(二) (r7筆記第85天)

相關文章:主備切換的準備工作(r7筆記第83天)

之前也強調過元資料的重要性,而且強調過備庫需要考慮的很多方面,如果考慮不周到,其實我們的備庫還沒有做好切換的準備,而且最近也連連處理了多起問題, 發現災備中還是有很多的思考的東西,所謂實踐出真知,這些地方不注意,只能保證資料不丟失,對於業務連線,應用響應和影響範圍來說都是不可估量的。 很多次的災備切換中,如果在同機房的情況下,在failover的場景中,為了儘可能減少應用的影響範圍,一般都是直接修改備庫的IP為原來主庫的IP, 那麼防火牆的配置就尤為重要,防火牆是一個方面,應用連線的埠是否主備統一,可能對於不同的應用指定了不同的訪問埠,哪些主機配置了更多的信任關係, 可以走域名解析,所以這些看起來很細小的問題,如果在大半夜問題發生的時候再去處理,還是讓人有些上火,尤其在這個時候就特別希望能有個簡單的備份改多 好。 有兩篇文章可以參考,以前寫的一些思路。現在都在實踐這些,具體技術的各個擊破還是好做,能把它做成體系和標準真心不易。

運維平臺的建設思考-元資料管理 你的備庫做好準備了嗎 所以內部使用先嚐到了甜頭,就會不斷改進,願意融入這個體系,那一切都好說了。 目前的思路是可以像八爪魚一般把所有主庫伺服器的資訊都抓取下來,放到中控的指定目錄下。目前的實現指令碼如下: 說明一下,根據 sh /home/yangjr/new.lst 得到了一個元資料列表,然後再這個基礎上根據得到的主庫IP資訊進行備份。這個時候備份的主要還是主庫的配置資訊。 看起來指令碼思路比較簡單,我來說說裡面的一些細節,也確實花了我一些時間。 首先tnsnames.ora,listener.ora甚至initxxx.ora等等都是依賴ORACLE_HOME這個變數的,在這個地方花了不少 時間,最開始的解析思路是從profile裡面解析,但是解析發現profile的格式和方式還是有很大的差別,預設是按照.bash_profile來 解析ORACLE_HOME的,但是測試執行,得到了一半的錯誤都是下面的格式。 /home/oracle/.bash_profile: line 25: /root/.bidbprofile: No such file or directory /home/oracle/.bash_profile: line 13: /root/.testprofile: No such file or directory
當然這個也可以逐步規範,但是這個profile的使用也是合理的,如果一臺伺服器有多個例項,那麼就需要多個profile,可能profile還是巢狀呼叫的。這樣去解析就非常麻煩了。 如果單純在profile解析$ORACLE_HOME的值,其實$ORACLE_HOME一般都是設定為ORACLE_HOME=$ORACLE_BASE/xxxx 那麼問題來了,這個ORACLE_BASE改怎麼解析,可以實現,但是感覺比較繁瑣,而且很容易出現不相容的情況,那麼還有什麼招,一種方法就是/etc /oratab了。這個裡面會存放ORACLE_HOME的資訊,但凡資料庫例項安裝的規範,這個變數值都是有效的,取出一條即可。 對於元資料的抓取,資料庫層面目前是抓取了listener.ora,sqlnet.ora,tnsnames.ora,系統層面抓取了iptables和/etc/hosts的配置 對於sqlnet.ora如果有些服務配置中沒有顯式設定,就不需要生成這個檔案,如果是listener.ora和tnsnames.ora檔案則是必須的。 所以在這些地方指令碼中也做了檢查和校驗。 最後的指令碼內容如下:

##get primary db list 
for ip in `sh /home/yangjr/new.lst|grep -i PRIMARY|grep -v AIX|grep -v nopingdb |awk '{print $1}'|sort|uniq` ;
#for ip in `cat a.sh|grep -i PRIMARY|grep -v Solaris|grep -v nopingdb |awk '{print $1}'|sort|uniq` ;
do 
#echo $ip;cat a.sh|grep -w $ip  ;done > server_sum.txt
#ssh $ip        "cat /home/oracle/.bash_profile|grep -w ORACLE_HOME=|awk -F= '{print $2}'"

mkdir -p /home/conf/$ip;
ORACLE_HOME=`ssh $ip "cat /etc/oratab | tail -1 | awk -F: '{print \$2}'"  2>&1 `
echo  $ip" "$ORACLE_HOME
if [ -n "$ORACLE_HOME" ]; then
ssh $ip "cat $ORACLE_HOME/network/admin/tnsnames.ora 2>&1"  > /home/conf/$ip/tnsnames.ora
ssh $ip "cat $ORACLE_HOME/network/admin/listener.ora 2>&1"  > /home/conf/$ip/listener.ora
ssh $ip "cat $ORACLE_HOME/network/admin/sqlnet.ora 2>&1"  > /home/conf/$ip/sqlnet.ora
scp $ip:$ORACLE_HOME/dbs/init*.ora   /home/conf/$ip 2>&1
scp $ip:$ORACLE_HOME/dbs/spfile*.ora   /home/conf/$ip 2>&1
fi
ssh $ip "cat /etc/hosts"  > /home/conf/$ip/hosts
ssh $ip "cat /etc/sysconfig/iptables"  > /home/conf/$ip/iptables
ssh $ip "cat /etc/sysconfig/network"  > /home/conf/$ip/network

#validate if tnsnames.ora,listener.ora is empty or not
if [ ! -s /home/conf/$ip/sqlnet ];then
rm -f /home/conf/$ip/sqlnet.ora
fi

if [ ! -s /home/conf/$ip/listener.ora ] ||[ ! -s /home/conf/$ip/tnsnames.ora ];then
echo 'WARNING: there is empty files, tnsnames.ora,listener.ora, please check again.'
fi
done