使用netstat 获取各Oracle数据库实例对应应用IP地址脚本
一、背景描述
有一套Oracle19C生产库,当前这个生产库上部署了两个实例,其中一个实例是CDB-PDB 模式,另一个是非CDB-PDB模式,含有CDB-PDB模式的实例之前有两个PDB,前段时间因为业务调整,将其中一个PDB下线,目前仅剩余一个PDB。目前计划要为非CDB-PDB实例部署一套 ADG备库,并且业务提交的方案要能实现在短时间进行主备切换,将备库转变为主库。目前需要了解有哪些应用日常连接该实例。和应用相关人员沟通,他们也不清楚都有哪些应用服务器,所以只能通过其它方式来从Oracle数据库上获取连接实例的IP地址。
如果从v$session里获取,可能不准确,因为有些应用服务可能因为日终或其它原因未在执行SQL语句的时候捕获到,无法从v$session或者v$session_history里获取。
如果从监听日志里获取,也是相当麻烦。
通过netstat -ntp |grep oracle 可以看到最后一列对应不同的实例,如下所示
二、脚本信息
如果执行 netstat -ntp |grep oracle,会获取到大量IP等信息,为此,计划使用通过后台脚本结合netstat命令来获取连接数据库的应用IP,让脚本放在后台执行一段时间,脚本信息如下:
#!/bin/bash
# 脚本名称 ip_.sh
# 作者: # 创建临时文件用于存储结果
xxxx实例1_file="/tmp/xxxx实例1_connections.txt"
xxxx实例2_file="/tmp/xxxx实例2_connections.txt"# 清空之前的文件内容
> "$xxxx实例1_file"
> "$xxxx实例2_file"while true; do# 获取 netstat 输出并过滤netstat -ntp | grep oracle | awk '{ip = $5;gsub(/:[0-9]+/, "", ip); # 移除端口号proc = $NF;gsub(/\//, "", proc); # 移除斜杠print ip " " proc;}' | while read line; doip=$(echo $line | awk '{print $1}')proc=$(echo $line | awk '{print $2}')if [[ $proc == *"oraclexxx实例1"* ]]; thenecho "$ip" >> "$xxxx实例1_file"elif [[ $proc == *"oraclexxx实例2"* ]]; thenecho "$ip" >> "$xxxx实例2_file"fidone# 添加时间戳到文件echo "$(date)" >> "$xxxx实例1_file"echo "$(date)" >> "$xxxx实例2_file"sleep 5
done
然后通过如下命令来后台执行。
nohup sh ./ip_watcher.sh &
然后将生成 IP信息的txt文件通过如下命令进行去重:
grep -Eo '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' ip.txt | sort -u > /tmp/_IP.txt
将该脚本执行一段时间,比如一周,可以相对准确的获取到连接不同实例的应用IP.
注意:目前还在进一步优化针对一个实例如含有多个PDB,如何抓取对应不同PDB的应用IP地址,如果有知道的可以私信联系我。