线上故障如何快速排查?来看这套技巧大全( 四 )


线上故障如何快速排查?来看这套技巧大全

文章插图
 
3.2 慢SQL3.2.1 问题出现应用TPS下降 , 并出现SQL执行超时异常或者出现了类似如下的告警信息 , 则常常意味着出现了慢SQL 。
线上故障如何快速排查?来看这套技巧大全

文章插图
 
3.2.2 问题分析分析执行计划:利用explain指令获得该SQL语句的执行计划 , 根据该执行计划 , 可能有两种场景 。
SQL不走索引或扫描行数过多等致使执行时长过长 。
SQL没问题 , 只是因为事务并发导致等待锁 , 致使执行时长过长 。
3.2.3 场景一3.2.3.1 优化SQL通过增加索引 , 调整SQL语句的方式优化执行时长 ,  例如下的执行计划:
线上故障如何快速排查?来看这套技巧大全

文章插图
 
该SQL的执行计划的type为ALL , 同时根据以下type语义 , 可知无索引的全表查询 , 故可为其检索列增加索引进而解决 。
线上故障如何快速排查?来看这套技巧大全

文章插图
 
3.2.4 场景二3.2.4.1 查询当前事务情况可以通过查看如下3张表做相应的处理:
-- 当前运行的所有事务select *from information_schema.innodb_trx;-- 当前出现的锁SELECT * FROM information_schema.INNODB_LOCKS;-- 锁等待的对应关系select *from information_schema.INNODB_LOCK_WAITS;(1)查看当前的事务有哪些:
线上故障如何快速排查?来看这套技巧大全

文章插图
 
(2)查看事务锁类型索引的详细信息:
线上故障如何快速排查?来看这套技巧大全

文章插图
 
lock_table字段能看到被锁的索引的表名 , lock_mode可以看到锁类型是X锁,lock_type可以看到是行锁record 。
3.2.4.2 分析根据事务情况 , 得到表信息 , 和相关的事务时序信息:
DROP TABLE IF EXISTS `emp`;CREATE TABLE `emp` (`id` int(11) NOT NULL AUTO_INCREMENT,`salary` int(10) DEFAULT NULL,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_name` (`name`(191)) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;A事物锁住一条记录 , 不提交 , B事物需要更新此条记录 , 此时会阻塞 , 如下图是执行顺序:
线上故障如何快速排查?来看这套技巧大全

文章插图
 
3.2.4.3 解决方案(1)修改方案
由前一步的结果,分析事务间加锁时序 , 例如可以通过tx_query字段得知被阻塞的事务SQL,trx_state得知事务状态等 , 找到对应代码逻辑 , 进行优化修改 。
(2)临时修改方案
trx_mysql_thread_id是对应的事务sessionId , 可以通过以下命令杀死长时间执行的事务 , 从而避免阻塞其他事务执行 。
kill 1058533.3 连接数过多3.3.1 问题出现常出现too many connections异常,数据库连接到达最大连接数 。
3.3.2 解决方案解决方案:
通过set global max_connections=XXX增大最大连接数 。
先利用show processlist获取连接信息 , 然后利用kill杀死过多的连 。
常用脚本如下:
排序数据库连接的数目 mysql -h127.0.0.0.1 -uabc_test -pXXXXX -P3306 -A -e 'show processlist'| awk '{print $4}'|sort|uniq -c|sort -rn|head -103.4 相关知识3.4.1 索引3.4.1.1 MySql不同的存储引擎
线上故障如何快速排查?来看这套技巧大全

文章插图
 
3.4.1.2 InnoDB B+Tree索引实现主键索引(聚集索引):
  • 叶子节点data域保存了完整的数据的地址 。
  • 主键与数据全部存储在一颗树上 。
  • Root节点常驻内存 。
  • 每个非叶子节点一个innodb_page_size大小,加速磁盘IO 。
  • 磁盘的I/O要比内存慢几百倍 , 而磁盘慢的原因在于机械设备寻找磁道慢 , 因此采用磁盘预读 , 每次读取一个磁盘页(page:计算机管理存储器的逻辑块-通常为4k)的整倍数 。
  • 如果没有主键,MySQL默认生成隐含字段作为主键 , 这个字段长度为6个字节 , 类型为长整形 。
  • 辅助索引结构与主索引相同,但叶子节点data域保存的是主键指针 。