如何确认 MySQL 是否已启用错误日志和慢查询日志
安装完 MySQL 后,默认不一定开启所有日志,尤其慢查询日志(
slow_query_log)通常默认关闭。错误日志(
error_log)一般默认开启,但路径可能因安装方式而异(如 Homebrew、Docker、源码编译或官方 DMG/MSI 安装包路径不同)。
登录 MySQL 后执行以下命令确认当前状态:
SHOW VARIABLES LIKE 'log_error';<br>SHOW VARIABLES LIKE 'slow_query_log';<br>SHOW VARIABLES LIKE 'long_query_time';<br>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]<br>log_error = /var/log/mysql/error.log<br>slow_query_log = ON<br>slow_query_log_file = /var/log/mysql/slow.log<br>long_query_time = 1.0<br>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 动态开关慢日志:
SET GLOBAL slow_query_log = 'ON';<br>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 关闭当前日志文件并打开新文件<br>mysql -e "FLUSH LOGS;"<br># 再由 logrotate 处理旧文件(如压缩、删除)
典型
/etc/logrotate.d/mysql配置片段:
/var/log/mysql/*.log {<br> daily<br> missingok<br> rotate 30<br> compress<br> delaycompress<br> notifempty<br> create 640 mysql mysql<br> sharedscripts<br> postrotate<br> if [ -f /var/run/mysqld/mysqld.pid ]; then<br> mysql -e "FLUSH LOGS;" > /dev/null 2>&1<br> fi<br> endscript<br>}最容易被忽略的是:没加
sharedscripts和
postrotate中的
FLUSH LOGS,结果日志文件越滚越大,磁盘悄悄被打满。
