如何用python编写的简单的mysql巡检脚本

如何用python编写的简单的MySQL巡检脚本,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

站在用户的角度思考问题,与客户深入沟通,找到石门网站设计与石门网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站设计、网站制作、企业官网、英文网站、手机端网站、网站推广、申请域名雅安服务器托管、企业邮箱。业务覆盖石门地区。

准备工作:
1    安装python 3.5,本次使用源码安装。
2    安装psutil模块,使用python3.5自带的easy_install包直接运行
cd /opt/python3/bin
./easy_install-3.5 psuitl安装
3    安装mysql_connector模块,同样使用easy_install安装
easy_install-3.5 mysql-connector==2.1.4

准备工作完成后便可运行如下脚本:
[mysql@jing1 scripts]$ more healthcheck.py 
#!/usr/bin/env python3
# -*- coding: gbk -*- 


import psutil
import mysql.connector
import argparse
import json
import datetime


def get_cpu_info(verbose):
    cpu_info={}
    if verbose >0:
        print("[cpu]    start collect cpu info ...")
    data=psutil.cpu_times_percent(3)
    cpu_info['user']=data[0]
    cpu_info['system']=data[2]
    cpu_info['idle']=data[3]
    cpu_info['iowait']=data[4]
    cpu_info['hardirq']=data[5]
    cpu_info['softirq']=data[6]
    cpu_info['cpu_cores']=psutil.cpu_count()
    if verbose >0:
        print("{0}".format(json.dumps(cpu_info,ensure_ascii=False,indent=4)))
        print("[cpu]    collection compeleted ...")
    return cpu_info


def get_mem_info(verbose):
    mem_info={}
    if verbose >0:
        print("[mem]    start collect mem info ...")
    data=psutil.virtual_memory()
    mem_info['total']=data[0]/1024/1024/1024
    mem_info['avariable']=data[1]/1024/1024/1024
    if verbose>0:
        print("{0}".format(json.dumps(mem_info,ensure_ascii=False,indent=4)))
        print("[mem]    collection compeletd ...")
    return mem_info


def get_disk_info(verbose):
    disk_info={}
    if verbose >0:
        print("[disk]    start collect disk info ...")
    partitions=psutil.disk_partitions()
    partitions=[(partition[1],partition[2])for partition in partitions if partition[2]!='iso9660']
    disk_info={}
    for partition in partitions:
        disk_info[partition[0]]={}
        disk_info[partition[0]]['fstype']=partition[1]
    for mount_point in disk_info.keys():
        data=psutil.disk_usage(mount_point)
        disk_info[mount_point]['total']=data[0]/1024/1024/1024
        disk_info[mount_point]['used_percent']=data[3]
    if verbose >0:
        print("{0}".format(json.dumps(disk_info,ensure_ascii=False,indent=4)))
        print("[disk]    collection compeleted ....")
    return disk_info


def get_mysql_info(cnx_args,status_list):
    config={
        'user':cnx_args.user,
        'password':cnx_args.password,
        'host':cnx_args.host,
        'port':cnx_args.port}
    cnx=None
    cursor=None
    mysql_info={}
    try:
        cnx=mysql.connector.connect(**config)
        cursor=cnx.cursor(prepared=True)
        for index in range(len(status_list)):
            status_list[index].get_status(cursor)
            status=status_list[index]
            mysql_info[status.name]=status.value
        mysql_info['port']=config['port']
    except mysql.connector.Error as err:
        print(err)
    finally:
        if cursor != None:
            cursor.close()
        if cnx != None:
            cnx.close()
    return mysql_info


class Status(object):
    def __init__(self,name):
        self.name=name
        self._value=None




    def get_status(self,cursor):
        stmt="show global status like '{0}';".format(self.name)
        cursor.execute(stmt)
        value=cursor.fetchone()[1].decode('utf8')
        self._value=int(value)




    @property
    def value(self):
        if self._value==None:
            raise Exception("cant get value befor execute the get_status function")
        else:
            return self._value


IntStatus=Status




class diskResource(object):
    def __init__(self,mount_point,status):
        self.mount_point=mount_point
        self.status=status


    def __str__(self):
        result='''                


                   
{0}

                   

                       


                            range_format
                            {1}
                       


                       


                            total_space
                            {2:8.2f}G
                       


                       


                            used_space(%)
                            {3:8.2f}
                       


                       


                            
                       


                   

               
\n'''.format(self.mount_point,self.status['fstype'],self.status['total'],self.status['used_percent']
)
        return result


class diskResources(object):
    def __init__(self,status):
        self.disks=[]
        for mount_point in status.keys():
            self.disks.append(diskResource(mount_point,status[mount_point]))


    def __str__(self):
        result='''        

           

                disk
           

           
\n'''
        for index in range(len(self.disks)):
            result=result+self.disks[index].__str__()
        result=result+'''            

       
\n'''
        return result


class cpuResources(object):
    def __init__(self,status):
        self.status=status
    def __str__(self):
        result='''        

           

                CPU
           

           

               

                   
global

                   

                       


                            user_space(%)
                            {0}
                       


                       


                            kernel_space(%)
                            {1}
                       


                       


                            space(%)
                            {2}
                       


                       


                            hard_cruppt(%)
                            {3}
                       


                       


                            soft_cruppt(%)
                            {4}
                       


                       


                            io_wait(%)
                            {5}
                       


                       




                       


                   

               

           

       
\n'''.format(self.status['user'],self.status['system'],self.status['idle'],self.status['hardirq'],self.statu
s['softirq'],self.status['iowait'])
        return result


class memResources(object):
    def __init__(self,status):
        self.status=status


    def __str__(self):
        result='''        

           

                MEM
           

           

               

                   
global

                   

                       


                            total
                            {0:8.2f}G
                       


                       


                            free
                            {1:8.2f}G
                       


                        
                       


                            
                       


                   

               

           

       
'''.format(self.status['total'],self.status['avariable'])
        return result




class mysqlResources(object):
    def __init__(self,status):
        self.status=status
    def __str__(self):
        result='''        

           

                MYSQL
           

           

               

                   
{0}

                   

                       


                            innodb_log_wait
                            {1}
                       


                       


                            binlog_cache_use
                            {2}
                       


                       


                            create_temp_disk_table
                            {3}
                       


                                               


                                                        Slow_querys
                                                        {4}
                                               




                       


                            
                       


                   

               

           

       
'''.format(self.status['port'],self.status['Innodb_log_waits'],self.status['Binlog_cache_use'],
                          self.status['Created_tmp_disk_tables'],self.status['Slow_queries'])


        return result


class hostResources(object):
    def __init__(self,cpu_info,mem_info,disk_info,mysql_info,report_title='MySQL health check'):
        self.cpu=cpuResources(cpu_info)
        self.mem=memResources(mem_info)
        self.disk=diskResources(disk_info)
        self.mysql=mysqlResources(mysql_info)
        self.report_title=report_title
    def __str__(self):
        result='''


   
    health_check



   

               

                       

report_title


               
\n'''


        result=result.replace('report_title',self.report_title)
        result=result+self.cpu.__str__()
        result=result+self.mem.__str__()
        result=result+self.disk.__str__()
        result=result+self.mysql.__str__()
        result=result+'''    


'''
        return result




if __name__=="__main__":
    parser=argparse.ArgumentParser()
    parser.add_argument('--verbose',type=int,default=1,help='verbose for output')
    parser.add_argument('--user',default='system',help='user name for connect to mysql')
    parser.add_argument('--password',default='welcome123',help='user password for connect to mysql')
    parser.add_argument('--host',default='127.0.0.1',help='mysql host ip')
    parser.add_argument('--port',default=3306,type=int,help='mysql port')
    parser.add_argument('--int-status',default=('Com_select,Com_insert,Com_update,Com_delete,Innodb_log_waits,'
                                                'Binlog_cache_disk_use,Binlog_cache_use,Created_tmp_disk_tables,'
                                                'Slow_queries')
                       ,help='mysql status its value like int')
    parser.add_argument('--report-title',default='MySQL health check',help='report title')
    parser.add_argument('--output-dir',default='/tmp/',help='default report file output path')
    args=parser.parse_args()
    cpu_info=get_cpu_info(args.verbose)
    mem_info=get_mem_info(args.verbose)
    disk_info=get_disk_info(args.verbose)
    status_list=[ IntStatus(name=item) for item in args.int_status.split(',')]
    mysql_info=get_mysql_info(args,status_list)
    #dr=diskResources(disk_info)
    #cr=cpuResources(cpu_info)
    #mr=memResources(mem_info)
    #msr=mysqlResources(mysql_info)
    hr=hostResources(cpu_info,mem_info,disk_info,mysql_info,args.report_title)
    now=str(datetime.datetime.now()).replace(' ','^')
    if args.output_dir.endswith('/') != True:
        args.output_dir=args.output_dir+'/'
    filename=args.output_dir+'mysql_inspection_{0}.html'.format(now)
    with open(filename,'w') as output:
        output.write(hr.__str__())
    print('[report]    the report been saved to {0}    ok.... ....'.format(filename))

看完上述内容,你们掌握如何用python编写的简单的mysql巡检脚本的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


文章标题:如何用python编写的简单的mysql巡检脚本
URL链接:http://myzitong.com/article/ijejhc.html