-
2022-04-02 18:47:50
mysql information_schema 信息相关 performance_schema 性能相关 库
MySQL中information_schema是什么
information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。information_schema数据库表说明:
-
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
-
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
-
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
-
STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
-
USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
-
SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
-
TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
-
COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
-
CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
-
COLLATIONS表:提供了关于各字符集的对照信息。
-
COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOW COLLATION的前两个显示字段。
-
TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
-
KEY_COLUMN_USAGE表:描述了具有约束的键列。
-
ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
-
VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
-
TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表
performance_schema实践操作
基本了解了表的相关信息之后,可以通过这些表进行实际的查询操作来进行实际的分析
- 1、哪类的SQL执行最多?
SELECT DIGEST_TEXT,COUNT_STAR,FIRST_SEEN,LAST_SEEN FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC - 2、哪类SQL的平均响应时间最多?
SELECT DIGEST_TEXT,AVG_TIMER_WAIT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC - 3、哪类SQL排序记录数最多?
SELECT DIGEST_TEXT,SUM_SORT_ROWS FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC - 4、哪类SQL扫描记录数最多?
SELECT DIGEST_TEXT,SUM_ROWS_EXAMINED FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC - 5、哪类SQL使用临时表最多?
SELECT DIGEST_TEXT,SUM_CREATED_TMP_TABLES,SUM_CREATED_TMP_DISK_TABLES FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC - 6、哪类SQL返回结果集最多?
SELECT DIGEST_TEXT,SUM_ROWS_SENT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC - 7、哪个表物理IO最多?
SELECT file_name,event_name,SUM_NUMBER_OF_BYTES_READ,SUM_NUMBER_OF_BYTES_WRITE FROM file_summary_by_instance ORDER BY SUM_NUMBER_OF_BYTES_READ + SUM_NUMBER_OF_BYTES_WRITE DESC - 8、哪个表逻辑IO最多?
SELECT object_name,COUNT_READ,COUNT_WRITE,COUNT_FETCH,SUM_TIMER_WAIT FROM table_io_waits_summary_by_table ORDER BY sum_timer_wait DESC - 9、哪个索引访问最多?
SELECT OBJECT_NAME,INDEX_NAME,COUNT_FETCH,COUNT_INSERT,COUNT_UPDATE,COUNT_DELETE FROM table_io_waits_summary_by_index_usage ORDER BY SUM_TIMER_WAIT DESC - 10、哪个索引从来没有用过?
SELECT OBJECT_SCHEMA,OBJECT_NAME,INDEX_NAME FROM table_io_waits_summary_by_index_usage WHERE INDEX_NAME IS NOT NULL AND COUNT_STAR = 0 AND OBJECT_SCHEMA <> ‘mysql’ ORDER BY OBJECT_SCHEMA,OBJECT_NAME; - 11、哪个等待事件消耗时间最多?
SELECT EVENT_NAME,COUNT_STAR,SUM_TIMER_WAIT,AVG_TIMER_WAIT FROM events_waits_summary_global_by_event_name WHERE event_name != ‘idle’ ORDER BY SUM_TIMER_WAIT DESC - 12-1、剖析某条SQL的执行情况,包括statement信息,stege信息,wait信息
SELECT EVENT_ID,sql_text FROM events_statements_history WHERE sql_text LIKE ‘%count(*)%’; - 12-2、查看每个阶段的时间消耗
SELECT event_id,EVENT_NAME,SOURCE,TIMER_END - TIMER_START FROM events_stages_history_long WHERE NESTING_EVENT_ID = 1553; - 12-3、查看每个阶段的锁等待情况
SELECT event_id,event_name,source,timer_wait,object_name,index_name,operation,nesting_event_id FROM events_waits_history_longWHERE nesting_event_id = 1553;
更多相关内容 -
-
出现错误mysql Table ‘performance_schema…解决办法
2020-12-16 09:59:43测试环境搭了一个mariadb 5.7,使用jdbc驱动 <groupId>mysql <artifactId>mysql-...Table 'performance_schema.session_variables' doesn't exist 问度娘无果,无奈升级MySQL驱动为5.1.36,解决。 据了解: -
出现错误mysql Table 'performance_schema...解决办法
2020-09-09 18:00:03主要介绍了解决出现错误mysql Table 'performance_schema.session_variables' doesn't exist的相关资料,需要的朋友可以参考下 -
漫谈MySQL四-系统数据库performance_schema详解
2022-02-08 18:24:312.performance_schema详解 2.1. 什么是performance_schema? 2.2 performance_schema 使用 2.2.1 检查当前数据库版本是否支持 2.2.2.performance_schema 表的分类 2.2.3.performance_schema 简单配置与使用 ...目录
2.2.3.performance_schema 简单配置与使用
1.系统数据库的简介
以下系统库的介绍,主要是扩展大家的知识面,因为系统库中的数据很重要, 没有对 MySQL 有全面通盘的了解,不宜去操作其下的数据,而且对系统库的管理维护是是 DBA 的职责。
MySQL 有几个系统数据库,这几个数据库包含了 MySQL 服务器运行过程中所需的一些信息以及一些运行状态信息,我们现在稍微了解一下。
performance_schema
这个数据库里主要保存 MySQL 服务器运行过程中的一些状态信息,算是对
MySQL 服务器的一个性能监控。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等等信息。
sys
这个数据库主要是通过视图的形式把 information_schema 和performance_schema 结合起来,让程序员可以更方便的了解 MySQL 服务器的一些性能信息。
information_schema
这个数据库保存着 MySQL 服务器维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引。这些信息并不是真实的用户数据,而是一些描述性信息,有时候也称之为元数据。
mysql
这个数据库核心,它存储了 MySQL 的用户账户和权限信息,一些存储过程、事件的定义信息,一些运行过程中产生的日志信息,一些帮助信息以及时区信息等。
2.performance_schema详解
2.1. 什么是performance_schema?
MySQL 的performance_schema 是运行在较低级别的用于监控MySQL Server运行过程中的资源消耗、资源等待等情况的一个功能特性,它具有以下特点。
- performance_schema 提供了一种在数据库运行时实时检查Server 内部执行情况的方法。performance_schema 数据库中的表使用 performance_schema 存储引擎。该数据库主要关注数据库运行过程中的性能相关数据。
- performance_schema 通过监视Server 的事件来实现监视其内部执行情况,“事件”就是在 Server 内部活动中所做的任何事情以及对应的时间消耗,利用这些信息来判断 Server 中的相关资源被消耗在哪里。一般来说,事件可以是函数调用、操作系统的等待、SQL 语句执行的阶段[如 SQL 语句执行过程中的 parsing(解析)或 sorting(排序)阶段]或者整个 SQL 语句的集合。采集事件可以方便地提供 Server 中的相关存储引擎对磁盘文件、表 I/O、表锁等资源的同步调用信息。
- 当前活跃事件、历史事件和事件摘要相关表中记录的信息,能提供某个事件的执行次数、使用时长,进而可用于分析与某个特定线程、特定对象(如mutex 或 file)相关联的活动。
- performance_schema 存储引擎使用 Server 源代码中的“检测点”来实现事件数据的收集。对于 performance_schema 实现机制本身的代码没有相关的单独线程来检测,这与其他功能(如复制或事件计划程序)不同。收集到的事件数据被存储在 performance_schema 数据库的表中。对于这些表可以使用 SELECT 语句查询,也可以使用 SQL 语句更新 performance_schema 数据库中的表记录(比如动态修改 performance_schema 的以“setup_”开头的配置表,但要注意,配置表的更改会立即生效,这会影响数据收集)。
- performance_schema 的表中数据不会持久化存储在磁盘中,而是保存在内存中,一旦服务器重启,这些数据就会丢失(包括配置表在内的整个performance_schema 下的所有数据)。
2.2 performance_schema 使用
过上面介绍,相信你对于什么是 performance_schema 这个问题了解得更清晰了。下面开始介绍 performance_schema 的使用。
2.2.1 检查当前数据库版本是否支持
performance_schema 被视为存储引擎,如果该引擎可用,则应该在 INFORMATION_SCHEMA.ENGINES 表或 show engines 语句的输出中可以看到它的 Support 字段值为 YES,如下所示。
当我们看到 performance_schema 对应的 Support 字段值为 YES 时,就表示当前的数据库版本是支持 performance_schema 的。但确认了数据库实例支持performance_schema 存储引擎就可以使用了吗?NO,很遗憾,performance_schema 在 MySQL 5.6 及之前的版本中默认没有启用,在 MySQL 5.7及之后的版本中才修改为默认启用。
启用performance_schema 如果要显式启用或关闭performance_schema,则需要使用参数 performance_schema=ON|OFF来设置,并在my.cnf中进行配置。 注意:该参数为 只读参数,需要在实例启动之前设置才生效
mysqld 启动之后,通过如下语句查看 performance_schema 启用是否生效(值为 ON 表示 performance_schema 已初始化成功且可以使用了;值为 OFF 表示在启用 performance_schema 时发生某些错误,可以查看错误日志进行排查)。
现在,可以通过查询 INFORMATION_SCHEMA.TABLES 表中与performance_schema 存储引擎相关的元数据,或者在 performance_schema 库下使用 show tables 语句来了解其存在哪些表。
使用 show tables 语句来查询有哪些 performance_schema 引擎表。
现在,我们知道了在当前版本中,performance_schema 库下一共有 87 个表, 那么这些表都用于存放什么数据呢?我们如何使用它们来查询数据呢?先来看看这些表是如何分类的。
2.2.2.performance_schema 表的分类
performance_schema 库下的表可以按照监视的不同维度进行分组,例如: 按照不同的数据库对象进行分组、按照不同的事件类型进行分组,或者按照事件类型分组之后,再进一步按照账号、主机、程序、线程、用户等进行细分。
下面介绍按照事件类型分组记录性能事件数据的表。
语句事件记录表:记录语句事件信息的表,包括:events_statements_current(当前语句事件表)、events_statements_history(历史语句事件表)、events_statements_history_long(长语句历史事件表)以及一些 summary 表(聚合后的摘要表)。其中,summary 表还可以根据账号(account)、主机(host)、程序(program)、线程(thread)、用户(user)和全局(global) 再进行细分。
show tables like 'events_statement%';
等待事件记录表:与语句事件记录表类似。
show tables like 'events_wait%';
阶段事件记录表:记录语句执行阶段事件的表,与语句事件记录表类似。
show tables like 'events_stage%';
事务事件记录表:记录与事务相关的事件的表,与语句事件记录表类似。
show tables like 'events_transaction%';
监视文件系统层调用的表:
show tables like '%file%';
监视内存使用的表:
show tables like '%memory%';
动态对 performance_schema 进行配置的配置表:
show tables like '%setup%';
现在,我们已经大概知道了 performance_schema 中主要表的分类,但如何使用这些表来提供性能事件数据呢?
2.2.3.performance_schema 简单配置与使用
当数据库初始化完成并启动时,并非所有的 instruments(在采集配置项的配置表中,每一项都有一个开关字段,或为 YES,或为 NO)和 consumers(与采集配置项类似,也有一个对应的事件类型保存表配置项,为 YES 表示对应的表保存性能数据,为 NO 表示对应的表不保存性能数据)都启用了,所以默认不会收集所有的事件。
可能你想检测的事件并没有打开,需要进行设置。可以使用如下两条语句打开对应的 instruments 和 consumers,我们以配置监测等待事件数据为例进行说明。
打开等待事件的采集器配置项开关,需要修改 setup_instruments 配置表中对应的采集器配置项。
update setup_instruments set enabled='yes',timed='yes' where name like 'wait%';
打开等待事件的保存表配置项开关,修改 setup_consumers 配置表中对应的配置项。
update setup_consumers set enabled='yes' where name like 'wait%';
配置好之后,我们就可以查看 Server 当前正在做什么了。可以通过查询 events_waits_current 表来得知,该表中每个线程只包含一行数据,用于显示每个线程的最新监视事件(正在做的事情)。
*_current 表中每个线程只保留一条记录,且一旦线程完成工作,该表中就不会再记录该线程的事件信息了。*_history 表中记录每个线程已经执行完成的事件信息,但每个线程的事件信息只记录 10 条,再多就会被覆盖掉。*_history_long表中记录所有线程的事件信息,但总记录数量是 10000 行,超过会被覆盖掉。
summary 表提供所有事件的汇总信息。该组中的表以不同的方式汇总事件数据(如:按用户、按主机、按线程等汇总)。
2.2.4.查看最近执行失败的 SQL 语句
使用代码对数据库的某些操作(比如:使用 Java 的 ORM 框架操作数据库) 报出语法错误,但是代码并没有记录 SQL 语句文本的功能,在 MySQL 数据库层能否查看到具体的 SQL 语句文本,看看是否哪里写错了?这个时候,大多数人首先想到的就是去查看错误日志。很遗憾,对于 SQL 语句的语法错误,错误日志并不会记录。
实际上,在 performance_schema 的语句事件记录表中针对每一条语句的执行状态都记录了较为详细的信息,例如:events_statements_表和events_statements_summary_by_digest 表(events_statements_表记录了语句所有的执行错误信息,而 events_statements_summary_by_digest 表只记录了语句在执行过程中发生错误的语句记录统计信息,不记录具体的错误类型,例如:不记录语法错误类的信息)。下面看看如何使用这两个表查询语句发生错误的语句信息。
首先,我们模拟一条语法错误的 SQL 语句,使用events_statements_history_long 表或者 events_statements_history 表查询发生语法错误的 SQL 语句:
然后,查询 events_statements_history 表中错误号为 1064 的记录
select * from events_statements_history where mysql_errno=1064\G
不知道错误号是多少,可以查询发生错误次数不为 0 的语句记录,在里边找到 SQL_TEXT 和 MESSAGE_TEXT 字段(提示信息为语法错误的就是它)。
2.2.5.查看最近的事务执行信息
我们可以通过慢查询日志查询到一条语句的执行总时长,但是如果数据库中存在着一些大事务在执行过程中回滚了,或者在执行过程中异常中止,这个时候慢查询日志就爱莫能助了,这时我们可以借助 performance_schema 的events_transactions_*表来查看与事务相关的记录,在这些表中详细记录了是否有事务被回滚、活跃(长时间未提交的事务也属于活跃事务)或已提交等信息。
首先需要进行配置启用,事务事件默认并未启用
update setup_instruments set enabled='yes',timed='yes' where name like 'transaction%'; update setup_consumers set enabled='yes' where name like '%transaction%';
开启一个新会话(会话 2)用于执行事务,并模拟事务回滚。
查询活跃事务,活跃事务表示当前正在执行的事务事件,需要从 events_transactions_current 表中查询。
会话 2 中回滚事务:
查询事务事件当前表和事务事件历史记录表,可以看到在两表中都记录了一行事务事件信息,线程ID 为49 的线程执行了一个事务,事务状态为ROLLED BACK。
但是当我们关闭会话 2 以后,事务事件当前表中的记录就消失了。
3.总结
当然 performance_schema 的用途不止我们上面说到过的这些,它还能提供比如查看 SQL 语句执行阶段和进度信息、MySQL 集群下复制功能查看复制报错详情等等。更多的一些能力我们后面再详解
-
performance_schema配置
2022-01-06 10:54:28配置 ...bash-4.4# mysqld --verbose --help | grep performance-schema | grep -v '\-\-' performance-schema TRUE performance-schema-accounts-size -1 performance-schema-consumer-events-sta配置
查看配置
bash-4.4# mysqld --verbose --help | grep performance-schema | grep -v '\-\-' performance-schema TRUE performance-schema-accounts-size -1 performance-schema-consumer-events-stages-current FALSE performance-schema-consumer-events-stages-history FALSE performance-schema-consumer-events-stages-history-long FALSE performance-schema-consumer-events-statements-current TRUE performance-schema-consumer-events-statements-history TRUE performance-schema-consumer-events-statements-history-long FALSE performance-schema-consumer-events-transactions-current TRUE performance-schema-consumer-events-transactions-history TRUE performance-schema-consumer-events-transactions-history-long FALSE performance-schema-consumer-events-waits-current FALSE performance-schema-consumer-events-waits-history FALSE performance-schema-consumer-events-waits-history-long FALSE performance-schema-consumer-global-instrumentation TRUE performance-schema-consumer-statements-digest TRUE performance-schema-consumer-thread-instrumentation TRUE performance-schema-digests-size -1 performance-schema-error-size 5018 performance-schema-events-stages-history-long-size -1 performance-schema-events-stages-history-size -1 performance-schema-events-statements-history-long-size -1 performance-schema-events-statements-history-size -1 performance-schema-events-transactions-history-long-size -1 performance-schema-events-transactions-history-size -1 performance-schema-events-waits-history-long-size -1 performance-schema-events-waits-history-size -1 performance-schema-hosts-size -1 performance-schema-instrument performance-schema-max-cond-classes 150 performance-schema-max-cond-instances -1 performance-schema-max-digest-length 1024 performance-schema-max-digest-sample-age 60 performance-schema-max-file-classes 80 performance-schema-max-file-handles 32768 performance-schema-max-file-instances -1 performance-schema-max-index-stat -1 performance-schema-max-memory-classes 450 performance-schema-max-metadata-locks -1 performance-schema-max-mutex-classes 350 performance-schema-max-mutex-instances -1 performance-schema-max-prepared-statements-instances -1 performance-schema-max-program-instances -1 performance-schema-max-rwlock-classes 60 performance-schema-max-rwlock-instances -1 performance-schema-max-socket-classes 10 performance-schema-max-socket-instances -1 performance-schema-max-sql-text-length 1024 performance-schema-max-stage-classes 175 performance-schema-max-statement-classes 219 performance-schema-max-statement-stack 10 performance-schema-max-table-handles -1 performance-schema-max-table-instances -1 performance-schema-max-table-lock-stat -1 performance-schema-max-thread-classes 100 performance-schema-max-thread-instances -1 performance-schema-session-connect-attrs-size -1 performance-schema-setup-actors-size -1 performance-schema-setup-objects-size -1 performance-schema-show-processlist FALSE performance-schema-users-size -1
performance_schema中的配置是保存在内存中的,即保存在performance_schema配置表(中的配置项在MySQL实例停止时会全部丢失。所以,需要在MySQL的配置文件中使用启动选项来持久化配置项,让MySQL每次重启时都自动加载配置项,而不需要再重新配置。
关键配置介绍
(1)performance_schema_consumer_events_statements_current=TRUE
是否在MySQL Server启动时就开启events_statements_current表的记录功能(该表记录当前的语句事件信息),启动之后也可以在setup_consumers表中使用UPDATE语句动态更新setup_consumers配置表中的events_statements_current配置项,默认值为TRUE。
(2)performance_schema_consumer_events_statements_history=TRUE
用于配置是否记录语句事件短历史信息,默认值为TRUE。
(3)performance_schema_consumer_global_instrumentation=TRUE
是否在MySQL Server启动时就开启全局表(如:mutex_instances、rwlock_instances、cond_instances、file_instances、users、hostsaccounts、socket_summary_by_event_name、file_summary_by_instance等大部分全局对象计数统计和事件汇总统计信息表)的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句动态更新全局配置项。默认值为TRUE。
(4)performance_schema_consumer_statements_digest=TRUE
是否在MySQL Server启动时就开启events_statements_summary_by_digest表的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句动态更新digest配置项。默认值为TRUE。
(5)performance_schema_consumer_thread_instrumentation=TRUE
是否在MySQL Server启动时就开启events_xxx_summary_by_yyy_by_event_name表的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句动态更新线程配置项。默认值为TRUE。
(6)performance_schema_instrument[=name]
是否在MySQL Server启动时就启用某些采集器。由于instruments配置项多达数千个,所以该配置项支持key-value模式,还支持使用“%”进行通配等。
查看生效的配置
mysql> show variables like '%performance_schema%' -> ; +----------------------------------------------------------+-------+ | Variable_name | Value | +----------------------------------------------------------+-------+ | performance_schema | ON | | performance_schema_accounts_size | -1 | | performance_schema_digests_size | 10000 | | performance_schema_error_size | 5018 | | performance_schema_events_stages_history_long_size | 10000 | | performance_s
-
MySQL系统库之performance_schema
2021-04-30 21:21:26performance_schema介绍 performance_schema是运行在较低级别的用于监控MySQL Server 运行过程中的资源消耗、资源等待等情况的一个功能特性,它具有以下特点。 performance_schema提供了一种在数据库运行时实时...performance_schema介绍
performance_schema是运行在较低级别的用于监控MySQL Server
运行过程中的资源消耗、资源等待等情况的一个功能特性,它具有以下特点。-
performance_schema提供了一种在数据库运行时实时检查Server内部执
行情况的方法。performance_schema数据库中的表使用performance_schema存
储引擎。该数据库主要关注数据库运行过程中的性能相关数据。 -
performance_schema通过监视Server的事件来实现监视其内部执行情况,
”事件”就是在Server内部活动中所做的任何事情以及对应的时间消耗,利用这
些信息来判断Server中的相关资源被消耗在哪里。一般来说,事件可以是函数调
用、操作系统的等待、SQL语句执行的阶段【如SQL语句执行过程中的parsing(解
析)或 sorting(排序)阶段】或者整个SQL语句的集合。采集事件可以方便地提
供Server中的相关存储引擎对磁盘文件、表I/O、表锁等资源的同步调用信息。 -
当前活跃事件、历史事件和事件摘要相关表中记录的信息,能提供某个
事件的执行次数、使用时长,进而可用于分析与某个特定线程、特定对象(如
mutex 或 file)相关联的活动。 -
performance_schema存储引擎使用Server源代码中的“检测点”来实现
事件数据的收集。对于performance_schema实现机制本身的代码没有相关的单
独线程来检测,这与其他功能(如复制或事件计划程序)不同。
收集到的事件数据被存储在performance_schema数据库的表中。对于这些
表可以使用SELECT语句查询,也可以使用SQL语句更新performance_schema数
据库中的表记录(比如动态修改performance_schema的以“setup_”开头的配
置表,但要注意,配置表的更改会立即生效,这会影响数据收集)。 -
performance_schema的表中数据不会持久化存储在磁盘中,而是保存在
内存中,一旦服务器重启,这些数据就会丢失(包括配置表在内的整个
performance_schema 下的所有数据)。
performance_schema使用
检查当前数据库版本是否支持performance_schema
performance_schema 被视为存储引擎,如果该引擎可用,则应该在
INFORMATION_SCHEMA.ENGINES 表或show engines语句的输出中可以看到
它的Support字段值为YES,如下所示:mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ mysql> SELECT * FROM INFORMATION_SCHEMA.ENGINES WHERE ENGINE ='PERFORMANCE_SCHEMA'; +--------------------+---------+--------------------+--------------+------+------------+ | ENGINE | SUPPORT | COMMENT | TRANSACTIONS | XA | SAVEPOINTS | +--------------------+---------+--------------------+--------------+------+------------+ | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | +--------------------+---------+--------------------+--------------+------+------------+
启用performance_schema
当我们看到performance_schema对应的Support字段值为YES时,就表示当
前的数据库版本是支持performance_schema的。但确认了数据库实例支持
performance_schema存储引擎就可以使用了吗?NO,很遗憾,
performance_schema在MySQL5.6及之前的版本中默认没有启用,在MySQL 5.7
及之后的版本中才修改为默认启用。如果要显式启用或关闭 performance_schema,则需要使用参数
performance_schema=ON|OFF 来设置,并在my.cnf中进行配置。注意:该参数为
只读参数,需要在实例启动之前设置才生效
。mysqld启动之后,通过如下语句查看performance_schema启用是否生效(值
为ON表示performance_schema已初始化成功且可以使用了;值为OFF表示在
启用performance_schema时发生某些错误,可以查看错误日志进行排查)。mysql> show variables like 'performance_schema'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | performance_schema | ON | +--------------------+-------+
performance_schema下的表
可以通过从INFORMATION_SCHEMA.tables表查询有哪些performance_schema引擎的表:
mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES \ -> WHERE TABLE_SCHEMA ='performance_schema' and engine='performance_schema' ; +------------------------------------------------------+ | TABLE_NAME | +------------------------------------------------------+ | accounts | ... ... | | users | | variables_by_thread | +------------------------------------------------------+ 87 rows in set (0.00 sec)
也可以直接在performance_schema库下使用show tables语句:
mysql> use performance_schema Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +------------------------------------------------------+ | Tables_in_performance_schema | +------------------------------------------------------+ | accounts | ... ... | users | | variables_by_thread | +------------------------------------------------------+ 87 rows in set (0.00 sec)
可以看到在MySQL 5.7.31版本中,performance_schema下一共有87张表,它们都是存放什么数据呢?如何用来查询想要的数据呢?先别着急,我们先来看看这些表是如何分类的。
performance_schema表的分类
performance_schema库下的表可以按照监视的不同维度进行分组,例如:
按照不同的数据库对象进行分组、按照不同的事件类型进行分组,或者按照事件
类型分组之后,再进一步按照账号、主机、程序、线程、用户等进行细分。下面介绍按照事件类型分组记录性能事件数据的表。
语句事件记录表
语句事件记录表:记录语句事件信息的表,包括:
events_statements_current(当前语句事件表)、events_statements_history(历
史语句事件表)、events_statements_history_long(长语句历史事件表)以及一
些summary表(聚合后的摘要表)。其中,summary表还可以根据账号(account)、
主机(host)、程序(program)、线程(thread)、用户(user)和全局(global)
再进行细分。mysql> show tables like 'events_statement%'; +----------------------------------------------------+ | Tables_in_performance_schema (events_statement%) | +----------------------------------------------------+ | events_statements_current | | events_statements_history | | events_statements_history_long | | events_statements_summary_by_account_by_event_name | | events_statements_summary_by_digest | | events_statements_summary_by_host_by_event_name | | events_statements_summary_by_program | | events_statements_summary_by_thread_by_event_name | | events_statements_summary_by_user_by_event_name | | events_statements_summary_global_by_event_name | +----------------------------------------------------+ 10 rows in set (0.00 sec)
等待事件记录表
等待事件记录表:与语句事件记录表类似。
mysql> show tables like 'events_wait%'; +-----------------------------------------------+ | Tables_in_performance_schema (events_wait%) | +-----------------------------------------------+ | events_waits_current | | events_waits_history | | events_waits_history_long | | events_waits_summary_by_account_by_event_name | | events_waits_summary_by_host_by_event_name | | events_waits_summary_by_instance | | events_waits_summary_by_thread_by_event_name | | events_waits_summary_by_user_by_event_name | | events_waits_summary_global_by_event_name | +-----------------------------------------------+ 9 rows in set (0.00 sec)
阶段事件记录表
阶段事件记录表:记录语句执行阶段事件的表,与语句事件记录表类似。
mysql> show tables like 'events_stage%'; +------------------------------------------------+ | Tables_in_performance_schema (events_stage%) | +------------------------------------------------+ | events_stages_current | | events_stages_history | | events_stages_history_long | | events_stages_summary_by_account_by_event_name | | events_stages_summary_by_host_by_event_name | | events_stages_summary_by_thread_by_event_name | | events_stages_summary_by_user_by_event_name | | events_stages_summary_global_by_event_name | +------------------------------------------------+ 8 rows in set (0.00 sec)
事务事件记录表
事务事件记录表:记录与事务相关的事件的表,与语句事件记录表类似。
mysql> show tables like 'events_transaction%'; +------------------------------------------------------+ | Tables_in_performance_schema (events_transaction%) | +------------------------------------------------------+ | events_transactions_current | | events_transactions_history | | events_transactions_history_long | | events_transactions_summary_by_account_by_event_name | | events_transactions_summary_by_host_by_event_name | | events_transactions_summary_by_thread_by_event_name | | events_transactions_summary_by_user_by_event_name | | events_transactions_summary_global_by_event_name | +------------------------------------------------------+ 8 rows in set (0.00 sec)
监视文件系统层调用的表:
mysql> show tables like '%file%'; +---------------------------------------+ | Tables_in_performance_schema (%file%) | +---------------------------------------+ | file_instances | | file_summary_by_event_name | | file_summary_by_instance | +---------------------------------------+ 3 rows in set (0.00 sec)
监视内存使用的表:
mysql> show tables like '%memory%'; +-----------------------------------------+ | Tables_in_performance_schema (%memory%) | +-----------------------------------------+ | memory_summary_by_account_by_event_name | | memory_summary_by_host_by_event_name | | memory_summary_by_thread_by_event_name | | memory_summary_by_user_by_event_name | | memory_summary_global_by_event_name | +-----------------------------------------+ 5 rows in set (0.00 sec)
动态对performance_schema进行配置的配置表:
mysql> show tables like '%setup%'; +----------------------------------------+ | Tables_in_performance_schema (%setup%) | +----------------------------------------+ | setup_actors | | setup_consumers | | setup_instruments | | setup_objects | | setup_timers | +----------------------------------------+ 5 rows in set (0.00 sec)
现在,我们已经大概知道了performance_schema中主要表的分类,但如何
使用这些表来提供性能事件数据呢?performance_schema简单配置
当数据库初始化完成并启动时,并非所有的instruments(在采集配置项的
配置表中,每一项都有一个开关字段,或为YES,或为NO)和consumers(与采
集配置项类似,也有一个对应的事件类型保存表配置项,为YES表示对应的表保
存性能数据,为NO表示对应的表不保存性能数据)都启用了,所以默认不会收
集所有的事件。可能你想检测的事件并没有打开,需要进行设置。可以使用如下两条语句打
开对应的 instruments 和 consumers,我们以配置监测等待事件数据为例进行说明。打开等待事件的采集器配置项开关,需要修改setup_instruments配置表中
对应的采集器配置项。mysql> update setup_instruments set enabled='yes',timed='yes' where name like 'wait%';
打开等待事件的保存表配置项开关,修改 setup_consumers 配置表中对应的
配置项。mysql> update setup_consumers set enabled='yes' where name like 'wait%';
配置好之后,我们就可以查看Server当前正在做什么了。可以通过查询
events_waits_current表来得知,该表中每个线程只包含一行数据,用于显示每个
线程的最新监视事件(正在做的事情)。*_current表中每个线程只保留一条记录,且一旦线程完成工作,该表中就
不会再记录该线程的事件信息了。*_history 表中记录每个线程已经执行完成的事
件信息,但每个线程的事件信息只记录 10 条,再多就会被覆盖掉。*_history_long
表中记录所有线程的事件信息,但总记录数量是 10000 行,超过会被覆盖掉。summary表提供所有事件的汇总信息。该组中的表以不同的方式汇总事件数
据(如:按用户、按主机、按线程等汇总)。查看最近执行失败的 SQL 语句
使用代码对数据库的某些操作(比如:使用Java的ORM框架操作数据库)
报出语法错误,但是代码并没有记录SQL语句文本的功能,在MySQL数据库层
能否查看到具体的SQL语句文本,看看是否哪里写错了?这个时候,大多数人首
先想到的就是去查看错误日志。很遗憾,对于SQL语句的语法错误,错误日志并
不会记录。实际上,在performance_schema的语句事件记录表中针对每一条语句的执
行状态都记录了较为详细的信息,例如:events_statements_*表和
events_statements_summary_by_digest表(events_statements_*表记录了语句所有
的执行错误信息,而 events_statements_summary_by_digest 表只记录了语句在执
行过程中发生错误的语句记录统计信息,不记录具体的错误类型,例如:不记录
语法错误类的信息)。下面看看如何使用这两个表查询语句发生错误的语句信息。首先,我们模拟一条语法错误的SQL语句,使用
events_statements_history_long表或者events_statements_history表查询发生语
法错误的SQL语句:mysql> select * from; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 mysql> select * from events_statements_history where mysql_errno=1064\G; *************************** 1. row *************************** THREAD_ID: 27 EVENT_ID: 105 END_EVENT_ID: 105 EVENT_NAME: statement/sql/error SOURCE: TIMER_START: 954821531487000 TIMER_END: 954821601185000 TIMER_WAIT: 69698000 LOCK_TIME: 0 SQL_TEXT: select * from DIGEST: NULL DIGEST_TEXT: NULL CURRENT_SCHEMA: performance_schema OBJECT_TYPE: NULL OBJECT_SCHEMA: NULL OBJECT_NAME: NULL OBJECT_INSTANCE_BEGIN: NULL MYSQL_ERRNO: 1064 RETURNED_SQLSTATE: 42000 MESSAGE_TEXT: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use ERRORS: 1 WARNINGS: 0 ROWS_AFFECTED: 0 ROWS_SENT: 0 ROWS_EXAMINED: 0 CREATED_TMP_DISK_TABLES: 0 CREATED_TMP_TABLES: 0 SELECT_FULL_JOIN: 0 SELECT_FULL_RANGE_JOIN: 0 SELECT_RANGE: 0 SELECT_RANGE_CHECK: 0 SELECT_SCAN: 0 SORT_MERGE_PASSES: 0 SORT_RANGE: 0 SORT_ROWS: 0 SORT_SCAN: 0 NO_INDEX_USED: 0 NO_GOOD_INDEX_USED: 0 NESTING_EVENT_ID: NULL NESTING_EVENT_TYPE: NULL NESTING_EVENT_LEVEL: 0 1 row in set (0.01 sec)
不知道错误号是多少,可以查询发生错误次数不为 0 的语句记录,在里边找
到SQL_TEXT和MESSAGE_TEXT字段(提示信息为语法错误的就是它)。查看最近的事务执行信息
我们可以通过慢查询日志查询到一条语句的执行总时长,但是如果数据库中
存在着一些大事务在执行过程中回滚了,或者在执行过程中异常中止,这个时候
慢查询日志就爱莫能助了,这时我们可以借助performance_schema的
events_transactions_*表来查看与事务相关的记录,在这些表中详细记录了是否
有事务被回滚、活跃(长时间未提交的事务也属于活跃事务)或已提交等信息。首先需要进行配置启用,事务事件默认并未启用
:mysql> update setup_instruments set enabled='yes',timed='yes' where name like 'transaction%'; mysql> update setup_consumers set enabled='yes' where name like '%transaction%';
开启一个新会话(会话 2)用于执行事务,并模拟事务回滚。
mysql> create database test; mysql> use test; mysql> create table dept(id int primary key, name varchar(20)); mysql> insert into dept values(1, 'dev'); mysql> begin; mysql> insert into dept values(2, 'test');
此时返回会话1查询活跃事务,活跃事务表示当前正在执行的事务事件,需要从
events_transactions_current 表中查询:mysql> select * from events_transactions_current\G; *************************** 1. row *************************** THREAD_ID: 28 EVENT_ID: 197 END_EVENT_ID: NULL EVENT_NAME: transaction STATE: ACTIVE TRX_ID: NULL GTID: AUTOMATIC XID_FORMAT_ID: NULL XID_GTRID: NULL XID_BQUAL: NULL XA_STATE: NULL SOURCE: TIMER_START: 4040988368889000 TIMER_END: 4072493150997000 TIMER_WAIT: 31504782108000 ACCESS_MODE: READ WRITE ISOLATION_LEVEL: REPEATABLE READ AUTOCOMMIT: NO NUMBER_OF_SAVEPOINTS: 0 NUMBER_OF_ROLLBACK_TO_SAVEPOINT: 0 NUMBER_OF_RELEASE_SAVEPOINT: 0 OBJECT_INSTANCE_BEGIN: NULL NESTING_EVENT_ID: 196 NESTING_EVENT_TYPE: STATEMENT 1 row in set (0.00 sec)
会话 2 中回滚事务:
mysql> rollback;
查询事务事件当前表和事务事件历史记录表,可以看到在两表中都记录了一
行事务事件信息,线程ID为28的线程执行了一个事务,事务状态为ROLLED BACK。mysql> select * from events_transactions_current\G; *************************** 1. row *************************** THREAD_ID: 28 EVENT_ID: 197 END_EVENT_ID: 199 EVENT_NAME: transaction STATE: ROLLED BACK TRX_ID: NULL GTID: AUTOMATIC XID_FORMAT_ID: NULL XID_GTRID: NULL XID_BQUAL: NULL XA_STATE: NULL SOURCE: TIMER_START: 4040988368889000 TIMER_END: 4248882284352000 TIMER_WAIT: 207893915463000 ACCESS_MODE: READ WRITE ISOLATION_LEVEL: REPEATABLE READ AUTOCOMMIT: NO NUMBER_OF_SAVEPOINTS: 0 NUMBER_OF_ROLLBACK_TO_SAVEPOINT: 0 NUMBER_OF_RELEASE_SAVEPOINT: 0 OBJECT_INSTANCE_BEGIN: NULL NESTING_EVENT_ID: 196 NESTING_EVENT_TYPE: STATEMENT 1 row in set (0.00 sec) mysql> select * from events_transactions_history\G; *************************** 1. row *************************** THREAD_ID: 28 EVENT_ID: 197 END_EVENT_ID: 199 EVENT_NAME: transaction STATE: ROLLED BACK TRX_ID: NULL GTID: AUTOMATIC XID_FORMAT_ID: NULL XID_GTRID: NULL XID_BQUAL: NULL XA_STATE: NULL SOURCE: TIMER_START: 4040988368889000 TIMER_END: 4248882284352000 TIMER_WAIT: 207893915463000 ACCESS_MODE: READ WRITE ISOLATION_LEVEL: REPEATABLE READ AUTOCOMMIT: NO NUMBER_OF_SAVEPOINTS: 0 NUMBER_OF_ROLLBACK_TO_SAVEPOINT: 0 NUMBER_OF_RELEASE_SAVEPOINT: 0 OBJECT_INSTANCE_BEGIN: NULL NESTING_EVENT_ID: 196 NESTING_EVENT_TYPE: STATEMENT 1 rows in set (0.00 sec)
但是当我们关闭会话2以后,事务事件当前表和事务事件历史表的记录就消失了,数据转移到events_transactions_history_long表中。
mysql> select * from events_transactions_current\G; Empty set (0.00 sec) mysql> select * from events_transactions_history\G; Empty set (0.01 sec)
-
-
performance_schema的配置
2021-03-26 10:22:09开启performance_schema 修改performance_schema参数需要重启mysql [mysqld] performance_schema=ON SELECT * FROM INFORMATION_SCHEMA.ENGINES;或者 show engines;可以看出mysql把PERFORMANCE_SCHEMA看成一种存储... -
MySQL之performance_schema监控
2022-04-13 10:34:56MySQL的performance schema 用于监控MySQL server在一个较低级别的运行过程中的资源消耗、资源等待等情况;从MySQL5.6开始,Performance Schema 默认打开。 特点: 提供了一种在数据库运行时实时检查server的内部... -
MySQL默认数据库information_schema,mysql,performance_schema内容
2021-08-05 13:28:01MySQL装好后自带三个数据库 这几个是数据库的核心,绝对不能删,除非要跑路 MariaDB [(none)]> show databases; -------------- show databases -------------- ...+--------------------+ ...| performance_sch -
MySQL中的系统库—performance_schema
2021-09-27 22:35:14performance_schema 这个数据库里主要保存 MySQL 服务器运行过程中的一些状态信息,算是对 MySQL 服务器的一个性能监控。包括统计最近执行了哪些语句,在执行过程的每 个阶段都花费了多长时间,内存的 -
初相识|performance_schema全方位介绍
2021-02-18 17:54:091、什么是performance_schema 2、performance_schema使用快速入门 2.1. 检查当前数据库版本是否支持 2.2. 启用performance_schema 2.3. performance_schema表的分类 2.4. performance_schema简单配置与使用 |... -
MySQL 5.6中备份及还原performance_schema配置
2019-08-02 11:52:10NULL 博文链接:https://icbm.iteye.com/blog/1981396 -
MYSQL 8 上云 performance_schema 里面参数我们打开了那些 5个表调整脚本?(POLARDB 适用)...
2022-06-03 00:56:03UPDATE performance_schema.setup_instruments SET ENABLED= 'YES' WHERE NAME = 'memory/performance_schema/table_io_waits_summary_by_index_usage'; UPDATE performance_schema.setup_instruments SET ... -
MySQL5.5 performance_schema的介绍
2021-01-19 11:20:23mysql5.5 版本 新增了一个性能优化的引擎: PERFORMANCE_SCHEMA这个功能默认是关闭的:需要设置参数: performance_schema 才可以启动该功能,这个参数是静态参数,只能写在my.cnf 中不能动态修改。先看看有什么东西... -
performance_schema之锁等待问题排
2021-07-20 23:12:09一、performance_schema简介 performance_schema 可监控MySQL数据库Server、Engine层的资源消耗、资源等待信息,并根据多个维度进行一定的分组聚合,方便我们用于资源瓶颈分析。开启该功能后,这些监控采集数据使用... -
performance_schema全方位介绍
2020-05-16 23:56:361、什么是performance_schema 2、performance_schema使用快速入门 2.1. 检查当前数据库版本是否支持 2.2. 启用performance_schema 2.3. performance_schema表的分类 2.4. performance_schema简单配置与使用 |... -
配置详解 | performance_schema全方位介绍
2021-02-18 20:19:52在上一篇《初相识 | performance_schema全方位介绍》中粗略介绍了如何配置与使用performance_schema,相信大家对performance_schema能够为我们提供什么样的性能数据已经有一个初步的认识,今天将带领大家一起踏上... -
Mysql Performance_schema简介, 表和常用性能查询
2022-01-04 11:55:44performance_schema是运行在较低级别的用于监控MySQL Server运行过程中的资源消耗、资源等待等情况的一个功能特性,它具有以下特点。 提供了一种在数据库运行时实时检查Server内部执行情况的方法 可监控任何事情... -
利用performance_schema进行故障诊断(mysql金字塔法则读书笔记)
2021-02-18 17:45:50instrunments:生产者,用于采集mysql中各种操作产生的事件信息,对应配置表中的配置项,我们可以称之为采集...use performance_schema update setup_instruments set enabled='yes',timed='yes' where name like 'w. -
【转】利用performance_schema进行故障诊断(mysql金字塔法则读书笔记)
2021-06-06 15:41:59instrunments:生产者,用于采集mysql中各种操作产生的事件信息,对应配置表中的配置项,我们可以称之为采集...use performance_schema update setup_instruments set enabled='yes',timed='yes' where name like 'w. -
mysql5.6之performance_schema使用初探
2021-03-03 17:52:10一:Performance Schema的开启在mysql中新增了一个性能优化的引擎,在mysql5.6.6之前Performance Schema是默认关闭的,在Mysql5.6.6之后Performance Schema默认是开启的。所以mysql5.6.6之前的版本要使用Performance ... -
jdbc连接数据库显示Unknown system variable 'performance_schema' 错误
2022-03-29 04:07:58问题相关代码,请勿粘贴截图 public class JDBCDemo { public static void main(String... } } 运行结果及报错内容 Exception in thread "main" java.sql.SQLException: Unknown system variable 'performance_schema' -
使用performance_schema
2020-05-28 09:34:14可以使用performance_schema在运行时检查服务器的内部执行情况。 performance_schema中有许多影响服务器计时的事件消费者,例如函数调用、对操作系统的等待、 SQL语句执行中的某个阶段(例如解析或排序)、一条语句... -
性能分析performance_schema
2021-01-25 16:34:47profiling功能在5.6开始逐渐被performance_schema取代,information_schema中部分性能数据收集迁移到了performance_schema中。 一言以蔽之,P_S库值得我们学习,对它的合理使用,有利于我们对数据库进行分析 官方... -
mysql事件统计之PERFORMANCE_SCHEMA基础详解
2021-01-19 17:51:19概述MySQL 5.5开始新增一个数据库:PERFORMANCE_SCHEMA,主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。performance_schema... -
mysql performance_schema/information_schema授权问题
2021-02-01 18:00:42grant all on performance_schema.* to ‘testuser‘@‘%‘;ERROR 1044 (42000): Access denied for user ‘root‘@‘localhost‘ to database ‘performance_schema‘mysql> grant all on information_schema..... -
MySQL下的Performance_schema性能板块监控 (附博主开源项目)
2021-11-23 11:34:38Performance_schema性能板块监控 1.简单介绍 MYSQL的Performance_schema用于监控MySQL server 在一个较低级别的运行过程中的资源消耗,资源等待等情况 MySQL默认开启,可以用 SHOW VARIABLES LIKE ‘performance_... -
mysql中performance_schema(一)配置篇
2020-10-23 09:32:43performance_schema最早在MYSQL 5.5中出现,而现在5.6,5.7中performance_schema又添加了更多的监控项,统计信息也更丰富,真乃DBA童鞋进行性能诊断分析的福音。 检查当前数据库版本是否支持 performance_...