暂无图片
暂无图片
20
暂无图片
暂无图片
暂无图片

一键生成MySQL巡检报告

原创 金同学 2025-06-09
1327

去年写了一篇MySQL数据库巡检的文章,热度很高,内容涵盖了mysql巡检大纲、巡检指标、对应的sql语句以及部分核心代码。最近我改写了一版通用性强的代码,可以在各种环境下部署运行,现开源出来。

一、执行脚本一键生成巡检报告

1.1 脚本介绍

脚本采用python3编写,可以远程执行,也可以本地执行(即被巡检数据库主机)。包含以下几个目录文件,其中templates下存放word模板和采集数据库指标的sql模板,main.py为主程序。

[root@testdb open_dbcheck]# ls conf main.py mod_logger.py readme templates

1.2 配置文件

配置文件名称为my.ini,存放在conf目录下。将被巡检数据库信息写入my.ini后,执行main函数可以批量巡检。

[root@testdb open_dbcheck]# cat conf/my.ini [192.168.1.101] NAME = 终端管理平台1 VIP = 192.168.1.101 PORT = 3307 USER = i_dbcheck PASSWORD = 123456 ###参数说明: # [xxxx]:标签名称,当巡检单套系统时需要指定标签名称; # NAME:业务系统中文名; # VIP:被巡检库的ip地址,建议写vip或者master节点的物理ip; # PORT:mysql端口; # USER、PASSWORD:连接数据库的用户和密码。

巡检多套库时,需要写多个标签。

[root@testdb open_dbcheck]# cat conf/my.ini [db1] NAME = 终端管理平台1 VIP = 192.168.1.101 PORT = 3307 USER = i_dbcheck PASSWORD = 123456 [db2] NAME = 终端管理平台1 VIP = 192.168.1.102 PORT = 3307 USER = i_dbcheck PASSWORD = 123456 [db3] NAME = 终端管理平台1 VIP = 192.168.1.103 PORT = 3307 USER = i_dbcheck PASSWORD = 123456

1.3 使用方法

  • -h 查看帮助,
  • -F 指定配置文件,默认为conf/my.ini,
  • -C 指定sql模板,默认为templates/sqltemplates.ini
  • -L 指定标签名称,仅巡检配置文件中的某一套库时,需指定对应的标签名称

查看帮助

[root@testdb open_dbcheck]# python3 main.py -h usage: main.py [-h] [-F CONF] [-C SQLTEMPLATES] [-L LABEL] optional arguments: -h, --help show this help message and exit -F CONF, --conf CONF mysql config file. -C SQLTEMPLATES, --sqltemplates SQLTEMPLATES SQL sqltemplates. -L LABEL, --label LABEL Label used when health check single database.

执行巡检命令
conf/my.ini中只写了一个标签,所以下面示例只巡检了一套数据库。如下日志,数据库巡检报告为:/tmp/终端管理平台1_192.168.1.101_MySQLCheckReport.docx

[root@testdb open_dbcheck]# python3 main.py 
2025-06-09 17:31:49.591 [Info] templatefile = ./templates/wordtemplates_v2.0.docx
2025-06-09 17:31:49.592 [Info] my.ini配置读取成功 
2025-06-09 17:31:49.592 [Info] 开始采集巡检数据(192.168.1.101) ...... 
2025-06-09 17:31:49.957 [Info] 开始输出风险和建议 ...... 
2025-06-09 17:31:50.958 [Info] 数据库长事务个数(超5min): 0
2025-06-09 17:31:50.958 [Info] 数据库锁个数:1
2025-06-09 17:31:50.958 [Info] 数据库双一检查: 正常
2025-06-09 17:31:50.958 [Info] Binlog是否开启: 正常
2025-06-09 17:31:50.958 [Info] MDL元数据做检查: 0
2025-06-09 17:31:50.958 [Info] 数据库对象检查(单表 > 50G):1.49
2025-06-09 17:31:50.958 [Info] 无主键的表个数:0
2025-06-09 17:31:50.958 [Info] 非innodb引擎的对象个数0
2025-06-09 17:31:50.958 [Info] 存在n个未使用索引的对象: 130
2025-06-09 17:31:50.958 [Info] 自增值使用率> 0.90: 0.1166
2025-06-09 17:31:50.958 [Info] 数据库并发数: 2
2025-06-09 17:31:50.958 [Info] 最大连接数: 3000
2025-06-09 17:31:50.958 [Info] 存在n个冗余索引: 10
2025-06-09 17:31:50.958 [Info] 成功采集41个指标数据 
2025-06-09 17:31:52.344 [Info] 输出巡检文档:/tmp/终端管理平台1_192.168.1.101_MySQLCheckReport.docx

二、查看巡检报告

巡检代码从集成平台剥离后,原来调用接口采集的指标缺失了,请自行补充。以下是一键生成的自动化巡检报告,主要内容如下:

2.1 报告首页

image.png

2.2 检查总结

image.png
image.png

2.3 服务器资源指标

工作较忙,还没来得及更新这部分代码,目前缺失系统指标项采集,大家可以贡献代码自行实现或者手工填写。
image.png

2.4 MySQL 基础信息

image.png
image.png
image.png
image.png
image.png
image.png
image.png

2.5 数据库性能检查

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

2.6 数据库备份

image.png

三、自定义编排巡检报告内容

通过自定义编排,大家可以根据工作需求,自由删减报告内容。在整个编排过程中,只需要在sql模板新增sql语句,然后将sql语句中的select后面的列名填入word模板即可,整个过程无需修改代码。

上文已经介绍过脚本文件,两个模板文件存放在templates目录下:

  • 巡检报告word模板名称:wordtemplates_v2.0.docx)
  • 获取mysql巡检数据的sql模板名称:sqltemplates.ini
[root@testdb open_dbcheck]# ls conf main.py mod_logger.py readme templates [root@testdb templates]# ls sqltemplates.ini wordtemplates_v2.0.docx

3.1 自定义编排步骤

  • 首先在sql模板新增查询数据库的sql语句;
  • 然后在word模板插入一个表格,sql语句中的select列对应word模板中新增表格的列;
  • 最后把sql语句中select后面的列名一一对应写入word模板新插入的表格中。

3.2 编排示例:在巡检报告新增mgr集群信息

step1: 在sql模板新增sql语句
在sql模板(templates/sqltemplates.ini)中,有两个标签,分别为[report]和[variables]。其中[report]标签中记录了word模板的位置和生成巡检报告的路径,[variables]标签记录了所有获取巡检指标的sql语句,我们将查看mgr集群信息的sql写到[variables]标签下。

[root@testdb templates]# vi sqltemplates.ini [report] name = HeathCheck report template = ./templates/wordtemplates_v2.0.docx output = /tmp/MySQLCheckReport.docx [variables] #查询mgr集群信息 mgrinfo =SELECT MEMBER_ID, MEMBER_HOST, MEMBER_PORT, MEMBER_STATE, IF(global_status.VARIABLE_NAME IS NOT NULL, 'PRIMARY', 'SECONDARY') AS MEMBER_ROLE FROM performance_schema.replication_group_members LEFT JOIN performance_schema.global_status ON global_status.VARIABLE_NAME = 'group_replication_primary_member' AND global_status.VARIABLE_VALUE = replication_group_members.MEMBER_ID;

step2: sql语句语法语义验证
在被巡检数据库执行sql语句,确保成功执行。

mysql> SELECT MEMBER_ID, MEMBER_HOST, MEMBER_PORT, MEMBER_STATE, IF(global_status.VARIABLE_NAME IS NOT NULL, 'PRIMARY', 'SECONDARY') AS MEMBER_ROLE FROM performance_schema.replication_group_members LEFT JOIN performance_schema.global_status ON global_status.VARIABLE_NAME = 'group_replication_primary_member' AND global_status.VARIABLE_VALUE = replication_group_members.MEMBER_ID; +--------------------------------------+-------------+-------------+--------------+-------------+ | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | +--------------------------------------+-------------+-------------+--------------+-------------+ | e2a9e91f-4b3c-11eb-af3d-943bb06b33da | 10.200.8.37 | 3307 | ONLINE | PRIMARY | | de154380-4b3c-11eb-9446-943bb0b912a8 | 10.200.8.38 | 3307 | ONLINE | SECONDARY | | e14b7f3d-4b3c-11eb-a292-943bb0bb744a | 10.200.8.39 | 3307 | ONLINE | SECONDARY | +--------------------------------------+-------------+-------------+--------------+-------------+ 3 rows in set (0.00 sec)

step3: word模板新增表格
在word模板(templates/wordtemplates_v2.0.docx)新增表格并填写代码,sql语句中字段名称对应word表格中的代码。
image.png
对应关系
image.png
step4: 查看巡检报告内容

#执行巡检 [root@testdb open_dbcheck]# python3 main.py -h

巡检报告mgr集群信息展示
image.png

四、执行脚本遇到的错

4.1 日志有异常输出

如“1054,“Unknown xxx””或其他异常信息时,说明该指标采集异常,sql执行失败。需要从sql模板中找到对应的sql语句,然后去被巡检库执行测试。
image.png

4.2 执行python3 main.py巡检时报错

python运行环境异常时检查版本

执行巡检脚本需安装python3运行环境建议 python版本建议:python3.6.x + 依赖模块建议: pip3 install pymysql==1.0.2 + pip3 install python-docx==0.8.11 + pip3 install docxtpl==0.16.0 +

windows存在字符集问题,请升级到最新版本:open_dbcheck_v2.3.tar
b879534323dbd08da1001bb6637c09c.png

4.3 执行脚本时,-L指定标签后运行报错

早期脚本存在问题,指定-L运行时报KeyEoor:'ha’错误。该问题再最新版本(open_dbcheck_v2.3.tar)修复了。
image.png

4.4 运行巡检脚本报“Unkown column ‘%Y-%m’ in ‘field list’”错误

日志中有3个sql采集数据异常,最后python执行失败。错误暂时出现在mysql 8.0.42版本,
image.png
解决方法:将sql模板中对应sql语句的双引号改为单引号。
30123e8e49025663ea941b1ad77b4d8.png

本文暂时介绍到这里,欢迎评论区交流。

添加作者微信获取脚本源代码
image.png

最后修改时间:2025-09-11 10:47:15
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论