设为首页 收藏本站
查看: 893|回复: 0

[经验分享] Python实现MySQL DBA小工具一例

[复制链接]

尚未签到

发表于 2018-8-4 07:09:39 | 显示全部楼层 |阅读模式
#!/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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-546138-1-1.html 上篇帖子: Zabbix api的使用方法(python版) 下篇帖子: python生成双色球程序
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表