相关文章:主备切换的准备工作(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