我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python实现MySQL DBA小工具

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python实现MySQL DBA小工具

  我们知道MySQL所有的运行状态统计信息都能从“show global status”语句的结果集中查看,该结果集保存的是从MySQL启动到当前时间之间各状态值的“总数”,对我们的分析不友好。在我们日常维护和优化中,我们需要持续的跟踪某些状态值的的变化(增量或者是平均值);或者是在调整某些参数后,观察某些状态值的变化是否符合我们预期等等。

  基于以上这些需求,作者用Python实现了一个小工具。其实也从“MySQL Workbench”这个图形化工具中获得了一点启发,想到做一个命令行下类似的功能。MySQL Workbench中的dashboard中可显示如下图的统计信息,很漂亮哈~

wKiom1dVI53w3a-bAAEnIch64NM659.png

  言归正传,该脚本显示信息的类型分两类:“指定时间内平均值”和“指定时间内增长值”,在命令选项里可指定,首先来看一下命令的帮助信息

wKioL1dVESzAV4PTAAPdOsiSzzU823.png

 

  其中--average选项为查看指定时间平均值,默认查看指定时间内的增长值;-t选项为想查看的信息类型,每一种信息类型在脚本里对应一个元组(即数组):值为该类型所包含的“状态值”。

  这里我本来想做一个比较完美的命令,大家拿来即用,但是应为show status里的状态值太多了,我不用也没必要在脚本里包含所有的。脚本里我只将常用的一些信息包含了进来,并且我更倾向于大家把这个脚本看做是一个易于根据自己情况定制的通用框架(其实就是如果自己关心的信息没有包含在脚本里的话,自己在脚本里添加或修改一个分类即可)。

先看几个例子

  查看指定时间内qps:

wKiom1dWdK2je-iaAAQzJptSKQU068.png

  查看MySQL网络相关状态

wKiom1dVF4PAEl1MAAQGkNEheHE906.png


OK,看完上面截图觉得这小工具还有点用的,接着看代码,代码中注释还是比较详细的,只要有点编程基础,应该是能看的懂的~~

#!/bin/env python3
"""
by lijiankai 20160602
"""

from sys import exit
from time import sleep
from argparse import ArgumentParser,RawTextHelpFormatter
import pymysql

#----------
#定义每种显示类型(由-t指定)所包含的状态
#添加和修改要展示的信息修改types_dic字典即可
#同时关注下面add_argument方法添加-t选项时其中choices参数的值,应该和types_dic的键一致
#----------
types_dic = {}
types_dic['qps'] = ('Com_select','Com_update','Com_insert','Com_delete','Com_replace','Questions','Queries')
types_dic['table_file'] = ('Opened_tables','Opened_table_definitions','Opened_files','Created_tmp_tables','Created_tmp_disk_tables','Created_tmp_files',)
types_dic['general'] = ('Slow_queries','Select_full_join','Select_full_range_join','Select_range','Select_scan','Sort_range','Sort_rows','Sort_scan')
types_dic['threading'] = ('threads_created')
types_dic['networking_stats'] = ('Bytes_received','Bytes_sent','Connections','Aborted_connects')
types_dic['innodb_buffer_pool'] = ('Innodb_buffer_pool_read_requests','Innodb_buffer_pool_reads','Innodb_buffer_pool_write_requests','Innodb_buffer_pool_wait_free')
types_dic['innodb_data'] = ('Innodb_data_fsyncs','Innodb_data_read','Innodb_data_written') 
types_dic['innodb_stats'] = ('Innodb_log_write_requests','Innodb_log_writes','Innodb_os_log_fsyncs','Innodb_os_log_writes')

#----------
#get_args()函数通过argparse模块的ArgumentParser类来生成帮助信息并获取命令行参数
#生成一个全局变量字典对象args,保存处理过的命令行参数
#----------
def get_args():
    #实例化类,formatter_class参数允许help信息以自定义的格式显示
    parser = ArgumentParser(description="This is a simple tool for MySQL DBA.\nWith this tool you can see several kinds of status's average or increase value in the last N seconds",formatter_class =RawTextHelpFormatter)
    
    #group_necessary = parser.add_argument_group('necessary arguments')
    #group_optional = parser.add_argument_group('optional arguments')    #默认既有该项,所有参数均位于该项下

    parser.add_argument('-u',metavar='USER',dest='user',help="mysql user",required=True)
    parser.add_argument('-p',metavar='PASSWORD',dest='password',help="mysql password",required=True)
    parser.add_argument('-H',metavar='HOSTNAME',dest='host',help="mysql hostname",required=True,)
    parser.add_argument('-P',metavar='PORT',dest='port',help="mysql port(default 3306)",default=3306,type=int)
    parser.add_argument('-i',metavar='INTERVAL_TIME',dest='interval',help="interval time(unit=second,default 10s)",default=10,type=int)
    #--average表示是否查看平均值,默认显示差值    action不能和metavar共存
    parser.add_argument('--average',dest='average',help='show average value in the interval time(default is the increase value)',action='store_true')    #store_true不能喝metavar共存
    #下面-t选项中的choices的列表值需和脚本开始处定义的types_dic字典的键一致
    parser.add_argument('-t',metavar='INFORMATION_TYPE',dest='type',choices=['qps','table_file','general','threading','networking_stats','innodb_buffer_pool','innodb_data','innodb_stats'],help="""information type.See the allowed types below:
qps :   numbers of the DML command executed
table_file :   tables or tmp_tables or tmp_files that are opend or created
general :   something about select
networking_stats :   something about network or connect
innodb_buffer_pool :   something about innodb_buffer_pool stats
innodb_data :   something about innodb_data stats
innodb_stats :   something about innodb stats""",\
    required=True)

    #全局字典 键(add_argument()中的dest):值(用户输入)
    #vars将Namespace object转换成dict object
    global args
    args = vars(parser.parse_args())
    #print(args)
    
#----------
#process_query()函数从get_args()返回值中拿到登陆mysql需要的相关信息
#执行show global status语句,并将结果保存在status_dict字典中
#----------
def process_query():
    status_dict={}    #存放所有status值
    try:
        with pymysql.connect(host=args['host'],user=args['user'],password=args['password'],charset='utf8',port=args['port']) as mysql_cur:
            mysql_cur.execute('show global status')    #执行语句,查询结果的每一行作为一个元组存进mysql_cur中
    except pymysql.err.MySQLError as err:
        print("ERROR: "+str(err))
        exit(10)

    for status in mysql_cur:
        status_dict[status[0]]=status[1]    #更新status_dict字典
    return status_dict

#----------
#show_result()函数处理相关数据,展示最终结果
#----------
def show_result(type):

    #打印头部
    print()
    for status in types_dic[args['type']]:
        print('     {}'.format(status),end='')
    print()
    
    #开始循环显示
    try:
        while True:
            status_dic1=process_query()
            sleep(args['interval'])
            status_dic2=process_query()
            #打印各值
            for k in types_dic[args['type']]:
                if args['average'] is True:
                    #有--average选项,输出指定时间内的平均值
                    print( '     ' + str(round((int(status_dic2[k])-int(status_dic1[k]))/args['interval'],2)).center(len(k)),end='' )
                else:
                    #输出指定时间内的增长值
                    print( '     ' + str(round(int(status_dic2[k])-int(status_dic1[k]))).center(len(k)),end='' )
            print()
    except KeyboardInterrupt:
        print('\n-----bye-----')
             
if __name__ == '__main__':
    get_args()
    process_query()
    show_result(args['type'])

最后再啰嗦两句:

1. 关于MySQL show status中的各状态,还是建议小伙伴们仔细阅读下官方文档的解释

2. Python编写命令行工具,用argparse模块来生成帮助信息和处理命令行参数还是很方便的。


奋进的k博客,原文地址:http://kaifly.blog.51cto.com/3209616/1786586

对这篇文章有任何疑惑或建议都欢迎来讨论,一起进步。

Python实现MySQL DBA小工具

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python实现MySQL DBA小工具

我们知道MySQL所有的运行状态统计信息都能从“show global status”语句的结果集中查看,该结果集保存的是从MySQL启动到当前时间之间各状态值的“总数”,对我们的分析不友好。在我们日常维护和优化中,我们需要持续的跟踪某些状
2023-01-31

Python实现翻译小工具

一、背景利用Requests模块获取有道词典web页面的post信息,BeautifulSoup来获取需要的内容,通过tkinter模块生成gui界面。二、代码git源码地址Python实现翻译小工具fanyi.py代码如下:#!/bin/
2023-01-31

[python小工具]实现屏幕录制

用python实现屏幕录制PIL 即pollow 的安装命令如下:pip install pillow其中cv2的安装是下面这条命令pip install opencv-python#python + opencv 实现屏幕录制from P
2023-01-31

python实现读取excel写入mysql的小工具详解

Python是数据分析的强大利器利用Python做数据分析,第一步就是学习如何读取日常工作中产生各种excel报表并存入数据中,方便后续数据处理。 这里向大家分享python如何读取excel,并使用Python将数据存入Mysql中,有需
2022-06-04

python炒鸡实用小工具

好长时间没写博客。不找理由,多多鞭策自己。 两年前接触和学习了python,期间断断续续,虽没扔,但也没做过什么实际项目。最近在看算法和数据结构,同时又在重温python。刚才在掘金常规读帖子,瞟到一篇python好文《几个提高工作效率的P
2023-01-31

python实用小工具介绍

一、秒级启动一个HTTP下载服务器在实际工作中,时不时会有这样的一个需求:将文件传给其他同事。将文件传给同事本身并不是一个很繁琐的工作,现在的聊天工具一般都支持文件传输。但是,如果需要传送的文件较多,那么,操作起来就会比较麻烦。此外,如果文
2023-01-31

Python如何实现语音合成小工具

这篇文章主要讲解了“Python如何实现语音合成小工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python如何实现语音合成小工具”吧!TTS简介TTS(Text To Speech)是
2023-07-04

基于Python实现视频去重小工具

这篇文章主要为大家详细介绍了如何通过Python语言编写简单的视频去重小工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起尝试一下
2023-03-24

Python 小工具 -实现简单文件对比

起因            历史遗留问题导致CMDB (配置管理数据库) 数据错误,内网机器200多台,逐一核对显然太不现实; (浪费人力);      2.解决问题思路 ;        读取docker 平台ip接口,和cmdb 平台接
2023-01-31

python学习-python小工具

一、启动python下载服务器pyththon -m SimpleHTTPServer执行该命令会在当前目录下启动一个文件下载服务器,默认打开8000端口二、安装pipwget https://files.pythonhosted.org/
2023-01-31

Python实现微信小程序自动操作工具

这篇文章主要为大家详细介绍了如何利用Python实现微信小程序自动化操作的小工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2023-01-29

基于Python如何实现视频去重小工具

这篇文章主要介绍“基于Python如何实现视频去重小工具”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python如何实现视频去重小工具”文章能帮助大家解决问题。同级目录下新建dup_video
2023-07-05

Java如何实现截图小工具

这篇文章主要介绍“Java如何实现截图小工具”,在日常操作中,相信很多人在Java如何实现截图小工具问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java如何实现截图小工具”的疑惑有所帮助!接下来,请跟着小编
2023-06-30

编程热搜

目录