本文档风哥主要介绍MySQL 8.4安装后的监控配置,包括内置监控工具、日志监控、外部监控工具集成和告警配置等。风哥教程参考MySQL官方文档MySQL Server
Administration等。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 MySQL监控的重要性
MySQL监控是数据库管理的重要组成部分,通过监控可以及时发现性能问题、预防潜在故障、优化数据库性能、确保服务可用性并满足SLA要求。学习交流加群风哥微信: itpux-com
1.2 MySQL监控维度
MySQL监控主要包括以下几个维度:
- 服务器状态:CPU、内存、磁盘、网络等系统资源监控
- MySQL实例:连接数、查询性能、缓存命中率等数据库层面监控
- 存储引擎:InnoDB缓冲池、日志、锁等存储引擎内部监控
- 复制状态:复制延迟、错误等复制环境监控
1.3 MySQL内置监控工具
MySQL提供了多种内置监控工具,包括:
- Performance Schema:提供详细的性能数据
- sys Schema:基于Performance Schema和INFORMATION_SCHEMA,提供更易于理解的监控视图
- SHOW STATUS/SHOW VARIABLES:基本的状态和变量查询
- 各种日志文件:错误日志、慢查询日志、一般查询日志等
Part02-生产环境规划与建议
2.1 监控系统架构规划
在生产环境中,建议采用分层监控架构:
- 基础设施层:监控服务器硬件和操作系统资源
- 数据库层:监控MySQL实例、存储引擎和复制状态
- 应用层:监控应用程序与数据库的交互
2.2 关键监控指标选择
生产环境中需要重点监控的MySQL指标包括:
- 连接数:Threads_connected、max_connections
- 查询性能:Slow_queries、Queries
- 缓冲池:Innodb_buffer_pool_reads、Innodb_buffer_pool_read_requests
- 复制状态:Seconds_Behind_Master
- 磁盘空间:Data_free、表空间使用率
2.3 告警阈值设置建议
告警阈值的设置应根据业务特点进行调整,以下是参考建议:
- 连接数:超过max_connections的80%
- 慢查询:持续增长或超过历史基线
- 缓冲池命中率:低于95%
- 复制延迟:超过300秒
- 磁盘空间:数据目录使用率超过80%
Part03-生产环境项目实施方案
3.1 内置监控工具配置
3.1.1 Performance Schema配置
Performance Schema是MySQL 5.5引入的监控工具,提供了详细的性能数据。学习交流加群风哥QQ113257174
vi /etc/my.cnf
[mysqld]
performance_schema=ON
# 重启MySQL服务使配置生效
systemctl restart mysqld
# 验证Performance Schema是否启用
mysql -u root -p -e “SHOW VARIABLES LIKE ‘performance_schema’;”
Enter password: Fgedu123!
+——————–+——-+
| Variable_name | Value |
+——————–+——-+
| performance_schema | ON |
+——————–+——-+
3.1.2 常用Performance Schema查询
SELECT * FROM performance_schema.threads WHERE processlist_id IS NOT NULL;
— 查看语句执行情况(按执行时间排序)
SELECT * FROM performance_schema.events_statements_summary_by_digest ORDER BY sum_timer_wait DESC LIMIT 10;
— 查看表锁情况
SELECT * FROM performance_schema.table_handles;
— 查看InnoDB锁等待
SELECT * FROM performance_schema.data_locks;
3.1.3 sys Schema配置与使用
sys Schema是MySQL 5.7引入的,基于Performance Schema和INFORMATION_SCHEMA,提供了更易于理解的监控视图。
SELECT * FROM sys.statements_with_runtimes_in_95th_percentile;
— 查看IO热点(按字节数排序)
SELECT * FROM sys.io_global_by_file_by_bytes;
— 查看当前会话情况
SELECT * FROM sys.session;
— 查看索引使用情况
SELECT * FROM sys.schema_unused_indexes;
3.2 日志监控配置
3.2.1 错误日志配置
错误日志记录了MySQL服务器的启动、运行和关闭过程中的错误信息。风哥提示:错误日志是排查MySQL故障的重要依据,建议长期保存。
vi /etc/my.cnf
[mysqld]
log_error=/mysql/logs/error.log
error_log_verbosity=3 # 0=错误, 1=警告, 2=注意, 3=信息
# 重启MySQL服务使配置生效
systemctl restart mysqld
# 查看错误日志内容
cat /mysql/logs/error.log | tail -50
3.2.2 慢查询日志配置
慢查询日志记录了执行时间超过阈值的SQL语句,是性能优化的重要依据。更多学习教程公众号风哥教程itpux_com
vi /etc/my.cnf
[mysqld]
slow_query_log=ON
slow_query_log_file=/mysql/logs/slow-query.log
long_query_time=2 # 慢查询阈值,单位秒
log_queries_not_using_indexes=ON # 记录未使用索引的查询
log_throttle_queries_not_using_indexes=10 # 每分钟最多记录10条未使用索引的查询
# 重启MySQL服务使配置生效
systemctl restart mysqld
# 验证慢查询日志是否启用
mysql -u root -p -e “SHOW VARIABLES LIKE ‘%slow%’;”
Enter password: Fgedu123!
+—————————+—————————+
| Variable_name | Value |
+—————————+—————————+
| log_slow_admin_statements | OFF |
| log_slow_extra | OFF |
| log_slow_slave_statements | OFF |
| slow_query_log | ON |
| slow_query_log_file | /mysql/logs/slow-query.log |
+—————————+—————————+
3.2.3 一般查询日志配置
一般查询日志记录了所有SQL语句的执行情况,生产环境中建议谨慎启用,因为会产生大量日志。
vi /etc/my.cnf
[mysqld]
general_log=ON
general_log_file=/mysql/logs/general-query.log
# 重启MySQL服务使配置生效
systemctl restart mysqld
# 或者临时启用(不需要重启服务)
mysql -u root -p -e “SET GLOBAL general_log = ‘ON’;”
Enter password: Fgedu123!
3.3 外部监控工具集成
3.3.1 Prometheus + Grafana监控配置
Prometheus是一个开源的监控系统,Grafana是一个数据可视化工具,两者结合可以提供强大的监控解决方案。
wget
https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysqld_exporter-0.14.0.linux-amd64.tar.gz
# 解压
tar -xf mysqld_exporter-0.14.0.linux-amd64.tar.gz
cd mysqld_exporter-0.14.0.linux-amd64
# 创建MySQL用户用于监控
mysql -u root -p -e “CREATE USER ‘exporter’@’localhost’ IDENTIFIED BY ‘Fgedu123!’ WITH MAX_USER_CONNECTIONS
3;”
mysql -u root -p -e “GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO ‘exporter’@’localhost’;”
Enter password: Fgedu123!
# 创建配置文件
cat > .my.cnf << EOF [client] user=exporter password=Fgedu123! EOF # 运行MySQL Exporter(可以配置为系统服务)
./mysqld_exporter --config.my-cnf=.my.cnf & # 验证Exporter是否运行 curl http://localhost:9104/metrics
vi /etc/prometheus/prometheus.yml
scrape_configs:
– job_name: ‘mysql’
static_configs:
– targets: [‘localhost:9104’]
labels:
instance: ‘fgedudb’
# 重启Prometheus服务
systemctl restart prometheus
# 配置Grafana:导入MySQL模板(ID: 7362)
3.3.2 Percona Monitoring and Management (PMM)配置
PMM是Percona提供的开源监控工具,专为MySQL和MongoDB设计,提供了丰富的监控指标和可视化界面。
docker run -d \
–name pmm-server \
-p 80:80 \
-p 443:443 \
-v /opt/pmm-data:/srv \
percona/pmm-server:2
# 安装PMM Client
yum install pmm2-client
# 连接PMM Client到PMM Server
pmm-admin config –server-url=https://admin:admin@localhost –server-insecure-tls
# 注册MySQL实例
pmm-admin add mysql –username=root –password=Fgedu123! –query-source=perfschema fgedudb
Part04-生产案例与实战讲解
4.1 MySQL监控脚本开发
以下是一个生产环境中常用的MySQL监控脚本示例,可以定期检查MySQL的关键指标并发送告警。
# mysql_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# MySQL连接信息
HOST=”localhost”
USER=”root”
PASSWORD=”Fgedu123!”
ALERT_EMAIL=”admin@fgedu.net.cn”
# 检查连接数
CONNECTIONS=$(mysql -h $HOST -u $USER -p$PASSWORD -e “SHOW GLOBAL STATUS LIKE ‘Threads_connected’;”
| grep Threads_connected | awk ‘{print $2}’)
MAX_CONNECTIONS=$(mysql -h $HOST -u $USER -p$PASSWORD -e “SHOW VARIABLES LIKE ‘max_connections’;” |
grep max_connections | awk ‘{print $2}’)
# 计算连接百分比
PERCENTAGE=$(( $CONNECTIONS * 100 / $MAX_CONNECTIONS ))
if [ $PERCENTAGE -gt 80 ]; then
ALERT_MESSAGE=”警告:MySQL连接数使用率超过80%,当前连接数: $CONNECTIONS,最大连接数: $MAX_CONNECTIONS”
echo “$ALERT_MESSAGE” | mail -s “MySQL告警” $ALERT_EMAIL
fi
# 检查慢查询
SLOW_QUERIES=$(mysql -h $HOST -u $USER -p$PASSWORD -e “SHOW GLOBAL STATUS LIKE ‘Slow_queries’;” |
grep Slow_queries | awk ‘{print $2}’)
echo “当前慢查询数量: $SLOW_QUERIES”
# 检查缓冲池命中率
BUFFER_POOL_READS=$(mysql -h $HOST -u $USER -p$PASSWORD -e “SHOW GLOBAL STATUS LIKE
‘Innodb_buffer_pool_reads’;” | grep Innodb_buffer_pool_reads | awk ‘{print $2}’)
BUFFER_POOL_READ_REQUESTS=$(mysql -h $HOST -u $USER -p$PASSWORD -e “SHOW GLOBAL STATUS LIKE
‘Innodb_buffer_pool_read_requests’;” | grep Innodb_buffer_pool_read_requests | awk ‘{print $2}’)
if [ $BUFFER_POOL_READ_REQUESTS -gt 0 ]; then
HIT_RATE=$(( ($BUFFER_POOL_READ_REQUESTS – $BUFFER_POOL_READS) * 100 / $BUFFER_POOL_READ_REQUESTS ))
echo “缓冲池命中率: $HIT_RATE%”
if [ $HIT_RATE -lt 95 ]; then
ALERT_MESSAGE=”警告:MySQL缓冲池命中率低于95%,当前命中率: $HIT_RATE%”
echo “$ALERT_MESSAGE” | mail -s “MySQL告警” $ALERT_EMAIL
fi
fi
# 检查复制状态(如果是从库)
SLAVE_IO_RUNNING=$(mysql -h $HOST -u $USER -p$PASSWORD -e “SHOW SLAVE STATUS\G” | grep
Slave_IO_Running | awk ‘{print $2}’)
SLAVE_SQL_RUNNING=$(mysql -h $HOST -u $USER -p$PASSWORD -e “SHOW SLAVE STATUS\G” | grep
Slave_SQL_Running | awk ‘{print $2}’)
if [ “$SLAVE_IO_RUNNING” = “No” ] || [ “$SLAVE_SQL_RUNNING” = “No” ]; then
ALERT_MESSAGE=”警告:MySQL复制异常,Slave_IO_Running: $SLAVE_IO_RUNNING, Slave_SQL_Running:
$SLAVE_SQL_RUNNING”
echo “$ALERT_MESSAGE” | mail -s “MySQL告警” $ALERT_EMAIL
fi
4.2 Prometheus+Grafana监控部署
以下是在生产环境中完整部署Prometheus+Grafana监控MySQL的步骤。
wget
https://github.com/prometheus/prometheus/releases/download/v2.40.0/prometheus-2.40.0.linux-amd64.tar.gz
tar -xf prometheus-2.40.0.linux-amd64.tar.gz
cd prometheus-2.40.0.linux-amd64
# 2. 安装Grafana
yum install -y https://dl.grafana.com/oss/release/grafana-9.0.0-1.x86_64.rpm
systemctl start grafana-server
systemctl enable grafana-server
# 3. 配置Prometheus(添加MySQL监控)
vi prometheus.yml
scrape_configs:
– job_name: ‘mysql’
static_configs:
– targets: [‘localhost:9104’]
# 4. 启动所有服务
./prometheus –config.file=prometheus.yml &
# 5. 访问Grafana并配置MySQL监控
# 访问地址:http://localhost:3000
# 默认用户名/密码:admin/admin
# 导入MySQL模板(ID: 7362)
4.3 告警配置实战
配置MySQL服务器发送邮件告警和Prometheus Alertmanager告警。
# 安装mailx
yum install mailx -y
# 配置SMTP
vi /etc/mail.rc
set from=alert@fgedu.net.cn
set smtp=smtp.fgedu.net.cn
set smtp-auth-user=alert@fgedu.net.cn
set smtp-auth-password=Fgedu123!
set smtp-auth=login
# 创建告警脚本
cat > /usr/local/bin/mysql_alert.sh << 'EOF' #!/bin/bash SUBJECT="MySQL告警"
RECIPIENT="admin@fgedu.net.cn" MESSAGE="$1" echo "$MESSAGE" | mail -s "$SUBJECT" $RECIPIENT EOF
chmod +x /usr/local/bin/mysql_alert.sh
# 下载Alertmanager
wget
https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz
tar -xf alertmanager-0.25.0.linux-amd64.tar.gz
# 配置Alertmanager
vi alertmanager.yml
global:
smtp_smarthost: ‘smtp.fgedu.net.cn:587’
smtp_from: ‘alert@fgedu.net.cn’
smtp_auth_username: ‘alert@fgedu.net.cn’
smtp_auth_password: ‘Fgedu123!’
route:
group_by: [‘alertname’]
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: ’email’
receivers:
– name: ’email’
email_configs:
– to: ‘admin@fgedu.net.cn’
send_resolved: true
# 创建告警规则
vi /etc/prometheus/alert.rules
groups:
– name: mysql_alerts
rules:
– alert: MySQLHighConnectionCount
expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections * 100 >
80
for: 5m
labels:
severity: warning
annotations:
summary: “MySQL连接数过高”
description: “MySQL连接数使用率已超过80%”
# 启动Alertmanager
./alertmanager –config.file=alertmanager.yml &
Part05-风哥经验总结与分享
5.1 监控最佳实践
基于多年的MySQL运维经验,以下是MySQL监控的最佳实践建议:
- 分层监控:从服务器硬件、操作系统到数据库层面进行全面监控
- 重点关注:连接数、慢查询、缓冲池命中率、复制状态等关键指标
- 阈值合理:根据业务特点设置合理的告警阈值,避免误告警
- 趋势分析:关注指标的变化趋势,而不仅仅是当前值
- 定期审查:每季度审查一次监控配置和告警规则,根据业务变化进行调整
- 日志管理:合理配置日志保留策略,定期归档和清理日志
- 自动化运维:使用自动化脚本和工具进行监控和告警,提高效率
5.2 常见问题与解决方案
在MySQL监控过程中,经常会遇到以下问题:
- 连接数过高:可能是应用程序连接未释放或连接池配置不合理,需要检查应用程序代码和连接池配置,必要时增加max_connections
- 慢查询增加:可能是缺少索引或查询计划不合理,需要分析慢查询日志,优化SQL语句和索引
- 缓冲池命中率低:可能是缓冲池大小不足或数据访问模式不合理,需要增加innodb_buffer_pool_size或优化数据访问
- 复制延迟:可能是网络延迟、主库写入量大或从库配置不足,需要优化网络、增加从库配置或使用并行复制
- 监控数据过多:可能是监控频率过高或监控指标过多,需要调整监控频率和监控指标
MySQL:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
