如何修改 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 = ON
general_log_file = /var/log/mysql/general.log
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.logMySQL 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内)。但可通过参数精细管理其生成方式:
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 {<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> mysqladmin --defaults-file=/etc/mysql/debian.cnf flush-logs 2>/dev/null || true<br> fi<br> endscript<br>}
关键是 postrotate里的
flush-logs:它让 MySQL 关闭当前句柄并打开新文件,否则日志会持续写入已重命名的旧文件 若使用容器部署(如 Docker),需挂载日志目录为 volume,并在 entrypoint 中配置 logrotate 或用 sidecar 容器处理 MySQL 日志路径看似只是配个字符串,但涉及权限、SELinux/AppArmor、启动校验、轮转机制多个环节。最容易忽略的是:改完配置不验证、轮转不触发
flush-logs、以及误以为
log_bin能指向任意路径。
