mysql 性能分析套件

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

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=‘[email protected]‘,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()
时间: 2024-10-20 21:34:38

mysql 性能分析套件的相关文章

MySQL性能分析及explain的使用

MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析结果 如explain select * from test1 where id=1;会出现:id  selecttype  table  type possible_keys  key key_len  ref rows  extra各列. 其中, type=const表示通过索引一次就找到了: key=primar

MySQL性能分析和优化-part 1

MySQL性能优化 平时我们在使用MySQL的时候,怎么评估系统的运行状态,怎么快速定位系统瓶颈,又如何快速解决问题呢? 本文总结了多年来MySQL优化的经验,系统介绍MySQL优化的方法. OS性能分析 使用top观察top cpu/memory进程 使用mpstat观察每个CPU核心的CPU使用情况 使用iostat观察系统io状况 使用sar -n DEV观察网卡流量 使用vmstat查看系统内存使用情况 查看系统日志 使用dstat 记录和查看历史数据 查看昨天的数据 查看swap 查看

mysql性能分析show profile/show profiles

MySQL性能分析show profiles show profile 和 show profiles 语句可以展示当前会话(退出session后,profiling重置为0) 中执行语句的资源使用情况. Profiling 功能由MySQL会话变量 : profiling控制,默认是OFF.关闭状态.select @@profiling; 或者show variables like '%profi%': mysql> select @@profiling; +-------------+ |

MySQL性能分析之explain

mysql性能分析之explain Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法:explain select … from … [where …] 例如:explain select * from news; 输出:+--+-----------+-----+----+-------------+---+----

Yahoo 开源的 MySQL 性能分析工具(MySQL Performance Analyzer)

原文地址:https://github.com/yahoo/mysql_perf_analyzer MySQL Performance Analyzer is an open source project for MySQL performance monitoring and analysis. This repository includes two sub projects: Java web application project myperf Java web server jetty

mysql性能分析-------profiling和explain

1. profiling之性能分析 MySQL5.0.37版本以上支持了Profiling – 官方手册.此工具可用来查询 SQL 会执行多少时间,System lock和Table lock 花多少时间等等,对定位一条语句的 I/O消耗和CPU消耗 非常重要.查看profiling: select @@profiling; 启动profiling: set @@profiling=1 关闭profiling : set @@profiling=0; sql语句: 1.查看profile记录sh

mysql性能分析工具

一.EXPALIN 在SQL语句之前加上EXPLAIN关键字就可以获取这条SQL语句执行的计划 那么返回的这些字段是什么呢? 我们先关心一下比较重要的几个字段: 1. select_type 查询类型 1)simple 简单查询,没有UNION和子查询 2)priamry 主查询,有UNION或子查询的最外层查询 3)union 联合查询,有UNION的第二个和以后的查询 4)subquery 子查询,有子查询的除FROM包含的子查询 5)derived 派生查询,FROM包含的子查询 6)de

MySQL性能分析脚本

""" 目标 : 这个工具用于分析MySQL实例的性能问题 作者 : 蒋乐兴 QQ : 1721900707 版本信息 : 基于python3.4 MySQL 5.7.11 orzdba MySQL用户要用到的一些权限: create user [email protected]'127.0.0.1' identified by '131417'; """ #!/usr/bin/python #!coding:utf-8 import mysql

mysql 性能分析及explain用法

转载自http://blog.sina.com.cn/s/blog_4586764e0100o9s1.html 使用explain语句去查看分析结果 如   explain select * from test1 where id=1; 会出现: id  selecttype  table  type possible_keys  key key_len  ref rows  extra各列 其中, type=const表示通过索引一次就找到了, key=primary的话,表示使用了主键 ty