本文目录:

  • 一、连接相关
  • 二、长事务
  • 三、元数据锁
  • 四、锁等待
  • 五、全局读锁
  • 六、内存使用监控
  • 七、分区表
  • 八、数据库信息概览
  • 九、长时间未更新的表
  • 十、主键、索引
  • 十一、存储引擎
  • 十二、实时负载

阅读提示:

1)本篇文章涉及到大量 SQL 语句,可将图片放大查阅

2)SQL 基于 Oracle MySQL 5.7 版本,其它版本因数据源不同不完全适用。

3)SQL 使用场景包含会话连接、元数据锁、全局锁、锁等待、长事务、内存监控、分区表、低频更新表、主键、索引、存储引擎、实时负载属于工具型文章,建议收藏保存以便后续查看。

一、连接相关

查看某用户连接的会话级别参数设置及状态变量,用于观测其它会话连接行为,辅助定位连接类问题

  • 例:查看用户连接 ID 为 19 的字符集设置,也可不指定 PROCESSLIST_ID 条件,查看所有用户连接

MySQL的一些常用SQL_主键

  • 例:发现用户 ID 为 254 的连接关闭了 sql_log_bin 设置

MySQL的一些常用SQL_数据库_02

  • 例:查看用户连接 ID 为 24 的网络流量变化

MySQL的一些常用SQL_mysql_03

二、长事务

事务开启后,超过 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 表信息。

影响锁等待超时的参数

MySQL的一些常用SQL_数据库_04

五、全局读锁

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 存储引擎表

MySQL的一些常用SQL_数据库_05