监控数据库mysql,Prometheus监控栈:Prometheus+Grafana+Alertmanager
一、软件环境介绍
1.1 mysql介绍
。是什么
MYSQL是一个关系型数据库管理系统,目前属于Oracle 旗下产品
它是最流行的关系型数据库管理系统之一,存放表的数据
。与其他关系型数据库管理系统相比,市占率

。优势
| MysqI | Oracle | sqlserver | |
|---|---|---|---|
| 开源 | 是 | 是 | 否-闭源 |
| 社区活跃度 | 最活跃 | 活跃 | 活跃 |
| 使用门槛 | 低 | 高 | 中 |
| 学习门槛 | 低 | 高 | 中 |
| 性能 | 较快 | 最快 | 较快 |
1.2 主机清单
| 职责 | ip地址 | 备注 |
|---|---|---|
| Prometheus服务器 | 192.168.92.11 | docker-compose模式的prometheus |
| 待监控Linux | 192.168.92.12 | 待准备组件:mysql8版本 |
二、prometheus监控mysql
docker安装(略)
docker-compose安装(略)
2.1待监控Linux安装MysqI8
test中,创建(修改)docker-compose目录
mkdir /data/docker-compose -p
cd /data/docker-compose
创建(修改)docker-compose.yaml
version: '3.3'
services:
db: #服务名:db。在Docker Compose网络中,其他容器(如应用)可通过此名称(db)连接到此MySQL数据库。
image: mysql:8.0 #使用官方 mysql:8.0 镜像
restart: always #确保容器异常退出时自动重启,保障服务高可用。
container_name: mysql #将容器命名为 mysql
environment:
TZ: Asia/Shanghai #设置容器时区,确保时间戳和字符处理符合预期。
LANG: en_US.UTF-8 #设置容器语言环境,确保时间戳和字符处理符合预期。
MYSQL_ROOT_PASSWORD: "123456" #设置MySQL超级用户(root)的密码为 123456
command:
- --default-authentication-plugin=mysql_native_password #设置默认身份验证插件
- --character-set-server=utf8mb4 #设置服务端默认字符集为 utf8mb4
- --collation-server=utf8mb4_general_ci #设置与字符集对应的默认排序规则(collation)。utf8mb4_general_ci是一个通用的、不区分大小写的排序规则。
- --lower-case-table-names=1 #强制将所有表名存储为小写。
- --performance-schema=1 #启用性能模式(Performance Schema),用于收集数据库性能指标,对监控至关重要。
- --skip-log-bin #禁用二进制日志。如果计划用于主从复制,则应移除此项并配置日志相关参数。
volumes: #将宿主机的 /data/mysql/data 目录挂载到容器内的 /var/lib/mysql(MySQL默认数据目录)
- /data/mysql/data:/var/lib/mysql
ports: #格式为 宿主机端口:容器端口。
- "3306:3306"
运行docker-compose
docker-compose up -d
查看docker 的信息
docker images
docker ps -a
2.2 待监控Linux安装mysqld_exporter
创建exporter账户
test机器
#进入mysql容器
docker exec -it mysql mysql -uroot -p123456
#创建exporter用户
CREATE USER 'exporter'@'%' IDENTIFIED BY '123456' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
#刷新权限
flush privileges;
#退出mysql容器
exit
#测试登录
docker exec -it mysql mysql -uexporter -p123456;
安装mysqld_exporter(基于mysql服务器的监控器)
二进制安装或者docker安装(或者docker-compose安装),此处选用docker-compose安装
test机器上,修改docker-compose.yaml文件
cd /data/docker-compose
vi docker-compose.yaml
yaml文件增加mysqld_exporter组件
version: '3.3' #Docker Compose 文件格式版本
services:
mysqld-exporter:
image: prom/mysqld-exporter:v0.12.1 #官方 Prometheus MySQL Exporter 镜像
container_name: mysqld_exporter #容器名称(便于管理)
restart: always #容器异常退出时自动重启
command:
- '--collect.info_schema.processlist' # 收集活动连接和查询
- '--collect.info_schema.innodb_metrics' # InnoDB 引擎性能指标
- '--collect.info_schema.tablestats' # 表访问统计
- '--collect.info_schema.tables' #表大小/行数等元数据
- '--collect.info_schema.userstats' # 用户连接统计
- '--collect.engine_innodb_status' # InnoDB 详细状态信息
environment:
DATA_SOURCE_NAME: 'exporter:123456@(192.168.92.12:3306)/'
ports:
- "9104:9104"
启动docker-compose.yaml
docker-compose up -d
访问mysqld_exporter
http://192.168.92.12:9104/metrics
2.3 prometheus服务器添加mysqld_exporter的地址
192.168.92.11的prometheus上,修改prometheus的配置文件
#进入docker-prametheus目录
cd /data/docker-prometheus
#修改prometheus.yml
vi prometheus/prometheus.yml
添加待监控的mysqld_exporter
- job_name: 'mysqld-exporter'
static_configs:
- targets: ['192.168.92.12:9104']
labels:
instance: 'mysqld服务器'
保存配置后,让配置生效
curl -X POST http://localhost:9090/-/reload
刷新访问http://192.168.92.11:9090/targets?search=,确认新监控的mysqld服务器是否生效

2.4 mysql服务器指标查询
基础状态与连接
mysql_up: 服务是否在线(1为在线,0为离线)
mysql_global_status_uptime: 运行时长,单位秒(s)
mysql_global_status_threads_connected: 当前客户端建立连接数
mysql_global_variables_max_connections: 允许的最大连接数
mysql_global_status_threads_running: 正在运行命令的客户端数
网络流量
delta(mysql_global_status_bytes_received[1m]): 每分钟网络接收的字节数(bytes)
delta(mysql_global_status_bytes_sent[1m]): 每分钟网络发送的字节数(bytes)
客户端连接异常
delta(mysql_global_status_aborted_connects[1m]): 每分钟客户端建立连接失败的数量
delta(mysql_global_status_aborted_clients[1m]): 每分钟客户端未正常断开连接的数量
查询和命令处理
delta(mysql_global_status_commands_total{command="xx"}[1m]) > 0: 每分钟执行特定命令(将"xx"替换为具体命令)的次数
delta(mysql_global_status_handlers_total{handler="xx"}[1m]) > 0: 每分钟执行特定处理器操作(将"xx"替换为具体处理器)的次数
delta(mysql_global_status_table_locks_waited[1m]): 每分钟请求获取锁、但需要等待的次数
delta(mysql_global_status_handlers_total{handler="commit"}[1m]) > 0: 每分钟执行提交操作的次数
delta(mysql_global_status_table_locks_immediate[1m]): 每分钟请求获取锁并立即获得的次数
delta(mysql_global_status_queries[1m]): 每分钟查询数
delta(mysql_global_status_slow_queries[1m]): 每分钟慢查询数
InnoDB存储引擎相关
mysql_global_status_innodb_page_size: InnoDB数据页的大小
mysql_global_variables_innodb_buffer_pool_size: InnoDB缓冲池大小
mysql_global_status_buffer_pool_pages{state="data"}: 缓冲池中包含数据的页数
mysql_global_status_buffer_pool_dirty_pages: 缓冲池中的脏页数
InnoDB行锁指标
mysql_global_status_innodb_row_lock_current_waits: 当前正在等待的InnoDB行锁数量
mysql_global_status_innodb_row_lock_time: 从服务器启动以来的总InnoDB行锁等待时间(毫秒)
mysql_global_status_innodb_row_lock_time_avg: 每次等待InnoDB行锁的平均时间(毫秒)
mysql_global_status_innodb_row_lock_time_max: 单次等待InnoDB行锁的最长时间(毫秒)
mysql_global_status_innodb_row_lock_waits: 从服务器启动以来的总InnoDB行锁等待次数
2.5 grafana中对mysql进行监控
copy id to clipboard->grafana的dashboards中Import dashboard
https://grafana.com/grafana/dashboards/20016-mysql-8-0/



