作者回复: 先说明下,binlog是没有“恢复redolog”的能力的哈。其它部分分析得很好👍🏿
Binlog 这么大,说明是大事务,崩溃恢复的时候要处理的redolog 很多,估计耗时间耗在这。
这种磁盘空间满的情况,以前我的处理方法是把最老的binlog移动到别的盘(如果确定日志已经备份到备份系统了就删掉),目的是腾出空间让这个事务执行完成。
后面可以考虑这种方案,强制重启还是有点伤的,不过核心还是做好监控,不让出现磁盘100%写满的情况
作者回复: 1. Kill 掉备份线程在当时是最好的办法了。不过我之前确实也没碰到过show create table 不能kill的情况,我看下代码,如果能复现出来加入那篇文章中
2. 嗯,80060这个问题是因为要truncate,所以要回收脏页导致慢,不过这个问题在5.5.23就优化掉了哦,看你使用的是5.6,可能是别的原因。truncate如果不是被锁,而是已经在执行了,确实还是别做别的事情,等结束最好;
3. 这个语句是因为子查询要用临时表,跟order by 无关的(你看到的阶段还没开始order by 操作)。这个语句的临时表都能多到把磁盘打满,增加tmp_table_size是没用的。
就是说这三个方法里面2和3其实都无效。你们当时的选择很精准呀。
而且前面提出“重启无效”的这个人值得团队内大力表扬(是不是就是你😄)
另外这个语句,看着像有机会优化的样子,核心方向是去掉临时表
4.可以只删掉其中一个独立索引,再加一个联合索引,就是变成(a,b)和(b)这两种索引,也就是把(a)改成(a,b),这样是加法,相对比较安全。删除索引是一个要很小心的操作,少删一个多一份安全,之后再通过观察索引b的使用情况,确定没必要再删。interset确实一般都比较慢。
5. 正常回滚很快的,是不是大事务回滚?这种还是得从消除大事务入手
作者回复: 就是这么实现的😓
C=10还是要锁的,如果不锁可能被删除
作者回复: 因为执行c=20的时候,由于要order by c desc, 就要先找到“最右边第一个c=20的行”,
这个怎么找呢,只能向右找到25,才能知道它左边那个20是“最右的20”
作者回复: 总结的非常好,而且现象很全面。
核心的一个点是:kill query 只是终止当前执行语句,并不会让事务回滚👍🏿
作者回复: 嗯,因为执行索引遍历的顺序不一样,其实锁范围不一样也算合理啦😄
作者回复: 1. Next-key lock是前开后闭区间呀,有扫描到25,所以(20,25]
2. Rows_examined 是server层统计的,这个不满足的值没返回给server
3. 你show processlist 结果发我看下,代码中没搜到😓
作者回复: 这没问题呀
begin; select * from t where c>=15 and c<=20 order by c desc lock in share mode;
锁的范围是这样的:
索引c上,next-key lock: (5,10],(10,15],(15,20];
索引id上,行锁: id=15和id=20
作者回复: 👍
作者回复: 对的,readonly对super无效;
一方面是尽量不要给业务super
一方面你做完readonly还会去确认binlog有没有变,这个意识很好哦
作者回复: 在算法导论面前,这个专栏的内容算很浅的😆
作者回复: 业务开发基本都能用上的哈😆
作者回复: 是这样的,我们只是简写成(5,10],
这个是索引c上的next-key lock,
所以这个范围的左边界是 (c=5,id=5), 右边界是(c=10,id=10)
你举例里面,
insert into t values(6,5,6) 是(c=5, id=6);
insert into t values(7,5,6) 是(c=5, id=7);
这两个都落在上面的next-key lock的区间,所以是会被锁住的哦
好问题, 新年快乐
作者回复: 就是优化2,找第一个值的时候是等值查询
作者回复: 看连接池怎么实现的了,不过确实大多数连接池的一个基本功能就是维护长连接
作者回复: 👍
尤其是第二点,可以在测试环境就发现问题,是最好
作者回复: 1. 第一次就是找c=20,这个就是一次等值查找
2. 案例5那个,等值查的是id=10,然后向右遍历。这两个,一个是有order by desc,索引的扫描方向不一样,“找第一个”的值也是不一样的