怎么确认当前开了哪些日志
别急着改配置,先连上 MySQL 看一眼现状:
mysql -u root -p→ 输入密码后执行:
SHOW VARIABLES LIKE 'general_log%';
SHOW VARIABLES LIKE 'slow_query_log%';
SHOW VARIABLES LIKE 'log_error';
SHOW VARIABLES LIKE 'log_bin';
这些命令能分别告诉你通用日志、慢查询日志、错误日志、binlog 是否启用,以及它们的路径。如果值是
OFF或空,说明没开;
ON且路径存在,才算真正生效。
永久开启日志:改配置文件最稳妥
临时用
SET GLOBAL开启日志,MySQL 重启就失效,生产环境必须写进配置文件。
找到主配置文件(常见位置:
/etc/my.cnf、
/etc/mysql/my.cnf或
/etc/my.cnf.d/server.cnf),在
[mysqld]段下添加:
log-error = /var/log/mysql/error.log(错误日志,建议必开)
general_log = ON+
general_log_file = /var/log/mysql/general.log(通用日志,记录所有语句,磁盘吃紧慎开)
slow_query_log = ON+
slow_query_log_file = /var/log/mysql/slow.log+
long_query_time = 2(慢查日志,阈值按业务调,1~5 秒较常见)
log-bin = /var/lib/mysql/mysql-bin(binlog,主从/恢复必需,但有约 1% 性能损耗)
改完务必
sudo systemctl restart mysqld(或
service mysqld restart),再用前面的
SHOW VARIABLES验证。
动态开启日志:适合调试但不持久
不想重启服务?可以用 SQL 命令临时打开(仅对当前会话或全局生效):
开通用日志:SET GLOBAL general_log = 'ON';+
SET GLOBAL general_log_file = '/tmp/mysql-general.log';开慢查日志:
SET GLOBAL slow_query_log = 'ON';+
SET GLOBAL long_query_time = 1;注意:
SET GLOBAL不影响已存在的连接,新连接才生效;且只在本次运行周期有效 如果报错
ERROR 1238 (HY000): Variable 'general_log' is a read only variable,说明配置文件里禁用了动态修改(如设置了
read_only或启用了某些安全插件)
日志路径和权限最容易出问题
即使配置全对,日志也可能写不进去——90% 是路径或权限问题:
确保目录存在:sudo mkdir -p /var/log/mysql确保 MySQL 进程用户(通常是
mysql)有写权限:
sudo chown mysql:mysql /var/log/mysql避免写到根分区或
/tmp:日志增长快,容易撑爆磁盘;推荐挂载独立小分区或用
logrotate定期轮转 不要把日志和数据目录混放(比如都丢在
/var/lib/mysql):一来难管理,二来某些备份工具会误删日志文件
binlog 和 error log 尤其敏感:路径写错会导致 MySQL 启动失败,直接卡在 service 启动阶段,查
journalctl -u mysqld才能看到真实报错。
