MySQL错误日志路径需在my.cnf的[mysqld]段配置log_error,重启生效;general_log和slow_query_log需同时开启并指定路径;binlog路径由datadir决定,不可单独设置;日志轮转须配合flush-logs。

如何修改 MySQL 的错误日志路径
MySQL 默认把错误日志写到数据目录下(如 /var/lib/mysql/hostname.err),但生产环境通常需要统一日志归集或挂载独立磁盘。改路径必须通过配置文件,不能运行时动态设置。
- 编辑
my.cnf或mysqld.cnf(常见位置:/etc/mysql/my.cnf、/etc/my.cnf、/usr/etc/my.cnf) - 在
[mysqld]段落下添加或修改:log_error = /var/log/mysql/error.log - 确保 MySQL 进程对目标目录有写权限:
chown mysql:mysql /var/log/mysql/,且 SELinux 或 AppArmor 未拦截(CentOS/RHEL 上可能需setsebool -P mysqld_read_error_log on) - 重启服务:
systemctl restart mysqld;若启动失败,检查错误日志原路径是否仍被占用,或用mysqld --defaults-file=/etc/my.cnf --validate-config验证配置语法
开启并指定 general_log 和 slow_query_log 路径
这两类日志默认关闭,启用后建议明确指定路径,避免混入数据目录。注意:general_log 开销大,仅调试用;slow_query_log 建议长期开启并配合 long_query_time 控制粒度。
- 在
[mysqld]下添加:general_log = ONgeneral_log_file = /var/log/mysql/general.logslow_query_log = ONslow_query_log_file = /var/log/mysql/slow.log - MySQL 5.7+ 支持以表形式记录(
log_output = TABLE),此时*_log_file参数无效,日志存于mysql.general_log表中——但该方式不便于外部日志轮转和审计,线上慎用 - 如果只设
slow_query_log_file但没开slow_query_log,文件不会创建;反之,开了但没指定路径,会落到数据目录下,名字为hostname-slow.log
binlog 路径不能随意改,但可以控制文件名与滚动行为
binlog 路径由 datadir 决定,不能单独指定目录(MySQL 启动时强制校验 binlog 文件必须在 datadir 内)。但可通过参数精细管理其生成方式:
本版升级功能:1、增加“系统参数设置”功能,可在线管理编辑全站数据库路径、备份路径,无须到程序代码下更改;2、改进后台管理员权限分配问题,严谨、完善、安全的根限分配细分到每个功能页面的列表查看权限、添加权限、编辑权限、删除权限都可以在线分配,确保系统在多用户管理下,安全稳定运行;3、更新优化数据库操作,在线备份、压缩、恢复数据库,管理登录日志;4、增加&am
-
log_bin = /var/lib/mysql/mysql-bin—— 实际是设置前缀名,完整路径仍拼接datadir;若写成绝对路径(如/data/binlogs/mysql-bin),MySQL 启动会报错Failed to open log (error 13) -
expire_logs_days = 7或binlog_expire_logs_seconds = 604800(MySQL 8.0.28+)控制自动清理,避免磁盘打满 -
max_binlog_size = 100M设置单个 binlog 文件上限,但实际大小可能略超(因事务不可切分)
日志权限与轮转要手动配合 logrotate
MySQL 自身不提供日志轮转功能(除 binlog 可靠过期外),错误日志、slow log 等需外部工具管理。直接 mv 或 cp 日志文件会导致 MySQL 继续往旧 fd 写,新文件为空。
- 正确做法:用
logrotate+mysqladmin flush-logs,例如在/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
mysqladmin --defaults-file=/etc/mysql/debian.cnf flush-logs 2>/dev/null || true
fi
endscript
} - 关键是
postrotate里的flush-logs:它让 MySQL 关闭当前句柄并打开新文件,否则日志会持续写入已重命名的旧文件 - 若使用容器部署(如 Docker),需挂载日志目录为 volume,并在 entrypoint 中配置 logrotate 或用 sidecar 容器处理
flush-logs、以及误以为 log_bin 能指向任意路径。









