先执行show variables查看日志启用状态及路径,再通过修改配置文件永久开启并重启服务验证;动态开启仅临时有效,需注意权限、路径和磁盘空间问题。

怎么确认当前开了哪些日志
别急着改配置,先连上 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 才能看到真实报错。










