1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

基于行事件导致从库运行缓慢及解决方法

基于行事件导致从库运行缓慢及解决方法

最近,在处理了一个从库延迟问题,在分析期间,发现从库SQL线程在处理来自主库二进制日志的基于行的事件时无法跟上。

基于行事件导致从库运行缓慢及解决方法

当SQL线程应用基于行的事件更改时,它必须找到被更新的确切行。使用主键,因为只有一行才可能具有相同的主键。但是,如果从库表上没有主键,SQL线程必须搜索整个表才能找到要更新或删除的行。它重复搜索每个更新的行。这种搜索会占用大量资源(CPU占用率最高可达100%),又会导致从库延迟。

解决方法

最好的解决方案是确保所有表都有一个主键。这不仅确保SQL线程可以轻松找到需要更新或删除的行,因为它确保所有行都是唯一的。如果无法在逻辑上为表添加自然主键,一个潜在的解决方案是添加一个自增无符号整数列作为主键。

在这种情况下,一个短期的解决方案是更改从库使用的搜索算法,以定位由基于行的事件更改的行。搜索算法是使用MySQL5.6及更高版本中可用的slave_rows_search_algorithms选项设置的。默认值是尽可能使用索引扫描,否则使用表扫描。但是,对于没有主键的表使用散列扫描,这会导致SQL线程临时缓存散列以减少搜索整个表的开销。

如果对大行(例如,使用blob或文本数据)执行更新或删除,增加主库上binlog_row_event_max_size的值可能会有所帮助。只能在MySQL配置文件中设置binlog_row_event_max_size,重置该值需要重启数据库。

总结

即使启用哈希扫描可以提高从库的性能,但永久的解决方案是为每个表添加显式主键,这种模式可以避免许许多多的问题。

原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6398.html