首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >别再靠猜!MySQL 8.0 慢查询日志彻底搞懂,怎么设置,怎么查

别再靠猜!MySQL 8.0 慢查询日志彻底搞懂,怎么设置,怎么查

作者头像
IT咸鱼
发布于 2025-06-13 06:28:19
发布于 2025-06-13 06:28:19
21100
代码可运行
举报
运行总次数:0
代码可运行

为什么你必须掌握慢查询日志?

你有没有遇到过这种情况:系统跑着跑着就卡了,明明 CPU 和内存都没爆,MySQL 却迟迟不给结果。领导追问“哪个 SQL 慢?为啥慢?”,你一脸懵,连查都不会查。


一、慢查询日志是啥?组件关系先说清楚

  • **作用:**记录执行时间超过指定时间阈值的 SQL 语句。
  • **用途:**定位哪些 SQL 慢、影响性能、需优化。
  • **适用场景:**SQL 优化、性能瓶颈排查。

在你的一主两从架构中:

  • master:业务写入为主,我们只在 master 上开启慢查询日志。
  • node1、node2(从库):一般不开启慢查询日志,除非你专门做从库查询优化。

建议:只在写入库开启慢查询日志即可,避免性能开销


二、检查和开启慢查询日志(在 master 上执行)

在哪执行?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

# SSH 登录 master 服务器
ssh root@master

# 进入 MySQL 容器(你是 Docker 部署)
docker exec-it mysql-master bash

# 登录 MySQL
mysql -uroot-p

1)检查是否已开启

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

SHOW VARIABLES LIKE '%slow_query_log%';

输出中如果 slow_query_log = OFF,说明未开启。

2)临时开启(重启后失效)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

SETGLOBAL slow_query_log =ON;
SETGLOBAL slow_query_log_file ='/var/lib/mysql/mysql-slow.log';
SETGLOBAL long_query_time =1;-- 超过1秒算慢

3)永久开启(容器内编辑配置文件 my.cnf)

注意:命令在容器内部执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

vi /etc/my.cnf

添加以下配置(若无[mysqld]段请手动添加):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

[mysqld]
slow_query_log=1
slow_query_log_file=/var/lib/mysql/mysql-slow.log
long_query_time=1

保存后退出 vi(按 Esc输入 :wq)。然后重启容器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

docker restart mysql-master

三、遇到“命令不存在”的解决办法(bash: xxx: 未找到命令)

如果你在终端遇到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

bash: mysql: 未找到命令

解决方式:你需要先进入容器中再执行 mysql

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

dockerexec-it mysql-master bash
mysql -uroot-p

或者你没装 docker?检查:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

docker-v

如果提示 bash: docker: 未找到命令,请先安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

yum install-ydocker
systemctl start docker

四、日志文件在哪看?怎么读?

进入容器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

dockerexec-it mysql-master bash
cd /var/lib/mysql/
cat mysql-slow.log

日志格式示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

# 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: 扫描了多少行(越多越慢)

五、日志太多了怎么办?筛选只看慢的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

grep-A10 Query_time mysql-slow.log | grep-B5 SELECT

或者使用分析工具(后续我们写):pt-query-digest。


代码语言:javascript
代码运行次数:0
运行
复制
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT咸鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么你必须掌握慢查询日志?
  • 一、慢查询日志是啥?组件关系先说清楚
  • 二、检查和开启慢查询日志(在 master 上执行)
    • 1)检查是否已开启
    • 2)临时开启(重启后失效)
    • 3)永久开启(容器内编辑配置文件 my.cnf)
  • 三、遇到“命令不存在”的解决办法(bash: xxx: 未找到命令)
  • 四、日志文件在哪看?怎么读?
  • 五、日志太多了怎么办?筛选只看慢的
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档