温馨提示×

Debian MySQL资源占用如何监控

小樊
46
2025-11-21 04:42:55
栏目: 云计算

Debian 上监控 MySQL 资源占用的实用方案

一 快速排查与实时监控

  • 进程与系统资源:使用 top/htop 观察 mysqldCPU%、MEM%;用 ps -ef | grep mysqld 查看完整命令行与启动参数;用 vmstat 1 关注 us、sy、free 等整体负载与内存压力。
  • 服务状态与基础指标:用 systemctl status mysql 查看是否运行与最近日志;用 mysqladmin -u root -p status 获取 Uptime、Threads、Queries 等;在 MySQL 客户端执行 SHOW STATUS LIKE ‘Threads_connected’;SHOW PROCESSLIST; 查看连接与正在执行的语句。
  • 磁盘 I/O:安装 sysstat 后执行 iostat -x 1,关注 await、r/s、w/s、util% 以判断是否存在 I/O 瓶颈。
  • 网络与连接:用 ss -tulpen | grep 3306netstat -tulpen | grep 3306 检查监听与连接状态。

二 日志与慢查询定位

  • 错误日志:默认路径 /var/log/mysql/error.log,用于发现启动失败、崩溃、InnoDB 恢复与告警信息。
  • 慢查询日志:在 /etc/mysql/my.cnf[mysqld] 段落开启并配置阈值,例如:
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/slow-queries.log
    long_query_time = 2
    修改后执行 systemctl restart mysql 生效;随后可用 mysqldumpslow 或 pt-query-digest 分析耗时 SQL。

三 常用监控工具与可视化

  • 命令行增强:安装 innotop(sudo apt install innotop),可实时查看 InnoDB 缓冲池、I/O、复制、查询列表 等,适合临时排障与深入观察。
  • 企业级与开源监控:
    • Zabbix:通过模板监控 MySQL 可用性、连接数、查询速率、复制延迟等,提供告警与图形界面。
    • Prometheus + mysqld_exporter + Grafana:以时间序列采集指标,Grafana 做可视化与阈值告警,适合长期趋势与容量规划。

四 关键指标与阈值参考

指标 如何查看 关注点与建议
连接数 SHOW STATUS LIKE ‘Threads_connected’; / mysqladmin status 接近 max_connections 时可能出现新连接被拒,结合业务峰值与超时设置评估是否需要调优或扩容。
查询吞吐 SHOW STATUS LIKE ‘Queries’; mysqladmin status 观察 Queries/s 的趋势变化,突增常伴随慢查询或业务高峰。
慢查询 SHOW VARIABLES LIKE ‘slow_query_log%’; SHOW VARIABLES LIKE ‘long_query_time’; 建议开启慢查询日志并将 long_query_time 设为 1–2 秒,定期分析并优化。
InnoDB 缓冲池命中率 SHOW STATUS LIKE ‘Innodb_buffer_pool_read%’; 计算:命中率 ≈ 1 − Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests;低于 95% 时考虑增大 innodb_buffer_pool_size
磁盘 I/O iostat -x 1 关注 await、r/s、w/s、util%util% 持续接近 100% 表示磁盘饱和,需优化 SQL/索引或升级存储。

五 一键巡检脚本示例

#!/usr/bin/env bash
# 简易 MySQL 资源巡检脚本(Debian)
MYSQL_USER="root"
MYSQL_PWD="你的密码"
MYSQL_HOST="127.0.0.1"
LOG_DIR="/var/log/mysql-monitor"
mkdir -p "$LOG_DIR"
TS=$(date +"%F_%H-%M-%S")
LOG="$LOG_DIR/check_$TS.log"

{
  echo "===== $(date) ====="
  echo "## systemd 状态"
  systemctl status mysql --no-pager | head -n 20

  echo -e "\n## mysqladmin status"
  mysqladmin -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PWD" status

  echo -e "\n## 连接与进程"
  mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PWD" -e "SHOW STATUS LIKE 'Threads_connected';"
  mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PWD" -e "SHOW PROCESSLIST\G"

  echo -e "\n## 慢查询配置"
  mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PWD" -e "SHOW VARIABLES LIKE 'slow_query_log%';"
  mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PWD" -e "SHOW VARIABLES LIKE 'long_query_time';"

  echo -e "\n## InnoDB 缓冲池命中率"
  mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PWD" -sN -e "
    SELECT
      ROUND(1 - (Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests),4) AS hit_ratio
    FROM performance_schema.global_status
    WHERE variable_name IN ('Innodb_buffer_pool_reads','Innodb_buffer_pool_read_requests');"

  echo -e "\n## 磁盘 I/O (iostat -x 1 5)"
  iostat -x 1 5

  echo -e "\n## 监听端口"
  ss -tulpen | grep 3306
} >> "$LOG" 2>&1

echo "Saved to $LOG"

提示:将脚本加入 cron(如每 5 分钟 执行)并结合 logrotate 做日志轮转,便于长期留存与告警联动。

0