MySQL系统运行状态实时监控(python版本)

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> MySQL系统运行状态实时监控(python版本)

昨天的文章,用shell写了一个简单的MySQL系统运行状态实时监控的模版,《》,对于这种操作,任何语言都可以完成,今儿就用python写一下,写的不优雅的地方,请各位指正。

首先,为了让python能连接MySQL数据库,需要一些第三方的库,由于我用的是python 2.3版本,因此可以使用mysqldb,(若是python 3.x,则可以使用PyMySQL),可以从以下链接下载压缩,目前最新版本是1.2.5,

https://pypi.python.org/pypi/MySQL-python/1.2.3

MySQL系统运行状态实时监控(python版本)

如果不确定本机是否安装了,可以使用,

python

import MySQLdb

看下是否报错,若提示了,

ImportError: No module named MySQLdb

则表示未安装。

解压MySQL-python-1.2.3.tar.gz,

MySQL系统运行状态实时监控(python版本)

进入目录,执行以下命令,完成mysqldb的安装,

python setup.py install

接下来开始coding,首先定义一个枚举类,方便常量调用,此处为五个状态参数,

def enum(**enums):
return type(‘Enum’, (), enums)

Status=enum(QPS="queries", Commit="com_commit", Rollback="com_rollback", Threads_con="Threads_connected", Threads_run="Threads_running")

python连接数据库,确实比java这些语言,要简单些,

dbConn=MySQLdb.connect(
host=’x.x.x.x’,
port=3306,
user=’bisal’,
passwd=’xxxxx’,
db=’mysql’)
cursor=dbConn.cursor()

比如我要检索QPS这个参数,执行以下SQL,由于是肯定只返回一条数据,所以用了fetchone()函数,为了只要返回值,使用str[a:b]进行了字符串截取。

sql=’show global status like ‘’ + Status.QPS + ‘’’
cursor.execute(sql)
result=cursor.fetchone()
str= ‘’.join(result)
q=str[len(Status.QPS):len(str)]

接下来就可以格式化打印,同样输出10次,重新打印表头,显示sleep一秒,

if (count==0):
print “|QPS        |Commit     |Rollback   |TPS        |Threads_con  |Threads_run |”
print “——————————————————————————“
if (count=10):
count=0
print “——————————————————————————“
print “|QPS        |Commit     |Rollback   |TPS        |Threads_con  |Threads_run |”
print “——————————————————————————“
print “|%-10s |%-10s |%-10s |%-10s |%-12s |%-12s|” % (q,c,r,c+r,tc,tr)
else:
print “|%-10s |%-10s |%-10s |%-10s |%-12s |%-12s|” % (q,c,r,c+r,tc,tr)
count+=1
time.sleep(1)

另外,记得需要关闭数据库连接,

cursor.close()
dbConn.close()

整个流程,其实很简单,就是执行show status语句,进行一些字符串处理,格式化输出,以上完整代码,可以下载:

https://github.com/bisal-liu/mysql/blob/master/mysql_per_monitor_1.py

要说可以优化,就是上面这种方法中,对于每一个状态参数,都要执行一次show status,有些浪费,可以一次执行,多次解析,使用IN子句,实现执行一次SQL,返回不同参数,

sql=’show global status where variable_name in (‘’ + Status.QPS + ‘’,’’ + Status.Commit

  • ‘’,’’ + Status.Rollback + ‘’,’’ + Status.Threads_con + ‘’,’’ + Status.Threads_run + ‘’)’

由于返回不止一条记录,因此需要使用for,if中根据字符串做匹配,以下写法中,

  1. 若使用了’’.join(line),则需要使用q=k1[len(Status.QPS):len(k1)]截取字符串。

  2. 若使用了str(line),则需要使用q=k2.split(‘’’)[3]截取字符串。

for line in result:
k1=’’.join(line).lower()
k2=str(line).lower()

if (Status.QPS in k1): q=k1[len(Status.QPS):len(k1)] elif (Status.Commit in k1): c=k1[len(Status.Commit):len(k1)] elif (Status.Rollback in k1): r=k1[len(Status.Rollback):len(k1)] elif (Status.Threads_con in k1): tc=k1[len(Status.Threads_con):len(k1)] elif (Status.Threads_run in k1): tr=k1[len(Status.Threads_run):len(k1)]

if (Status.QPS in k2): q=k2.split(''')[3] elif (Status.Commit in k2): c=k2.split(''')[3] elif (Status.Rollback in k2): r=k2.split(''')[3] elif (Status.Threads_con in k2): tc=k2.split(''')[3] elif (Status.Threads_run in k2): tr=k2.split(''')[3]

以上完整代码,可以下载,

https://github.com/bisal-liu/mysql/blob/master/mysql_per_monitor_2.py

以上两种写法,效果一样,

  1. 每隔1秒,刷新一次,
MySQL系统运行状态实时监控(python版本)
  1. 每隔10次,重新打印表头,
MySQL系统运行状态实时监控(python版本)

如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

MySQL系统运行状态实时监控(python版本)

      MySQL系统运行状态实时监控(python版本)  MySQL系统运行状态实时监控(python版本)      

MySQL系统运行状态实时监控(python版本)
本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

转载声明:转载请注明出处,本技术博客是本人原创文章

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> MySQL系统运行状态实时监控(python版本)


 上一篇
MySQL系统运行状态实时监控(shell版本) MySQL系统运行状态实时监控(shell版本)
开始接触MySQL,还是和Oracle有些不一样的地方,需要逐步积累和学习,其中有一点不同,就是Oracle有一些数据字典,可以显示系统运行状态,但需要使用SQL来检索,另外AWR会有一些运行状态信息,相比之下,MySQL提供了一些指令,直
下一篇 
上周上线碰见的ORA-00054错误回放 上周上线碰见的ORA-00054错误回放
上周应用上线,有一个数据库脚本,包含改字段长度等操作,执行过程中,现象就是有些改字段成功了,有些执行出错,报了ORA-00054的错误。了解一下原理,就能对这个错误,有比较深入的理解了。 首先,我们模拟下报错过程,创建测试表,session