Oracle 自动化运维-Python表空间邮件预警

网友投稿 1215 2022-10-04

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

Oracle 自动化运维-Python表空间邮件预警

一:创建查询表空间SQL

二:Python调用表空间SQL

三:Python设置发邮件脚本

四:Python表空间邮件预警

参考:http://zhaibibei.cn/python1/1.1/

一:创建查询表空间SQL

[oracle@jumplinux01 ~]$ mkdir script

[oracle@jumplinux01 ~]$ cd home/oracle/script/

[oracle@jumplinux01 script]$ vim tablespace.sql

select a.tablespace_name,

a.bytes 1024 1024 "Sum MB",

(a.bytes - b.bytes) 1024 1024 "used MB",

b.bytes / 1024 / 1024 "free MB",

round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "percent_used%"

from (select tablespace_name, sum(bytes) bytes

from dba_data_files

group by tablespace_name) a,

(select tablespace_name, sum(bytes) bytes, max(bytes) largest

from dba_free_space

group by tablespace_name) b

where a.tablespace_name = b.tablespace_name

#结尾不能有分号

#否则会有错误:

#cx_Oracle.DatabaseError: ORA-00933: SQL command not properly ended

二:Python调用表空间SQL

[oracle@jumplinux01 script]$ vim tablespace.py

#!/usr/bin/python

#coding=utf8

import cx_Oracle

def oraclesql(cursor):

#这里我们使用python的open方法打开文件并读取文件内容作为SQL语句执行

#可使用绝对路径或相对路径

fp=open('/home/oracle/script/tablespace.sql','r')

#fp=open('./tablespace.sql','r')

fp1=fp.read()

cursor.execute(fp1)

data=cursor.fetchall()

return data

if __name__=="__main__":

ipaddress='192.168.2.222'

username='sys'

password='oracle'

port='1521'

tnsname='cjcpdb01'

#这里我们利用Python的异常处理来捕获异常,具体用法请参考文章开始提到的教程

try:

#这里我们使用sysdba权限连接oracle数据库(和上期连接普通用户的不同)

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

except Exception as e:

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

print (content)

else:

cursor = db.cursor()

data=oraclesql(cursor)

cursor.close()

db.close()

#由于上面获取的是一个列表(多行),这里使用for循环来遍历

#注意i也是一个列表

print ('表空间名称 总大小(M) 已使用(M) 剩余空间(M) 使用率')

for i in data:

print (i)

运行结果:

[oracle@jumplinux01 script]$ python tablespace.py

表空间名称 总大小(M) 已使用(M) 剩余空间(M) 使用率

('SYSTEM', 320, 314.625, 5.375, 98.32000000000001)

('CJCTBS', 10, 1, 9, 10)

('SYSAUX', 480, 452.0625, 27.9375, 94.18)

('UNDOTBS1', 230, 211.125, 18.875, 91.79)

('USERS', 5, 1.0625, 3.9375, 21.25)

获取感兴趣的列:

我们是利用fetchall方法来获取数据的,返回的是一个列表(list),我们可以使用i[0]的方式只取感兴趣的列,如下图我们只获取表空间的名称

只需将代码最后一行改成:print (i[0])

[oracle@jumplinux01 script]$ python tablespace1.py

表空间名称 总大小(M) 已使用(M) 剩余空间(M) 使用率

SYSTEM

CJCTBS

SYSAUX

UNDOTBS1

USERS

三:Python设置发邮件脚本

如何利用Python的email模块发送邮件

环境设置

Linux系统为 Centos 6.7

Python环境为 Python 3.6

我们新建一个文件

路径为:/home/oracle/script/sendmail.py

[oracle@jumplinux01 script]$ vim sendmail.py

#!/usr/bin/python

#coding=utf-8

import smtplib

import os

import time

from email.mime.text import MIMEText

to_list=[""]

mail_user="chenjuchao163"    #用户名

mail_pass="**********"

mail_postfix="163.com"  #发件箱的后缀

def send_mail(to_list,sub,content):  #to_list:收件人;sub:主题;content:邮件内容

me="<"+mail_user+"@"+mail_postfix+">"

msg = MIMEText(content)    #创建一个实例,这里设置为html格式邮件

msg['Subject'] = sub    #设置主题

msg['From'] = me

msg['To'] = ";".join(to_list)

smtp_server = 'smtp.163.com'

try:

server=smtplib.SMTP_SSL(smtp_server)

server.connect(smtp_server,465)

#s.set_debuglevel(1)

#smtp_server.helo()

#s.starttls()

server.login(mail_user,mail_pass)  #登陆

server.sendmail(me, to_list, msg.as_string())  #发送邮件

server.close()

return True

except Exception as  e:

print (str(e))

return False

if __name__ == '__main__':

#多个收件人请用逗号隔开

content='这里是发送的内容'

sub='这里是邮件的标题'

s=send_mail(to_list,sub,content)

print (s)

运行结果:

[oracle@jumplinux01 script]$ python sendmail.py

四:Python表空间邮件预警

Python监控表空间使用率,等超过阈值后发送邮件通知

环境设置

Linux系统为 Centos 6.7

Python环境为 Python 3.6

监控Oracle表空间并发送报警信息

文件名称:checktablespace.py

[oracle@jumplinux01 script]$ vim checktablespace.py

#!/usr/bin/python

#coding=utf8

import cx_Oracle

from sendmail import *

def oraclesql(cursor):

#这里我们使用python的open方法打开文件并读取文件内容作为SQL语句执行

#可使用绝对路径或相对路径

fp=open('/home/oracle/script/tablespace.sql','r')

#fp=open('./tablespace.sql','r')

fp1=fp.read()

cursor.execute(fp1)

data=cursor.fetchall()

return data

if __name__=="__main__":

mailcontent=[]

ipaddress='192.168.2.222'

username='sys'

password='oracle'

port='1521'

tnsname='cjcpdb01'

#这里我们利用Python的异常处理来捕获异常,具体用法请参考文章开始提到的教程

try:

#这里我们使用sysdba权限连接oracle数据库(和上期连接普通用户的不同)

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

except Exception as e:

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

print (content)

else:

cursor = db.cursor()

data=oraclesql(cursor)

cursor.close()

db.close()

#这里我们检查每个表空间使用率是否大于90%,如果是则将一条报警信息加入到mailcontent列表

for i in data:

usage=int(i[4])

if usage>=90:

tablespace=i[0]

mailcontent.append('Be Careful tablespace '+tablespace+' is '+str(usage)+'% Used!')

#这里我们判断mailcontent长度是否为0,不为0说明有超过90%的表空间,然后我们发送邮件

if len(mailcontent) != 0:

content='\n'.join(mailcontent)

send_mail(to_list,' Tablespace usage warnning',content)

运行结果:

[oracle@jumplinux01 script]$ python checktablespace.py

设置定时任务

接下来我们要做的就是把他设成自动任务定期执行

如下就是设定每天12点检查一次

[oracle@jumplinux01 script]$ crontabl -e

00 12 * * * /usr/bin/python /home/oracle/script/checktablespace.py

更多数据库相关学习资料,可以查看我的ITPUB博客,网名chenoracle:

http://blog.itpub.net/29785807/

上一篇:运维常见安全问题汇总及剖析 By 乌云
下一篇:IT运维管理重头戏:配置信息统一化
相关文章

 发表评论

暂时没有评论,来抢沙发吧~