如何解决 Amazon Aurora MySQL 中的“Amazon Aurora MySQL 中的“Waiting for the slave SQL thread to free enough relay log space”(等待从 SQL 线程释放足够的中继日志空间)错误?

2 分钟阅读
0

我在 SHOW SAVE STATUS 命令的输出中收到以下错误,该命令正在作为 Amazon Aurora MySQL 中的二进制日志复制副本工作: "Waiting for the slave SQL thread to free enough relay log space"(等待从属 SQL 线程释放足够的中继日志空间) 如何排查并解决此错误?

简短描述

当 Aurora MySQL 是二进制日志复制副本时,它以与 MySQL 相同的方式运行 I/O 线程和 SQL 线程。I/O 线程从主节点读取二进制日志,然后将它们保存为副本数据库实例中的中继日志。SQL 线程处理中继日志中的事件,然后在处理中继日志中的事件后删除中继日志。

如果 SQL 线程处理事件的速度不足以赶上生成中继日志的速度,中继日志的数量就会增加。

当全局变量 relay_log_space _limit 设置为大于 0 且所有中继日志的总大小达到限制时,不会保存新的中继日志。在中继日志空间再次可用之前,SHOW SAVE SATUS 的输出将在 slave_io_State 字段中显示消息“Waiting for the slave SQL thread to free enough relay log space”(等待从属 SQL 线程释放足够的中继日志空间)。

在 Aurora MySQL 中,relay_log_space _limit 设置为 1000000000 (953.6 MiB),无法修改。这可以防止集群卷非必要增大。当所有中继日志的总大小达到 1000000000 字节 (953.6 MiB) 时,I/O 线程将停止保存中继日志。它会等待 SQL 线程处理事件并删除现有日志。然后 Slave_io_State 显示消息“Waiting for the slave SQL thread to free enough relay log space”(等待从属 SQL 线程释放足够的中继日志空间)如果 SQL 线程未停止,中继日志最终会被删除,I/O 线程将继续保存新的中继日志。

这也意味着存在复制延迟的原因是 SQL 不够快,无法赶上 I/O 线程生成的中继日志。即使 relay_log_space _limit 被修改为更大的值,中继日志仍会进一步累积,直到 SQL 线程赶上才能解决问题。

您可以在 SHOW SAVE STATUS 命令的输出中查看当前中继日志空间、I/O 线程的状态以及 SQL 线程的状态。

Slave_IO_State: Waiting for the slave SQL thread to free enough relay log space
Master_Log_File: mysql-bin-changelog.237029
Read_Master_Log_Pos: 55356151
Relay_Master_Log_File: mysql-bin-changelog.237023
Exec_Master_Log_Pos: 120
Relay_Log_Space: 1000002403

Master_Log_FileRead_Master_Log_Pos 显示二进制日志文件名以及 I/O 线程完成读取和保存的位置。Relay_Master_Log_FileExec_Master_Log_Pos 显示二进制日志文件名和 SQL 线程正在处理的位置。尽管 SQL 线程实际读取的是中继日志,但会显示主数据库实例中对应的二进制日志文件名和位置。

Master_Log_File 不同于 Relay_Master_Log_File 时,SQL 线程速度不够快。如果 Master_Log_FileRelay_Master_Log_File 相同,则 I/O 线程可能会导致延迟。

以下因素可能会导致 SQL 线程的性能不足:

  • 主数据库实例上长时间运行的查询
  • 数据库实例类大小或存储空间不足
  • 在主数据库实例上执行的并行查询
  • 同步到副本数据库实例上的磁盘的二进制日志
  • 副本上的 Binlog_format 设置为 ROW

有关解决这些问题的更多信息,请参阅如何使用 Amazon RDS for MySQL 排查高副本延迟

此外,以下因素也会影响 SQL 线程的性能:

  • 副本数据库实例上非常大的事务处理经历列表长度 (HLL)
  • 副本数据库实例上效率低的 I/O 操作
  • 副本数据库实例上具有大量带二级索引的表

解决方法

只要副本中有写入操作,您就无需担心中继日志空间。您可以使用增强型监控中的写入吞吐量度来 控此情况。

相反,重点是对副本的性能进行故障排除。有关更多详细信息,请参阅 如何使用 Amazon RDS for MySQL 排查高副本延迟、以及为什么我的 Amazon Aurora 只读副本延迟并重启?


相关信息

有关副本服务器选项和变量的 MySQL 文档

AWS 官方
AWS 官方已更新 3 年前