给服务器请一尊佛,哈哈

将想要显示的内容写入/etc/motd中,实测redhat、centos都可以,ubuntu17.10也可以。

复制来的图案:

 

 

delete\update where… in语句 导致死锁问题分析

1、问题描述
测试中发现delete\update语句在并发测试时经常会导致发生死锁。
2、问题分析
在mariadb中,update或delete使用 where(…,…,…) in (…,…,..) 的写法会导致全表扫描,加大锁冲突的概率,造成死锁。
例1:

场景1:

当会话1:start transaction;
delete from b where (a,b,c,d,e) in ((1,1,1,1,1));
会话2:start transaction;
delete from b where (a,b,c,d,e) in ((1,1,2,1,1));
此时会话2会产生锁等待。
而场景2:
当会话1:start transaction;
delete from b where where a=1 and b=1 and c=1 and d=1 and e=1;
会话2:start transaction;
delete from b where where a=1 and b=1 and c=2 and d=1 and e=1;
不会产生锁等待。
例2:

3、解决办法

不使用delete\update where… in的写法,改为delete\update where … and …or
4、半一致性读仍会死锁问题
在read-committed隔离级别下,update会使用半一致性读,为什么还是有几率发生死锁?
根据场景复现后,show engine innodb status查看死锁信息,发现发生死锁的事务会占有很多锁,不符合innodb半一致读的特性:

5、Mariadb处理逻辑

在RC隔离级别下,在执行计划为全表扫描或全索引扫描的情况下innodb处理update的流程如下图:
6、源码分析
遍历记录的主函数为row_search_for_mysql()
调用sel_set_rec_lock()尝试加锁
如果加锁时产生锁等待,即:

进行半一致性读:


如果在半一致读时,等待的锁已被释放,则锁读当前版本

如果读取到历史版本则设置did_semi_consistent_read = TRUE;
根据did_semi_consistent_read的值设置prebuilt->row_read_type

调用解锁函数ha_innobase::unlock_row()


但是由于在上面的代码中prebuilt->new_rec_locks的值为0,所以不会对记录解锁!!!

测试MySQL不存在上述问题,应该是这块逻辑与MariaDB不同。

Mysql主备延时监控工具pt-heartbeat

pt-heartbeat是percona toolkit里带的一个监控Mysql主备延时的工具。
       编译、安装:
       perl Makefile.PL
       make
       make install
       工具原理:
  1. 在主上建立一张heartbeat表,定时向该表插入当前时间戳。
  2. 在备机上定时查询该表的时间戳,并与当前系统时间对比,计算出的差值即为从落后主的时间。
  3. 使用前提:主备系统时间必须一致。可以使用ntp服务同步。
使用步骤:
  1. 在主上运行:pt-heartbeat –user=root –host=10.47.160.26 –create-table -D lzk –interval=1 –update –daemonize 初始化表并建立后台进程定时更新heartbeat表
  2. 在备上运行:pt-heartbeat -D lzk –table=heartbeat –monitor –user=root –host=10.47.160.26 –interval=1 –port=5182 监控
[lzk2@redhat64-26 ~]$ pt-heartbeat -D lzk –table=heartbeat –monitor –user=root –host=10.47.160.26 –interval=1 –port=5182
184.00s [  3.07s,  0.61s,  0.20s ]
185.00s [  6.15s,  1.23s,  0.41s ]
186.00s [  9.25s,  1.85s,  0.62s ]
187.00s [ 12.37s,  2.47s,  0.82s ]
186.95s [ 15.48s,  3.10s,  1.03s ]
187.95s [ 18.61s,  3.72s,  1.24s ]
188.95s [ 21.76s,  4.35s,  1.45s ]
189.95s [ 24.93s,  4.99s,  1.66s ]
190.95s [ 28.11s,  5.62s,  1.87s ]
191.95s [ 31.31s,  6.26s,  2.09s ]
192.95s [ 34.53s,  6.91s,  2.30s ]
193.95s [ 37.76s,  7.55s,  2.52s ]
当前延时   1分钟   5分钟  15分钟的平均值