如第 7.4 节,“MySQL 服务器日志”中所述,MySQL 服务器可以创建多个不同的日志文件,以帮助您查看正在进行的活动。但是,您必须定期清理这些文件,以确保日志不会占用过多的磁盘空间。
在使用启用了日志记录的 MySQL 时,您可能需要不时备份并删除旧的日志文件,并告诉 MySQL 开始将日志记录到新文件中。参见第 9.2 节,“数据库备份方法”.
在 Linux (Red Hat) 安装中,您可以使用 mysql-log-rotate
脚本来维护日志。如果您从 RPM 发行版安装了 MySQL,则此脚本应该已自动安装。如果您使用二进制日志进行复制,请小心使用此脚本。在确保其内容已由所有副本处理之前,您不应删除二进制日志。
在其他系统上,您必须自己安装一个简短的脚本,从 cron(或其等效项)启动该脚本以处理日志文件。
二进制日志文件在服务器的二进制日志过期时间后会自动删除。文件的删除可能会在启动时以及刷新二进制日志时发生。默认的二进制日志过期时间为 30 天。要指定替代的过期时间,请使用 binlog_expire_logs_seconds
系统变量。如果您使用复制,则应指定一个过期时间,该时间不低于您的副本可能落后于源的最长时间。要按需删除二进制日志,请使用 PURGE BINARY LOGS
语句(参见 第 15.4.1.1 节,“PURGE BINARY LOGS 语句”)。
要强制 MySQL 开始使用新的日志文件,请刷新日志。当您执行 FLUSH LOGS
语句或 mysqladmin flush-logs、mysqladmin refresh、mysqldump --flush-logs
或 mysqldump --source-data
命令时,将发生日志刷新。参见 第 15.7.8.3 节,“FLUSH 语句”、第 6.5.2 节,“mysqladmin — MySQL 服务器管理程序” 和 第 6.5.4 节,“mysqldump — 数据库备份程序”。此外,当当前二进制日志文件大小达到 max_binlog_size
系统变量的值时,服务器会自动刷新二进制日志。
FLUSH LOGS
支持可选的修饰符以启用对单个日志的选择性刷新(例如,FLUSH BINARY LOGS
)。参见 第 15.7.8.3 节,“FLUSH 语句”.
日志刷新操作具有以下影响
如果启用了二进制日志记录,服务器将关闭当前二进制日志文件,并使用下一个序列号打开一个新的日志文件。
如果启用了对日志文件的通用查询日志记录或慢速查询日志记录,服务器将关闭并重新打开日志文件。
如果服务器以
--log-error
选项启动以将错误日志写入文件,服务器将关闭并重新打开日志文件。
执行日志刷新语句或命令需要使用具有 RELOAD
权限的帐户连接到服务器。在 Unix 和类 Unix 系统上,刷新日志的另一种方法是向服务器发送信号,这可以通过 root
或拥有服务器进程的帐户来完成。(参见 第 6.10 节,“MySQL 中的 Unix 信号处理”。)信号允许在不连接到服务器的情况下执行日志刷新
一个
SIGHUP
信号将刷新所有日志。但是,SIGHUP
除了日志刷新之外还有其他影响,这些影响可能是不可取的。SIGUSR1
信号会使服务器刷新错误日志、通用查询日志和慢查询日志。如果您只想刷新这些日志,SIGUSR1
可以用作更 “轻量级” 的信号,它不包含与日志无关的SIGHUP
效果。
如前所述,刷新二进制日志会创建一个新的二进制日志文件,而刷新通用查询日志、慢查询日志或错误日志只会关闭并重新打开日志文件。对于后者,要在 Unix 上创建新的日志文件,请先重命名当前日志文件,然后再刷新它。在刷新时,服务器会以原始名称打开新的日志文件。例如,如果通用查询日志、慢查询日志和错误日志文件分别命名为 mysql.log
、mysql-slow.log
和 err.log
,您可以从命令行使用以下命令序列
cd mysql-data-directory
mv mysql.log mysql.log.old
mv mysql-slow.log mysql-slow.log.old
mv err.log err.log.old
mysqladmin flush-logs
在 Windows 上,使用 rename 而不是 mv.
此时,您可以备份 mysql.log.old
、mysql-slow.log.old
和 err.log.old
,然后从磁盘中删除它们。
要重命名运行时的通用查询日志或慢查询日志,首先连接到服务器并禁用日志
SET GLOBAL general_log = 'OFF';
SET GLOBAL slow_query_log = 'OFF';
在禁用日志后,从外部重命名日志文件(例如,从命令行)。然后再次启用日志
SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';
此方法适用于任何平台,不需要服务器重启。
为了使服务器在您从外部重命名文件后重新创建给定的日志文件,文件位置必须对服务器可写。这并不总是可能的。例如,在 Linux 上,服务器可能将错误日志写入 /var/log/mysqld.log
,其中 /var/log
由 root
拥有,而 mysqld 不可写。在这种情况下,日志刷新操作将无法创建新的日志文件。
为了处理这种情况,您必须在重命名原始日志文件后手动创建新的日志文件,并赋予其正确的权限。例如,以 root
身份执行以下命令
mv /var/log/mysqld.log /var/log/mysqld.log.old
install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log