前阵子,我们的"全方位认识performance_schema"系列为大家完整的介绍了performance_schema系统库。在我们的发布计划中为什么要把performance_schema放在最前面呢?其中一个原因就是因为它是sys 系统库的数据来源,今天开始,我们将为大家逐步推出“全方位认识 sys 系统库”系列文章,下面我们将为大家带来系列第一篇《初相识|全方位认识 sys 系统库》,请跟随我们一起开始 sys 系统库的系统学习之旅吧~

PS:本系列基于MySQL 5.7.18 版本整理

|  初识sys系统库

1. sys系统库使用基础环境

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

1)sys系统库支持MySQL 5.6或更高版本,5.5.x及其以下版本不支持;

2)因为sys系统库提供了一些代替直接访问performance_schema的视图,所以必须启用performance_schema(performance_schema系统参数设置为ON)之后sys系统库的大部分功能才能正常使用;

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),要了解某存储过程具体做了什么事情可能通过show create procedure procedure_name;语句查看

您可以使用sys系统库本身来启用所有需要的instruments和consumers:

* 启用所有wait instruments:CALLsys.ps_setup_enable_instrument('wait');

* 启用所有stage instruments:CALLsys.ps_setup_enable_instrument('stage');

* 启用所有statement instruments:CALLsys.ps_setup_enable_instrument('statement');

* 启用所有事件类型的current表:CALLsys.ps_setup_enable_consumer('current');

* 启用所有事件类型的history_long表:CALLsys.ps_setup_enable_consumer('history_long');

* 注意:performance_schema的默认配置就可以满足sys系统库的大部分数据收集功能。启用上述所提及的所有instruments和consumers会对性能产生一定影响,因此最好仅启用所需的配置。如果你在启用了一些默认配置之外的配置,则可以使用存储过程:CALLsys.ps_setup_reset_to_default(TRUE); 来快速恢复到performance_schema的默认配置

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

2. sys系统库初体验

当你使用了use语句切换默认数据库,那么就可以直接使用sys系统库下的视图名称进行查询,就像查询某个库下的表一样操作,如下:

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

也可以使用db_name.view_name、db_name.procedure_name、db_name.func_name等方式在不指定默认数据库的情况下访问sys 系统库中的对象(这叫做名称限定对象引用),如下:

mysql> SELECT * FROM sys.version;+ ------------- + ----------------- +| sys_version | mysql_version |+ ------------- + ----------------- +| 1.5.0 | 5.7.9-debug-log |+ ------------- + ----------------- +

PS:下文中的示例中,对于sys 系统库的访问都是假定指定了默认数据库为sys 系统库。

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

# x$host_summary_by_file_io视图汇总数据,显示未格式化的皮秒单位延迟时间,没有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库查询。例如,要查看session视图和format_bytes()函数的定义,可以使用如下语句:

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.sqlmysqlpump sys> sys_dump.sql

如果要重新导入sys 系统库,可以使用如下命令:

mysql sys_dump.sql

3. sys 系统库的进度报告功能

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

processlistsessionx$processlistx$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表,so,需要打开相应的instruments和consumers,否则谁没打开谁对应的信息字段列就为NULL,对于trx_state字段为ACTIVE的线程,progress可以输出百分比进度信息(只有支持进度的事件才会被统计并打印进来)

查询示例

# 查看当前正在执行的语句进度信息admin@localhost : sys 06:57:21> select * from session where conn_id!=connection_id() and trx_state='ACTIVE'\G;*************************** 1. row ***************************            thd_id: 47          conn_id: 5              user: admin@localhost                db: sbtest          command: Query            state: alter table (merge sort)              time: 29current_statement: alter table sbtest1 add index i_c(c)statement_latency: 29.34 s          progress: 49.70      lock_latency: 4.34 ms    rows_examined: 0        rows_sent: 0    rows_affected: 0        tmp_tables: 0  tmp_disk_tables: 0        full_scan: NO    last_statement: NULLlast_statement_latency: NULL    current_memory: 4.52 KiB        last_wait: wait/io/file/innodb/innodb_temp_filelast_wait_latency: 369.52 us            source: os0file.ic:470      trx_latency: 29.45 s        trx_state: ACTIVE    trx_autocommit: YES              pid: 4667      program_name: mysql1 row in set (0.12 sec)# 查看已经执行完的语句相关统计信息admin@localhost : sys 07:02:21> select * from session where conn_id!=connection_id() and trx_state='COMMITTED'\G;*************************** 1. row ***************************            thd_id: 47          conn_id: 5              user: admin@localhost                db: sbtest          command: Sleep            state: NULL              time: 372current_statement: NULLstatement_latency: NULL          progress: NULL      lock_latency: 4.34 ms    rows_examined: 0        rows_sent: 0    rows_affected: 0        tmp_tables: 0  tmp_disk_tables: 0        full_scan: NO    last_statement: alter table sbtest1 add index i_c(c)last_statement_latency: 1.61 m    current_memory: 4.52 KiB        last_wait: idlelast_wait_latency: Still Waiting            source: socket_connection.cc:69      trx_latency: 1.61 m        trx_state: COMMITTED    trx_autocommit: YES              pid: 4667      program_name: mysql1 row in set (0.12 sec)

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

stage/sql/Copying to tmp tablestage/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

对于不支持进度的stage 事件,或者未启用所需的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 系统库"系列文章分享,你就可以系统地学完它。谢谢你的阅读,我们下期不见不散!

| 作者简介

罗小波·数据库技术专家

《千金良方——MySQL性能优化金字塔法则》、《数据生态:MySQL复制技术与生产实践》作者之一。熟悉MySQL体系结构,擅长数据库的整体调优,喜好专研开源技术,并热衷于开源技术的推广,在线上线下做过多次公开的数据库专题分享,发表过近100篇数据库相关的研究文章。

全文完。

Enjoy MySQL :)

叶老师的「MySQL核心优化」大课已升级到MySQL 8.0,扫码开启MySQL 8.0修行之旅吧

mysqldump单个库导出_初相识 | 全方位认识 sys 系统库相关推荐

  1. 初相识 | 全方位认识 sys 系统库

    前阵子,我们的"全方位认识performance_schema"系列为大家完整的介绍了performance_schema系统库.在我们的发布计划中为什么要把performance ...

  2. mysqldump单个库导出_mysql mysqldump只导出表结构或只导出数据的实现方法

    mysql mysqldump 只导出表结构 不导出数据 代码如下: mysqldump --opt -d 数据库名 -u root -p > xxx.sql 备份数据库 代码如下: #mysq ...

  3. 等待事件统计视图 | 全方位认识 sys 系统库

    在上一篇<内存分配统计视图 | 全方位认识 sys 系统库>中,我们介绍了sys 系统库如何查询内存事件统计信息和buffer pool统计信息,本期的内容先给大家介绍按照等待事件统计相关 ...

  4. mysql dump 导入导出_使用mysqldump导入导出数据

    DRDS支持MySQL官方数据导出工具mysqldump.本文围绕DRDS数据导入导出的几种常见场景对操作步骤和注意事项进行说明.mysqldump命令的详细说明请参见MySQL官方文档. mysql ...

  5. 数据可视化系列(一):Matplotlib初相识

    前言 期待了好久的datawhale可视化教程终于出来了,这次标题狠有文艺范儿,哈哈哈 这次我主要目的是最近要写篇论文,也正好为以后建模画图打捞基础~ 大家可以多看看官方教程: 中文官方网站:http ...

  6. mysql 默认当前时间_复制信息记录表|全方位认识 mysql 系统库

    在上一期<时区信息记录表|全方位认识 mysql 系统库>中,我们详细介绍了mysql系统库中的时区信息记录表,本期我们将为大家带来系列第七篇<复制信息记录表|全方位认识 mysql ...

  7. mysql 单表字段多少合适_复制信息记录表|全方位认识 mysql 系统库

    在上一期<时区信息记录表|全方位认识 mysql 系统库>中,我们详细介绍了mysql系统库中的时区信息记录表,本期我们将为大家带来系列第七篇<复制信息记录表|全方位认识 mysql ...

  8. mysqldump导出数据库视图_mysql中如何用mysqldump批量如何导出视图view啊?

    你的位置: 问答吧 -> MySQL -> 问题详情 mysql中如何用mysqldump批量如何导出视图view啊? mysql中如何用mysqldump批量如何导出视图view啊? 我 ...

  9. 最简单的基于FFmpeg的移动端例子:Android 视频解码器-单个库版

    ===================================================== 最简单的基于FFmpeg的移动端例子系列文章列表: 最简单的基于FFmpeg的移动端例子:A ...

最新文章

  1. 当OpenCV遇到VS2019时,以前的配置方式翻车了….
  2. html5中的新标签
  3. 【工具】更新云文档办公利器汇总,腾讯文档测试文件上传,云文档对比测试报告...
  4. java和php混合_PHP和Java强强联合 集成开发详解
  5. c++ 13.二维数组
  6. 阿里最后一面,高并发下如何设计一个秒杀系统?
  7. 【Linux】Linux中变量#,@,0,1,2,*,$$,$?的解释
  8. golang延时_Golang 定时器底层实现深度剖析
  9. 快速掌握 深度学习(Deep Learning) 常用概念术语,常用模型
  10. Star-shaped polygon
  11. springAOP学习笔记
  12. FlexiGrid使用教程
  13. java2实用教程第五版耿祥义电子版_Java2实用教程(第5版)答案 耿祥义、张跃平
  14. JavaScript 文件下载,二进制下载,文本下载的几种方式
  15. 安装 Tableau Desktop 时出现“0x80070109”错误以及Tableau Desktop破解
  16. 女人总浑身都没有力气怎么回事儿
  17. phpstudy的php fpm,浅谈PHP-FPM参数
  18. macd底背离的python_python量化交易是否可以有策略有效识别MACD/SKDJ底背离和顶背离?...
  19. 二维码在线生成接口API
  20. android电话录音没有声音,Android通话录音未录制来电语音(示例代码)

热门文章

  1. 腾讯绝悟AI完全体限时开放体验,研究登上国际顶会与顶刊
  2. 我在 MySQL 的那些年
  3. TDSQL在巴黎ICDE上设立展台,掌声送给它!
  4. SRS流媒体服务器搭建+ffmpeg推流VLC取流观看
  5. H.264视频RTP负载格式/NALU的类型
  6. go context的使用总结
  7. 每日两SQL(10),欢迎交流~
  8. -bash: xxx: command not found
  9. leetcode 139. Word Break | 139. 单词拆分(动态规划)
  10. leetcode 557. 反转字符串中的单词 III(Java版)