Ubuntu 上监控 MySQL 性能的可落地方案
一 内置与命令行快速检查
systemctl status mysqlmysqladmin -u root -p statusSHOW GLOBAL STATUS LIKE 'Threads_connected';、SHOW FULL PROCESSLIST;SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%';SHOW ENGINE INNODB STATUS\GSHOW VARIABLES LIKE 'max_connections';、SHOW VARIABLES LIKE '%slow%';SELECT table_schema, SUM(data_length/1024/1024) AS data_mb, SUM(index_length/1024/1024) AS idx_mb, SUM(data_free/1024/1024) AS free_mb FROM information_schema.tables GROUP BY table_schema;二 日志与内置性能架构
/etc/mysql/my.cnf 的 [mysqld] 段):
slow_query_log = 1slow_query_log_file = /var/log/mysql/slow.loglong_query_time = 2log_queries_not_using_indexes = 1mysqldumpslow -s t /var/log/mysql/slow.logpt-query-digest /var/log/mysql/slow.log(来自 Percona Toolkit)SHOW VARIABLES LIKE 'log_error';SELECT EVENT_NAME, COUNT_STAR, SUM_TIMER_WAIT FROM performance_schema.events_waits_summary_global_by_event_name ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;SELECT * FROM sys.statement_analysis ORDER BY avg_latency DESC LIMIT 10;SELECT * FROM sys.user_summary;三 第三方监控与可视化
my.cnf 或 .my.cnf 认证;Prometheus 抓取 9104 端口;Grafana 导入 MySQL 仪表盘(如 ID 7362)四 关键指标与告警阈值示例
| 指标 | 如何查看 | 告警阈值示例 | 说明 |
|---|---|---|---|
| 连接数使用率 | Threads_connected、max_connections |
> 80% | 连接池趋满,可能拒绝新连接 |
| 慢查询数增长 | Slow_queries、慢查询日志 |
持续上升或突增 | 结合 pt-query-digest 定位具体 SQL |
| 复制延迟 | Seconds_Behind_Master(复制状态) |
> 60s | 影响读一致性与故障切换 |
| InnoDB 缓冲池命中率 | Innodb_buffer_pool_read_requests、Innodb_buffer_pool_reads |
< 95% | 命中率低建议增大 innodb_buffer_pool_size |
| 查询缓存命中率 | Qcache_hits、Qcache_inserts |
< 90% | 命中率低可考虑关闭或调优(MySQL 8.0 已移除) |
| 临时表磁盘化比例 | Created_tmp_disk_tables、Created_tmp_tables |
> 10% | 增加 tmp_table_size/max_heap_table_size 或优化 SQL |
| 锁等待 | Innodb_row_lock_waits、Innodb_row_lock_time_avg |
持续偏高 | 关注热点行、事务设计与索引 |
| 磁盘 I/O 饱和度 | iostat -x 1(%util、await) |
%util 持续 >80% 或 await 高 |
I/O 成为瓶颈,考虑更快磁盘或优化 I/O 模式 |
| 这些指标与阈值可作为基线,需结合业务特点与历史趋势动态校准。 |
五 快速上手与自动化巡检
mysql -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';" -s -Nmysql -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';" -s -Nmysql -e "SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%';" -s -Nsudo tail -n 50 $(mysql -s -N -e "SHOW VARIABLES LIKE 'log_error';")mysql -e "SELECT table_schema, SUM(data_length/1024/1024) AS data_mb, SUM(index_length/1024/1024) AS idx_mb FROM information_schema.tables GROUP BY table_schema;" -s -N