mysql安装完成后如何配置日志_mysql日志管理方法

11次阅读

可通过执行SHOW varIABLES LIKE ‘log_Error’和SHOW VARIABLES LIKE ‘slow_query_log’命令确认mysql错误日志和慢查询日志是否启用,其中log_error为空或为stderr表示错误日志未落盘,slow_query_log为OFF表示慢日志未开启。

mysql安装完成后如何配置日志_mysql日志管理方法

如何确认 MySQL 是否已启用错误日志和慢查询日志

安装完 MySQL 后,默认不一定开启所有日志,尤其慢查询日志(slow_query_log)通常默认关闭。错误日志(error_log)一般默认开启,但路径可能因安装方式而异(如 Homebrew、docker、源码编译或官方 DMG/MSI 安装包路径不同)。

登录 MySQL 后执行以下命令确认当前状态:

SHOW VARIABLES LIKE 'log_error';
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'slow_query_log_file';

常见问题:返回 log_error 值为空或为 stderr,说明错误日志未落盘;slow_query_log 值为 OFF,即慢日志根本没开。

修改 my.cnf 启用并规范日志路径

MySQL 读取配置的优先级顺序是:/etc/my.cnf → /etc/mysql/my.cnf → /usr/etc/my.cnf → ~/.my.cnf。生产环境建议统一使用 /etc/my.cnf/etc/mysql/my.cnf

[mysqld] 段下添加或修改以下配置项:

[mysqld]
log_error = /var/log/mysql/error.log
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1.0
log_queries_not_using_indexes = OFF
  • log_error 必须指定绝对路径,且 MySQL 进程(通常是 mysql 用户)要有写权限;否则启动失败或静默丢弃日志
  • slow_query_log_file 路径需提前创建目录并赋权:sudo mkdir -p /var/log/mysql && sudo chown mysql:mysql /var/log/mysql
  • long_query_time 单位是秒,支持小数(如 0.5),设为 0 表示记录所有查询(仅调试用,勿上生产)
  • log_queries_not_using_indexes 开启后会显著增加慢日志体积,建议仅在索引优化阶段临时启用

运行时动态开启慢查询日志(无需重启)

如果无法重启 MySQL(如云数据库 RDS 或线上服务),可用 SQL 动态开关慢日志:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2.0;

注意:

  • 该设置只对新连接生效,已有连接不受影响
  • 动态设置的 slow_query_log_file 值不会改变——它始终沿用配置文件中定义的路径(若未配置,则用默认名 host_name-slow.log,位置在数据目录下)
  • 动态关闭后,日志文件不会自动轮转或关闭句柄,需手动 FLUSH LOGS 才能确保写入完成

日志轮转与清理不能只靠 logrotate

MySQL 自身不管理日志文件大小和归档,logrotate 直接重命名或压缩 error.logslow.log 会导致 MySQL 继续往旧文件句柄写入(表现为磁盘空间不释放)。

正确做法是配合 FLUSH LOGS

# 先通知 MySQL 关闭当前日志文件并打开新文件
mysql -e "FLUSH LOGS;"
# 再由 logrotate 处理旧文件(如压缩、删除)

典型 /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
mysql -e "FLUSH LOGS;" > /dev/null 2>&1
fi
endscript
}

最容易被忽略的是:没加 sharedscriptspostrotate 中的 FLUSH LOGS,结果日志文件越滚越大,磁盘悄悄被打满。

text=ZqhQzanResources