在Oracle ADG高可用架构中,配置虚拟IP(VIP)是核心优化手段之一,其核心目的是实现ADG主备切换后,业务应用无需修改数据源IP,大幅降低业务中断时长,这一设计思路同样适用于其他数据库的HA架构。本次实操围绕Oracle ADG主备节点完成VIP自动切换脚本部署,同时解决了脚本运行中su操作日志持续写入/var/log/messages导致日志无限膨胀的问题,相同网卡配置的主备两台服务器,脚本部署与运行配置完全一致,以下为详细实操步骤。
一、环境检查:确认公网业务网卡
本次实操中业务公网网卡为ens33,通过ip a命令检查网卡信息,确认网卡状态及原有IP配置,为后续VIP绑定做准备。
[root@euler01 etc]# ip a
# 关键输出:ens33网卡UP状态,绑定物理IP 192.168.X.X/24
二、VIP自动切换脚本部署
本次部署包含两个核心脚本:vip_check.sh为心跳检测脚本,实现定时调用核心脚本;vip_dg.sh为核心逻辑脚本,根据数据库OPEN_MODE状态自动绑定/卸载VIP,同时配置脚本随系统自启动,确保服务器重启后VIP高可用功能正常。
2.1 配置系统自启动
修改/etc/rc.local添加脚本启动命令,同时赋予rc.local可执行权限,保证系统启动时自动运行VIP检测脚本。
# 编辑自启动文件,添加脚本后台运行命令
[root@euler01 etc]# cat /etc/rc.local
添加:/etc/vip_check.sh > /dev/null 2>&1 &
# 赋予可执行权限
[root@euler01 etc]# chmod +x /etc/rc.d/rc.local
[root@euler01 etc]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 510 Dec 2 09:48 /etc/rc.d/rc.local
2.2 编写心跳检测脚本:vip_check.sh
该脚本为死循环定时脚本,每3秒调用一次核心脚本vip_dg.sh,实现VIP状态的实时检测,脚本存放路径/etc/vip_check.sh。
[root@euler01 etc]# cat /etc/vip_check.sh
#!/bin/bash
step=3
while true; do
/etc/vip_dg.sh > /dev/null 2>&1
sleep $step
done
2.3 编写核心逻辑脚本:vip_dg.sh
该脚本为VIP切换核心逻辑,通过查询Oracle数据库v$database视图的open_mode判断主备状态(主库为WRITE模式),同时检查VIP(192.168.207.39)是否绑定,实现主库自动绑定VIP、备库自动卸载VIP ,并通过arping广播更新网络arp表,确保VIP网络可达,脚本存放路径/etc/vip_dg.sh。
[root@euler01 etc]# cat /etc/vip_dg.sh
#!/bin/bash
# 查询数据库是否为WRITE模式(主库),返回1则为主库,0则为备库
dbstats=`su - oracle -c "echo -e 'set pagesize 0\nselect open_mode from v\\$database;' | sqlplus -S / as sysdba"|grep WRITE|wc -l`
# 检查VIP 192.168.X.X是否已绑定在ens33:1
ip=`/usr/sbin/ip a|grep ens33:1|wc -l`
if [[ "${dbstats}" -eq 1 ]] ; then
# 主库:未绑定VIP则执行绑定,并发送arp广播
if [[ "${ip}" -eq 0 ]]; then
/usr/sbin/ifconfig ens33:1 192.168.X.X netmask 255.255.255.0 up
/usr/sbin/arping -I ens33 -b -s 192.168.X.X 192.168.X.X -c 3
fi
else
# 备库:已绑定VIP则执行卸载
if [[ "${ip}" -gt 0 ]]; then
/usr/sbin/ifconfig ens33:1 down
fi
fi
三、脚本运行基础测试
完成脚本部署后,重启服务器验证脚本自启动、VIP绑定状态,确认基础功能正常。
3.1 验证脚本进程运行
服务器重启后,通过ps -ef命令检查VIP脚本进程,确认进程正常后台运行。
[root@euler01 etc]# ps -ef|grep vip
3.2 验证主库VIP绑定状态
主库节点下,通过ip a命令检查,确认浮动VIP 192.168.X.X成功绑定在ens33:1子网卡上,VIP状态正常。
[root@euler01 etc]# ip a
# 关键输出:ens33:1子网卡绑定VIP 192.168.X.X/24
四、问题解决:屏蔽su操作日志输出
脚本运行中,vip_dg.sh每3秒执行一次su - oracle操作,系统会将该操作日志持续写入/var/log/messages,长期运行会导致日志文件无限增大,本次通过修改rsyslog配置,屏蔽su操作的auth类日志输出至messages。
4.1 检查rsyslog服务状态
确认rsyslog服务正常运行,该服务为系统日志核心服务,修改其配置可实现日志过滤。
[root@euler01 etc]# systemctl status rsyslog
# 关键输出:Active: active (running),服务正常运行
4.2 修改rsyslog配置文件
编辑/etc/rsyslog.conf,在messages日志的配置行中添加auth.none,表示屏蔽auth类日志输出至该文件。
[root@euler01 etc]# vi /etc/rsyslog.conf
# 修改前
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 修改后
*.info;mail.none;authpriv.none;cron.none;auth.none /var/log/messages
# 验证修改结果
[root@euler01 etc]# cat /etc/rsyslog.conf|grep auth.*
*.info;mail.none;authpriv.none;cron.none;auth.none /var/log/messages
4.3 重启rsyslog服务并验证
重启rsyslog服务使配置生效,随后通过tail -f实时查看messages日志,确认无新的su操作日志输出,问题解决。
# 重启服务
[root@euler01 etc]# systemctl restart rsyslog
# 验证日志,无su记录输出
[root@euler01 etc]# tail -f /var/log/messages
# 仅显示rsyslog服务重启日志,无su[xxxx]: (to oracle) root on none相关记录
五、最终验证:通过VIP连接数据库
以Oracle用户身份,通过浮动VIP 192.168.X.X连接数据库,验证VIP网络可达、数据库正常访问,确认整个VIP高可用部署流程生效。
[root@euler01 etc]# su - oracle
[oracle@euler01 ~]$ sqlplus zyjc/zyjc@192.168.X.X:1521/cm
SQL*Plus: Release 11.2.0.4.0 Production on Tue Dec 2 13:10:18 2025
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options