在巡检过程中需要定期检查数据库连接情况,如果直接查看listener.log
文件,发现很费力,有一个listener日志的解析利器,可以分析到这种类型的问题。见附录。
原始的listener.log
内容如下
08-SEP-2021 17:32:34 * (CONNECT_DATA=(SID=zhjkctdb)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=Administrator))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.6.206)(PORT=63233)) * establish * zhjkctdb * 0
08-SEP-2021 17:32:37 * (CONNECT_DATA=(SID=zhjkctdb)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=zhjkct))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.6.214)(PORT=38442)) * establish * zhjkctdb * 0
08-SEP-2021 17:32:37 * (CONNECT_DATA=(SID=zhjkctdb)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=zhjkct))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.6.214)(PORT=38440)) * establish * zhjkctdb * 0
08-SEP-2021 17:32:37 * (CONNECT_DATA=(SID=zhjkctdb)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=zhjkct))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.6.214)(PORT=38438)) * establish * zhjkctdb * 0
08-SEP-2021 17:32:37 * (CONNECT_DATA=(SID=zhjkctdb)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=zhjkct))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.6.214)(PORT=38446)) * establish * zhjkctdb * 0
08-SEP-2021 17:32:37 * (CONNECT_DATA=(SID=zhjkctdb)(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=zhjkct))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.6.214)(PORT=38444)) * establish * zhjkctdb * 0
1. lsnr_analyzer.pl
用法
1.1. 必须安装perl
使用yum安装
yum install perl* (yum安装perl相关支持)
yum install cpan (perl需要的程序库,需要cpan的支持,详细自行百度)
1.2. lsnr_analyzer.pl
语法
perl lsnr_analyzer.pl -t 'time rexge' [-h] filename
其中:
time rexge
填充内容为时间表达式,具体见后面详细说明。
-h
表示连接的来源主机(host)的IP地址。
特别说明:
注1:lsnr_analyzer.pl 是用来分析已经establish的连接,如果是其他连接,不统计在内。
注2:lsnr_analyzer.pl 的统计比较消耗cpu,30万行的listener日志分析大约1秒出结果,300万行的listener日志分析大约6秒出结果。所以如果listener日志比较大,建议tail剪切后统计。
对于已经出现tcpListenDrop的情况,我们分几种情况分析:
(1)如果是突然的连接风暴,需要控制前端的连接,如weblogic中间件逐台启动,而不是同时启动;
(2)如果一直连接数很高,导致listener无法处理,就需要拆分listener,如按照端口拆分。
1.3. 统计某一天或某些天的session请求数
用法:
# 统计2021年9月8日这一天的session请求数
perl lsnr_analyzer.pl -t '08-SEP-2021' listener.log
# 统计2021年9月1日到9月19日这些天的session请求数
perl lsnr_analyzer.pl -t '[0-1][0-9]-SEP-2021' listener.log
[0-1][0-9]
就是将0与0-9进行匹配,再将1与0-9进行匹配得出所有组合的数字。
结果:
01-SEP-2021 => Total:8438
02-SEP-2021 => Total:8827
......
18-SEP-2021 => Total:7934
19-SEP-2021 => Total:8529
1.4. 分host统计某一天或某些天的session请求数
用法:
perl lsnr_analyzer.pl -t '08-SEP-2021' -h listener.log
perl lsnr_analyzer.pl -t '[0-1][0-9]-SEP-2021' -h listener.log
1.5. 指定的一天每个小时的session请求数
用法:
# 统计2021年9月8日每个小时的session请求数
perl lsnr_analyzer.pl -t '08-SEP-2021 [0-2][0-9]' listener.log
结果:
08-SEP-2021 00 => Total:305
08-SEP-2021 01 => Total:305
......
08-SEP-2021 22 => Total:306
08-SEP-2021 23 => Total:300
1.6. 分host统计指定分钟/秒钟内的session请求数
用法:
# 分host统计2021年9月8日17点钟30~59分钟内的session请求数
perl lsnr_analyzer.pl -t '08-SEP-2021 17:[3-5][0-9]' -h listener.log
# 分host统计2021年9月8日17点钟17分钟内每秒的session请求数
perl lsnr_analyzer.pl -t '08-SEP-2021 17:17:[0-5][0-9]' -h listener.log
结果:
08-SEP-2021 17:30 => Total:2
172.16.65.245 2
08-SEP-2021 17:31 => Total:10
172.16.65.245 2
172.16.4.11 5
172.16.5.119 10
......
08-SEP-2021 17:41 => Total:2
172.16.69.13 2
08-SEP-2021 17:42 => Total:1
172.16.69.13 1
......
08-SEP-2021 17:56 => Total:10
172.16.4.11 10
08-SEP-2021 17:59 => Total:7
172.16.65.245 1
172.16.4.11 10
2. 使用fgrep来统计
参考:
Shell: extract more from listener.log (分析oracle监听日志)https://www.cnblogs.com/DataArt/p/10018008.html
3. 附录
3.1. lsnr_analyzer.pl
文件下载
3.2. 连接正常与异常的日志
连接正常的日志:
09-SEP-2021 01:13:05 * (CONNECT_DATA=(SERVICE_NAME=etdb2)(CID=(PROGRAM=sqlplus)(HOST=ZHJKCTDB.localdomain)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.6.201)(PORT=12297)) * establish * etdb2 * 0
连接异常的日志:
09-SEP-2021 01:16:15 * (CONNECT_DATA=(SERVICE_NAME=etdb3)(CID=(PROGRAM=sqlplus)(HOST=ZHJKCTDB.localdomain)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=172.16.6.201)(PORT=12459)) * establish * etdb3 * 12514
TNS-12514: TNS:listener does not currently know of service requested in connect descriptor
特别说明:密码错误不是连接错误。如果想分析某个IP尝试用错误的密码来连接数据库,可以使用上述的统计IP地址的方式来检查。
附录:关联或参考文档
A. 参考的文档
Oracle listener日志的解析利器: https://oracleblog.org/working-case/analyzer-oracle-listener/
B. 关联的文档
清理Oracle监听日志:http://dba.qishuo.xin/?p=411
ORA-12516:TNS:监听程序找不到符合协议堆栈要求的可用处理程序:http://dba.qishuo.xin/?p=1383
Oracle 使用 SCANs 是如何创建数据库连接:http://dba.qishuo.xin/?p=1755
Oracle RAC 修改侦听 (listener)端口:http://dba.qishuo.xin/?p=1152