5.4.7 服务器日志维护

第 5.4 节“ MySQL 服务器日志”中所述,MySQL Server 可以创建几个不同的日志文件来帮助您查看正在发生的活动。但是,您必须定期清理这些文件,以确保日志不会占用过多的磁盘空间。

在启用日志记录的情况下使用 MySQL 时,您可能需要不时备份和删除旧的日志文件,并告诉 MySQL 开始记录新文件。参见第 7.2 节“数据库备份方法”

在 Linux(Red Hat)安装中,可以使用mysql-log-rotate脚本进行日志维护。如果您是从 RPM 发行版安装的 MySQL,则该脚本应该已经自动安装。如果要使用二进制日志进行复制,请谨慎使用此脚本。在确定二进制副本的内容已被所有副本处理后,才可以删除它们。

在其他系统上,您必须自己安装一个简短的脚本,该脚本是从 cron (或其等效文件)开始的,用于处理日志文件。

对于二进制日志,您可以将expire_logs_days系统变量设置为在给定的天数后自动使二进制日志文件过期(请参阅第 5.1.7 节“服务器系统变量”)。如果使用复制,则应将变量设置为不小于副本可能滞后于源的最大天数。要按需删除二进制日志,请使用清除二进制日志语句(请参见第 13.4.1.1 节“ PURGE BINARY LOGS 语句”)。

要强制 MySQL 开始使用新的日志文件,请刷新日志。当执行FLUSH LOGS语句或mysqladmin flush-logsmysqladmin refreshmysqldump --flush-logsmysqldump --master-data命令时,将发生日志刷新。参见第 13.7.6.3 节“ FLUSH 语句”第 4.5.2 节“ mysqladmin-MySQL 服务器 Management 程序”第 4.5.4 节“ mysqldump-数据库备份程序”。此外,当当前二进制日志文件大小达到max_binlog_size系统变量的值时,服务器会自动刷新二进制日志。

FLUSH LOGS支持可选修饰符,以启用对单个日志的选择性刷新(例如刷新二进制日志)。参见第 13.7.6.3 节“ FLUSH 语句”

日志刷新操作具有以下效果:

  • 如果启用了二进制日志记录,则服务器将关闭当前的二进制日志文件,并使用下一个序列号打开一个新的日志文件。

  • 如果启用了一般查询日志记录或慢速查询日志记录到日志文件,则服务器将关闭并重新打开日志文件。

  • 如果使用--log-error选项启动服务器以将错误日志写入文件,则服务器将关闭并重新打开日志文件。

执行日志刷新语句或命令需要使用具有RELOAD特权的帐户连接到服务器。在 Unix 和类似 Unix 的系统上,刷新日志的另一种方法是向服务器发送SIGHUPsignal,这可以由root或拥有服务器进程的帐户完成。signal 使无需连接到服务器即可执行日志刷新。但是,SIGHUP可能具有除日志刷新以外的其他效果,这可能是不希望的。有关详细信息,请参见第 4.10 节“ MySQL 中的 Unixsignal 处理”

如前所述,刷新二进制日志会创建一个新的二进制日志文件,而刷新常规查询日志,慢查询日志或错误日志只会关闭并重新打开日志文件。对于后面的日志,要在 Unix 上创建一个新的日志文件,请先刷新当前日志文件,然后再刷新它。在刷新时,服务器使用原始名称打开新的日志文件。例如,如果常规查询日志,慢速查询日志和错误日志文件分别命名为mysql.logmysql-slow.logerr.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.oldmysql-slow.log.olderr.log.old,然后将它们从磁盘中删除。

要在运行时重命名常规查询日志或慢速查询日志,请首先连接到服务器并禁用日志:

SET GLOBAL general_log = 'OFF';
SET GLOBAL slow_query_log = 'OFF';

在禁用日志的情况下,从外部重命名日志文件(例如,从命令行)。然后再次启用日志:

SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';

此方法可在任何平台上使用,并且不需要重新启动服务器。

Note

为了在外部重命名文件后服务器重新创建给定的日志文件,文件位置必须是服务器可写的。并非总是如此。例如,在 Linux 上,服务器可能将错误日志写为/var/log/mysqld.log,其中/var/logroot拥有,而不能由mysqld写入。在这种情况下,日志刷新操作无法创建新的日志文件。

要处理这种情况,您必须在重命名原始日志文件后手动创建具有适当所有权的新日志文件。例如,以root的身份执行以下命令:

mv /var/log/mysqld.log /var/log/mysqld.log.old
install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log