MySql日志(六)中继日志

从数据库Slave服务的I/O线程从主数据库Master服务的二进制日志中读取数据库的更改记录并写入到中继日志中,然后在Slave数据库执行修改操作。这就是中继日志Relay Log。

mysql> show variables like '%relay%';
+---------------------------+------------------------------------------------+
| Variable_name             | Value                                          |
+---------------------------+------------------------------------------------+
| max_relay_log_size        | 0                                              |
| relay_log                 |                                                |
| relay_log_basename        | /var/lib/mysql/VM_2_223_centos-relay-bin       |
| relay_log_index           | /var/lib/mysql/VM_2_223_centos-relay-bin.index |
| relay_log_info_file       | relay-log.info                                 |
| relay_log_info_repository | FILE                                           |
| relay_log_purge           | ON                                             |
| relay_log_recovery        | OFF                                            |
| relay_log_space_limit     | 0                                              |
| sync_relay_log            | 10000                                          |
| sync_relay_log_info       | 10000                                          |
+---------------------------+------------------------------------------------+
11 rows in set (0.02 sec)
RELAY LOG相关参数
  • max_relay_log_size
    relay log 允许的最大值,如果该值为0,则默认值为 max_binlog_size (1G);
    如果不为0,则 max_relay_log_size 则为最大的relay_log文件大小;

  • relay_log
    定义 relay_log 的位置和名称,如果值为空,则默认位置在数据文件的目录;

  • relay_log_index
    定义 relay_log 索引的位置和名称,记录有几个 relay_log 文件,默认为2个

  • relay_log_info_file
    定义 relay-log.info 的位置和名称

  • relay_log_purge
    是否自动清空中继日志,默认值为1(启用);

  • relay_log_recovery
    当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性。默认情况下该功能是关闭的,将relay_log_recovery的值设置为 1时,可在slave从库上开启该功能,建议开启;

  • sync_relay_log
    设置如何同步中继日志到中继日志文件。

    • 当sync_relay_log = 0时,则MySQL服务不会对中继日志文件进行同步操作,依赖于操作系统来定期进行同步。
    • 当sync_relay_log = N(N>0),slave的I/O线程每次接收到master发送过来的binlog日志都要写入系统缓冲区,每N个sync_relay_log事件后对中继日志文件执行一次同步(调用fdatasync())。
  • sync_relay_log_info
    用于设置如何将应用中继日志的位置信息同步到文件和表中,默认参数为10000

    • 当sync_relay_log_info = FILE时:
      • 如果sync_relay_log_info=0,则MySQL服务不会对relay-log.info文件进行同步操作,依赖于操作系统来定期进行同步。
      • 如果sync_relay_log_info=N(N>0),则每执行N个事务后将信息使用fdatasync()同步到relay-log.info文件。
    • 当sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info使用事务存储引擎如Innodb:
      • 在每次事务后都会更新mysql.slave_relay_log_info表的数据,忽略sync_relay_log_info的设置。
    • 当sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info不使用存储引擎如MyISAM:
      • 如果sync_relay_log_info=0,则不更新表mysql.slave_relay_log_info的数据。
      • 如果sync_relay_log_info=N(N>0),则每执行N个事务后更新表mysql.slave_relay_log_info的数据。
        elay_log.info内容同步至磁盘
设置如何保存从节点接收到的主库BINLOG
  • sync_relay_log
    设置如何同步中继日志到中继日志文件。
    • 当sync_relay_log = 0时,则MySQL服务不会对中继日志文件进行同步操作,依赖于操作系统来定期进行同步。
    • 当sync_relay_log = N(N>0),则每N个sync_relay_log事件后对中继日志文件执行一次同步(调用fdatasync())。
设置如何保存从节点接收主库BINLOG的进度信息
  • master_info_repository
    用于设置如何保存从节点接收到主库BINLOG的位点信息,可选参数可选参数值FILE|TABLE,默认参数为FILE。
  • sync_master_info
    参数值N(int),用于设置当N次sync_master_info事件后将信息同步到文件或同步到表中,默认参数值为1000
    • 当master_info_repository = FILE时,如果sync_master_info=0,则MySQL服务不会对master.info文件进行同步操作,依赖于操作系统来定期进行同步。
    • 当master_info_repository = TABLE时,如果sync_master_info=0,则MySQL服务不会更新mysql.slave_master_info的数据。

修改sync_master_info参数值不需要关闭复制进程,修改即时生效。

设置如何保存从节点上应用RELAYLOG的进度信息
  • relay_log_info_repository
    用于设置如何保存从节点上应用中继日志的位置信息,可选参数可选参数值FILE|TABLE,默认参数为FILE。

    • 如果设置为FILE,信息存放到relay-log.info文件中,如果设置为TABLE,信息存放到mysql.slave_relay_log_info中。
    • 如果使用多源复制,必须使用TABLE参数值。
      修改relay_log_info_repository 参数的值需先关闭复制进程再修改然后重启复制线程。
  • sync_relay_log_info
    用于设置如何将应用中继日志的位置信息同步到文件和表中,默认参数为10000

    • 当sync_relay_log_info = FILE时:
      • 如果sync_relay_log_info=0,则MySQL服务不会对relay-log.info文件进行同步操作,依赖于操作系统来定期进行同步。
      • 如果sync_relay_log_info=N(N>0),则每执行N个事务后将信息使用fdatasync()同步到relay-log.info文件。
    • 当sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info使用事务存储引擎如Innodb:
      在每次事务后都会更新mysql.slave_relay_log_info表的数据,忽略sync_relay_log_info的设置。
    • 当sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info不使用存储引擎如MyISAM:
      • 如果sync_relay_log_info=0,则不更新表mysql.slave_relay_log_info的数据。
      • 如果sync_relay_log_info=N(N>0),则每执行N个事务后更新表mysql.slave_relay_log_info的数据。
设置如何恢复RELAY LOG
  • relay_log_recovery
    用于设置在relay-log出现问题时如何修复,默认值为0(不开启)
    当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性
    当MTS开启后,如果设置relay_log_recovery=1,从节点意外重启或被强制kill后重启,会有如下错误:
    relay-log-recovery cannot be executed when the slave was stopped with an error or killed in MTS mode

如果从节点上relay_log_info_repository= file 或sync_relay_log_info<>1时,如果从节点发生故障重启,就可能出现从节点已应用第XXX条日志,但relay_log_info中记录的还是第XXX-N的位置,从节点从第XXX-N条日志进行重做,这部分relay log被重复执行,报1032和1062的错误,导致同步失败。因此推荐进行如下设置:

master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=1

1、由于设置relay_log_recovery=1,当Relay Log出现异常时,能自动恢复,因此无需每次同步RALAY LOG都刷新进度信息(sync_master_info)和每次将RALAY LOG刷新到磁盘(sync_relay_log)
2、由于设置relay_log_info_repository=TABLE,且表mysql.slave_relay_log_info默认使用InnoDB存储引擎,因为每次应用RALAY LOG中的事件都会刷新mysql.slave_relay_log_info表数据,忽略参数sync_master_info的设置。

RELAY LOG文件生成与删除
  • Relaylog的生成:
    写入一个从Master端得到的event后,会判断当前文件是否超过max_relay_log_size,如果超过则生成一个新的relaylog

  • Relaylog的删除:

    • 当SQL线程执行完该Relaylog最后一个event后,会判断该文件是否还需要保留,如果不需要保留,则删除
    • 在实例启动和flush logs时,判断relay log是否超过expire-log-days的限制,如果超过,则删除

猜你喜欢

转载自blog.csdn.net/jinhf10/article/details/110479269
今日推荐