#### 17.2.4.1 中继日志

中继日志与二进制日志一样，由一组编号的文件组成，其中包含描述数据库更改的事件，以及一个包含所有使用的中继日志文件名称的索引文件。中继日志文件的默认位置是数据目录。

术语“中继日志文件”通常表示包含数据库事件的单个编号文件。术语“中继日志”统称为一组编号的中继日志文件加上索引文件。

中继日志文件与二进制日志文件格式相同，可以使用[**mysqlbinlog**](mysqlbinlog.html)（看[第 4.6.9 节，“mysqlbinlog - 处理二进制日志文件的实用程序”](mysqlbinlog.html)）。如果使用二进制日志事务压缩（自 MySQL 8.0.20 起可用），写入中继日志的事务有效负载以与二进制日志相同的方式压缩。有关二进制日志事务压缩的更多信息，请参阅[第 5.4.4.5 节，“二进制日志事务压缩”](binary-log-transaction-compression.html).

对于默认复制通道，中继日志文件名具有默认形式`*`主机名`*-中继箱。*`呸呸呸`*`， 在哪里*`主机名`*是副本服务器主机的名称，并且*`呸呸呸`*是一个序列号。连续的中继日志文件是使用连续的序列号创建的，以`000001`.对于非默认复制通道，默认基本名称为`*`主机名`*-中继箱-*`渠道`*`， 在哪里*`渠道`*是记录在中继日志中的复制通道的名称。

副本使用索引文件来跟踪当前使用的中继日志文件。默认中继日志索引文件名是`*`主机名`*-relay-bin.index`对于默认频道，以及`*`主机名`*-中继箱-*`渠道`*。指数`对于非默认复制通道。

默认中继日志文件和中继日志索引文件名和位置可以分别用[`中继日志`](replication-options-replica.html#sysvar_relay_log)和[`中继日志索引`](replication-options-replica.html#sysvar_relay_log_index)系统变量（见[第 17.1.6 节，“复制和二进制日志记录选项和变量”](replication-options.html)）。

如果副本使用默认的基于主机的中继日志文件名，则在设置复制后更改副本的主机名可能会导致复制失败，并出现错误无法打开中继日志和中继日志初始化期间找不到目标日志。这是一个已知问题（请参阅错误 #2122）。如果您预计副本的主机名将来可能会更改（例如，如果在副本上设置网络以便可以使用 DHCP 修改其主机名），您可以通过使用[`中继日志`](replication-options-replica.html#sysvar_relay_log)和[`中继日志索引`](replication-options-replica.html#sysvar_relay_log_index)系统变量以在您最初设置副本时显式指定中继日志文件名。这会导致名称独立于服务器主机名更改。

如果您在复制已经开始后遇到问题，解决此问题的一种方法是停止副本服务器，将旧中继日志索引文件的内容添加到新的，然后重新启动副本。在 Unix 系统上，这可以如下所示完成：

```
$> cat new_relay_log_name.index >> old_relay_log_name.index
$> mv old_relay_log_name.index new_relay_log_name.index
```

副本服务器在以下条件下创建新的中继日志文件：

-   每次复制 I/O（接收方）线程启动时。

-   当日志被刷新时（例如，使用[`刷新日志`](flush.html#flush-logs)要么[**mysqladmin 刷新日志**](mysqladmin.html)）。

-   当前relay log文件过大时，判断如下：

    -   如果值[`max_relay_log_size`](replication-options-replica.html#sysvar_max_relay_log_size)大于 0，即最大中继日志文件大小。

    -   如果值[`max_relay_log_size`](replication-options-replica.html#sysvar_max_relay_log_size)为 0，[`max_binlog_size`](replication-options-binary-log.html#sysvar_max_binlog_size)确定最大中继日志文件大小。

    复制 SQL（应用程序）线程在执行完文件中的所有事件并且不再需要它之后自动删除每个中继日志文件。没有用于删除中继日志的明确机制，因为复制 SQL 线程负责这样做。然而，[`刷新日志`](flush.html#flush-logs)轮换中继日志，这会影响复制 SQL 线程何时删除它们。
