关闭mysql general_log和slow_query_log需先执行set global general_log = 'off'及set global slow_query_log = 'off',再注释或设为off配置文件中对应行;清日志前须确认已关闭、查路径、用truncate清空或rm删除。

MySQL 的 general_log 和 slow_query_log 日志怎么关?
运行日志(尤其是 general_log)一旦开启且长期不关,会迅速占满磁盘,甚至拖慢查询响应。它不是归档日志,而是实时写入的调试型日志,生产环境几乎从不启用。
关闭最直接:连上 MySQL 后执行
SET GLOBAL general_log = 'OFF';<br>SET GLOBAL slow_query_log = 'OFF';
注意:SET GLOBAL 只影响当前实例运行时状态,重启后会恢复配置文件中的值。所以必须同步修改配置文件(如 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf),把对应行注释或设为 OFF:
# general_log = 1<br># slow_query_log = 1
常见错误:只改配置没执行 SET GLOBAL,导致日志还在写;或者只执行命令但没改配置,重启后又爆盘。
日志文件本身怎么安全删除?
别直接 rm 正在被 MySQL 写入的日志文件——Linux 下文件句柄仍被 mysqld 占用,磁盘空间不会释放,且可能引发写入异常。
正确做法分三步:
- 先确认日志是否已关闭:
SELECT @@general_log, @@slow_query_log;返回OFF才继续 - 查日志路径:
SELECT @@general_log_file;或SELECT @@slow_query_log_file; - 用
mysqladmin flush-logs(可选)触发日志轮转,再用truncate -s 0 <file></file>清空内容,或直接rm文件(此时 mysqld 已不再写入)
如果日志路径是默认的(比如 /var/lib/mysql/hostname.log),删前务必 ls -lh 确认文件名,避免误删 ibdata1 或 binlog。
写个一键清理脚本要注意什么?
脚本核心不是“删”,而是“判断 + 关 + 清”。一个健壮的 Bash 脚本至少要检查三件事:
- MySQL 进程是否存活(
pgrep mysqld) - 当前
general_log和slow_query_log是否为ON(用mysql -Nse "SELECT @@general_log"获取值) - 日志文件是否存在且非空(
[ -s "$log_file" ])
示例关键逻辑片段:
log_file=$(mysql -Nse "SELECT @@general_log_file")<br>if [ -s "$log_file" ]; then<br> mysql -e "SET GLOBAL general_log = 'OFF'"<br> truncate -s 0 "$log_file"<br>fi
不要在脚本里硬编码路径;不要忽略权限问题(脚本需用 MySQL 有 SUPER 权限的账号运行,比如 mysql -u root -p...);更不要把 rm -rf /var/lib/mysql 这类命令塞进去。
binlog 算不算“运行日志”?能随便清吗?
不算。binlog 是事务日志,用于主从复制和时间点恢复,关闭或清理会影响数据一致性。它由 expire_logs_days 或 binlog_expire_logs_seconds 控制自动清理,手动清理必须用 PURGE BINARY LOGS:
PURGE BINARY LOGS TO 'mysql-bin.000123';<br>-- 或按时间:<br>PURGE BINARY LOGS BEFORE '2024-05-01 00:00:00';
直接删 mysql-bin.* 文件会导致 MySQL 启动失败,或从库 IO 线程报错 Could not find first log file name in binary log index file。这点和 general_log 完全不同,切勿混淆。











