将Oracle已使用过索引存入MySQL中

这个专题讲述如何讲这些监控数据保存在MySQL中为日后所用

上节讲到如何利用Python获取Oracle已使用过的索引名称

这节讲如何将他们存入MySQL数据库中

环境设置

Linux系统为 Centos 6.8

Python环境为 Python 3.6

MySQL版本 MySQL 5.7 (GA)

连接Oracle模块:cx_Oracle

连接MySQL模块:PyMySQL

存入MySQL脚本内容

将上节获取Oracle索引的脚本增加存入MySQL数据库的代码

脚本名称依然为:checkindex.py

#!/usr/bin/python
#coding=utf8
import cx_Oracle
import pymysql
from sendmail_phone import *

def getindex(oracle_cursor):
    fp=open('/home/oracle/script/getindex.sql','r')
    fp1=fp.read()
    s=oracle_cursor.execute(fp1)
    fp.close()
    result=[]
    row=s.fetchall()
    for i in row:
        result.append(i[0]+'.'+i[1])
    return result

if __name__=="__main__":
    mailcontent=[] 
    ipaddress='10.60.14.70'
    username='sys'
    password='sys_password'
    port='1527'
    tnsname='NP1'
    #首先获取v$sql_plan中的索引名称保存至变量data
    try:
        oracle = 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:
        oracle_cursor = oracle.cursor()
        data=getindex(oracle_cursor)
        oracle_cursor.close()
        oracle.close()
        #接下来连接本地MySQL数据库
        mysql = pymysql.connect("localhost","root","Oracle@123","oracle" )
        mysql_cursor = mysql.cursor()
        #遍历每个索引
        for index in data:
            #首先检查该索引是否存在于数据库中
            checkifexist='select count(*) from oracle_indexmonitor where index_name=\''+index+'\' and ipaddress=\''+ipaddress+'\' and tnsname=\''+tnsname+'\''
            mysql_cursor.execute(checkifexist)
            count = mysql_cursor.fetchone()
            #如结果等于0说明该索引未记录,则插入到MySQL数据库中
            if int(count[0])==0:
                try:
                    insertsql='insert into oracle_indexmonitor(index_name,ipaddress,tnsname) values(\''+index+'\',\''+ipaddress+'\',\''+tnsname+'\')'
                    mysql_cursor.execute(insertsql)
                    mysql.commit()
                except:
                    mysql.rollback()

        mysql_cursor.close()
        mysql.close()

思路为先获取索引信息

  1. 再遍历每个索引

  2. 针对不在MySQL的数据库的存入MySQL数据库中

  3. 经过一段时间的运行即可知道哪些索引未被使用过

运行结果

运行完脚本后我们查看MySQL数据库,应该可以看到表里应该有数据,而且没有重复数据

由于v$sql_plan中的数据可能被刷出内存空间,我们需要较为频繁的运行该程序

我在实际监控中是每隔十五分钟,大家可以使用crontab 来设定

这样经过一段时间(半年甚至一年),可知道哪些索引未被使用过

Alt text

Alt text

源码位置

全部代码请查看我的Github主页

https://github.com/bsbforever/wechat_oms

至此该专题已经讲解完毕,介绍了监控索引的一种思路,日常运维中可横向展开对其他指标进行监控,这个下次说。