云数据库RDS MySQL版主实例与只读实例之间存在复制延迟

更新时间:

问题描述

云数据库RDS MySQL版主实例与只读实例之间存在复制延迟。

问题原因

  • 原因一:执行过涉及数据量较大的DDL语句。
    涉及数据量较大的DDL语句可能会产生大量的临时数据表,并且DDL语句通常是单线程执行的,所以速度比较慢,例如optimize table big_data_table
  • 原因二:对单表执行过大量的DML语句或者高频次的DML语句。
    • 对单张表进行大量的insertupdate等DML语句,只读实例只能单线程读取并执行binlog文件,与原因一类似,速度比较慢,于是产生复制延迟。
    • 高频次的DML语句虽然可以多线程并发执行,但通常只读实例的规格小于主实例,因此只读实例的负载将大于主实例,读取并执行binlog文件的速度较慢,最终产生复制延迟。
  • 原因三:执行过涉及数据量较大的事务。
    事务中存在上述两种情况的DDL语句或者DML语句时,会产生大量row格式的binlog日志。尤其针对单表执行的SQL语句,将由单线程完成复制,速度比较慢。
  • 原因四:SQL语句执行的目标数据表中没有主键(Primary Key),同时唯一键(Unique Key)中存在空值(Null)。
    由于数据表中无主键,只读实例在复制binlog文件时,将以唯一键作为优先索引,而唯一键中存在空值,导致索引效率低,产生大量的全表扫描。

解决方案

不同的问题原因对应的解决方案不同,请您先通过SQL洞察功能对故障发生时的所有SQL语句进行审计,检查是否存在上述几种情况。

说明:更多有关SQL洞察的信息,例如如何开通SQL洞察以及如何使用SQL洞察,请参见SQL洞察

如果存在上述情况,则参考以下内容进行针对性的处理:

原因一:执行过涉及数据量较大的DDL语句

请避免在业务高峰期执行此类DDL语句。

原因二:对单表执行过大量的DML语句或者高频次的DML语句

请优化SQL语句,尝试分批多次提交SQL语句,并且增加每次提交的间隔时间。或者您也可以尝试升级只读实例的规格。

原因三:执行过涉及数据量较大的事务

本原因包含上述两种情况,请参见原因一原因二进行处理。

原因四:SQL语句执行的目标数据表中没有主键(Primary Key)

解决方法比较简单,即在目标数据表中增加主键即可。

适用于

  • 云数据库RDS MySQL版