MySQL 5.7系列之sys schema(2)
0、导读
MySQL 5.7引入了sys schema,有了它,我们排查分析一些问题时将更得心应手。sys schema里主要存储的是视图、存储过程、函数等。
视图:用于结果的汇总展示及配置持久化;
存储过程:用于对Performance schema的控制及收集;
函数:对于Performance schema的配置及数据格式化。
本文约2000字,阅读时间约10分钟。
1、本文目标
上篇我们只是先简单介绍了下sys schema可以做什么,以及几个基础概念,本文继续深入介绍sys schema,回答上篇我们留下的几个问题:
哪个用户或者来自哪个IP的客户端使用了最多的资源;
数据库连接来自哪里,以及这些连接对数据库的请求情况是怎样的;
数据库中哪些SQL被频繁执行;
哪个文件产生了最多的IO,读多,还是写的多;
哪个表上的IO请求最多;
哪个表被访问的最多;
哪些语句延迟比较严重;
哪些SQL语句使用了临时表,又有哪些用到了磁盘临时表;
哪个表占用了最多的buffer pool;
每个库(database)占用多少buffer pool;
每个连接分配多少内存;
MySQL内部有多个线程在运行;
其他...
2、基本视图介绍
host_summary视图
字段名 |
意义 |
host |
从哪个客户机上连过来。如果是NULL,表示内部的进程 |
statements |
该客户机共执行了多少语句 |
statement_latency |
该客户机发来等待语句执行的时间 |
statement_avg_latency |
该客户机等待语句执行的平均时间 |
table_scans |
该客户机发生全表扫描的次数 |
file_ios |
该客户机上IO事件请求的次数 |
file_io_latency |
该客户机请求等待IO的时间 |
current_connections |
该客户机当前的连接数 |
total_connections |
该客户机连接DB共有多少次 |
unique_user |
该客户机上有几个不同用户名的帐户连接过来 |
current_memory |
该客户机上当前连接占用的内存 |
total_memory_allocated |
该客户机上的请求总共使用的内存量(历史累计值) |
io_global_by_file_by_bytes视图
file |
被操作的文件名 |
count_read |
总共有多少次读 |
total_read |
总共读了多少字节 |
avg_read |
平均每次读的字节数 |
count_write |
总共有多少次写 |
total_written |
总共写了多少字节 |
avg_write |
平均每次写的字节大小 |
total |
读和写总共的IO大小 |
write_pct |
写请求占总IO请求中的百分比(就是通常所说的读写比) |
user_summary视图
user |
客户端连接过来的用户名,如果是NULL,表示内部进程 |
statements |
该用户执行了多少SQL |
statement_latency |
该用户执行SQL的总延迟时间 |
statement_avg_latency |
该用户执行SQL的平均延迟时间 |
table_scans |
该用户执行SQL时发生全表扫描的次数 |
file_ios |
该用户发生的IO请求总量 |
file_io_latency |
该用户发生的IO请求总延迟时间 |
current_connections |
该用户当前的连接 |
total_connections |
该用户总的连接数 |
unique_hosts |
该用户从几个不同客户机连接过来 |
current_memory |
该用户当前占用的内存 |
total_memory_allocated |
该用户总共申请到的内存(历史累计值) |
memory_global_total视图
total_allocated |
Server总共分配出去的内存大小 |
memory_by_thread_by_current_bytes视图
thread_id |
MySQL内部线程ID,可以和session视图中的thd_id关联 |
user |
当前线程是哪个用户创建 |
current_count_used |
当前线程正在使用且未释放的内存块(内存块不是固定大小的) |
current_allocated |
当前线程正在使用且未释放的内存块大小(字节) |
current_avg_alloc |
当前线程每个内存块平均分配内存大小(字节) |
current_max_alloc |
当前线程单次曾经分配的最多内存大小(字节) |
total_allocated |
当前线程总共分配的内存大小 |
statement_analysis视图
query |
格式化后的SQL(将SQL中的参数替换成?) |
db |
在哪个DB中执行,如果为NULL表示在任何DB |
full_scan |
是否使用了全表扫描 |
exec_count |
该SQL被执行的总次数 |
err_count |
发生错误的次数 |
warn_count |
发生警告的次数 |
total_latency |
总共发生延迟的时间 |
max_latency |
最大延迟的时间 |
avg_latency |
平均延迟的时间 |
lock_latency |
因锁等待占用的总时间 |
rows_sent |
执行该SQL返回的总行数 |
rows_sent_avg |
执行该SQL平均返回的行数 |
rows_examined |
执行该SQL扫描的总行数 |
rows_examined_avg |
执行该SQL平均每次扫描的行数 |
tmp_tables |
该SQL生成内存临时表的总次数 |
tmp_disk_tables |
该SQL生成磁盘文件临时表的总次数 |
rows_sorted |
该SQL总共排序的行数 |
sort_merge_passes |
用于排序中合并的总次数 |
digest |
该语句的HASH值 |
first_seen |
该SQL最早出现的时间 |
last_seen |
该SQL最近出现的时间 |
processlist视图
thd_id |
内部线程ID |
conn_id |
连接的ID(对应show processlist中的"Id"列) |
user |
该线程创建的用户名 |
db |
连接的DB,如果是NULL表示后台线程 |
command |
Client发起命令的类型提示 |
state |
命令的状态 |
time |
基于上面state停留的时间 |
current_statement |
该线程执行的语句 |
statement_latency |
语句运行总共占用时间 |
progress |
该语句运行完成的百分比 |
lock_latency |
该语句用于锁等待的时间 |
rows_examined |
该语句扫描的行数 |
rows_send |
该语句返回的行数 |
rows_affected |
该语句影响到的行数(写入语句) |
tmp_tables |
形成内存临时表的次数 |
tmp_disk_tables |
形成磁盘临时表的次数 |
full_scan |
全表描扫的次数 |
last_statement |
上一条被执行的SQL |
last_statement_latency |
上一条被执行的SQL时延 |
current_memory |
当前线程占用的内存 |
last_wait |
上一次等待事件 |
last_wait_latency |
上一次等待时间时延 |
source |
上一次等待事件对应的源码位置 |
trx_latency |
事务时延 |
trx_state |
当前事务状态 |
pid |
对应到系统里的pid |
program_name |
连接进来的标识名 |
session视图
session视图和processlist视图基本一样,只是把后台线程过滤掉。
innodb_buffer_stats_by_schema视图
object_schema |
schema名 |
allocated |
该schema上分配的buffer pool大小(字节) |
data |
该schema中缓存的数据大小(字节) |
pages |
该schema中缓存的data page数 |
pages_hashed |
该schema中分配了多少hashed page |
pages_old |
该schema中的old page数量 |
rows_cached |
该schema中缓存的row data数量 |
innodb_buffer_stats_by_table视图
和innodb_buffer_stats_by_schema基本一致,只是比上面那个视图多了一个ojbect_name用于指定表名。
3、sys schema运用
上面把几个基础的视图都介绍完了,接下来就可以回答上篇提出的那些问题了。
哪个用户或者来自哪个IP的客户端使用了最多的资源
查看每个客户端IP过来的连接消耗了多少资源:
查看某个数据文件上发生了多少IO请求:
查看哪个用户消耗了多少资源:
查看总共分配了多少内存:
数据库连接来自哪里,以及这些连接对数据库的请求情况是怎样的
查看当前连接情况:
select host, current_connections, statements from host_summary;
查看当前正在执行的SQL:
select conn_id, user, current_statement, last_statement from session;
和执行show full processlist的效果相当。
数据库中哪些SQL被频繁执行
执行下面命令查询TOP 10最热SQL:
select db,exec_count,query from statement_analysis order by exec_count desc limit 10;
哪个文件产生了最多的IO,读多,还是写的多
select * from io_global_by_file_by_bytes limit 10;
哪个表上的IO请求最多
select * from io_global_by_file_by_bytes where file like '%ibd' order by total desc limit 10;
哪个表被访问的最多
先访问statement_analysis,根据热门SQL排序找到相应的数据表。
哪些语句延迟比较严重
查看 statement_analysis 中 avg_latency的最高的SQL:
select * from statement_analysis order by avg_latency desc limit 10;
哪些SQL语句使用了临时表,又有哪些用到了磁盘临时表
查看 statement_analysis 中哪个SQL的 tmp_tables 、tmp_disk_tables 值大于0即可:
select db, query, tmp_tables, tmp_disk_tables from statement_analysis where tmp_tables>0 or tmp_disk_tables >0 order by (tmp_tables+tmp_disk_tables) desc limit 20;
哪个表占用了最多的buffer pool
select * from innodb_buffer_stats_by_table order by allocated desc limit 10;
每个库(database)占用多少buffer pool
select * from innodb_buffer_stats_by_schema order by allocated desc limit 10;
每个连接分配多少内存
利用session表和memory_by_thread_by_current_bytes分配表进行关联查询:
select b.user, current_count_used, current_allocated, current_avg_alloc, current_max_alloc, total_allocated,current_statement from memory_by_thread_by_current_bytes a, session b where a.thread_id = b.thd_id;
MySQL内部有多个线程在运行
MySQL内部的线程类型及数量:
select user, count(*) from processlist group by user;
写到这里,其实我们只涉及到 sys schema 很少的一部分功能。估计MySQL的官方AWR也要快出现了,大家也可以期待一下(MySQL 8.0这块又进一步规范了一下)
MySQL 5.7系列之sys schema(1)
阅读原文
MySQL 5.7系列之sys schema(2)相关推荐
- MySQL 5.7 SYS SCHEMA
MySQL 5.7 SYS SCHEMA 官方地址:https://dev.mysql.com/doc/refman/5.7/en/sys-schema.html 1.performance sch ...
- mysql.sys_MySQL sys Schema
MySQL sys Schema MySQL 5.7.7及更高版本包括sys schema,这是一组帮助DBA和开发人员解释Performance schema收集的数据的对象. sys schema ...
- 【MySQL】MySQL 5.7 sys Schema
[MySQL]MySQL 5.7 sys Schema sys库说明:http://dev.mysql.com/doc/refman/5.7/en/sys-schema-usage.html sys库 ...
- oracle查询基表阻塞,在Oracle专家眼中,MySQL sys Schema是怎样一种存在?
sys Schema的初衷 MySQL的数据字典经历了几个阶段的演进,MySQL4.1 提供了information_schema 数据字典,一些基础元数据可以通过SQL来查询得到. MySQL5.5 ...
- MySQL性能分析工具的使用:慢查询日志、EXPLAN的使用、分析优化器执行计划:trace、MySQL监控分析视图-sys schema
文章目录 1.数据库服务器的优化步骤 2.查看系统性能参数 2.1 语法 2.2 常用参数 3.统计SQL的查询成本:last_query_cost 4.定位执行慢的SQL:慢查询日志 4.1 慢查询 ...
- mysql 5.7 sys schema_案例详细说明MySQL5.7中 performance与sys schema中的监控参数
软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...
- Mysql高级部分系列(二)
1.索引的数据结构 1.1.索引概述 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构. 索引的本质: 索引是数据结构.简单理解为"排好序的快速查找数据 ...
- mysql5.7 sql监控_MySQL5.7中 performance和sys schema中的监控参数解释
MySQL5.7中的mysql performance和sys 监控参数 1.performance schema:介绍 在MySQL5.7中,performance schema有很大改进,包括引 ...
- Mysql源代码分析系列
Mysql源代码分析系列(2): 源代码结构 Mysql源代码主要包括客户端程序代码,服务器端代码,测试工具和一些库构成,下面我们对比较重要的目录做些介绍. BUILD 这个目录在本系列的上篇文章中我 ...
最新文章
- Opencv java 二值化函数threshold (10)
- 命名分组(?name....)
- ActiveMQ添加商品发送消息
- Linux / Server 端收到 SIGPIPE 信号的原因
- java 重复提交_java解决重复提交表单
- 仿OpenStack开发云计算管理软件”--熟悉开发环境
- Python中菱形继承的MRO顺序及property属性
- ubuntu 安装 OpenCV-CUDA
- python画建筑分析图_教你用GH绘制酷炫的流线分析图
- 使用sqlldr导入文本数据到oracle
- jupyter notebook 使用pip安装库,解决报错:zsh:1: command not found: pip
- 22 File Links: Hard and Symbolic
- 最新“母马”病毒反杀主流杀毒软件
- Java中在时间戳计算的过程中遇到的数据溢出问题
- java 有三个map,第一个map是第二个和第三个map的key的对应映射,对比第二个map的值和第三个map对的值是否一致
- java将数组加上千分号_PHP实现对数字分隔加千分号的方法
- 学习微积分60年有感(I)
- VlanIF和Vlan间路由
- springcloud视频教程免费下载
- 大脑的未来将走向何方?《大脑全书》告诉你答案
热门文章
- APPLE笔记本电脑软件测试,Apple Mac 实验室
- html载入图片代码,TextVeiw加载HTML代码块内图片
- linux 多核线程 调度,通过轻型线程提高多核设备中的Linux实时性能
- shell 不等于_Shell 布尔运算符与逻辑运算符
- html登录界面设计代码_最简洁实现Github登录的JS代码示例
- linux如何安装交叉工具链,Linux:制作mipsel 交叉工具链 (更新版)
- java mybits架构图_java架构之路-(mybatis源码)mybatis执行流程源码解析
- nginx php 协同工作,nginx和php之间工作原理
- vue页面跳转数据传递
- cp和scp复制命令