AIOps 一场颠覆传统运维的盛筵
1215
2022-10-04
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/
发表评论
暂时没有评论,来抢沙发吧~