系列文章参考自《MySQL 性能优化金字塔法则》,删除了书里重复说明和过于复杂的一些解释,完整版请参考原书。

前面一系列笔记介绍了performance_schema系统库,把它放在最前面其中一个原因就是因为它是sys系统库的数据来源。本系列基于MySQL 5.7.18 版本整理

一、 sys系统库使用前提

使用sys系统库前,需要确保数据库环境满足如下条件:

1)MySQL 5.6或更高版本

2)启用performance_schema(performance_schema=on)

3)要完全访问sys系统库,用户必须具有以下权限:

  • 对所有sys表和视图具有SELECT权限
  • 对所有sys存储过程和函数具有EXECUTE权限
  • 对sys_config表具有INSERT、UPDATE权限
  • 对某些特定的sys系统库存储过程和函数需要额外权限,如,ps_setup_save()存储过程,需要临时表相关的权限

4)要有与被sys系统库执行访问的对象相关的权限

  • 任何被sys系统库访问的performance_schema表需要有SELECT权限;要使用sys系统库对performance_schema相关表执行更新,则需要performance_schema相关表的UPDATE权限
  • INFORMATION_SCHEMA.INNODB_BUFFER_PAGE表的PROCESS权限

5)要充分使用sys系统库的功能,必须启用某些performance_schema的instruments和consumers:

  • 所有wait instruments
  • 所有stage instruments
  • 所有statement instruments
  • 对于所启用的类型事件的instruments,还需要启用对应类型的consumers(xxx_current和xxx_history_long)

可以使用sys系统库来启用所有需要的instruments和consumers(存储过程具体内容可通过 show create procedure procedure_name; 语句查看):

  • 启用所有wait instruments:CALL sys.ps_setup_enable_instrument('wait');
  • 启用所有stage instruments:CALL sys.ps_setup_enable_instrument('stage');
  • 启用所有statement instruments:CALL sys.ps_setup_enable_instrument('statement');
  • 启用所有事件类型的current表:CALL sys.ps_setup_enable_consumer('current');
  • 启用所有事件类型的history_long表:CALL sys.ps_setup_enable_consumer('history_long');

注意:

performance_schema的默认配置就可以满足sys系统库的大部分数据收集功能。启用上述所提及的所有instruments和consumers会对性能产生一定影响,最好仅启用所需的配置。可以使用 CALL sys.ps_setup_reset_to_default(TRUE); 快速恢复到performance_schema的默认配置。

对于以上繁杂的权限要求,通常创建一个具有管理员权限的账号即可,当然如果你有明确的需求,那另当别论,但sys系统库通常都是提供给DBA排查一些特定问题使用的,其下所涉及的各项查询或多或少都会对性能有一定影响(主要体现在performance_schema功能实现的性能开销),在不明需求的情况下,不建议开放这些功能来作为常规的监控手段使用。

二、 sys系统库初体验

可以切换到sys系统库下直接查询视图,就像查询某个库下的表一样,如下:

# version视图可以查看sys 系统库和mysql server的版本号
mysql> USE sys;
mysql> SELECT * FROM version;
+ ------------- + ----------------- +
| sys_version | mysql_version |
+ ------------- + ----------------- +
| 1.5.0 | 5.7.9-debug-log |
+ ------------- + ----------------- +

sys 系统库下包含许多视图,以各种方式对performance_schema表进行聚合计算展示。其中大部分是成对出现,两个视图名称相同,但有一个视图带'x$'字符前缀,例如:host_summary_by_file_io和x$host_summary_by_file_io,代表按照主机进行汇总统计的文件I/O性能数据,两个视图访问数据源是相同的,但是创建视图的语句中,不带x$的视图是把相关数值数据经过单位换算再显示的,带x$前缀的视图显示的是原始的数据(皮秒)。

# 输出信息经过单位换算,可读性更高
mysql> SELECT * FROM host_summary_by_file_io;
+------------+-------+------------+
| host      | ios  | io_latency |
+------------+-------+------------+
| localhost  | 67570 | 5.38 s    |
| background |  3468 | 4.18 s    |
+------------+-------+------------+# 带x$的视图显示原始的皮秒单位数值,对于程序或工具获取使用更易于数据处理
mysql> SELECT * FROM x$host_summary_by_file_io;
+------------+-------+---------------+
| host      | ios  | io_latency    |
+------------+-------+---------------+
| localhost  | 67574 | 5380678125144 |
| background |  3474 | 4758696829416 |
+------------+-------+---------------+

要查看sys 系统库对象定义语句,可以使用适当的SHOW语句或INFORMATION_SCHEMA库查询。

mysql> SHOW CREATE VIEW session;
mysql> SHOW CREATE FUNCTION format_bytes;

要查看更易读的格式对象定义语句,可以访问sys 系统库开发网站https://github.com/mysql/mysql-sys上的各个.sql文件,或者使用mysqldump与mysqlpump工具导出sys库,默认情况下,mysqldump和mysqlpump都不会导出sys 系统库。要生成包含sys 系统库的导出文件,可以使用如下命令显式指定sys 系统库。虽然可以导出视图定义,但是与原始的定义语句相比仍然缺失了相当一部分内容,只是可读性比直接show create view要好一些:

mysqldump --databases --routines sys> sys_dump.sql
mysqlpump sys> sys_dump.sql
# 如果要重新导入sys 系统库,可以使用如下命令:
mysql < sys_dump.sql

三、 事务进度报告功能

从MySQL 5.7.9开始,sys 系统库视图提供长时间运行的事务的进度报告,通过processlist和session以及x$前缀的视图进行查看,其中processlist包含了后台和前台线程当前的事件信息,session不包含后台线程和command为Daemon的线程,如下:

processlist
session
x$processlist
x$session

session视图直接调用processlist视图过滤了后台线程和command为Daemon的线程。

processlist线程联结查询了threads、events_waits_current、events_stages_current、events_statements_current、events_transactions_current、sys.x$memory_by_thread_by_current_bytes、session_connect_attrs表,因此需要打开相应的instruments和consumers,否则谁没打开谁对应的信息字段列就为NULL,对于trx_state字段为ACTIVE的线程,progress可以输出百分比进度信息,但只有支持进度的事件才会被统计并打印。

-- 查看当前正在执行的语句进度信息
select * from session where conn_id!=connection_id() and trx_state='ACTIVE'\G;*************************** 1. row ***************************thd_id: 47conn_id: 5user: admin@localhostdb: sbtestcommand: Querystate: alter table (merge sort)time: 29
current_statement: alter table sbtest1 add index i_c(c)
statement_latency: 29.34 sprogress: 49.70  ------ 进度lock_latency: 4.34 msrows_examined: 0rows_sent: 0rows_affected: 0tmp_tables: 0tmp_disk_tables: 0full_scan: NOlast_statement: NULL
last_statement_latency: NULLcurrent_memory: 4.52 KiBlast_wait: wait/io/file/innodb/innodb_temp_file
last_wait_latency: 369.52 ussource: os0file.ic:470trx_latency: 29.45 strx_state: ACTIVEtrx_autocommit: YESpid: 4667program_name: mysql
1 row in set (0.12 sec)-- 查看已经执行完的语句相关统计信息
select * from session where conn_id!=connection_id() and trx_state='COMMITTED'\G;*************************** 1. row ***************************thd_id: 47conn_id: 5user: admin@localhostdb: sbtestcommand: Sleepstate: NULLtime: 372
current_statement: NULL
statement_latency: NULLprogress: NULL ------ 已执行完、未启用、不支持进度显示的为nulllock_latency: 4.34 msrows_examined: 0rows_sent: 0rows_affected: 0tmp_tables: 0tmp_disk_tables: 0full_scan: NOlast_statement: alter table sbtest1 add index i_c(c)
last_statement_latency: 1.61 mcurrent_memory: 4.52 KiBlast_wait: idle
last_wait_latency: Still Waitingsource: socket_connection.cc:69trx_latency: 1.61 mtrx_state: COMMITTEDtrx_autocommit: YESpid: 4667program_name: mysql
1 row in set (0.12 sec)

对于stage事件进度报告要求必须启用events_stages_current consumers,启用需要查看进度相关的instruments。例如:

stage/sql/Copying to tmp table
stage/innodb/alter table (end)
stage/innodb/alter table (flush)
stage/innodb/alter table (insert)
stage/innodb/alter table (log apply index)
stage/innodb/alter table (log apply table)
stage/innodb/alter table (merge sort)
stage/innodb/alter table (read PK and internal sort)
stage/innodb/buffer pool load

对于不支持进度或未启用所需的instruments或consumers的stage事件,对应的进度信息列显示为NULL。

更多内容参考

https://dev.mysql.com/doc/refman/5.7/en/sys-schema-progress-reporting.html

https://dev.mysql.com/doc/refman/5.7/en/sys-schema-prerequisites.html

https://dev.mysql.com/doc/refman/5.7/en/sys-schema-usage.html

sys 系统库 笔记(一)—— 简介与快速入门相关推荐

  1. Filter和Listener-学习笔记01【Filter 快速入门】

    Java后端 学习路线 笔记汇总表[黑马程序员] Filter和Listener-学习笔记01[Filter快速入门] Filter和Listener-学习笔记02[Filter细节] Filter和 ...

  2. Cookie和Session-学习笔记03【Session快速入门、Session细节】

    Java后端 学习路线 笔记汇总表[黑马程序员] Cookie和Session-学习笔记01[Cookie_快速入门.Cookie_细节] Cookie和Session-学习笔记02[Cookie案例 ...

  3. Cookie和Session-学习笔记01【Cookie_快速入门、Cookie_细节】

    Java后端 学习路线 笔记汇总表[黑马程序员] Cookie和Session-学习笔记01[Cookie_快速入门.Cookie_细节] Cookie和Session-学习笔记02[Cookie案例 ...

  4. Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】

    Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...

  5. JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  6. 图数据库HugeGraph简介与快速入门

    图数据库HugeGraph简介与快速入门 作者:胡佳辉(家辉),日期:2019年2月10日 CSDN博客:https://blog.csdn.net/gobitan 1. HugeGraph简介 1. ...

  7. Python学习笔记--10.Django框架快速入门之后台管理admin(书籍管理系统)

    Python学习笔记--10.Django框架快速入门之后台管理 一.Django框架介绍 二.创建第一个Django项目 三.应用的创建和使用 四.项目的数据库模型 ORM对象关系映射 sqlite ...

  8. Redis学习笔记①基础篇_Redis快速入门

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...

  9. UE4学习笔记1st:编程快速入门

    UE4学习笔记1st:编程快速入门 今天我开始学习虚幻4游戏引擎,为了此我专门买了新的电脑,我将主要配置写在这里,有想学习的同学可以参考 显卡:丽台K620 CPU:E3-1230-V3 主板:b85 ...

最新文章

  1. 【动态规划】最长公共子序列与最长公共子串
  2. javaweb学习总结(四十)——编写自己的JDBC框架
  3. 各个大学的录取通知书,哪个颜值最高?
  4. c# 联合halcon 基于相关性 模板匹配_机器视觉之halcon入门(5)-字符识别exe生成...
  5. 验证登陆信息的合法性
  6. java集合性能测试,关于Map和List的性能测试
  7. Qt4_实现其他菜单
  8. 微软商店打不开,错误代码0x80131500
  9. PAT乙级真题 1092 最好吃的月饼 C++实现
  10. 优雅的落地个人所得税的计算
  11. 医疗项目业务以及表设计介绍
  12. Android生态系统进化论
  13. Java高级篇-----jdk1.8新特性
  14. 微众银行区块链李辉忠:多方大数据隐私计算平台为数据隐私加“安全锁”
  15. Vagrant 下载太慢解决方法(本地安装box文件)
  16. S32K144 串口通信
  17. onedrive的使用
  18. 关于DFS的一些拙劣的理解
  19. Using Hierarchy Viewer
  20. 移动咪咕盒子红外遥控驱动

热门文章

  1. 什么是持续集成的自动化测试
  2. Spring Cloud H SR5集成 Jaeger
  3. 工业产品类计算机绘图师,全国计算机绘图师考试试题汇总.pdf
  4. [附源码]Node.js计算机毕业设计高校智慧党建党务管理系统Express
  5. Windows程序crash该怎么分析?
  6. 从Spring源码探究DI属性注入流程
  7. python filter和map的区别_js中filter和map的区别
  8. 谈谈老衲对闭包的理解!!综合了我在网上看的资料,把我的理解跟大家分享
  9. 【云原生之Docker实战】使用docker部署Monica个人开源CRM系统
  10. [HARDWARE] ddr、ddr2、ddr3的区别