mysql巡检脚本(必看篇)

作者:jingxian 时间:2024-01-22 07:24:54 

如下所示:


#!/usr/bin/env python3.5

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='''        <div class="stage-list">
         <div class="stage-title"><span>{0}</span></div>
         <div class="detail">
           <p class="detail-list">
             <span class="detail-title">区分格式</span>
             <span class="detail-describe">{1}</span>
           </p>
           <p class="detail-list">
             <span class="detail-title">总空间大小</span>
             <span class="detail-describe">{2:8.2f}G</span>
           </p>
           <p class="detail-list">
             <span class="detail-title">空闲空间(%)</span>
             <span class="detail-describe">{3:8.2f}</span>
           </p>
           <p class="detail-list">

</p>
         </div>
       </div>\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='''    <div class="list-item">
     <div class="category">
       <span>磁盘</span>
     </div>
     <div class="second-stage">\n'''
   for index in range(len(self.disks)):
     result=result+self.disks[index].__str__()
   result=result+'''      </div>
   </div>\n'''
   return result

class cpuResources(object):
 def __init__(self,status):
   self.status=status
 def __str__(self):
   result='''    <div class="list-item">
     <div class="category">
       <span>CPU</span>
     </div>
     <div class="second-stage">
       <div class="stage-list">
         <div class="stage-title"><span>global</span></div>
         <div class="detail">
           <p class="detail-list">
             <span class="detail-title">用户空间使用(%)</span>
             <span class="detail-describe">{0}</span>
           </p>
           <p class="detail-list">
             <span class="detail-title">内核空间使用(%)</span>
             <span class="detail-describe">{1}</span>
           </p>
           <p class="detail-list">
             <span class="detail-title">空闲(%)</span>
             <span class="detail-describe">{2}</span>
           </p>
           <p class="detail-list">
             <span class="detail-title">硬中断(%)</span>
             <span class="detail-describe">{3}</span>
           </p>
           <p class="detail-list">
             <span class="detail-title">软中断(%)</span>
             <span class="detail-describe">{4}</span>
           </p>
           <p class="detail-list">
             <span class="detail-title">io等待(%)</span>
             <span class="detail-describe">{5}</span>
           </p>
           <p class="detail-list">

</p>
         </div>
       </div>
     </div>
   </div>\n'''.format(self.status['user'],self.status['system'],self.status['idle'],self.status['hardirq'],self.status['softirq'],self.status['iowait'])
   return result

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

def __str__(self):
   result='''    <div class="list-item">
     <div class="category">
       <span>MEM</span>
     </div>
     <div class="second-stage">
       <div class="stage-list">
         <div class="stage-title"><span>global</span></div>
         <div class="detail">
           <p class="detail-list">
             <span class="detail-title">总大小</span>
             <span class="detail-describe">{0:8.2f}G</span>
           </p>
           <p class="detail-list">
             <span class="detail-title">空闲大小</span>
             <span class="detail-describe">{1:8.2f}G</span>
           </p>

<p class="detail-list">

</p>
         </div>
       </div>
     </div>
   </div>'''.format(self.status['total'],self.status['avariable'])
   return result

class mysqlResources(object):
 def __init__(self,status):
   self.status=status
 def __str__(self):
   result='''    <div class="list-item">
     <div class="category">
       <span>MYSQL</span>
     </div>
     <div class="second-stage">
       <div class="stage-list">
         <div class="stage-title"><span>{0}</span></div>
         <div class="detail">
           <p class="detail-list">
             <span class="detail-title">innodb_log_wait</span>
             <span class="detail-describe">{1}</span>
           </p>
           <p class="detail-list">
             <span class="detail-title">binlog_cache_use</span>
             <span class="detail-describe">{2}</span>
           </p>
           <p class="detail-list">
             <span class="detail-title">create_temp_disk_table</span>
             <span class="detail-describe">{3}</span>
           </p>
                       <p class="detail-list">
                           <span class="detail-title">Slow_querys</span>
                           <span class="detail-describe">{4}</span>
                       </p>

<p class="detail-list">

</p>
         </div>
       </div>
     </div>
   </div>'''.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巡检报告'):
   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='''<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>巡检报告</title>
<style>
*{
 margin: 0;
 padding: 0;
}
 .content{
   width:1000px;
   height: auto;
   margin: 30px auto;
   border-bottom:1px solid #b2b2b2;
 }
 .list-item{
   border:1px solid #b2b2b2;
   border-bottom: none;
   transition: all .35s;
   overflow: hidden;
   display: flex;
 }
 .list-item:empty{
   display: none;
 }
 .top-title{
   line-height: 32px;
   font-size: 16px;
   color: #333;
   text-indent: 10px;
   font-weight: 600;
 }
 .category{
   width:97px;
   height: auto;
   border-right: 1px solid #b2b2b2;
   float: left;
   text-align: center;
   position: relative;
 }
 .stage-title>span,
 .category>span{
   display: block;
   height: 20px;
   width:100%;
   text-align: center;
   line-height: 20px;
   position: absolute;
   top: 50%;
   margin-top: -10px;left: 0;
 }
 .second-stage{
   width:900px;
   float: left;
 }
 .stage-list{
   border-bottom: 1px solid #b2b2b2;
   display: flex;
 }
 .stage-list:last-child{
   border-bottom: 0;
 }
 .stage-title{
   width:99px;
   border-right: 1px solid #b2b2b2;
   position: relative;
 }
 .detail{
   flex: 1;
 }
 .detail-list{
   border-bottom: 1px solid #b2b2b2;
   height: 40px;
   display: flex;
   transition: all .35s;
 }
 .detail-title{
   padding: 10px;
   height: 20px;
   line-height: 20px;
   border-right: 1px solid #b2b2b2;
   width:200px;
 }
 .detail-describe{
   flex: 1;
   padding: 10px;line-height: 20px;
 }
 .detail-list:last-child{
   border-bottom: 0;
 }
 .list-item:hover{
   background-color: #eee;
 }
 .detail-list:hover{
   background-color: #d1d1d1;
 }
</style>
</head>
<body>
 <div class="content">
       <div class="list-item">
           <p class="top-title">report_title</p>
       </div>\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+'''  </div>
</body>
</html>'''
   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='chkuser',help='user name for connect to mysql')
 parser.add_argument('--password',default='123456',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巡检报告',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))
标签:mySQL,巡检
0
投稿

猜你喜欢

  • Mysql获取当前日期的前几天日期的方法

    2024-01-16 01:22:31
  • 前端面试之vue2和vue3的区别有哪些

    2024-04-28 10:54:38
  • Python用input输入列表的实例代码

    2021-09-22 09:33:53
  • Python实现统计给定列表中指定数字出现次数的方法

    2023-02-04 09:50:29
  • 5.PHP的其他功能

    2023-11-14 16:45:42
  • js字符串日期yyyy-MM-dd转化为date示例代码

    2023-08-06 16:35:58
  • 一文总结MySQL中数学函数有哪些

    2024-01-28 11:24:09
  • pip install如何指定包的安装路径

    2022-05-28 03:38:47
  • MySQL实现SQL Server的sp_executesql

    2008-11-20 15:01:00
  • pycharm远程开发项目的实现步骤

    2023-07-17 06:01:54
  • 利用Pycharm断点调试Python程序的方法

    2023-07-05 03:47:08
  • JavaScript实现简单省市联动

    2024-04-16 09:53:44
  • 解析JavaScript中的标签语句

    2024-05-13 10:35:07
  • MySQL命令行中给表添加一个字段(字段名、是否为空、默认值)

    2024-01-16 12:47:36
  • php实现的验证码文件类实例

    2023-08-17 17:54:52
  • Python基于Hypothesis测试库生成测试数据

    2021-10-21 20:27:22
  • 浅谈Python中chr、unichr、ord字符函数之间的对比

    2022-02-27 16:02:58
  • MySQL慢查询优化之慢查询日志分析的实例教程

    2024-01-22 01:32:44
  • JS加载器如何动态加载外部js文件

    2024-04-16 08:47:06
  • 详解Selenium-webdriver绕开反爬虫机制的4种方法

    2023-09-21 03:30:46
  • asp之家 网络编程 m.aspxhome.com