TOP云提供高性价比云服务器租用,有中国内地/港澳台、海外等全球各地节点,TOP云国内云服务器只要有域名备案号就能直接用,无须重复备案;港澳台及海外云服务器不用备案,购买之后直接使用,省时省力省心。价格实惠,续费同价,2核2G5M仅需27元每月,8核8G50M仅需66元每月,更多配置套餐请进入下面网址了解:

TOP云总站云服务器:https://topyun.vip/server/buy.html

TOP云C站云服务器:https://c.topyun.vip/cart

在云服务器上,MySQL 会生成多种日志文件,包括 错误日志慢查询日志二进制日志通用查询日志 等。这些日志文件随着时间的推移会不断增长,占用大量磁盘空间。如果不及时清理,可能会导致磁盘空间耗尽,进而影响 MySQL 服务的正常运行。

以下是关于如何安全清理 MySQL 日志文件的详细指南,包括不同类型日志的清理方法、注意事项以及自动化清理的建议。


一、MySQL 日志文件类型概述

日志类型作用默认路径(可能因配置而异)
错误日志记录 MySQL 启动、运行或停止过程中的错误信息。/var/log/mysql/error.log 或 /var/lib/mysql/hostname.err
慢查询日志记录执行时间超过设定阈值的 SQL 查询。/var/log/mysql/slow.log
二进制日志记录所有数据变更操作(用于主从复制、数据恢复)。/var/lib/mysql/mysql-bin.*
通用查询日志记录所有客户端连接和执行的 SQL 查询(调试用,通常不建议开启)。/var/log/mysql/mysql.log
中继日志从库用于存储主库传递过来的二进制日志(仅从库有)。/var/lib/mysql/mysql-relay-bin.*

注意:日志文件的具体路径取决于 MySQL 的配置文件(my.cnf 或 my.ini)中的设置,可以通过以下命令查看日志路径:

SHOW VARIABLES LIKE 'log_error';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW VARIABLES LIKE 'log_bin_basename';

二、清理不同类型的 MySQL 日志文件

1. 清理错误日志(error.log 或 hostname.err)

(1)查看错误日志路径

登录 MySQL,执行以下命令查看错误日志路径:

SHOW VARIABLES LIKE 'log_error';

输出示例:

+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| log_error     | /var/log/mysql/error.log |
+---------------+-----------------------+

(2)清理错误日志

错误日志通常不会自动轮转(除非配置了 logrotate),可以直接清空文件内容而无需删除文件本身,以避免 MySQL 服务因找不到日志文件而报错。

# 清空错误日志文件内容
truncate -s 0 /var/log/mysql/error.log

注意

  • 使用 truncate 命令可以快速清空文件内容,但保留文件本身,避免 MySQL 服务因日志文件丢失而中断。

  • 如果日志文件过大,也可以使用 > 重定向清空文件:

    > /var/log/mysql/error.log

(3)配置日志轮转(推荐)

为了避免错误日志文件过大,可以配置 Linux 的 logrotate 工具自动轮转和压缩错误日志。

  • 编辑或创建 /etc/logrotate.d/mysql 文件:

sudo nano /etc/logrotate.d/mysql
  • 添加以下内容:

/var/log/mysql/error.log {
    daily
    rotate 7
    missingok
    create 640 mysql mysql
    compress
    delaycompress
    notifempty
    sharedscripts
    postrotate
        # 通知 MySQL 重新打开日志文件
        if [ -f /var/run/mysqld/mysqld.pid ]; then
            kill -USR1 $(cat /var/run/mysqld/mysqld.pid)
        fi
    endscript
}

  • 参数说明:

    • daily:每天轮转一次日志。

    • rotate 7:保留最近 7 个日志文件。

    • compress:压缩旧日志文件。

    • delaycompress:延迟压缩,避免立即压缩最新日志文件。

    • notifempty:如果日志为空,则不轮转。

    • sharedscripts:所有日志共享同一个脚本。

    • postrotate:轮转后执行的命令,用于通知 MySQL 重新打开日志文件。

  • 测试 logrotate 配置是否正确:

sudo logrotate -f /etc/logrotate.d/mysql

2. 清理慢查询日志(slow.log)

(1)查看慢查询日志路径

登录 MySQL,执行以下命令查看慢查询日志路径:

SHOW VARIABLES LIKE 'slow_query_log_file';

(2)清理慢查询日志

与错误日志类似,可以直接清空慢查询日志文件内容:

# 清空慢查询日志文件内容
truncate -s 0 /var/log/mysql/slow.log

或者使用 > 重定向:

> /var/log/mysql/slow.log

(3)配置日志轮转(推荐)

同样可以使用 logrotate 工具管理慢查询日志。

  • 编辑 /etc/logrotate.d/mysql 文件,添加以下内容:

/var/log/mysql/slow.log {
    daily
    rotate 7
    missingok
    create 640 mysql mysql
    compress
    delaycompress
    notifempty
    sharedscripts
    postrotate
        if [ -f /var/run/mysqld/mysqld.pid ]; then
            kill -USR1 $(cat /var/run/mysqld/mysqld.pid)
        fi
    endscript
}

  • 测试配置:

sudo logrotate -f /etc/logrotate.d/mysql

3. 清理二进制日志(mysql-bin.*)

(1)查看二进制日志状态

登录 MySQL,执行以下命令查看当前的二进制日志文件及其大小:

SHOW BINARY LOGS;

输出示例:

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       120 |
| mysql-bin.000002 |       345 |
| mysql-bin.000003 |      1024 |
+------------------+-----------+
  • Log_name:二进制日志文件名。

  • File_size:文件大小(单位:字节)。

还可以查看当前正在使用的二进制日志文件:

SHOW MASTER STATUS;

输出示例:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     1024 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

注意:File 字段显示的是当前正在写入的二进制日志文件。

(2)清理二进制日志

MySQL 提供了几种清理二进制日志的方式:

方法 1:删除指定文件之前的所有二进制日志
PURGE BINARY LOGS TO 'mysql-bin.000003';
  • 该命令会删除 mysql-bin.000003 之前的所有二进制日志文件(如 mysql-bin.000001 和 mysql-bin.000002),但保留 mysql-bin.000003 及之后的日志。

方法 2:删除指定时间之前的所有二进制日志
PURGE BINARY LOGS BEFORE '2023-10-01 00:00:00';
  • 该命令会删除 2023-10-01 00:00:00 之前的所有二进制日志文件。

方法 3:直接删除日志文件(不推荐)
  • 二进制日志文件存储在 MySQL 数据目录(如 /var/lib/mysql/)中,文件名类似于 mysql-bin.000001。

  • 虽然可以直接使用 rm 命令删除这些文件,但不推荐这样做,因为可能会导致 MySQL 服务出现不一致或错误。

正确做法:始终通过 SQL 命令(如 PURGE BINARY LOGS)清理二进制日志,以确保 MySQL 内部状态的一致性。

(3)配置二进制日志自动过期(推荐)

为了避免二进制日志文件占用过多磁盘空间,可以在 MySQL 配置文件中设置日志过期时间。

  • 编辑 MySQL 配置文件(如 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf),添加以下参数:

[mysqld]
# 设置二进制日志过期时间(单位:天)
expire_logs_days = 7
  • 或者(MySQL 8.0+ 支持更精确的单位):

[mysqld]
# 设置二进制日志过期时间(单位:秒)
binlog_expire_logs_seconds = 604800  # 7天的秒数
  • 修改配置后,重启 MySQL 服务:

# CentOS / RHEL
systemctl restart mysqld

# Ubuntu / Debian
systemctl restart mysql

注意:expire_logs_days 和 binlog_expire_logs_seconds 是互斥的,只能使用其中一个。


4. 清理通用查询日志(mysql.log)

(1)查看通用查询日志路径

登录 MySQL,执行以下命令查看通用查询日志路径:

SHOW VARIABLES LIKE 'general_log_file';

注意:通用查询日志默认是关闭的,只有在明确启用后才会生成日志文件。

(2)清理通用查询日志

与错误日志和慢查询日志类似,可以直接清空日志文件内容:

# 清空通用查询日志文件内容
truncate -s 0 /var/log/mysql/mysql.log

或者使用 > 重定向:

> /var/log/mysql/mysql.log

(3)关闭通用查询日志(推荐)

通用查询日志会记录所有客户端连接和执行的 SQL 查询,通常用于调试,但在生产环境中不建议开启,因为会占用大量磁盘空间。

  • 登录 MySQL,关闭通用查询日志:

SET GLOBAL general_log = 'OFF';
  • 如果需要永久关闭,编辑 MySQL 配置文件(如 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf),确保以下参数未设置或设置为 OFF:

[mysqld]
general_log = 0
general_log_file = /var/log/mysql/mysql.log
  • 修改配置后,重启 MySQL 服务:

# CentOS / RHEL
systemctl restart mysqld

# Ubuntu / Debian
systemctl restart mysql

三、自动化清理日志的建议

为了避免手动清理日志的麻烦,可以结合 Linux 的定时任务工具 cron 实现自动化日志清理。

1. 创建清理脚本(如 cleanup_mysql_logs.sh)

#!/bin/bash

# 清空错误日志
truncate -s 0 /var/log/mysql/error.log

# 清空慢查询日志
truncate -s 0 /var/log/mysql/slow.log

# 清空通用查询日志(如果启用)
if [ -f /var/log/mysql/mysql.log ]; then
    truncate -s 0 /var/log/mysql/mysql.log
fi

# 可选:删除超过 7 天的二进制日志(需在 MySQL 中执行)
mysql -u root -pYOUR_PASSWORD -e "PURGE BINARY LOGS BEFORE NOW() - INTERVAL 7 DAY;"

注意

  • 替换 YOUR_PASSWORD 为实际的 MySQL root 用户密码。

  • 如果使用 mysql_config_editor 配置了登录信息,可以省略密码参数。

2. 设置脚本权限

chmod +x cleanup_mysql_logs.sh

3. 添加定时任务

编辑 crontab:

crontab -e

添加以下内容,每天凌晨 2 点执行清理脚本:

0 2 * * * /path/to/cleanup_mysql_logs.sh

四、总结与注意事项

注意事项
不要直接删除日志文件:直接使用 rm 删除日志文件可能导致 MySQL 服务异常,始终通过 MySQL 命令(如 PURGE BINARY LOGS)或工具(如 truncate)清理日志。
定期监控磁盘空间:使用 df -h 或 du -sh /var/log/mysql/ 检查日志文件占用的磁盘空间,及时发现并处理日志增长问题。
启用日志轮转:使用 logrotate 工具管理日志文件,避免手动清理的麻烦,同时保留一定数量的日志以备排查问题。
根据业务需求调整日志级别:如果不需要某些日志(如通用查询日志),建议关闭以减少磁盘占用。
备份重要日志:在清理日志之前,如果需要保留某些日志(如慢查询日志用于分析),可以先将日志文件备份到其他位置。


不容错过
Powered By TOPYUN 云产品资讯