MySQL 的 Performance Schema
是一套性能监控与诊断工具,帮助开发者和数据库管理员收集、分析 MySQL 实例的运行状态,找出性能瓶颈并进行优化。通过 Performance Schema
,我们能够监控不同的内部事件、线程、会话、语句执行等关键性能指标。然而,默认情况下并非所有监控项目都被启用,用户可以通过配置相关的表来灵活调整需要采集的监控数据。
本文将对 Performance Schema
相关的运行时配置表进行深入剖析,包括 performance_timers
、setup_timers
、setup_consumers
、setup_instruments
、setup_actors
、setup_objects
和 threads
表的具体作用、字段含义及其配置技巧,帮助读者更好地掌握和使用 MySQL 性能调优工具。
在实际应用中,我们可能会遇到以下需求:
通过运行时配置,我们可以更灵活地管理 Performance Schema
的数据采集和存储,从而更好地满足实际监控需求。
关键配置表及字段解释
以下是 MySQL 5.8 中与 Performance Schema
配置相关的一些重要表及其字段解释:
在 MySQL 中,performance_timers
表用于显示各种计时器的配置和性能参数。了解这些计时器对于精确地测量和记录性能数据至关重要。以下是 performance_timers
表中各字段的详细解释:
mysql> SELECT * FROM performance_timers;
+-------------+-----------------+------------------+----------------+
| TIMER_NAME | TIMER_FREQUENCY | TIMER_RESOLUTION | TIMER_OVERHEAD |
+-------------+-----------------+------------------+----------------+
| CYCLE | 3791482587 | 1 | 22 |
| NANOSECOND | 1000000000 | 1 | 44 |
| MICROSECOND | 1000000 | 1 | 36 |
| MILLISECOND | 1037 | 1 | 36 |
| TICK | 105 | 1 | 596 |
+-------------+-----------------+------------------+----------------+
5 rows in set
TIMER_NAME:计时器的名称。这些名称指代不同的时间度量方式或精度,例如 NANOSECOND 表示纳秒级别的计时器,MILLISECOND 表示毫秒级别的计时器。
TIMER_FREQUENCY:计时器的频率,以每秒计数的次数表示。例如,NANOSECOND 的频率为 1000000000,意味着每秒有 10 亿次计数。CYCLE 的频率为 3791482587,意味着每秒可以测量约 37 亿次。
TIMER_RESOLUTION:计时器的分辨率,表示计时器的最小单位。在 MySQL 中,这通常是 1,即每个计时器的最小单位是一个基本计数。所有计时器的 TIMER_RESOLUTION 为 1,表明它们的分辨率相同,能够测量最小的时间单位。
TIMER_OVERHEAD:使用该计时器时的开销,以微秒为单位。开销越低,计时器的性能越高。TICK 计时器的开销为 596 微秒,相对较高,这表明它可能在时间测量过程中引入了较大的性能开销。相比之下,NANOSECOND 计时器的开销为 44 微秒,性能较好。
NANOSECOND
计时器;如果性能开销更重要,可以选择开销较低的计时器,如 MICROSECOND
。在 MySQL 中,setup_timers
表用于配置 Performance Schema
的计时器。计时器的配置决定了性能数据的测量精度。通过配置 setup_timers 表中的计时器,我们可以根据不同事件的需求选择适当的计时器类型。这种灵活的配置可以帮助我们在性能监控中取得更好的效果,既可以提高数据的精度,也可以减少性能开销。了解这些配置能够帮助优化 Performance Schema 的性能监控,使其更好地适应具体需求。
mysql> SELECT * FROM setup_timers;
+-------------+-------------+
| NAME | TIMER_NAME |
+-------------+-------------+
| idle | MICROSECOND |
| wait | CYCLE |
| stage | NANOSECOND |
| statement | NANOSECOND |
| transaction | NANOSECOND |
+-------------+-------------+
5 rows in set
NAME: 计时器类别的名称。这个字段表示 Performance Schema 用于不同类型事件的计时器配置。idle 表示空闲事件的计时器,wait 表示等待事件的计时器,stage 表示阶段事件的计时器。
TIMER_NAME: 与 performance_timers 表中的计时器名称匹配,表示用于记录该事件类别的计时器类型。MICROSECOND 表示微秒级计时器,NANOSECOND 表示纳秒级计时器,CYCLE 表示周期计时器。
查看当前计时器配置:
SELECT * FROM setup_timers;
更改计时器配置,例如,将 statement
事件的计时器更改为 MICROSECOND
:
UPDATE setup_timers SET TIMER_NAME = 'MICROSECOND' WHERE NAME = 'statement';
在 MySQL 中,setup_consumers
表用于配置 Performance Schema
中的消费者。消费者负责从 Performance Schema
中收集并存储性能事件数据。通过配置消费者的启用状态,我们可以灵活地控制哪些类型的数据被记录和分析。通过配置 setup_consumers 表中的消费者,可以精确控制哪些性能数据被记录和分析。这种灵活的配置能够根据具体需求优化 Performance Schema 的性能监控。启用或禁用特定的消费者可以使更有效地收集和分析性能数据,从而提高数据库系统的整体性能和可靠性。
mysql> SELECT * FROM setup_consumers;
+----------------------------------+---------+
| NAME | ENABLED |
+----------------------------------+---------+
| events_stages_current | NO |
| events_stages_history | NO |
| events_stages_history_long | NO |
| events_statements_current | YES |
| events_statements_history | YES |
| events_statements_history_long | NO |
| events_transactions_current | NO |
| events_transactions_history | NO |
| events_transactions_history_long | NO |
| events_waits_current | NO |
| events_waits_history | NO |
| events_waits_history_long | NO |
| global_instrumentation | YES |
| thread_instrumentation | YES |
| statements_digest | YES |
+----------------------------------+---------+
15 rows in set
NAME: 消费者的名称。每个消费者对应 Performance Schema 中的一个数据类型,它决定了如何收集和存储不同类型的性能事件数据。events_statements_current 记录当前正在执行的 SQL 语句的事件,global_instrumentation 用于全局性能统计。
ENABLED: 指示相应的消费者是否启用(YES 或 NO)。如果启用,消费者将开始收集相应类型的事件数据;如果禁用,则不会收集这些数据。events_statements_current 的状态为 YES,说明当前正在记录 SQL 语句的执行事件,而 events_stages_current 的状态为 NO,则表示当前不记录 SQL 执行阶段的事件。
查看当前消费者的配置状态:
SELECT * FROM setup_consumers;
启用 events_stages_current
消费者:
UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME = 'events_stages_current';
禁用 events_statements_current
消费者:
UPDATE setup_consumers SET ENABLED = 'NO' WHERE NAME = 'events_statements_current';
在 MySQL 的 Performance Schema
中,setup_instruments
表用于配置各种性能事件的采集器。通过设置这些采集器,我们可以控制哪些类型的事件会被记录,它允许根据需求选择要监控的具体事件,决定是否记录时间数据,从而优化性能监控的效果和开销。通过对该表的配置,可以灵活地控制性能监控的粒度和范围,确保监控信息对系统优化和问题排查的价值最大化。
数据太多了,我们挑重点的说,我们假设执行了之后的查询:
mysql> SELECT * FROM setup_instruments;
+--------------------------------------------------------------------------------+---------+--------+
| NAME | ENABLED | TIMED |
+--------------------------------------------------------------------------------+---------+--------+
| wait/synch/mutex/sql/LOCK_error_log | NO | NO |
| wait/synch/mutex/sql/LOCK_gdl | NO | NO |
| wait/synch/mutex/sql/LOCK_global_system_variables | NO | NO |
| wait/synch/mutex/sql/LOCK_manager | NO | NO |
| wait/synch/mutex/sql/LOCK_prepared_stmt_count | NO | NO |
| wait/synch/mutex/sql/LOCK_sql_slave_skip_counter | NO | NO |
| wait/synch/mutex/sql/LOCK_slave_net_timeout | NO | NO |
| wait/synch/mutex/sql/LOCK_slave_trans_dep_tracker | NO | NO |
| wait/synch/mutex/sql/LOCK_server_started | NO | NO |
| wait/synch/mutex/sql/LOCK_keyring_operations | NO | NO |
| wait/synch/mutex/sql/LOCK_socket_listener_active | NO | NO |
+--------------------------------------------------------------------------------+---------+--------+
................
NAME: 表示要监控的特定事件或操作的名称。它通常包括事件的类别(如 wait/synch/mutex/sql)以及具体的资源(如 LOCK_error_log)。wait/synch/mutex/sql/LOCK_error_log 代表 SQL 线程在获取错误日志锁时的等待情况。
ENABLED: 指示是否启用该监控仪器(YES 或 NO)。如果为 YES,表示该监控工具正在采集数据;如果为 NO,则不采集数据。NO 表示 LOCK_error_log 不在监控范围内;YES 表示 LOCK_global_system_variables 在监控范围内。
TIMED: 指示是否记录时间数据(YES 或 NO)。如果为 YES,表示除了记录事件本身外,还记录发生该事件所花费的时间;如果为 NO,则只记录事件发生情况。NO 表示 LOCK_error_log 事件的发生时间不会被记录;YES 表示 LOCK_global_system_variables 事件的发生时间会被记录。
查看所有启用的监控仪器:
SELECT * FROM setup_instruments WHERE ENABLED = 'YES';
查看记录时间信息的所有监控仪器:
SELECT * FROM setup_instruments WHERE TIMED = 'YES';
启用某个监控仪器,例如启用 LOCK_error_log
并记录时间:
UPDATE setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME = 'wait/synch/mutex/sql/LOCK_error_log';
禁用某个监控仪器,例如禁用 LOCK_global_system_variables
:
UPDATE setup_instruments SET ENABLED = 'NO' WHERE NAME = 'wait/synch/mutex/sql/LOCK_global_system_variables';
在 MySQL 的 Performance Schema
中,setup_actors
表用于配置和管理对性能数据的访问控制。通过设置这个表,可以决定哪些主机、用户和角色能够查看和收集特定的性能事件数据。通过配置 setup_actors 表中的字段,可以精确控制哪些主机、用户和角色能够访问和收集 Performance Schema 中的性能数据。正确设置这些访问控制配置可以确保性能数据的安全性和隐私性,同时也允许根据需要收集和分析性能数据。理解这些配置项能够帮助更好地管理和优化 MySQL 数据库的性能监控。
mysql> SELECT * FROM setup_actors;
+------+------+------+---------+---------+
| HOST | USER | ROLE | ENABLED | HISTORY |
+------+------+------+---------+---------+
| % | % | % | YES | YES |
+------+------+------+---------+---------+
1 row in set
HOST: 指定能够访问性能数据的主机地址。可以是具体的 IP 地址、主机名或通配符。% 表示允许所有主机访问性能数据;192.168.1.% 表示只允许 192.168.1.x 网段的主机访问。
USER: 指定能够访问性能数据的用户账户。可以是具体的用户名或通配符。% 表示允许所有用户访问;admin 表示只允许用户名为 admin 的用户访问。
ROLE: 指定能够访问性能数据的用户角色。可以是具体的角色名称或通配符。% 表示允许所有角色访问;monitor 表示只允许具有 monitor 角色的用户访问。
ENABLED: 指示该配置是否启用(YES 或 NO)。如果启用,指定的主机、用户和角色将能够访问性能数据。YES 表示启用访问权限配置;NO 表示禁用访问权限配置。
HISTORY: 指示是否记录历史数据(YES 或 NO)。如果启用,历史性能数据将被记录以供后续分析。YES 表示记录历史数据;NO 表示不记录历史数据。
查看当前访问控制配置:
SELECT * FROM setup_actors;
允许特定用户和主机访问性能数据:
UPDATE setup_actors SET HOST = '192.168.1.%', USER = 'admin', ROLE = 'monitor', ENABLED = 'YES', HISTORY = 'YES';
禁用历史数据记录:
UPDATE setup_actors SET HISTORY = 'NO' WHERE HOST = '%' AND USER = '%' AND ROLE = '%';
在 MySQL 的 Performance Schema
中,setup_objects
表用于配置和管理监控对象的类型和状态。该表允许指定不同类型的数据库对象(如事件、函数、过程、表、触发器)是否应该被 Performance Schema 监控,以及是否记录它们的计时信息。通过配置 setup_objects 表中的字段,可以精确控制 Performance Schema 中对数据库对象的监控策略。了解和应用这些配置项可以帮助优化性能数据的收集,并根据需要进行详细的分析和调试。
mysql> SELECT * FROM setup_objects;
+-------------+--------------------+-------------+---------+-------+
| OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | ENABLED | TIMED |
+-------------+--------------------+-------------+---------+-------+
| EVENT | mysql | % | NO | NO |
| EVENT | performance_schema | % | NO | NO |
| EVENT | information_schema | % | NO | NO |
| EVENT | % | % | YES | YES |
| FUNCTION | mysql | % | NO | NO |
| FUNCTION | performance_schema | % | NO | NO |
| FUNCTION | information_schema | % | NO | NO |
| FUNCTION | % | % | YES | YES |
| PROCEDURE | mysql | % | NO | NO |
| PROCEDURE | performance_schema | % | NO | NO |
| PROCEDURE | information_schema | % | NO | NO |
| PROCEDURE | % | % | YES | YES |
| TABLE | mysql | % | NO | NO |
| TABLE | performance_schema | % | NO | NO |
| TABLE | information_schema | % | NO | NO |
| TABLE | % | % | YES | YES |
| TRIGGER | mysql | % | NO | NO |
| TRIGGER | performance_schema | % | NO | NO |
| TRIGGER | information_schema | % | NO | NO |
| TRIGGER | % | % | YES | YES |
+-------------+--------------------+-------------+---------+-------+
查看当前对象监控配置:
SELECT * FROM setup_objects;
启用对所有表的监控并记录计时信息:
UPDATE setup_objects SET ENABLED = 'YES', TIMED = 'YES' WHERE OBJECT_TYPE = 'TABLE';
禁用对特定函数的监控:
UPDATE setup_objects SET ENABLED = 'NO' WHERE OBJECT_TYPE = 'FUNCTION' AND OBJECT_NAME = 'my_function';
在 MySQL 的 Performance Schema
中,threads
表用于显示系统中的线程信息。这些线程可以是执行 SQL 查询的线程,也可以是后台进程或内部线程。threads 表提供了有关 MySQL 实例中各个线程的详细信息,包括其 ID、名称、类型、状态和其他相关属性。了解这些信息有助于监控系统的运行情况,诊断性能问题,以及调试和优化
mysql> SELECT * FROM threads;
+-----------+----------------------------------------+------------+----------------+------------------+------------------+----------------------------+---------------------+------------------+-------------------+-----------------------+------------------+------+--------------+---------+-----------------+--------------+
| THREAD_ID | NAME | TYPE | PROCESSLIST_ID | PROCESSLIST_USER | PROCESSLIST_HOST | PROCESSLIST_DB | PROCESSLIST_COMMAND | PROCESSLIST_TIME | PROCESSLIST_STATE | PROCESSLIST_INFO | PARENT_THREAD_ID | ROLE | INSTRUMENTED | HISTORY | CONNECTION_TYPE | THREAD_OS_ID |
+-----------+----------------------------------------+------------+----------------+------------------+------------------+----------------------------+---------------------+------------------+-------------------+-----------------------+------------------+------+--------------+---------+-----------------+--------------+
| 1 | thread/sql/main | BACKGROUND | NULL | NULL | NULL | NULL | NULL | 8319880 | NULL | NULL | NULL | NULL | YES | YES | NULL | 1 |
| 2 | thread/sql/thread_timer_notifier | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 1 | NULL | YES | YES | NULL | 46 |
| 3 | thread/innodb/io_ibuf_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 47 |
| 4 | thread/innodb/io_log_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 48 |
| 5 | thread/innodb/io_read_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 49 |
| 6 | thread/innodb/io_read_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 50 |
| 7 | thread/innodb/io_read_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 51 |
| 8 | thread/innodb/io_read_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 52 |
| 9 | thread/innodb/io_write_thread | BACKGROUND | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | YES | YES | NULL | 53 |
+-----------+----------------------------------------+------------+----------------+------------------+------------------+----------------------------+---------------------+------------------+-------------------+-----------------------+------------------+------+--------------+---------+-----------------+--------------+
THREAD_ID: 线程的唯一标识符。1 是线程 thread/sql/main 的 ID,2 是线程 thread/sql/thread_timer_notifier 的 ID。
NAME: 线程的名称。可以包括线程的类型和功能。thread/sql/main 代表主要的 SQL 线程,thread/innodb/io_read_thread 代表 InnoDB 的读线程。
TYPE: 线程的类型,通常是 BACKGROUND(后台)或 USER(用户线程)。BACKGROUND 表示后台线程,例如用于系统维护;USER 表示用户创建的线程,例如执行 SQL 查询的线程。
PROCESSLIST_ID: 线程在进程列表中的 ID。如果是后台线程,此字段通常为 NULL。NULL 表示此线程不在进程列表中,例如内部后台线程;8319880 表示特定用户线程的 ID。
PROCESSLIST_USER: 执行该线程的用户。如果线程不是用户线程,则此字段为 NULL。NULL 表示后台线程;root 表示由 root 用户执行的线程。
PROCESSLIST_HOST: 执行该线程的主机名或 IP 地址。如果线程不是用户线程,则此字段为 NULL。NULL 表示后台线程;localhost 表示来自本地主机的连接。
PROCESSLIST_DB: 线程操作的数据库名。如果线程不是用户线程,则此字段为 NULL。NULL 表示后台线程;test_db 表示正在使用的数据库。
PROCESSLIST_COMMAND: 线程正在执行的命令类型,如 Query(查询)、Sleep(休眠)等。NULL 表示后台线程没有当前执行命令;Query 表示正在执行 SQL 查询。
PROCESSLIST_TIME: 线程已执行的时间(秒)。对于后台线程,通常为 NULL。NULL 表示后台线程;120 表示线程已执行了 120 秒的操作。
PROCESSLIST_STATE: 线程当前的状态,例如 Waiting for lock(等待锁定)或 Sending data(发送数据)。NULL 表示后台线程;Sending data 表示线程正在发送数据。
PROCESSLIST_INFO: 线程执行的具体信息,如 SQL 查询语句。后台线程通常没有此信息。NULL 表示后台线程;SELECT * FROM users 表示线程正在执行的 SQL 查询。
PARENT_THREAD_ID: 父线程的 ID。如果该线程没有父线程,则此字段为 NULL。NULL 表示该线程没有父线程;1 表示线程的父线程 ID 是 1。
ROLE: 线程的角色(例如 NULL 表示没有角色信息)。NULL 表示线程没有特别的角色;对于一些特殊的线程,可能会有具体角色信息。
INSTRUMENTED: 指示线程是否被 Performance Schema 监控(YES 或 NO)。YES 表示 Performance Schema 监控该线程;NO 表示不监控。
HISTORY: 指示是否记录线程历史信息(YES 或 NO)。YES 表示记录线程历史信息;NO 表示不记录。
CONNECTION_TYPE: 连接类型,通常为 NULL 表示没有特定类型。NULL 表示没有特定连接类型;在某些情况下可能会有具体的连接类型信息。
THREAD_OS_ID: 操作系统级别的线程 ID。1 表示操作系统中的线程 ID 是 1。
查看所有正在运行的线程:
SELECT * FROM threads;
查找所有 BACKGROUND
类型的线程:
SELECT * FROM threads WHERE TYPE = 'BACKGROUND';
获取特定线程的信息,例如 ID 为 3 的线程:
SELECT * FROM threads WHERE THREAD_ID = 3;
MySQL 的 Performance Schema
提供了非常强大的性能监控工具,而通过合理配置 Performance Schema
的运行时表,可以灵活控制采集数据的范围和深度,避免不必要的性能开销。掌握这些配置表的使用和优化技巧,能够有效提升 MySQL 数据库的运行效率,并帮助开发者和管理员及时定位系统瓶颈。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。