专栏首页SEian.G学习记录MySQL多线程复制报错案例

MySQL多线程复制报错案例

近期遇到一个主从复制报错的问题,具体的报错详情如下所示:

mysql >show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxxxx
                  Master_User: dba_repl
                  Master_Port: 4306
                Connect_Retry: 60
              Master_Log_File: mysqlbin.001589
          Read_Master_Log_Pos: 353490645
               Relay_Log_File: slave-relay-bin.004764
                Relay_Log_Pos: 912732994
        Relay_Master_Log_File: mysqlbin.001588
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 1864
                   Last_Error: Cannot schedule event Rows_query, relay-log name /data/mysql_4306/log/slave-relay-bin.004764, position 912733141 to Worker thread because its size 21520792 exceeds 18777088 of slave_pending_jobs_size_max.
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 912732823
              Relay_Log_Space: 1427234531
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 1864
               Last_SQL_Error: Cannot schedule event Rows_query, relay-log name /data/mysql_4306/log/slave-relay-bin.004764, position 912733141 to Worker thread because its size 21520792 exceeds 18777088 of slave_pending_jobs_size_max.
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 255
                  Master_UUID: 548723ca-1f7f-11e9-b3ab-005056b748c5
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State:
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp: 210514 16:02:41
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: 548723ca-1f7f-11e9-b3ab-005056b748c5:532252-1257990582
            Executed_Gtid_Set: 548723ca-1f7f-11e9-b3ab-005056b748c5:1-1257510314,
5965cc1e-42b8-11e8-9759-005056b7d9af:1-2805913654
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

从报错信息看,和参数slave_pending_jobs_size_max有关,那么这个参数具体是干什么的呢?我们今天就来了解一下;

下面是官方文档对该参数的介绍: For multithreaded replicas, this variable sets the maximum amount of memory (in bytes) available to worker queues holding events not yet applied. Setting this variable has no effect on replicas for which multithreading is not enabled. Setting this variable has no immediate effect. The state of the variable applies on all subsequent START SLAVE commands. The minimum possible value for this variable is 1024; the default is 16MB. The maximum possible value is 18446744073709551615 (16 exabytes). Values that are not exact multiples of 1024 are rounded down to the next-highest multiple of 1024 prior to being stored. The value of this variable is a soft limit and can be set to match the normal workload. If an unusually large event exceeds this size, the transaction is held until all the worker threads have empty queues, and then processed. All subsequent transactions are held until the large transaction has been completed.

大概的意思是:

对于多线程复制,slave_pending_jobs_size_max变量设置用于保存尚未应用的event的工作队列可用的最大内存量(以字节为单位)。设置此变量对未启用多线程处理的复制没有影响。设置此变量不会立即生效。必须要停掉复制之后,重新start slave。 此变量的最小值为1024;默认值为16MB。最大可能值为18446744073709551615(16 EB)。 此变量的值是软限制,可以设置为与正常工作负载匹配。如果异常大的事件超过此大小,事务将被保留,直到所有工作线程都有空队列,然后进行处理。如果内存富余,或者延迟较大时,可以适当调大;注意这个值要比主库的max_allowed_packet大!

划重点:

该参数在多线程复制中起作用, 当worker线程正在处理的event的总大小超过slave_pending_jobs_size_max变量的大小时,将发生此等待操作。此时可有在主库看到线程的状态为:Waiting for Slave Workers to free pending events 当event大小降至该限制以下时,协调器将恢复调度。仅当slave_parallel_workers设置为大于0时,才会出现此状态。

那么对该参数了解之后,具体的解决方法也就有了:

1、查看主库max_allowed_packet的大小

mysql> show variables like '%max_allowed_packet%';
+--------------------------+------------+
| Variable_name            | Value      |
+--------------------------+------------+
| max_allowed_packet       | 67108864   |
| slave_max_allowed_packet | 1073741824 |
+--------------------------+------------+
2 rows in set (0.00 sec)

2、设置从库slave_pending_jobs_size_max的大小,注意,需要大于主库max_allowed_packet的大小

mysql>stop slave;
Query OK, 0 rows affected (0.01 sec)
 
mysql>set global slave_pending_jobs_size_max=1073741824;
Query OK, 0 rows affected (0.00 sec)
 
mysql>start slave;
Query OK, 0 rows affected (0.02 sec)

到此,主从复制报错的问题就解决了;

本文分享自微信公众号 - DBA的辛酸事儿(dbabitter),作者:SEian.G

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • mysql复制系列5-多线程复制

    mysql复制中最常见的问题就是主从复制延迟问题,mysql从一开始不支持并行复制,到一步一步的优化改进多线程复制,下面介绍一下mysql复制单线程到多线程复制...

    wangwei-dba
  • 线上MySQL复制错误排查一例

    报错信息中不难看出来,是写入数据到/dev/shm这个目录的时候报错。报错信息也很明显,No space left on device;没有额外的空余磁盘空间。

    AsiaYe
  • 【MySQL】mysql5.7多源复制报错问题处理

    新master的file、pos位置已经改变,需要重新change master配置新的复制点

    用户5522200
  • MySQL通过物理备份恢复后,配置主从复制报错案例

    通过物理备份文件(从库的全量备份)恢复实例后,与主库建立主从复制关系,出现如下的报错信息:

    SEian.G
  • mysql或者mariadb多线程复制

    如果此时在主上有大量的insert操作,可以在slave上执行> select * from mysql.slave_worker_info\G 应该可以查看...

    二狗不要跑
  • MySQL复制错误ERROR 1837的相关缺陷案例

    从官方文档的中“gtid的限制”《https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-restr...

    SEian.G
  • Mysql 5.7 主从复制的多线程复制配置方式

    数据库复制的主要性能问题就是数据延时 为了优化复制性能,Mysql 5.6 引入了 “多线程复制” 这个新功能 但 5.6 中的每个线程只能处理一个数据库,所以...

    dys
  • MySQL 5.7基于GTID及多线程主从复制

    MySQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的binlog(使...

    小小科
  • 线上磁盘写满导致MySQL复制失败案例一则

    今天在线上发现一个问题,由于监控没有覆盖到,某台机器的磁盘被写满了,导致线上MySQL主从复制出现问题。问题如下:

    AsiaYe
  • waiting for metadata lock对腾讯云从节点的影响及处理

    某用户A反馈CDB实例读业务数据库没有响应,在控制台界面看到ro节点被剔除,剔除之前数据库监控上面cpu负载正常,活跃线程数出现大量的堆积;提单后,平台紧急介入...

    vkyzhao
  • 备份恢复,DBA最后一道防线,你完全掌握了吗?

    墨墨导读:备份恢复是DBA最后一道防线。最近项目碰到备份恢复的相关的事项,结合自己的经验,巩固一下知识。

    数据和云
  • MySQL row格式的两个问题

    作者简介: ? 刘伟 云和恩墨开源解决方案事业部首席架构师 多年一线互联网企业DBA经历,对MySQL、NoSQL,PostgreSQL等各类开源数据库均有涉猎...

    数据和云
  • 没遇到过这十个MySQL 数据库经典错误,你一定不是个好工程师

    笔者在刚开始学习数据库的时候,没少走弯路。经常会遇到各种稀奇古怪的 error 信息,遇到报错会很慌张,急需一个解决问题的办法。跟无头苍蝇一样,会不加思索地把错...

    小小科
  • mysql主从同步(2)-问题梳理

    之前部署了Mysql主从复制环境(Mysql主从同步(1)-主从/主主环境部署梳理),在mysql同步过程中会出现很多问题,导致数据同步异常。 以下梳理了几种主...

    洗尽了浮华
  • MySQL 案例:"最大连接数"的隐形限制

    最近遇到一个比较奇怪的问题,用户反馈云服务器的自建 MySQL 连接数没达到的 max_connections 限制,但是程序侧已经开始报错,无法创建新的连接了...

    王文安@DBA
  • MySQL 5.6 主从报错一例

    版本:MySQL 5.6,采用传统 binlog file & pos 方式配置的主从复制结构。

    老叶茶馆
  • 两个案例解析复制错误引发的故障

    MySQL Replication是MySQL非常重要的特性。用好了,可以发挥很大的作用,做负载均衡,做读写分离,做备份等等,能在关键时刻救DBA一命;用不好,...

    wubx
  • 12种mysql常见错误总结 +分析示例

    小伙伴们好,我是阿沐!最近呢,正筹备上云工作,需要考虑到很多场景;比如mongo、mysql、redis、splinx等等迁移工作,这就涉及到版本兼容问题;在迁...

    我是阿沐
  • 【Mysql】mysql 基于GTID复制

    3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。

    用户5522200

扫码关注云+社区

领取腾讯云代金券