你有没有遇到过这种情况:系统跑着跑着就卡了,明明 CPU 和内存都没爆,MySQL 却迟迟不给结果。领导追问“哪个 SQL 慢?为啥慢?”,你一脸懵,连查都不会查。
在你的一主两从架构中:
建议:只在写入库开启慢查询日志即可,避免性能开销
在哪执行?
# SSH 登录 master 服务器
ssh root@master
# 进入 MySQL 容器(你是 Docker 部署)
docker exec-it mysql-master bash
# 登录 MySQL
mysql -uroot-p
SHOW VARIABLES LIKE '%slow_query_log%';
输出中如果
slow_query_log = OFF
,说明未开启。
SETGLOBAL slow_query_log =ON;
SETGLOBAL slow_query_log_file ='/var/lib/mysql/mysql-slow.log';
SETGLOBAL long_query_time =1;-- 超过1秒算慢
注意:命令在容器内部执行
vi /etc/my.cnf
添加以下配置(若无[mysqld]段请手动添加):
[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/mysql-slow.log
long_query_time=1
保存后退出 vi
(按 Esc
输入 :wq
)。然后重启容器:
docker restart mysql-master
如果你在终端遇到:
bash: mysql: 未找到命令
解决方式:你需要先进入容器中再执行 mysql
dockerexec-it mysql-master bash
mysql -uroot-p
或者你没装 docker?检查:
docker-v
如果提示 bash: docker: 未找到命令
,请先安装:
yum install-ydocker
systemctl start docker
进入容器:
dockerexec-it mysql-master bash
cd /var/lib/mysql/
cat mysql-slow.log
日志格式示例:
# Time:2025-06-12T12:00:12.123456Z
# User@Host: root[root] @ localhost []
# Query_time:3.1415Lock_time:0.0001Rows_sent:1Rows_examined:10000
SELECT*FROM big_table WHERE name LIKE'%测试%';
解读:
Query_time
: SQL 执行耗时Lock_time
: 等待锁耗时Rows_examined
: 扫描了多少行(越多越慢)
grep-A10 Query_time mysql-slow.log | grep-B5 SELECT
或者使用分析工具(后续我们写):pt-query-digest。