故障分析 | DROP 大表造成数据库假死

客户数据库出现假死,导致探测语句下发不下去,出现切换。后来经过排查发现是一个大表drop导致的数据库产生假死,也参考过类似的数据库假死的案例,这里将测试一下不同版本droptable的影响

关于drop大表的历史bug描述

根据,对于大的bufferpool中的大表drop会占用mutex锁,导致其它查询无法进行。提供的临时解决方案为释放AHI(自适应哈希),预期解决版本是8.0.23。暂未从5.7的后期版本中找到解决方式

使用不同版本测试影响效果

准备流程

测试配置

bufferpool表空间占用5.7.29128

关闭binlog、调整双一,使用benchmark导入300个库的数据

ls-lhbmsql_*.ibd-rw-r-----1rootroot96KOct1917:49bmsql_:05bmsql_:46bmsql_:28bmsql_:34bmsql_:32bmsql_new_:48bmsql_:44bmsql_order_:43bmsql_:57bmsql_[localhost:5729]{root}(test)FLUSHTABLESbmsql_customerFOREXPORT;QueryOK,0rowsaffected(0.01sec)[root@R820-04test]cpbmsql_order_line.{ibd,cfg}/data/sandboxes/mysql[localhost:5729]{root}(test)UNLOCKTABLES;QueryOK,0rowsaffected(0.00sec)mysql[localhost:5729]{root}(test)FLUSHTABLESbmsql_stockFOREXPORT;QueryOK,0rowsaffected(0.00sec)[root@R820-04test]ls-lhbmsql_*-:06bmsql_:06bmsql_:12bmsql_order_:12bmsql_order_:14bmsql_:14bmsql_

改回binlog及双一参数。调整bufferpool到128G

mysql[localhost:5729]{root}((none))setglobalinnodb_buffer_pool_size=128*1024*1024*1024QueryOK,0rowsaffected(0.00sec)mysql[localhost:5729]{root}((none))showvariableslike'innodb_buffer_pool_size';+-------------------------+-------------+|Variable_name|Value|+-------------------------+-------------+|innodb_buffer_pool_size||+-------------------------+-------------+1rowinset(0.00sec)

数据库预热

mysql[localhost:5729]{root}(test)showvariableslike'%hash%';+----------------------------------+-------+|Variable_name|Value|+----------------------------------+-------+|innodb_adaptive_hash_index|ON||innodb_adaptive_hash_index_parts|8||metadata_locks_hash_instances|8|+----------------------------------+-------+/opt/sysbench-x86_64//bin/sysbencholtp_read_=10.186.17.104--mysql-port=5729--mysql-user=test--mysql-password=123456--mysql-db=test--table-size=10000000--tables=5--threads=5--db-ps-mode=disable--auto_inc=off--report-interval=3--max-requests=0--time=300--percentile=95--skip_trx=on--mysql-ignore-errors=6002,6004,4012,2013,4016,1062,1213--create_secondary=()Runningthetestwithfollowingoptions:Numberofthreads:5Reportintermediateresultsevery3second(s)InitializingrandomnumbergeneratorfromcurrenttimeInitializingworkerthreadsThreadsstarted![179s]thds:5tps:17.00qps:330.01(r/w/o:257.01/73.00/0.00)lat(ms,95%):350.33err/s:0.00reconn/s:0.00[180s]thds:5tps:5.00qps:78.99(r/w/o:63.99/15.00/0.00)lat(ms,95%):272.27err/s:0.00reconn/s:0.00[181s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[182s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[183s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[184s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[185s]thds:5tps:3.00qps:68.96(r/w/o:56.97/11.99/0.00)lat(ms,95%):5312.73err/s:0.00reconn/s:0.00[186s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[187s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[188s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[189s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[190s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[191s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[192s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[193s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[194s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[195s]thds:5tps:0.00qps:0.00(r/w/o:0.00/0.00/0.00)lat(ms,95%):0.00err/s:0.00reconn/s:0.00[196s]thds:5tps:10.00qps:139.00(r/w/o:99.00/40.00/0.00)lat(ms,95%):16519.10err/s:0.00reconn/s:0.00[197s]thds:5tps:19.00qps:362.00(r/w/o:286.00/76.00/0.00)lat(ms,95%):303.33err/s:0.00reconn/s:0.00[198s]thds:5tps:21.00qps:358.00(r/w/o:274.00/84.00/0.00)lat(ms,95%):442.73err/s:0.00reconn/s:0.00[199s]thds:5tps:22.00qps:395.97(r/w/o:307.97/87.99/0.00)lat(ms,95%):308.84err/s:0.00reconn/s:0.00[200s]thds:5tps:16.00qps:303.02(r/w/o:237.02/66.00/0.00)lat(ms,95%):502.20err/s:0.00reconn/s:0.00[201s]thds:5tps:21.00qps:379.03(r/w/o:297.02/82.01/0.00)lat(ms,95%):325.98err/s:0.00reconn/s:0.00

关闭AHI,时间缩短至2s,TPS/QPS过程中降为0

故障分析 | DROP 大表造成数据库假死

超过32gbufferpool中drop大表、dropAHI中占用大量页面的表、drop临时表空间,

之前版本会立即的释放脏页和AHI,这样会对性能产生很大的问题。如今的修复方式采用惰性删除的方式,对业务影响比较小

结论:

droptable过程大概分为三部分:

1、遍历lru,驱逐属于该表的脏页

2、清理AHI中的内容

3、文件系统的删除

其中前两部分属于最耗时,也是最影响业务的。大的bufferpool会导致遍历时间过长,通过hash运算找到AHI对应的位置并删除,这个时间也是比较长的,此阶段持有内部latche不释放,影响其它查询

8.0.23的修复版本主要是对应第一部分,对于脏页采用惰性删除方式,在关闭AHI的时候,是瞬间完成。当开启AHI的是,时间比历史版本的还要长,区别是不影响业务,猜测是降低锁的持有时间和粒度,使其它事务能够同时执行

发布于 2024-10-20 11:31
142
上一篇:系列逻辑板的通用性(方便维修代换) 下一篇:刚刚,2020年度中国科学十大进展公布
目录

    推荐阅读