与二进制日志一样,中继日志由一组编号的文件组成,其中包含描述数据库更改的事件,以及一个包含所有已使用中继日志文件名称的索引文件。
术语“中继日志文件”通常表示包含数据库事件的单独编号文件。术语 “中继日志”共同表示一组编号的中继日志文件加上索引文件。
中继日志文件的格式与二进制日志文件相同,可以使用mysqlbinlog读取(请参阅 第 4.6.7 节,“mysqlbinlog — 处理二进制日志文件的实用程序”)。
默认情况下,中继日志文件名
在数据目录中具有格式,其中
是副本服务器主机的名称,是序列号。连续的中继日志文件是使用连续的序列号创建的,以. 副本使用索引文件来跟踪当前正在使用的中继日志文件。默认中继日志索引文件名
在数据目录中。
host_name
-relay-bin.nnnnnn
host_name
nnnnnn
000001
host_name
-relay-bin.index
默认的中继日志文件和中继日志索引文件名可以分别用
relay_log
和
relay_log_index
系统变量覆盖(请参阅第 16.1.6 节,“复制和二进制日志记录选项和变量”)。
如果副本使用默认的基于主机的中继日志文件名,则在设置复制后更改副本的主机名可能会导致复制失败并出现错误Failed to open the relay log和Could not find target log during relay log initialization。这是一个已知问题(请参阅错误 #2122)。如果您预计副本的主机名将来可能会更改(例如,如果在副本上设置网络以便可以使用 DHCP 修改其主机名),则可以通过使用relay_log
和
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 LOGS
或 mysqladmin flush-logs)。当当前中继日志文件的大小变得过大时,判断如下:
如果 的值
max_relay_log_size
大于 0,那就是中继日志文件的最大大小。如果值为
max_relay_log_size
0,则max_binlog_size
确定最大中继日志文件大小。
复制 SQL 线程在执行完文件中的所有事件并且不再需要它后,会自动删除每个中继日志文件。没有用于删除中继日志的明确机制,因为复制 SQL 线程负责执行此操作。但是,FLUSH LOGS
轮转中继日志,这会影响复制 SQL 线程何时删除它们。