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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 昨天的文章,用shell写了一个简单的MySQL系统运行状态实时监控的模版,《MySQL系统运行状态实时监控(shell版本)》,对于这种操作,任何语言都可以完成,今儿就用python写一下,写的不优雅的地方,请各位指正。

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


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

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



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

python

>> import MySQLdb


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

ImportError: No module named MySQLdb

则表示未安装。


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



进入目录,执行以下命令,完成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秒,刷新一次,

2. 每隔10次,重新打印表头,



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

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
存储 数据库连接 API
Python环境变量在开发和运行Python应用程序时起着重要的作用
Python环境变量在开发和运行Python应用程序时起着重要的作用
126 15
|
8天前
|
SQL 关系型数据库 MySQL
vb6读取mysql,用odbc mysql 5.3版本驱动
通过以上步骤,您可以在VB6中使用ODBC MySQL 5.3驱动连接MySQL数据库并读取数据。配置ODBC数据源、编写VB6代码
53 32
|
2月前
|
关系型数据库 MySQL Linux
MySQL版本升级(8.0.31->8.0.37)
本次升级将MySQL从8.0.31升级到8.0.37,采用就地升级方式。具体步骤包括:停止MySQL服务、备份数据目录、下载并解压新版本的RPM包,使用`yum update`命令更新已安装的MySQL组件,最后启动MySQL服务并验证版本。整个过程需确保所有相关RPM包一同升级,避免部分包遗漏导致的问题。官方文档提供了详细指导,确保升级顺利进行。
160 16
|
2月前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
2月前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
151 5
|
2月前
|
Shell 开发工具 Python
如何在vim里直接运行python程序
如何在vim里直接运行python程序
|
3月前
|
开发者 Python
使用Python实现自动化邮件通知:当长时程序运行结束时
本文介绍了如何使用Python实现自动化邮件通知功能,当长时间运行的程序完成后自动发送邮件通知。主要内容包括:项目背景、设置SMTP服务、编写邮件发送函数、连接SMTP服务器、发送邮件及异常处理等步骤。通过这些步骤,可以有效提高工作效率,避免长时间等待程序结果。
103 9
|
15天前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
1天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
61 42
|
19天前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
152 0