导读:
作者:高鹏(网名八怪),《深入理解MySQL主从原理32讲》系列文的作者。
《深入理解MySQL主从原理32讲》
扫码订阅:
今天遇到一个朋友的线上问题,大概意思就是说,我有一个线上的大事务大概100G左右,正在做回滚,当前看起来似乎影响了线上的业务,并且回滚很慢,是否可以减轻对线上业务的影响。并且朋友已经取消了双1设置,但是没有任何改观。版本MySQL 5.6
首先我们需要知道的是,MySQL并不适合大事务,大概列举一些MySQL中大事务的影响:
binlog文件作为一次写入,会在sync阶段消耗大量的IO,会导致全库hang主,状态大多为query end。
大事务会造成导致主从延迟。
大事务可能导致某些需要备份挂起,原因在于flush table with read lock,拿不到MDL GLOBAL 级别的锁,等待状态为 Waiting for global read lock。
大事务可能导致更大Innodb row锁加锁范围,导致row锁等待问题。
回滚困难。
基于如上一些不完全的列举,我们应该在线上尽可能的避免大事务。好了我们下面来进行问题讨论。
一、问题
前面已经说了,我们已经取消了双1设置,所谓的双1就是 sync_binlog=1和 innodb_flush_log_at_trx_commit=1。这两个参数线上要保证为1,前者保证binlog的安全,后者保证redo的安全,它们在数据库crash recovery的时候起到了关键做用,不设置为双1可能导致数据丢失。具体的参数含义不做过多讨论。但是这里的问题是即便取消了双1,没有任何改观,因此似乎说明IO问题不是主要瓶颈呢?下面我们来看几个截图:
vmstat 截图
iostat 截图