背景

半同步复制从库在晚上凌晨2点半发生异常crash,另一个异步复制从库在第二天凌晨3点也发生了异常crash。

版本

mysql 5.7.16

redhat 6.8

mysql> show variables like ‘%slave_para%’;

+————————+—————+

| Variable_name | Value |

+————————+—————+

| slave_parallel_type | LOGICAL_CLOCK |

| slave_parallel_workers | 16 |

+————————+—————+

分析

mysqld服务在以mysqld_safe守护进程启动的情况下,在发生mysqld异常情况(比如OOM)会自动拉起mysqld服务,但已确认两个从库实例messages中无与OOM相关的日志。

从监控中发现,两个从库与Seconds_Behind_Master没有很高的异常上升。

参数slave_pending_jobs_size_max 在多线程复制时,在队列中Pending的事件所占用的最大内存,默认为16M,如果内存富余,或者延迟较大时,可以适当调大;注意这个值要比主库的max_allowed_packet大。

参考官方文档:slave_pending_jobs_size_max

两个发生异常crash的从库日志中都出现了ibuf record inserted to page x:x ,通过查看space_id发现都是对应的同一张表(a_xxx.join_acct_flow),疑是晚上的定时任务对这张表做了大事务的操作。从库的并行复制只有对并发提交的事务才会进行并行应用,对一个大事务,只有一个线程进行应用。

分析在从库发生异常crash的时间段里发现,产生了大事务

mysqlbinlog -v -v --base64-output=decode-rows

--start-datetime='2018-04-03 02:47:22' --stop-datetime='2018-04-03 02:48:26' /data/mysql/mysql-bin.003446 | awk

'/###/{if($0~/UPDATE|INSERT|DELETE/)count[$2""$NF]++}END{for(i in

count)print i,"\t",count[i]}' | column -t | sort -k3nr | more

DELETE`a_xxx`.`xxx_acct_flow` 565330

DELETE`a_xxx`.`xxx_bfj_flow` 23595

DELETE`a_xxx`.`xxx_loan_detail` 24156

DELETE`a_xxx`.`xxx_pay_log` 18475

INSERT`a_xxx`.`xxx_acct_flow_his` 576265

INSERT`a_xxx`.`xxx_bfj_flow_his` 23829

INSERT`a_xxx`.`xxx_loan_detail_his` 24539

INSERT`a_xxx`.`xxx_pay_log_his` 18709

向看源码的朋友请教了下,得到了MySQL异常crash的Stack Trace

获取内存地址放入/tmp/err.log 中

[0xf1dff5]

[0x79d3b4]

[0x358c00f7e0]

[0x358bc325e5]

[0x358bc33dc5]

[0x1159d65]

[0x115e8b3]

[0x102b4d1]

[0x102f531]

[0x1033b29]

[0x11a59a1]

[0x1200afb]

[0x110db48]

[0x358c007aa1]

[0x358bce8aad]

nm -D -n /usr/local/mysql/bin/mysqld>/tmp/mysqld.sym

resolve_stack_dump -s /tmp/mysqld.sym -n /tmp/err.log |c++filt | less

0xf1dff5 my_print_stacktrace + 53

0x79d3b4 handle_fatal_signal + 1188

0x358c00f7e0 _end + -1978652160

0x358bc325e5 _end + -1982703611

0x358bc33dc5 _end + -1982697499

0x1159d65 ut_dbg_assertion_failed(char const*, char const*, unsigned long) + 170

0x115e8b3 ib::fatal::~fatal() + 179

0x102b4d1 ibuf_print(_IO_FILE*) + 881

0x102f531 ibuf_update_free_bits_low(buf_block_t const*, unsigned long, mtr_t*) + 3905

0x1033b29 ibuf_merge_or_delete_for_page(buf_block_t*, page_id_t const&, page_size_t const*, unsigned long) + 2825

0x11a59a1 buf_page_io_complete(buf_page_t*, bool) + 1249

0x1200afb fil_aio_wait(unsigned long) + 347

0x110db48 io_handler_thread + 200

0x358c007aa1 _end + -1978684223

0x358bce8aad _end + -1981956915

测试

主库模拟一个大事务,看从库是否有异常出现

环境

centos 7.4

mysql5.7.19

从库并行复制线程 8

从库slave_pending_jobs_size_max 设置比主库 max_allowed_packet大

主库

mysql> desc sbtest1;

+-----+-----------+-----+-----+------+----------------+

| id | int(11) | NO | PRI | NULL | auto_increment |

| k | int(11) | NO | MUL | 0 | |

| c | char(120) | NO | | | |

| pad | char(60) | NO | | | |

| id3 | int(11) | YES | | NULL | |

| id5 | int(11) | YES | | NULL | |

+-----+-----------+-----+-----+------+----------------+

select count(*) from sbtest1;

mysql> show variables like 'max_allowed_packet%';

+--------------------+----------+

| max_allowed_packet | 16777216 | 16M

+--------------------+----------+

从库

mysql> show variables like '%slave_para%';

+------------------------+---------------+

| Variable_name | Value |

+------------------------+---------------+

| slave_parallel_type | LOGICAL_CLOCK |

| slave_parallel_workers | 8 |

+------------------------+---------------+

mysql> show variables like '%slave_pending_jobs%';

+-----------------------------+----------+

| Variable_name | Value |

+-----------------------------+----------+

| slave_pending_jobs_size_max | 67108864 | 64M

+-----------------------------+----------+

主库执行

UPDATE sbtest1 SET c=REPEAT(UUID(),2) where id<100000;

从库出现大量类似生产环境中的日志,但没有模拟出从库异常crash的情况

Note] Multi-threaded slave: Coordinator has waited 208341 times hitting slave_pending_jobs_size_max; current event size = 8044

Note] Multi-threaded slave: Coordinator has waited 208351 times hitting slave_pending_jobs_size_max; current event size = 8044

Note] Multi-threaded slave: Coordinator has waited 208361 times hitting slave_pending_jobs_size_max; current event size = 8044

Note] Multi-threaded slave: Coordinator has waited 208371 times hitting slave_pending_jobs_size_max; current event size = 8044

Note] Multi-threaded slave: Coordinator has waited 208381 times hitting slave_pending_jobs_size_max; current event

结论

从库开启并行复制,主库执行大事务,从库日志会出现大量中 Coordinator has waited。但没有复现出从库发生异常crash的情况。

建议:

尽量减少大事务的执行,拆分为小事务

从库slave_pending_jobs_size_max 变量设置比主库max_allowed_packet大些

可设置binlog_rows_query_log_events = 1(可以动态开启),DDL,DML会以语句形式在binlog中记录,方便分析binlog

crash问题后续可以多保留一些日志,再次复现时好分析些

作者:jiaxin

mysql多线程复制crash_MySQL 并行复制(MTS) 从库发生异常crash分析相关推荐

  1. mysql复制多行_mysql中的复制方式总结(半同步复制,并行复制,多源复制)

    一.MySQL主从复制(异步复制,默认) Mysql主从复制原理 Mysql的复制原理大致如下: 1.主库记录binlog日志 在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志b ...

  2. mysql从库并行,MySQL 并行复制从库发生自动重启分析

    并行复制从库发生自动重启分析 背景 半同步复制从库在晚上凌晨2点半发生自动重启,另一个异步复制从库在第二天凌晨3点也发生了自动重启. 分析 版本mysql 5.7.16 mysql> show ...

  3. MySQL 5.7 LOGICAL_CLOCK 并行复制原理及实现分析

    MySQL 5.7 LOGICAL_CLOCK 并行复制原理及实现分析 在MySQL5.7 引入基于Logical clock的并行复制方案前,MySQL使用基于Schema的并行复制,使不同db下的 ...

  4. mysql 主从复制优化、并行复制

    实验环境: server2 为 server3 的 master server3 为 server1 的 master 即server1.2.3的身份如下: server2:master server ...

  5. MySQL · 捉虫动态 · 并行复制外键约束问题二

    背景 并行复制可以大大提高备库的 binlog 应用速度,内核月报也多次对并行复制特性进行介绍,感兴趣的朋友可以回顾下:5.6 并行复制实现分析.5.6 并行复制恢复实现 和 5.6并行复制事件分发机 ...

  6. mysql 5.7开启并行复制

    开启多线程复制,默认关键的参数有两个: mysql> show variables like 'slave_parallel_%'; +------------------------+---- ...

  7. mysql mts_MySQL进一步完善可用并行复制-MTS并行增量的应用-爱可生

    原标题: MySQL进一步完善可用并行复制-MTS并行增量的应用-爱可生 MTS 并行增量应用 MySQL 的复制延迟在早期版本一直存在,MySQL 5.6.3 版本后开始支持并行复制,并在 5.7 ...

  8. mysql 多线程并行复制_【MySQL】开启并行复制

    [MySQL]开启并行复制 一.介绍 在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高.TPS 高时就会出现严重的主备延迟问题. 如果备库执行日志的速度持续低于主库生成日志的 ...

  9. MySQL 5.6, 5.7并行复制测试(二)(r12笔记第10天)

    昨天花了点时间整理了下并行复制在5.6,5.7中的一些差别和测试,当然只是一个开始,因为里面还有不少需要完善的部分,总体的感觉来看MySQL 5.7里的并行复制改进很大,能够极大提高效率,充分利用资源 ...

最新文章

  1. vue.js快速入门
  2. 在夕阳下第一次写文章的菜鸟
  3. hibernate里的generator中class =value介绍
  4. vim编辑环境设定[Linux]
  5. 如何进行服务器备份操作系统,如何在Linux服务器上做备份和恢复
  6. 报错:The type javax.servlet.http.HttpServletRequest cannot be resolved
  7. vnc非授权访问漏洞
  8. Docker初识与安装
  9. 小白怎么学习云计算?2020云计算学习大纲
  10. opencv 调整图像亮度和对比度
  11. ulp java_java.lang.Math.ulp(float f)方法实例
  12. 【读书笔记】《博弈论》--翟文明
  13. 计算机ip 地址异常,电脑显示IP地址错误怎么办|电脑无法上网提示IP地址错误的解决方法...
  14. 汉王考勤管理系统教程
  15. 用ps制作LOGO(个人向)
  16. 四核64位处理器,MIMX8MQ5DVAJZAB 满足智能设备应用
  17. 计算机主板电杆,嵌入式主板的常见故障解决办法
  18. Java 程序获取本机 ip 地址
  19. 陈梓立tison:投身开源,需要持之以恒的热爱与贡献
  20. PMP考试报名英文申请中项目经验该怎样填写?

热门文章

  1. N32926 24小时连续测试720p, h.264 IPCAM功能,为什么基本不发热呢?
  2. 【数据库系统综合实验】教学管理信息系统—学生选课及课程安排数据库综合实验
  3. rust自动售卖机英文_中英文设备销售合同.doc
  4. 成功解决android 网络视频边下载变播放。
  5. 【数模/预测】灰色预测
  6. java高校墨香文学社管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  7. scylladb源码安装过程
  8. R语言使用quantmod包的getSymbols函数从指定金融数据源获取指定时间段的股票数据、获取美国10年期债券收益率数据
  9. 【实战】1213- 点赞动画还可以做得那么飘逸!
  10. Gabor滤波器 pytorch实现