返回顶部
首页 > 资讯 > 数据库 >Python实现MySQL DBA小工具
  • 307
分享到

Python实现MySQL DBA小工具

小工具PythonMySQL 2023-01-31 07:01:31 307人浏览 泡泡鱼
摘要

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

  我们知道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

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

--结束END--

本文标题: Python实现MySQL DBA小工具

本文链接: https://lsjlt.com/news/191060.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python实现MySQL DBA小工具
      我们知道MySQL所有的运行状态统计信息都能从“show global status”语句的结果集中查看,该结果集保存的是从MySQL启动到当前时间之间各状态值的“总数”,对我们的分析不友好。在我们日常维护和优化中,我们需要持续的跟踪某...
    99+
    2023-01-31
    小工具 Python MySQL
  • Python实现翻译小工具
    一、背景利用Requests模块获取有道词典web页面的post信息,BeautifulSoup来获取需要的内容,通过tkinter模块生成gui界面。 二、代码git源码地址Python实现翻译小工具 fanyi.py代码如下: #!/...
    99+
    2023-01-31
    小工具 Python
  • [python小工具]实现屏幕录制
      用python实现屏幕录制 PIL 即pollow 的安装命令如下: pip install pillow 其中cv2的安装是下面这条命令 pip install opencv-python #python + opencv 实...
    99+
    2023-01-31
    小工具 屏幕 python
  • python实现读取excel写入mysql的小工具详解
    Python是数据分析的强大利器 利用Python做数据分析,第一步就是学习如何读取日常工作中产生各种excel报表并存入数据中,方便后续数据处理。 这里向大家分享python如何读取excel,并使用P...
    99+
    2022-06-04
    详解 小工具 python
  • python实用小工具介绍
    一、秒级启动一个HTTP下载服务器在实际工作中,时不时会有这样的一个需求:将文件传给其他同事。将文件传给同事本身并不是一个很繁琐的工作,现在的聊天工具一般都支持文件传输。但是,如果需要传送的文件较多,那么,操作起来就会比较麻烦。此外,如果文...
    99+
    2023-01-31
    小工具 python
  • python炒鸡实用小工具
    好长时间没写博客。不找理由,多多鞭策自己。 两年前接触和学习了python,期间断断续续,虽没扔,但也没做过什么实际项目。最近在看算法和数据结构,同时又在重温python。刚才在掘金常规读帖子,瞟到一篇python好文《几个提高...
    99+
    2023-01-31
    小工具 python
  • 基于Python实现自动关机小工具
    上班族经常会遇到这样情况,着急下班结果将关机误点成重启,或者临近下班又通知开会,开完会已经迟了还要去给电脑关机。 今天使用PyQt5做了个自动关机的小工具,设置好关机时间然后直接提交...
    99+
    2024-04-02
  • 基于Python实现视频去重小工具
    同级目录下新建dup_video import json import os import shutil import cv2 import imagehash from PIL ...
    99+
    2023-03-24
    Python实现视频去重工具 Python视频去重 Python视频
  • Python 小工具 -实现简单文件对比
    起因            历史遗留问题导致CMDB (配置管理数据库) 数据错误,内网机器200多台,逐一核对显然太不现实; (浪费人力);      2.解决问题思路 ;        读取docker 平台ip接口,和cmdb 平台接...
    99+
    2023-01-31
    小工具 简单 文件
  • Python如何实现语音合成小工具
    这篇文章主要讲解了“Python如何实现语音合成小工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python如何实现语音合成小工具”吧!TTS简介TTS(Text To Speech)是...
    99+
    2023-07-04
  • MySQL语句优化辅助工具DBA怎么用
    MySQL语句优化辅助工具DBA怎么用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 概述优化SQL,是DBA常见的工作之一。如何高...
    99+
    2024-04-02
  • Python实现图片自定义裁剪小工具
    目录前言环境依赖代码验证一下前言 本文提供将图片按照自定义尺寸进行裁剪的工具方法,一如既往的实用主义。 环境依赖 ffmpeg环境安装,可以参考:在Windows上安装FFmpeg程...
    99+
    2024-04-02
  • python学习-python小工具
    一、启动python下载服务器pyththon -m SimpleHTTPServer 执行该命令会在当前目录下启动一个文件下载服务器,默认打开8000端口二、安装pipwget https://files.pythonhosted.org...
    99+
    2023-01-31
    小工具 python
  • Mysql DBA 高级运维学习之路-MySQL高可用工具drbd实战
    1.DRBD介绍 Distributed Replicated Block Device (DRBD)是基于块设备在不同的高可用服务器对之间同步和镜像数据的软件,通过它可以实现在网络中的两台服务器之间基于块...
    99+
    2024-04-02
  • Android实现折线图小工具
    本文实例为大家分享了Android实现折线图小工具的具体代码,供大家参考,具体内容如下 1.LineChart类 public class LineChart extends Vie...
    99+
    2024-04-02
  • 利用Python实现自制文件搜索小工具
    目录前言环境准备完整代码前言 嗨嗨,大家晚上好 ~ 当自己电脑文件很多还有点乱,不记得自己文件放哪里的时候,用电脑自带的搜索文件,这个等待时间可慢了 对我们这种敲代码的,这能忍吗,...
    99+
    2024-04-02
  • Python实现微信小程序自动操作工具
    目录一、界面的实现二、模拟器集成三、自动化小程序四、最终部署如何微信小程序自动化抢到跨境安 最近,接到一个这样的需求,最终交付的结果如下: 为了保护隐私,做了马赛克的处理。 一、界...
    99+
    2023-01-29
    Python小程序自动操作工具 Python小程序自动操作 Python 自动操作
  • 基于Python如何实现视频去重小工具
    这篇文章主要介绍“基于Python如何实现视频去重小工具”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python如何实现视频去重小工具”文章能帮助大家解决问题。同级目录下新建dup_video...
    99+
    2023-07-05
  • tcping实用小工具
    Tcping----实用小工具tcping命令详解 一、tcping介绍 tcping:tcping命令基于tcp协议监控,可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从容硬线连接到分组交换或电路交换网...
    99+
    2023-09-04
    网络 服务器 tcp/ip
  • C#实现截图工具小项目
    本文实例为大家分享了C#实现截图工具小项目的具体代码,供大家参考,具体内容如下 1.起因 一直用的截图是qq的截图,所以想要实现一个简单点的截图,为了方便。 2.思路 讲一下实现流程...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作