例如ADG:两台X86数据库服务器centos7.9实现oracle11g的主备adg环境,避免单点故障,满足数据库基本容灾备份需求。

其它数据库的主从集群环境也可通过此思路写脚本处理。
判断本机是否是主并且vip是否在线:
1. 如果本机是主,且vip在线,则保持不动;
2. 如果本机是主,且vip不在线,则up vip;
3. 如果本机不是主,且vip在线,则down vip;
4. 如果本机不是主,且vip不在线,则保持不动。
主备库定时任务都添加脚本,每三秒检测一次。


[root@prebilla etc]# crontab -l
* * * * * /etc/ip.sh > /dev/null 2>&1
[root@prebilla etc]# cat /etc/ip.sh
step=3
for ((i = 0; i < 60; i = (i + step))); do
$(/etc/db_ip.sh)
sleep $step
done
exit 0
以下脚本不够严谨,仅作参考:(以下仅考虑了备库未启动的情况,未考虑备库只启动到nomount和mount状态,
此时还无mrp进程存在的情况,应该检查视图SELECT open_mode FROM v$database;
根据read write判断主库起vip,其它状态则不起vip)
[root@prebilla etc]# cat /etc/db_ip.sh
#!/bin/bash
dbstats=`ps -ef | grep ora_smon | grep -v grep | wc -l`
dgstats=`ps -ef | grep ora_mrp | grep -v grep | wc -l`
ip=`/usr/sbin/ip a|grep bond0:1|wc -l`
if [[ "${dbstats}" -gt 0 ]] && [[ "${dgstats}" -eq 0 ]]; then
if [[ "${ip}" -eq 0 ]]; then
/usr/sbin/ifconfig bond0:1 10.1.1.53 netmask 255.255.255.0 up
fi
else
if [[ "${ip}" -gt 0 ]]; then
/usr/sbin/ifconfig bond0:1 down
fi
fi
-----------------------------------
改进脚本:sqlplus非交互式判断的例子:
echo -e 'set pagesize 0\nselect open_mode from v$database;' | sqlplus -S / as sysdba|grep "READ WRITE"|wc -l
返回结果1,如果是读写模式,则认为是主,up vip;其它情况down vip
改进后的脚本:
-----------------------------------
#!/bin/bash
dbstats=`echo -e 'set pagesize 0\nselect open_mode from v$database;' | sqlplus -S / as sysdba|grep "READ WRITE"|wc -l`
ip=`/usr/sbin/ip a|grep bond0:1|wc -l`
if [[ "${dbstats}" -eq 1 ]] ; then
if [[ "${ip}" -eq 0 ]]; then
/usr/sbin/ifconfig bond0:1 10.1.1.53 netmask 255.255.255.0 up
/usr/sbin/arping -I bond0 -b -s 10.1.1.53 10.1.1.1 -c 3 #保证了5秒内IP可联通
fi
else
if [[ "${ip}" -gt 0 ]]; then
/usr/sbin/ifconfig bond0:1 down
fi
fi

最后修改时间:2024-03-15 12:14:51
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




