如第5.4节“ MySQL服务器日志”所述,MySQL Server可以创建几个不同的日志文件来帮助您查看正在发生的活动。但是,您必须定期清理这些文件,以确保日志不会占用过多的磁盘空间。
在启用 logging 的情况下使用 MySQL 时,您可能需要不时备份和删除旧的日志文件,并告诉MySQL开始记录新文件。请参见第7.2节“数据库备份方法”。
在 Linux(Red Hat)安装上,您可以使用mysql-log-rotate
脚本。如果您从 RPM 分发版安装了 MySQL,则应该已自动安装此脚本。如果您使用二进制 log 进行复制,请小心使用此脚本。在确定所有从属程序已处理其内容之前,不应删除二进制日志。
在其他系统上,您必须自己安装一个简短的脚本,该脚本是从cron(或其等效文件)开始的,用于处理日志文件。
对于二进制 log,您可以将expirelogs_days系统变量设置为在给定天数后自动使二进制 log files 过期(请参阅第 5.1.7 节,“服务器系统变量”)。如果使用复制,则应将变量设置为不小于从属服务器可能落后于主服务器的最大天数。要按需删除二进制日志,请使用PURGE BINARY LOGS
语句(请参见 第13.4.1.1节“ PURGE BINARY LOGS语句”)。
您可以通过刷新日志来强制MySQL开始使用新的日志文件。发出命令 FLUSH LOGS
或执行 mysqladmin flush-logs,mysqladmin refresh,mysqldump --flush-logs或mysqldump --master-data命令时, 将发生日志刷新。请参见 第13.7.6.3节“ FLUSH语句”,第4.5.2节“ mysqladmin-用于管理MySQL服务器的客户端”和 第4.5.4节“ mysqldump-数据库备份程序”。另外,当二进制日志的大小达到max_binlog_size
系统变量的值时,将刷新该二进制日志 。
FLUSH LOGS
支持可选的修饰符,以启用对单个日志的选择性刷新(例如FLUSH BINARY LOGS
)。
日志刷新操作执行以下操作:
-
如果启用了一般查询日志记录或慢速查询日志记录到日志文件,则服务器将关闭并重新打开一般查询日志文件或慢速查询日志文件。
-
如果启用了二进制日志记录,则服务器将关闭当前的二进制日志文件,并使用下一个序列号打开一个新的日志文件。
-
如果服务器启动时带有将
--log-error
错误日志写入文件的选项,则服务器将关闭并重新打开日志文件。
刷新日志时,服务器将创建一个新的二进制日志文件。但是,它只是关闭并重新打开常规和慢速查询日志文件。要使新文件在Unix上创建,请在刷新它们之前重命名当前日志文件。在刷新时,服务器将打开具有原始名称的新日志文件。例如,如果常规查询日志文件和慢速查询日志文件分别命名为 mysql.log
和 mysql-slow.log
,则可以使用以下命令:
shell> cd mysql-data-directory
shell> mv mysql.log mysql.old
shell> mv mysql-slow.log mysql-slow.old
shell> mysqladmin flush-logs
在Windows上,请使用rename而不是 mv。
在这一点上,你可以备份 mysql.old
和 mysql-slow.old
再从磁盘删除它们。
如果有,可以使用类似的策略来备份错误日志文件。
您可以在运行时通过禁用日志来重命名常规查询日志或慢速查询日志:
SET GLOBAL general_log = 'OFF';
SET GLOBAL slow_query_log = 'OFF';
在禁用日志的情况下,从外部重命名日志文件(例如,从命令行)。然后再次启用日志:
SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';
此方法可在任何平台上使用,并且不需要重新启动服务器。
注意
要使服务器在外部重命名文件后重新创建给定的 log 文件,服务器必须可以写入文件位置。情况可能并非总是如此。例如,在 Linux 上,服务器可能会将错误 log 写为/var/log/mysqld.log
,其中/var/log
由root
拥有而不可写。在这种情况下,log-flushing 操作将无法创建新的 log 文件。
要解决这种情况,您必须在重命名原始日志文件后使用适当的ownerhiop手动创建新的日志文件。例如,请以root的身份执行以下语句:
shell> mv /var/log/mysqld.log /var/log/mysqld.log.old
shell> install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log