记一次不常见到主从延迟问题

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: Slave_SQL_Running_State: Waiting for dependent transaction to commit 导致的主从延迟

一、问题:发现RDS实例主从数据不一致

二、分析:可能的原因
1.主从复制中断
2.主从延迟(DDL语句,大事务,只读实例负载高等)
3.实时性查询高
4.丢数据(binlog row格式可能性很小)

三、排查:
获取只读实例的复制状态,show slave status\G:

1. row **

           Slave_IO_State: Waiting for master to send event
              Master_Host: XXXXXXX
              Master_User: replicator
              Master_Port: XXXX
            Connect_Retry: 60
          Master_Log_File: mysql-bin.001798
      Read_Master_Log_Pos: 15683249
           Relay_Log_File: slave-relay.002090
            Relay_Log_Pos: 88207647
    Relay_Master_Log_File: mysql-bin.001797
         Slave_IO_Running: Yes
        Slave_SQL_Running: Yes
          Replicate_Do_DB: 
      Replicate_Ignore_DB: 
       Replicate_Do_Table: 
   Replicate_Ignore_Table: 
  Replicate_Wild_Do_Table: 

Replicate_Wild_Ignore_Table:

               Last_Errno: 0
               Last_Error: 
             Skip_Counter: 0
      Exec_Master_Log_Pos: 128759954
          Relay_Log_Space: 147040856
          Until_Condition: None
           Until_Log_File: 
            Until_Log_Pos: 0
       Master_SSL_Allowed: No
       Master_SSL_CA_File: 
       Master_SSL_CA_Path: 
          Master_SSL_Cert: 
        Master_SSL_Cipher: 
           Master_SSL_Key: 
    Seconds_Behind_Master: 9366

Master_SSL_Verify_Server_Cert: No

            Last_IO_Errno: 0
            Last_IO_Error: 
           Last_SQL_Errno: 0
           Last_SQL_Error: 

Replicate_Ignore_Server_Ids:

         Master_Server_Id: XXXX
              Master_UUID: XXXX
         Master_Info_File: mysql.slave_master_info
                SQL_Delay: 0
      SQL_Remaining_Delay: 
  Slave_SQL_Running_State: Waiting for dependent transaction to commit
       Master_Retry_Count: 86400
              Master_Bind: 
  Last_IO_Error_Timestamp: 
 Last_SQL_Error_Timestamp: 
      Last_SQL_Error_Gtid: 
           Master_SSL_Crl: 
       Master_SSL_Crlpath: 
       Retrieved_Gtid_Set: 64f5764b-abfd-11e8-b97f-6c92bf4645d4:6903-76788620
        Executed_Gtid_Set: 64f5764b-abfd-11e8-b97f-6c92bf4645d4:1-76781839,

73e54b6b-abfd-11e8-9bb5-6c92bf3a3bee:1-131695420

            Auto_Position: 1
     Replicate_Rewrite_DB: 
             Channel_Name: 
       Master_TLS_Version: 

解读下:看到IO Thread和SQL Thread线程正常都是YES 复制正常。
Seconds_Behind_Master: 9366, Relay_Master_Log_File: mysql-bin.001797 和 Master_Log_File: mysql-bin.001798 可以判断主从复制相差一个binlog日志有延迟,延迟时间大概9366秒。

继续分析只读实例负载不高
image
image

慢日志里有delete操作,但执行时间不是特别长,可以先忽略。

show processlist 也并未发现DDL语句执行
image
继续看复制信息 Slave_SQL_Running_State: Waiting for dependent transaction to commit 等待依赖的事务提交,这里提醒了我们relay log在回放某个event的时候,在等待某个事务提交。所以查询下infomation_schema.innodb_trx 这个系统表,里面会记录未提交事务执行信息
image
image

从结果看确实有2个未提交事务已经跑了很久了,为了尽快解决生产问题,建议客户kill 掉了这2个sql,这里说下trx_mysql_thread_id 对应的是processlist表里的id,所以kill时候,可以kill trx_mysql_thread_id。

结果:kill掉这2个未提交事务之后,延迟恢复。

四.复现客户问题
观察到当时SQL线程回放event时候,在等待table flush
image

资料:
FLUSH TABLES
Closes all open tables, forces all tables in use to be closed, and flushes the query cache and prepared statement cache. FLUSH TABLES also removes all query results from the query cache, like the RESET QUERY CACHE statement. For information about query caching and prepared statement caching, see Section 8.10.3, “The MySQL Query Cache”. and Section 8.10.4, “Caching of Prepared Statements and Stored Programs”.
mysql官网说明:https://dev.mysql.com/doc/refman/5.6/en/flush.html#flush-tables

说明下,flush tables遇到前面有大事务执行不完,还会产生阻塞,线程状态就是waiting for table flush(阻塞仅限于该表)

基于这些信息我们还原下问题

4.1先在只读实例,开启一个性能差的大查询事务,SQL一直执行不完
image

4.2在只读实例另外开启一个会话执行flush tables tablename
image

4.3主实例插入一条测试数据
image

4.4查询只读实例的sql线程,可以看到SQL线程的状态waiting for table flush,第一个查询一值执行不完不提交,
第二步flush tables tablename就阻塞了第三步的sql
image

4.5查询只读实例的复制状态,同样可以看到:Waiting for dependent transaction to commit
image

4.6同样也可以查到未提交的这个大事务
image

总结:未提交事务和flush tables导致relay log回放event时候,产生了阻塞,复制不能继续,产生主从延迟

客户的问题还可以通过解析binlog定位到当时relay log 回放到binlog的event了,可以佐证该事务在等待这2个事务commit或rollback。解析时候分析这个位置Relay_Master_Log_File: mysql-bin.001797,Exec_Master_Log_Pos: 128759954,row格式使用命令:mysqlbinlog -vv --base64-output=decode-rows --start-position=128759954 mysql-bin.001797 | less

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
文字识别 Oracle 关系型数据库
|
SQL 关系型数据库 MySQL
如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒设置可能不是最佳的”?
3704 0
|
SQL 监控 关系型数据库
MySQL 延迟从库介绍
本文介绍了MySQL中的延迟从库功能,详细解释了其工作原理及配置方法。延迟从库允许从库在主库执行完数据变更后延迟一段时间再同步,主要用于快速恢复误操作的数据。此外,它还可用于备份、离线查询及数据合规性需求。通过合理配置,可显著提升数据库系统的稳定性和可靠性。
512 4
|
存储 SQL 缓存
一文带你了解MySQL之Adaptive Hash Index
在InnoDB体系架构图的内存结构中,还有一块区域名为:Adaptive Hash Index,翻译成中文:自适应哈希索引,缩写:AHI,它是一个纯内存结构,我们今天就来了解它。
3269 0
|
关系型数据库 MySQL C++
MySQL InnoDB inno_space 工具介绍
**什么是inno_space?** [inno_space ](./https://github.com/baotiao/inno_space) 是一个可以直接访问InnoDB 内部文件的命令行工具, 可以打印出文件的内部结构. Jeremy Cole 用ruby 写了一个类似的工具, 不过不支持MySQL 8.0, 并且ruby 编译以及改动起来特别麻烦, 所以用cpp 重写了一个.
766 0
MySQL InnoDB inno_space 工具介绍
|
SQL 存储 关系型数据库
MySQL主从同步延迟原因与解决方法
MySQL主从同步延迟原因与解决方法
1701 0
|
数据安全/隐私保护 时序数据库
influxdb 查看和设置用户权限
influxdb 查看和设置用户权限
821 0
|
SQL 关系型数据库 MySQL
orchestrator搭建mysql高可用
orchestrator搭建mysql高可用
528 0
|
关系型数据库 MySQL 数据库
MySQL GTID 主从复制错误修复方法
GTID 复制错误修复方法
9645 0