可通过执行SHOW VARIABLES LIKE 'log_error'和SHOW VARIABLES LIKE 'slow_query_log'命令确认MySQL错误日志和慢查询日志是否启用,其中log_error为空或为stderr表示错误日志未落盘,slow_query_log为OFF表示慢日志未开启。

如何确认 MySQL 是否已启用错误日志和慢查询日志
安装完 MySQL 后,默认不一定开启所有日志,尤其慢查询日志(slow_query_log)通常默认关闭。错误日志(error_log)一般默认开启,但路径可能因安装方式而异(如 Homebrew、Docker、源码编译或官方 DMG/MSI 安装包路径不同)。
登录 MySQL 后执行以下命令确认当前状态:
SHOW VARIABLES LIKE 'log_error';
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'slow_query_log_file';
常见问题:返回 log_error 值为空或为 stderr,说明错误日志未落盘;slow_query_log 值为 OFF,即慢日志根本没开。
修改 my.cnf 启用并规范日志路径
MySQL 读取配置的优先级顺序是:/etc/my.cnf → /etc/mysql/my.cnf → /usr/etc/my.cnf → ~/.my.cnf。生产环境建议统一使用 /etc/my.cnf 或 /etc/mysql/my.cnf。
在 [mysqld] 段下添加或修改以下配置项:
[mysqld]
log_error = /var/log/mysql/error.log
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1.0
log_queries_not_using_indexes = OFF
-
log_error必须指定绝对路径,且 MySQL 进程(通常是mysql用户)要有写权限;否则启动失败或静默丢弃日志 -
slow_query_log_file路径需提前创建目录并赋权:sudo mkdir -p /var/log/mysql && sudo chown mysql:mysql /var/log/mysql -
long_query_time单位是秒,支持小数(如0.5),设为0表示记录所有查询(仅调试用,勿上生产) -
log_queries_not_using_indexes开启后会显著增加慢日志体积,建议仅在索引优化阶段临时启用
运行时动态开启慢查询日志(无需重启)
如果无法重启 MySQL(如云数据库 RDS 或线上服务),可用 SQL 动态开关慢日志:
此版本和闪睿企业网站管理系统 2009 SP1 Build 090828 得区别是:这个可以在本地计算机一键安装所有所需组件,并安装完成后自动打开闪睿网站前台。我们的口号:简单,不思考!这个版本要的就是简单!不再需要安装IIS,配置IIS,繁琐的各种设置,下载等,就下载一个包,运行一个程序,一步到位!2.0版本更新日志:1.自主研发迷你web服务器,全自动配置参数。简单无极限!2.迷你服务器和迷你
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2.0;
注意:
- 该设置只对新连接生效,已有连接不受影响
- 动态设置的
slow_query_log_file值不会改变——它始终沿用配置文件中定义的路径(若未配置,则用默认名host_name-slow.log,位置在数据目录下) - 动态关闭后,日志文件不会自动轮转或关闭句柄,需手动
FLUSH LOGS才能确保写入完成
日志轮转与清理不能只靠 logrotate
MySQL 自身不管理日志文件大小和归档,logrotate 直接重命名或压缩 error.log 或 slow.log 会导致 MySQL 继续往旧文件句柄写入(表现为磁盘空间不释放)。
正确做法是配合 FLUSH LOGS:
# 先通知 MySQL 关闭当前日志文件并打开新文件
mysql -e "FLUSH LOGS;"
# 再由 logrotate 处理旧文件(如压缩、删除)
典型 /etc/logrotate.d/mysql 配置片段:
/var/log/mysql/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 mysql mysql
sharedscripts
postrotate
if [ -f /var/run/mysqld/mysqld.pid ]; then
mysql -e "FLUSH LOGS;" > /dev/null 2>&1
fi
endscript
}最容易被忽略的是:没加 sharedscripts 和 postrotate 中的 FLUSH LOGS,结果日志文件越滚越大,磁盘悄悄被打满。









