oracle返回连接会话,监控Oracle长会话

本文介绍了如何使用Django批量监控Oracle数据库的长会话,并在发现超时会话时通过邮件和微信发送报警。程序通过Django连接Oracle,检查v$session视图的last_call_et字段,当运行时间超过指定阈值时触发报警。同时提供了获取Job执行情况的函数。系统设置了每天凌晨自动运行此脚本并将日志重定向到文件。
摘要由CSDN通过智能技术生成

监控Oracle长会话

2018-01-05 Python 宅必备

关于监控系统我们前面介绍了很多,学会了如何使用Django新建网站以及获取数据监控数据至MySQL或redis

然后将获得的数据库处理后再前端显示

往期可以到我的个人网页查看

这期讲如何使用Django批量监控Oracle 长会话

开发环境

操作系统:CentOS 7.4

Python版本 :3.6

Django版本: 1.10.5

操作系统用户:oms

1. 程序原理

原理为通过Django来批量连接Oracle数据库,然后查看v$session视图的last_call_et字段,如果发现有运行超过指定时间的则报警出来

支持Oracle 9i/10g/11g

12c我没环境应该也可以

2 . 程序主体

#coding=utf-8

from django.core.management.base import BaseCommand

from monitor.models import oraclelist

from monitor.command.getoracleinfo import *

from monitor.command.sendmail_phone import *

from monitor.command.sendmail_wechat import *

class Command(BaseCommand):

def handle(self, *args, **options):

mailcontent=[]

ip=oraclelist.objects.all().order_by('tnsname')

for i in ip:

if i.monitor_type==1:

ipaddress=i.ipaddress

username=i.username

password=i.password

port=i.port

tnsname=i.tnsname

try:

db = cx_Oracle.connect(username+'/'+password+'@'+ipaddress+':'+port+'/'+tnsname ,mode=cx_Oracle.SYSDBA)

except Exception as e:

content= (i.tnsname+' is Unreachable,The reason is '+str(e)).strip()

mailcontent.append(content)

#print (mailcontent)

else:

cursor = db.cursor()

job=checkjob(cursor)

session=checkactivesession(cursor)

cursor.close()

db.close()

if job=='error':

jobresult= 'The job have errors on '+i.tnsname

mailcontent.append(jobresult)

if session=='error':

sessionresult= 'The Session On '+i.tnsname +' have long running sessions '

mailcontent.append(sessionresult)

if len(mailcontent) != 0:

mailcontent='\n'.join(mailcontent)

send_mail_phone(to_list,'Oracle Job&Session Status Monitor',mailcontent)

token=GetToken()

Send_Message(token,2,'Oracle Job&Session Status Monitor',mailcontent)

程序路径为:

mysite/monitor/management/commands/checkoracle_job_session.py

这个程序和前面说的检查Job的程序放在一起

该程序解释如下:

首先获取oraclelist表中所有的数据库信息

然后当monitor_type等于1时连接数据库

然后通过getoracleinfo.py中的checkactivesession函数获取会话的情况

当返回值为error时候获取tns名称并写入mailcontent列表中

最后判断mailcontent是否有数据,有的话则报警

这里有邮件和微信报警,微信报警请看我昨天的推送

3. 获取Job执行信息的函数

我们通过如下函数获取Job的执行情况,该程序可单独于Django运行

路径为:

mysite/monitor/command/checkoraclejob.py

该函数执行一个文件里的sql语句

检查v$session 中状态为ACTIVE或KILLED的非后台进程的会话,当LAST_CALL_ET字段大于7200(2小时)时候则报警出来

之所以单独排除CJQ 和QMN,因为这2个后台进程在9i中的TYPE为USERS而不是BACKGROUND

def checkactivesession(cursor):

fp=open(os.environ['HOME_DIR']+'/mysite/monitor/command/sql/getsession.sql','r')

fp1=fp.read()

s=cursor.execute(fp1)

fp.close()

row=s.fetchone()

if row is None:

return 'normal'

else:

return 'error'

getsession.sql

select a.sid,a.serial#,a.username,a.machine,a.program,a.sql_hash_value,a.type,a.LAST_CALL_ET

from v$session a

where a.status IN ('ACTIVE', 'KILLED')

and a.type <> 'BACKGROUND'

AND a.LAST_CALL_ET>7200

and a.PROGRAM not like '%CJQ%'

and a.PROGRAM not like '%QMN%'

4. 最终结果

7d2f6b10853f46c66202d43a1d038a91.png

可以看如果有超过2小时活动的会话则会发邮件

5. 设置自动运行

这里我们设置每天凌晨进行一次,并重定向所有日志至一个文件

这样我们可以通过检查该日志文件判断脚本是否正常运行

45 * * * * /usr/bin/python2.7 /ezio/website/manage.py checkoracle_job_session >>/home/oracle/crontab.log 2>&1

源代码位置

欢迎访问我的github主页查看源码

https://github.com/bsbforever/oms_django

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值