本文目录:
- 一、连接相关
- 二、长事务
- 三、元数据锁
- 四、锁等待
- 五、全局读锁
- 六、内存使用监控
- 七、分区表
- 八、数据库信息概览
- 九、长时间未更新的表
- 十、主键、索引
- 十一、存储引擎
- 十二、实时负载
阅读提示:
1)本篇文章涉及到大量 SQL 语句,可将图片放大查阅。
2)SQL 基于 Oracle MySQL 5.7 版本,其它版本因数据源不同不完全适用。
3)SQL 使用场景包含会话连接、元数据锁、全局锁、锁等待、长事务、内存监控、分区表、低频更新表、主键、索引、存储引擎、实时负载属于工具型文章,建议收藏保存以便后续查看。
一、连接相关
查看某用户连接的会话级别参数设置及状态变量,用于观测其它会话连接行为,辅助定位连接类问题
- 例:查看用户连接 ID 为 19 的字符集设置,也可不指定 PROCESSLIST_ID 条件,查看所有用户连接
- 例:发现用户 ID 为 254 的连接关闭了 sql_log_bin 设置
- 例:查看用户连接 ID 为 24 的网络流量变化
二、长事务
事务开启后,超过 5s 未提交的用户连接
三、元数据锁
MySQL 5.7 开启元数据锁追踪,以便追踪定位元数据锁相关的阻塞问题
场景 1:杀掉持有 MDL 锁的会话,使 DDL 语句顺利执行。
- DDL 语句被阻塞通常因为存在获取资源后未及时提交释放的长事务。因此,查找 kill 掉事务运行时间大于 DDL 运行时间的会话即可使 DDL 语句顺利下发,SQL 语句如下:
注:因 MySQL 元数据信息记录有限,此处可能误杀无辜长事务,且误杀无法完全避免。
- 当 kill 掉阻塞源后,可能存在 DDL 语句与被阻塞的 SQL 语句同时加锁的情况,此时会出现事务开始时间等于 DDL 开始时间连接,此类事务也需 kill。
场景 2:kill 掉下发 DDL 语句的用户连接,取消 DDL 语句下发,保障业务不被阻塞。
四、锁等待
查看锁等待相关的阻塞线程、被阻塞线程信息及相关用户、IP、PORT
- 若不关心阻塞相关的用户、IP、PORT,可直接查看 innodb_lock_waits 表信息。
影响锁等待超时的参数
五、全局读锁
PERFORMANCE_SCHEMA.METADATA_LOCKS 表 LOCK_DURATION 列为 EXPLICIT 状态表示 FTWRL 语句添加,OBJECT_TYPE 出现 COMMIT 状态表示已经加锁成功
- 场景 1:杀掉添加 FTWRL 的会话,恢复业务运行
- 场景 2:杀掉语句执行时间大于 FTWRL 执行时间的线程,确保 FTWRL 下发成功
六、内存使用监控
默认只对 performance_schema 库进行内存统计,对全局内存统计需要手工开启
- 查看实例内存消耗分布,sys 库下有多张 memory 相关视图用于协助用户定位分析内存溢出类问题
七、分区表
- 查看实例中的分区表相关信息
- 查看某分区表具体信息,此处以库名为 db、表名为 e 的分区表为例
八、数据库信息概览
- 统计实例中各数据库大小
- 统计某库下各表大小
- 查看某库下表的基本信息
九、长时间未更新的表
UPDATE_TIME 为 NULL 表示实例启动后一直未更新过
十、主键、索引
无主键、唯一键及二级索引基表
- MySQL Innodb 存储引擎为索引组织表,因此设置合适的主键字段对性能至关重要
无主键、唯一键,仅有二级索引表
- 该类型表因无高效索引,因此从库回放时容易导致复制延迟
仅有主键、唯一键表
- 该类型表结构因无二级索引,可能导致应用 SQL 语句上线后频繁全表扫描出现性能抖动
无主键、唯一键表
十一、存储引擎
- 存储引擎分布
- 非 INNODB 存储引擎表