### 5.4.6 服务器日志维护

[](<>)[](<>)[](<>)

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

在启用日志记录的情况下使用 MySQL 时，您可能希望不时备份和删除旧日志文件，并告诉 MySQL 开始记录新文件。看[第 7.2 节，“数据库备份方法”](backup-methods.html).

在 Linux (Red Hat) 安装中，您可以使用`mysql-日志旋转`日志维护脚本。如果您从 RPM 发行版安装 MySQL，则该脚本应该已自动安装。如果您使用二进制日志进行复制，请小心使用此脚本。在确定二进制日志的内容已被所有副本处理之前，不应删除二进制日志。

在其他系统上，您必须自己安装一个简短的脚本，然后从它开始**cron**（或其等价物）用于处理日志文件。

二进制日志文件会在服务器的二进制日志过期期限后自动删除。可以在启动时和刷新二进制日志时删除文件。默认二进制日志有效期为 30 天。要指定替代到期期限，请使用[`binlog_expire_logs_seconds`](replication-options-binary-log.html#sysvar_binlog_expire_logs_seconds)系统变量。如果您使用复制，则应指定不低于副本可能滞后于源的最长时间的到期期限。要按需删除二进制日志，请使用[`清除二进制日志`](purge-binary-logs.html)声明（见[第 13.4.1.1 节，“PURGE BINARY LOGS 语句”](purge-binary-logs.html)）。

要强制 MySQL 开始使用新的日志文件，请刷新日志。执行日志时会发生日志刷新[`刷新日志`](flush.html#flush-logs)声明或[**mysqladmin 刷新日志**](mysqladmin.html),[**mysqladmin 刷新**](mysqladmin.html),[**mysqldump --flush-logs**](mysqldump.html)， 要么[**mysqldump --主数据**](mysqldump.html)命令。看[第 13.7.8.3 节，“FLUSH 语句”](flush.html),[第 4.5.2 节，“mysqladmin - MySQL 服务器管理程序”](mysqladmin.html)， 和[第 4.5.4 节，“mysqldump - 数据库备份程序”](mysqldump.html).此外，当当前二进制日志文件大小达到[`max_binlog_size`](replication-options-binary-log.html#sysvar_max_binlog_size)系统变量。

[`刷新日志`](flush.html#flush-logs)支持可选修饰符以启用对单个日志的选择性刷新（例如，[`刷新二进制日志`](flush.html#flush-binary-logs)）。看[第 13.7.8.3 节，“FLUSH 语句”](flush.html).

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

-   如果启用了二进制日志，服务器将关闭当前的二进制日志文件并打开一个具有下一个序列号的新日志文件。

-   如果启用了对日志文件的常规查询日志记录或慢速查询日志记录，则服务器将关闭并重新打开日志文件。

-   如果服务器以[`--日志错误`](server-options.html#option_mysqld_log-error)选项以将错误日志写入文件，服务器关闭并重新打开日志文件。

[](<>)[](<>)

执行日志刷新语句或命令需要使用具有[`重新加载`](privileges-provided.html#priv_reload)特权。在 Unix 和类 Unix 系统上，刷新日志的另一种方法是向服务器发送信号，这可以通过`根`或拥有服务器进程的帐户。（看[第 4.10 节，“MySQL 中的 Unix 信号处理”](unix-signal-response.html).) 信号使无需连接到服务器即可执行日志刷新：

-   一种`SIGHUP`信号刷新所有日志。然而，`SIGHUP`除了可能不希望出现的日志刷新之外，还有其他影响。

-   从 MySQL 8.0.19 开始，`SIGUSR1`导致服务器刷新错误日志、一般查询日志和慢查询日志。如果您对仅刷新这些日志感兴趣，`SIGUSR1`可以用作更“轻量级”的信号，它没有`SIGHUP`与日志无关的影响。

    如前所述，刷新二进制日志会创建一个新的二进制日志文件，而刷新一般查询日志、慢查询日志或错误日志只是关闭并重新打开日志文件。对于后面的日志，要在 Unix 上创建新的日志文件，请先重命名当前日志文件，然后再刷新它。在刷新时，服务器使用原始名称打开新的日志文件。例如，如果将通用查询日志、慢查询日志和错误日志文件命名为`mysql.log`,`mysql-slow.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 上，使用**改名**而不是**mv**.

此时，您可以备份`mysql.log.old`,`mysql-slow.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/日志`归于`根`并且不可写[**mysqld**](mysqld.html).在这种情况下，日志刷新操作无法创建新的日志文件。

要处理这种情况，您必须在重命名原始日志文件后手动创建具有正确所有权的新日志文件。例如，将这些命令执行为`根`：

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