前阵子,我们的"全方位认识performance_schema"系列为大家完整的介绍了performance_schema系统库。在我们的发布计划中为什么要把performance_schema放在最前面呢?其中一个原因就是因为它是sys 系统库的数据来源,今天开始,我们将为大家逐步推出“全方位认识 sys 系统库”系列文章,下面我们将为大家带来系列第一篇《初相识|全方位认识 sys 系统库》,请跟随我们一起开始 sys 系统库的系统学习之旅吧~
PS:本系列基于MySQL 5.7.18 版本整理
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系统库下的视图名称进行查询,就像查询某个库下的表一样操作,如下:
也可以使用db_name.view_name、db_name.procedure_name、db_name.func_name等方式在不指定默认数据库的情况下访问sys 系统库中的对象(这叫做名称限定对象引用),如下:
PS:下文中的示例中,对于sys 系统库的访问都是假定指定了默认数据库为sys 系统库。
sys 系统库下包含许多视图,它们以各种方式对performance_schema表进行聚合计算展示。这些视图中大部分都是成对出现,两个视图名称相同,但有一个视图是带'x$'字符前缀的,例如:host_summary_by_file_io和x$host_summary_by_file_io,代表按照主机进行汇总统计的文件I/O性能数据,两个视图访问数据源是相同的,但是创建视图的语句中,不带x$的视图是把相关数值数据经过单位换算再显示的(显示为毫秒、秒、分钟、小时、天等),带x$前缀的视图显示的是原始的数据(皮秒),如下:
要查看sys 系统库对象定义语句,可以使用适当的SHOW语句或INFORMATION_SCHEMA库查询。例如,要查看session视图和format_bytes()函数的定义,可以使用如下语句:
然而,这些语句文本是经过格式化的,可读性比较差。要查看更易读的格式对象定义语句,可以访问sys 系统库开发网站上的各个.sql文件,或者使用mysqldump与mysqlpump工具导出sys库,默认情况下,mysqldump和mysqlpump都不会导出sys 系统库。要生成包含sys 系统库的导出文件,可以使用如下命令显式指定sys 系统库(虽然可以导出视图定义,但是与原始的定义语句相比仍然缺失了相当一部分内容,只是可读性比直接show create view要好一些):
如果要重新导入sys 系统库,可以使用如下命令:
3. sys 系统库的进度报告功能
从MySQL 5.7.9开始,sys 系统库视图提供查看长时间运行的事务的进度报告,通过processlist和session以及x$前缀的视图进行查看,其中processlist包含了后台线程和前台线程当前的事件信息,session不包含后台线程和command为Daemon的线程,如下:
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可以输出百分比进度信息(只有支持进度的事件才会被统计并打印进来)
查询示例
对于stage事件进度报告要求必须启用events_stages_current consumers,启用需要查看进度相关的instruments。例如:
对于不支持进度的stage 事件,或者未启用所需的instruments或consumers的stage事件,则对应的进度信息列显示为NULL。
本期内容就介绍到这里,本期内容参考链接如下:
================================================================================================================
================================================================================================================
1.表
CREATE TABLE `sys_config` (
`variable` varchar(128) NOT NULL,
`value` varchar(128) DEFAULT NULL,
`set_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`set_by` varchar(128) DEFAULT NULL,
PRIMARY KEY (`variable`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
|
variable 配置选项名称
variable
|
value
|
set_time
|
set_by
|
diagnostics.allow_i_s_tables
|
OFF
|
2015-11-20 16:04:38
|
root@localhost
|
diagnostics.include_raw
|
OFF
|
2015-11-20 16:04:38
|
root@localhost
|
statement_performance_analyzer.limit
|
100
|
2015-11-20 16:04:38
|
root@localhost
|
statement_performance_analyzer.view
|
|
2015-11-20 16:04:38
|
root@localhost
|
statement_truncate_len
|
64
|
2016-01-22 17:00:16
|
root@localhost
|
"翻过这座山,你就可以看到一片海!"。坚持阅读我们的"全方位认识 sys 系统库"系列文章分享,你就可以系统地学完它。 谢谢你的阅读,我们下期不见不散!