Menu Close

使用脚本分析Oracle listener日志

在巡检过程中需要定期检查数据库连接情况,如果直接查看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文件下载

lsnr_analyzer

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