码迷,mamicode.com
首页 > 数据库 > 详细

mysql 性能分析套件

时间:2016-07-03 00:26:06      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:

#!/usr/local/python3.5/bin/python3.5
#!coding:utf-8
####################################
#目地:用于诊断mysql性能问题
#作者:蒋乐兴
#时间:2016-07-02
#create user moniter@‘127.0.0.1‘ identified by ‘moniter@2048‘;
#
####################################

import mysql.connector as connector
import argparse
import psutil
import json
import sys
import os

show_global_status_56="select variable_name,variable_value from information_schema.global_status where variable_name= %s"
show_global_variables_56="select variable_name,variable_value from information_schema.global_variables where variable_name= %s"
show_global_status_57="select variable_name,variable_value from performance_schema.global_status where variable_name= %s"
show_global_variables_57="select variable_name,variable_value from performance_schema.global_variables where variable_name= %s"

class AnalyseBase(object):
    def __init__(self,cursor,args):
        self.cursor=cursor
        self.args=args
        self.result={}

    def Analyse(self):
        "执行分析函数"
        pass
    def Print(self):
        print(json.dumps(analyst.result,sort_keys=True,indent=4,ensure_ascii=False))

class AnalyseInnodb(AnalyseBase):
    def innodb_log_waits(self):
        "status:innodb_log_waits innodb 等待刷新redo log 的次,如果它不是0,说明innodb_log_buffer_size 过小"
        self.cursor.execute(args.show_global_status,(‘innodb_log_waits‘,))
        name,value=self.cursor.fetchone()
        comment=None
        if int(value)==0:
            comment=‘正常‘
        else:
            comment=‘innodb_log_waits > 0 应该适当增加innodb_log_buffer_size的大小‘
        self.result[‘innodb_log_waits‘]={‘name‘:‘innodb_log_waits‘,‘value‘:value,‘comment‘:comment}

    def innodb_flush_log_at_trx_commit(self):
        ("variables:innodb_flush_log_at_trx_commit     0:事务提交时并不把redo log 写入日志文件,而是等待主线程每秒的刷新。"
         "1:commit 时同步的方式刷新redo log 到日志文件"
         "2:commit 时异步的方式刷新redo log 到日志文件")
        self.cursor.execute(args.show_global_variables,(‘innodb_flush_log_at_trx_commit‘,))
        name,value=self.cursor.fetchone()
        comment=None
        if int(value)==1:
            comment=‘正常、由于每个事务完成后都要同步的刷新日志,所以性能不是最好‘
        else:
            comment=‘注意、有安全隐患;0:事务提交时并不把redo log 写入日志文件,而是等待主线程每秒的刷新;2:commit 时异步的方式刷新redo log 到日志文件。‘
        self.result[‘innodb_flush_log_at_trx_commit‘]={‘name‘:‘innodb_flush_log_at_trx_commit‘,‘value‘:value,‘comment‘:comment}

    def innodb_file_per_table(self):
        "variables:innodb_file_per_table 不做成单独表空间的话管理不方便"
        self.cursor.execute(args.show_global_variables,(‘innodb_file_per_table‘,))
        name,value=self.cursor.fetchone()
        comment=None
        if comment==‘ON‘:
            comment=‘正常‘
        else:
            comment=‘注意、建议开启innodb_file_per_table,以方式管理innodb表空间文件‘
        self.result[‘innodb_file_per_table‘]={‘name‘:‘innodb_file_per_table‘,‘value‘:value,‘comment‘:comment}

    def innodb_io_capacity(self):
        "1:在合并插入缓冲时,合并插入缓冲数量为innodb_io_capacity的5%;    2:在从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity页。"
        self.cursor.execute(args.show_global_variables,(‘innodb_io_capacity‘,))
        name,value=self.cursor.fetchone()
        comment=("注意、无法确认最优值,请核对磁盘IO能力。在合并插入缓冲时,合并插入缓冲数量为innodb_io_capacity的5%;"
        "在从缓冲区刷新脏页时,刷新脏页的数量为innodb_io_capacity页。")
        self.result[‘innodb_io_capacity‘]={‘name‘:‘innodb_io_capacity‘,‘value‘:value,‘comment‘:comment}

    def innodb_max_dirty_pages_pct(self):
        "innodb 在每秒刷新缓冲池时会去判断这个值,如果大于innodb_max_dirty_pages_pct,才会去刷新100个脏页"
        self.cursor.execute(args.show_global_variables,(‘innodb_max_dirty_pages_pct‘,))
        name,value=self.cursor.fetchone()
        comment=None
        if int(value) <=74:
            comment=("注意、innodb_max_dirty_pages_pct 过小;这会增加磁盘的IO负载,请适当增加,推荐值75~80")
        elif int(value) <=80:
            comment=‘正常‘
        else:
            comment=‘注意、innodb_max_dirty_pages_pct 过大;脏面数量过大,这会影响服务宕机后,重启的用时‘
        self.result[‘innodb_max_dirty_pages_pct‘]={‘name‘:‘innodb_max_dirty_pages_pct‘,‘value‘:value,‘comment‘:comment}

    def Analyse(self):
        self.innodb_log_waits()
        self.innodb_file_per_table()
        self.innodb_flush_log_at_trx_commit()
        self.innodb_io_capacity()
        self.innodb_max_dirty_pages_pct()

if __name__=="__main__":
    parser=argparse.ArgumentParser()
    parser.add_argument(‘--host‘,default=‘127.0.0.1‘,help=‘ip address of mysql server.....‘)
    parser.add_argument(‘--port‘,default=3306,type=int,help=‘port number of mysql server....‘)
    parser.add_argument(‘--user‘,default=‘moniter‘,help=‘mysql user name................‘)
    parser.add_argument(‘--password‘,default=‘moniter@2048‘,help=‘password of mysql user.........‘)
    parser.add_argument(‘--mysqlversion‘,default=5.6,choices=[‘5.6‘,‘5.7‘],help=‘version of mysql server........‘)
    parser.add_argument(‘target‘,default=‘innodb‘,choices=[‘innodb‘,‘binlog‘,‘all‘],help=‘the part of mysql that you want to tuning‘)
    args=parser.parse_args()
    #隔离不同版本mysql数据库的差异 
    if args.mysqlversion==5.6:
        args.show_global_status=show_global_status_56
        args.show_global_variables=show_global_variables_56
    elif args.mysqlversion==5.7:
        args.show_global_status=show_global_status_57
        args.show_global_variables=show_global_variables_57

    cnx=None
    cursor=None
    connection_config={
    ‘host‘:args.host,
    ‘port‘:args.port,
    ‘user‘:args.user,
    ‘password‘:args.password
    }
    try:
        cnx=connector.connect(**connection_config)
        cursor=cnx.cursor()
        analyst=AnalyseInnodb(cursor,args)
        analyst.Analyse()
        analyst.Print()
    except Exception as err:
        print(err)
    finally:
        if cnx != None:
            cnx.close()
            cursor.close()

 

mysql 性能分析套件

标签:

原文地址:http://www.cnblogs.com/JiangLe/p/5636265.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!