去年写了一篇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 报告首页

2.2 检查总结


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

2.4 MySQL 基础信息







2.5 数据库性能检查











2.6 数据库备份

三、自定义编排巡检报告内容
通过自定义编排,大家可以根据工作需求,自由删减报告内容。在整个编排过程中,只需要在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表格中的代码。

对应关系

step4: 查看巡检报告内容
#执行巡检
[root@testdb open_dbcheck]# python3 main.py -h
巡检报告mgr集群信息展示

四、执行脚本遇到的错
4.1 日志有异常输出
如“1054,“Unknown xxx””或其他异常信息时,说明该指标采集异常,sql执行失败。需要从sql模板中找到对应的sql语句,然后去被巡检库执行测试。

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

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

4.4 运行巡检脚本报“Unkown column ‘%Y-%m’ in ‘field list’”错误
日志中有3个sql采集数据异常,最后python执行失败。错误暂时出现在mysql 8.0.42版本,

解决方法:将sql模板中对应sql语句的双引号改为单引号。

本文暂时介绍到这里,欢迎评论区交流。
添加作者微信获取脚本源代码





