当前位置:Gxlcms > 数据库问题 > mysql 性能分析套件

mysql 性能分析套件

时间:2021-07-01 10:21:17 帮助过:2人阅读

!/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 性能分析套件

标签:

人气教程排行