Oracle 自動化運維-Python表空間郵件預警

chenoracle發表於2020-03-17


Oracle 自動化運維-Python表空間郵件預警


一:建立查詢表空間SQL

二:Python呼叫表空間SQL

三:Python設定發郵件指令碼

四:Python表空間郵件預警

參考:http://www.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

#結尾不能有分號

#否則Python呼叫時會有錯誤:

#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=["<chenjuchao126@126.com>"]

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+">"   #這裡的hello可以任意設定,收到信後,將按照設定顯示

    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監控表空間使用率,等超過閾值(大於90%)後傳送郵件通知

環境設定

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

歡迎關注我的微信公眾號"IT小Chen",共同學習,共同成長!!!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29785807/viewspace-2680841/,如需轉載,請註明出處,否則將追究法律責任。

相關文章