mysql错误日志是数据库运行过程中记录异常、启动关闭信息、关键错误的重要文件,默认由log_error参数指定存储路径和文件名。当数据库长期运行、出现大量异常或者开启了过细的日志记录级别时,错误日志文件会快速膨胀,甚至占满磁盘空间导致数据库无法正常工作。

错误日志过大的影响
错误日志文件过大首先会占用大量磁盘存储,若磁盘空间被占满,mysql可能无法写入新的数据或日志,直接导致服务不可用。其次过大的日志文件在排查问题时读取速度慢,不利于快速定位故障。另外部分场景下日志文件过大还可能拖慢mysql的启动速度。
安全清理错误日志的方案
方案一:使用mysql命令行刷新日志
这种方式不需要重启mysql服务,操作过程安全,不会影响正在运行的业务。首先登录mysql客户端,执行刷新日志的命令:
-- 登录mysql客户端后执行,刷新错误日志,会生成新的错误日志文件 FLUSH ERROR LOGS;
执行完上述命令后,mysql会关闭当前的错误日志文件,重新打开一个新的错误日志文件。此时原来的旧错误日志文件会被重命名,比如原文件是error.log,刷新后会变成error.log.old,之后就可以手动删除这个旧文件释放空间。
方案二:手动重命名后重启服务
如果无法使用命令行操作,也可以手动处理错误日志文件。首先找到log_error参数对应的日志文件路径,执行以下命令查看路径:
-- 查看错误日志的存储路径 SHOW VARIABLES LIKE 'log_error';
假设查询到的日志路径是/var/log/mysql/error.log,先重命名该文件:
# 重命名旧的错误日志文件 mv /var/log/mysql/error.log /var/log/mysql/error.log.bak
之后重启mysql服务,服务启动时会自动生成新的error.log文件,之后就可以删除error.log.bak文件。不同系统的重启命令略有差异:
# centos系统重启mysql systemctl restart mysqld # ubuntu系统重启mysql systemctl restart mysql
方案三:配置日志自动轮转
为了避免后续再次出现错误日志过大的问题,可以配置日志自动轮转,让系统定期自动处理旧的日志文件。以linux系统为例,使用logrotate工具配置轮转规则,创建/etc/logrotate.d/mysql-error文件,内容如下:
# mysql错误日志轮转配置
/var/log/mysql/error.log {
daily # 每天轮转一次
rotate 7 # 保留7个历史日志文件
missingok # 日志文件不存在时不报错
notifempty # 日志文件为空时不轮转
compress # 轮转后的日志文件压缩存储
postrotate # 轮转后执行的命令,刷新mysql日志
/usr/bin/mysqladmin -u root -p'你的密码' flush-error-logs
endscript
}
配置完成后,系统会按照设定的规则自动处理错误日志,不需要手动频繁操作。
操作注意事项
- 清理错误日志前建议先确认日志中是否有需要留存的重要错误信息,若有可以先备份日志文件再清理。
- 使用
FLUSH ERROR LOGS命令时,需要有对应的mysql权限,一般root用户默认拥有该权限。 - 手动重命名日志文件后,一定要确保mysql服务有对应目录的写入权限,否则重启服务时可能无法生成新的日志文件。
- 不要直接删除正在被mysql进程占用的错误日志文件,直接删除可能导致日志无法继续写入,需要重启服务才能恢复。
相关参数说明
可以通过调整以下参数控制错误日志的记录行为,减少不必要的日志产生:
| 参数名 | 作用 | 默认值 |
|---|---|---|
| log_error | 指定错误日志的存储路径和文件名 | 数据目录下hostname.err |
| log_error_verbosity | 控制错误日志的记录详细程度,取值1-3,数值越大记录越详细 | 2 |
| log_warnings | 是否记录警告信息到错误日志,0为不记录,1为记录 | 2 |
如果数据库运行稳定,没有频繁出现异常,可以适当调小log_error_verbosity的值,减少不必要的日志记录,从根源上减缓错误日志的增长速度。