2017-05-23 DBA日记,使用python巧妙分析listener的log.xml,为连接泄漏提供数据支持

背景:
通过观察数据库指标监控平台,发现数据库logon/s 为1.5个,并且出现在业务低峰期。因此怀疑中间件或程序代码出现连接泄密问题,所以需要进一步分析。
分析:
具体描述(S):在每天6-9点,数据库db1上发现logon/s 为1.5个。
收集数据(G-gather):下载listener的log.xml(该文件记录了什么时候,什么IP连接到数据库主机上,连接状态:是否成功连接)到本地进行分析,该文件是是一个非结构化文件,为了方便统计分析,我使用python稍作处理——统计同一IP,连接数据库的次数。处理后数据如下:
IP 连接次数
192.168.1.1 1000
192.168.1.2 800
192.168.1.3 700
192.168.1.4 500
192.168.1.5 1
分析(A):按照“找特例”的方法,首先把192.168.1.1这个标本取出来,进行第二轮分析。
第二轮分析:
具体描述:192.168.1.1这个服务器在3小时以内,产生了1000个新建连接的请求。
收集数据:1)向192.168.1.1的中间件管理员,描述该问题,并请求协助收集数据。如中间件中关于连接池的配置信息。根据中间件管理员的描述在该服务器上的中间件类型jboss,它的连接池属性是最小连接数配置3,最大是10,另一数据源的连接属性是最小连接数配置20,最大是100。 其中有一个关键属性< idle-timeout-minutes > 2 </ idle-timeout-minutes >
2) 通过查询数据库gv$session确认是否确实有此多的会话,结果,数据为上只有80多个连接。
分析:在JBOSS配置属性<idle-timeout-minutes >,当连接池空闲会话超过2分钟后,自动回收,所以在闲时,会把所有会话回收,同时又配置了最小连接数,所以,最极端情况,把所有连接销毁,又立刻创建新连接。

结论:
由于JBOSS配置属性<idle-timeout-minutes >配置不恰当,导致连接泄漏。目前建议配置为30分钟。

附录:python分析脚本:
#-*-coding:utf-8 -*-
'''
分析oracle实例的监听器的log.xml,分析主题如下
1. 找出一定时间内,统计app IP产生新连接数据库的次数
'''
from bs4 import BeautifulSoup
import re

def SortList(l1):
	max_value=0
	position=0
	new_l1=[]

	while (True):
		if len(l1)==0:
			break
		if len(l1)==1:
			position=0
			new_l1.append(l1[position])
			l1.pop(position)	
			break
		max_value=l1[0][1]
		for j in range(len(l1)):
			if l1[j][1]>=max_value:
				max_value=l1[j][1]
				position=j
		try:
			new_l1.append(l1[position])
			l1.pop(position)
		except:
			print 'error',position,l1[position-1]
			print len(l1)
	return new_l1



if __name__ == '__main__':
	print 'running............'
	xml=open(r'D:\log.xml','r')
	contents=xml.readlines()
	l_ip=[]
	l_full_ip=[]
	fmat_c=''
	for i in contents:
		fmat_c=fmat_c+i
	#print contents
	print "read file successful"
	bs=BeautifulSoup(fmat_c,"html5lib",from_encoding="UTF8")
	print "format file successful"
	txt=bs.find_all('txt')
	for i in txt:
		found=0
		result=re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',i.string)
		if len(result)>0:
			#print result[0]
			#l_ip.append(result[0])
			try:
				for j in range(len(l_ip)):
					if result[0]==l_ip[j][0]:
						l_ip[j][1]=l_ip[j][1]+1
						found=1
						break
				if found==0:
					l_ip.append([result[0],1])

			except Exception as e :
				print(e)
			
	#print l_ip.count()
	print 'sorted:'
	l=SortList(l_ip)
	for i in l:
		print i[0]+' '+str(i[1])


	xml.close()
	print '............END............'
	#print bs


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值