慢查询日志¶
该特性为慢查询日志输出添加了微秒级的时间分辨率和其他统计信息。它允许您在运行时启用或禁用慢速查询日志,为复制SQL线程添加日志记录,并对慢速查询日志中要记录的内容和数量添加细粒度控制。
你可以使用雷竞技下载官网Percona-Toolkit的pt-query-digest工具将类似查询聚合在一起,并报告那些消耗最多执行时间的查询。
版本相关信息¶
- 8.0.12-1:从该特性进行移植雷竞技下载官网用于MySQL的Percona服务器5.7.
系统变量¶
log_slow_filter¶
| 选项 | 描述 |
|---|---|
| 命令行 | 是的 |
| 配置文件 | 是的 |
| 范围 | 全球、会话 |
| 动态 | 是的 |
根据查询的执行计划过滤慢日志。以逗号分隔的字符串,可以包含以下值的任意组合:
full_scan:查询执行了全表扫描。full_join:该查询执行了完全连接(没有索引的连接)。tmp_table:查询创建了一个隐式的内部临时表。tmp_table_on_disk:查询的临时表存储在磁盘上。filesort:该查询使用了文件排序。filesort_on_disk:在磁盘上执行文件排序。
值是OR 'ed在一起的。如果字符串为空,则禁用筛选器。如果它不为空,那么只有当查询的执行计划与筛选器中显示的计划类型之一匹配时,查询才会记录到慢日志。
例如,若要只记录执行全表扫描的查询,请将值设置为full_scan.若要仅记录使用磁盘上临时存储进行中间结果的查询,请将该值设置为tmp_table_on_disk, filesort_on_disk.
log_slow_rate_type¶
| 选项 | 描述 |
|---|---|
| 命令行 | 是的 |
| 配置文件 | 是的 |
| 范围 | 全球 |
| 动态 | 是的 |
| 数据类型 | 枚举 |
| 默认的 | 会话、查询 |
指定log_slow_rate_limit -的语义会话或查询.
log_slow_rate_limit¶
| 选项 | 描述 |
|---|---|
| 命令行 | 是的 |
| 配置文件 | 是的 |
| 范围 | 全球、会话 |
| 动态 | 是的 |
| 默认的 | 1 |
| 范围 | 1 - 1000 |
这个变量的行为取决于所选的log_slow_rate_type。
的一小部分会话/查询应该记录。每n次启用一次日志记录会话/查询.默认情况下,n为1,因此为每个启用日志记录会话/查询.请注意:当log_slow_rate_type为会话复制线程禁用速率限制。
记录所有查询可能会消耗I/O带宽,并导致日志文件变大。
*当log_slow_rate_type为' session '时,这个选项允许你记录完整的会话,这样你就有完整的会话记录供以后分析;但是您可以对记录的会话数量进行速率限制。注意,如果应用程序使用任何类型的连接池或持久连接,则此特性将不能很好地工作。请注意,您在' session '模式下更改了log_slow_rate_limit,您应该重新连接以获得效果。*当log_slow_rate_type为' query '时,这个选项让你只记录一些查询以供以后分析。例如,如果将该值设置为100,那么将记录1%的查询。
注意,每个查询都具有全局惟一性query_id每个连接都可以有自己的(会话)log_slow_rate_limit。决定“记录与否”按以下方式计算:
如果
log_slow_rate_limit每个查询都是1 - log吗如果
log_slow_rate_limit1 -每1/随机log一次log_slow_rate_limit查询
这允许灵活的设置日志记录行为。
例如,如果将值设置为100,则会议/查询将被记录。在雷竞技下载官网用于MySQL的Percona服务器慢查询日志中添加了log_slow_rate_limit的相关信息。这意味着如果log_slow_rate_limit是有效的,它将反映在每个写入查询的慢查询日志中。
预期的输出
Log_slow_rate_type:查询Log_slow_rate_limit: 10
log_slow_sp_statements¶
| 选项 | 描述 |
|---|---|
| 命令行 | 是的 |
| 配置文件 | 是的 |
| 范围 | 全球 |
| 动态 | 是的 |
| 数据类型 | 枚举 |
| 默认的 | 会话 |
| 范围 | 会话、查询 |
如果真正的,则存储过程执行的语句将被记录到打开的slow中。
雷竞技下载官网用于MySQL的Percona服务器实现了存储过程日志到慢查询日志的改进:
*每个来自存储过程的查询现在被单独记录到慢速查询日志中* ' CALL '本身不再被记录到慢速查询日志中,因为这将为同一个查询计数两次,这将导致不正确的结果*在存储过程中调用的查询在慢速查询日志中使用它们运行的存储过程名称进行注释。
改进的存储过程慢查询日志条目示例:
mysqlDELIMITER/ / mysqlCREATE过程improved_sp_log()开始选择*从城市;选择*从国家;/ /结束mysqlDELIMITER;mysqlCALLimproved_sp_log();
当我们在运行存储过程后检查慢查询日志时,使用log_slow_sp_statements设置为真正的,它应该是这样的:
预期的输出
#时间:150109 11:38:55 # User@Host: root[root] @ localhost [] # Thread_id: 40 Schema: world Last_errno: 0 Killed: 0 # Query_time: 0.012989 Lock_time: 0.000033 Rows_sent: 4079 rows_checked: 4079 Rows_affected: 0 Rows_read: 4079 # Bytes_sent: 161085 #存储例程:world。SET时间戳=1420803535;SELECT * FROM City;# User@Host: root[root] @ localhost [] # Thread_id: 40 Schema: world Last_errno: 0 Killed: 0 # Query_time: 0.001413 Lock_time: 0.000017 Rows_sent: 4318 rows_checked: 4318 Rows_affected: 0 Rows_read: 4318 # Bytes_sent: 194601 #存储例程:world。SET时间戳=1420803535;
如果变量log_slow_sp_statements设置为假:
项被添加到慢速日志中
调用语句,而不是在该存储过程中运行的任何单个语句的执行时间报告
调用语句的总执行时间调用包括其所有声明
方法运行相同的存储过程log_slow_sp_statements设置为假慢速查询日志应该是这样的:
预期的输出
#时间:150109 11:51:42 # User@Host: root[root] @ localhost [] # Thread_id: 40 Schema: world Last_errno: 0 Killed: 0 # Query_time: 0.013947 Lock_time: 0.000000 Rows_sent: 4318 rows_checked: 4318 Rows_affected: 0 Rows_read: 4318 # Bytes_sent: 194612 SET timestamp=1420804302;调用improved_sp_log ();
请注意
对日志存储过程的支持不涉及触发器,因此即使启用了该特性,它们也不会被记录。
log_slow_verbosity¶
| 选项 | 描述 |
|---|---|
| 命令行 | 是的 |
| 配置文件 | 是的 |
| 范围 | 全球、会话 |
| 动态 | 是的 |
指定要在慢速日志中包含多少信息。以逗号分隔的字符串,可以包含以下值的任意组合:
microtime:微秒精度日志查询。query_plan:查询执行计划的日志信息。innodb:日志InnoDB统计数据。最小的:相当于启用justmicrotime.标准:相当于启用microtime, query_plan.完整的:相当于所有其他值或在一起不带分析而且profiling_use_getrusage选项。分析:允许对所有连接中的所有查询进行概要分析。profiling_use_getrusage:启用getrusage函数。query_info:启用打印Query_tables而且Query_digest进入慢速查询日志。默认情况下,这些字段是禁用的。
值是OR 'ed在一起的。
例如,启用微秒级查询计时和InnoDB,将此选项设置为microtime, innodb或标准.若要打开所有选项,请将该选项设置为完整的.
slow_query_log_use_global_control¶
| 选项 | 描述 |
|---|---|
| 命令行 | 是的 |
| 配置文件 | 是的 |
| 范围 | 全球 |
| 动态 | 是的 |
| 默认的 | 没有一个 |
指定哪些变量具有全局作用域而不是局部作用域。对于这样的变量,在当前会话中使用全局变量值,但不将该值复制到会话值。Value是一个“标志”变量-您可以指定多个用逗号分隔的值
没有一个:所有变量使用局部作用域log_slow_filter:全局变量log_slow_filter生效(而不是本地变量)log_slow_rate_limit:全局变量log_slow_rate_limit生效(而不是本地变量)log_slow_verbosity:全局变量log_slow_verbose生效(而不是局部变量)long_query_time:全局变量long_query_time生效(而不是本地变量)min_examined_row_limit:全局变量min_examined_row_limit具有效果(而不是局部)所有全局变量有效果(而不是局部变量)
slow_query_log_always_write_time¶
| 选项 | 描述 |
|---|---|
| 命令行 | 是的 |
| 配置文件 | 是的 |
| 范围 | 全球 |
| 动态 | 是的 |
| 默认的 | 10 |
此变量可用于指定查询执行时间,之后查询将被写入慢速查询日志。它可用于为慢查询日志指定一个额外的执行时间阈值,当超过该阈值时,将导致查询被无条件地记录,也就是说,log_slow_rate_limit将不适用于此日志。
其他信息¶
日志格式的更改¶
该特性为慢日志输出添加了更多信息。
预期的输出
#时间:130601 8:01:06.058915 # User@Host: root[root] @ localhost [] Id: 42 # Schema: imdb Last_errno: 0 Killed: 0 # Query_time: 7.725616 Lock_time: 0.000328 Rows_sent: 4 rows_altered: 1543720 Rows_affected: 0 # Bytes_sent: 272 Tmp_tables: 0 Tmp_disk_tables: 0 Tmp_table_sizes: 0 # Full_scan: Yes Full_join: No Tmp_table: No Tmp_table_on_disk: No # Filesort: No Filesort_on_disk: No Merge_passes: 0 SET timestamp=1370073666;SELECT id,title,production_year FROM title WHERE title = 'Bambi';
另一个例子(log_slow_verbosity=分析):
预期的输出
# Time: 130601 8:03:20.700441 # User@Host: root[root] @ localhost [] Id: 43 # Schema: imdb Last_errno: 0 Killed: 0 # Query_time: 7.815071 Lock_time: 0.000261 Rows_sent: 4 rows_altered: 1543720 Rows_affected: 0 # Bytes_sent: 272 # Profile_starting: 0.000125 Profile_starting_cpu: 0.000120 Profile_checking_permissions: 0.000021 Profile_Opening_tables: 0.000049 Profile_Opening_tables_cpu: 0.000048 Profile_init: 0.000048 Profile_init_cpu:0.000049 Profile_System_lock: 0.000049 Profile_System_lock_cpu: 0.000048 profile_optimization: 0.000024 Profile_optimizing_cpu: 0.000024 Profile_statistics: 0.000036 Profile_statistics_cpu: 0.000037 Profile_preparing: 0.000029 profile_prepareing_cpu: 0.000029 profile_execution: 0.000012 Profile_executing_cpu: 0.000012 Profile_Sending_data: 7.811634 Profile_end: 0.000013 Profile_end_cpu: 0.000012 Profile_query_end: 0.000014 Profile_query_end_cpu:0.000014 Profile_closing_tables: 0.000023 Profile_closing_tables_cpu: 0.000023 Profile_freeing_items: 0.000051 Profile_freeing_items_cpu: 0.000050 Profile_logging_slow_query: 0.000006 Profile_logging_slow_query_cpu: 0.000006 # Profile_total: 7.815085 Profile_total_cpu: 7.812127 SET timestamp=1370073800;SELECT id,title,production_year FROM title WHERE title = 'Bambi';
注意死亡:\当查询成功完成时,'关键字后面跟着零。如果查询被杀死,' ' killed: '关键字后面跟着一个非零的数字:
| 被杀死的数字代码 | 异常 |
|---|---|
| 0 | NOT_KILLED |
| 1 | KILL_BAD_DATA |
| 1053 | ER_SERVER_SHUTDOWN(参见MySQL文档) |
| 1317 | ER_QUERY_INTERRUPTED(参见MySQL文档) |
| 3024 | ER_QUERY_TIMEOUT(参见MySQL文档) |
| 还有其他数字吗 | KILLED_NO_VALUE(捕获所有其他情况) |
连接和模式标识符¶
现在,每个慢速日志条目都包含一个连接标识符,因此您可以跟踪来自单个连接的所有查询。中Id列中显示的值与此相同显示完整流程列表或者从CONNECTION_ID ()函数。
每个条目还包含一个模式名,因此可以跟踪默认数据库设置为特定模式的所有查询。
预期的输出
# Id: 43 Schema: imdb
微秒时间分辨率和额外的行信息¶
类提供的原始功能microslow特性。Query_time而且Lock_time以微秒分辨率记录。
该特性还添加了关于检查了多少行的信息选择查询,以及对多少查询进行了分析和影响更新,删除,插入查询,
预期的输出
# Query_time: 0.962742 Lock_time: 0.000202 Rows_sent: 4 rows_checked: 1543719 Rows_affected: 0
价值观和背景:
Rows_examined:扫描行数-选择Rows_affected:已修改行数-更新,删除,插入
内存占用¶
该特性提供了关于为查询结果发送的字节数和为执行查询而创建的临时表的数量的信息(根据它们是在内存上创建的还是在磁盘上创建的来区分)以及它们所使用的总字节数。
预期的输出
# Bytes_sent: 8053 Tmp_tables: 1 Tmp_disk_tables: 0 Tmp_table_sizes: 950528
价值观和背景:
Bytes_sent:为查询结果发送的字节数Tmp_tables:为查询在内存中创建的临时表个数Tmp_disk_tables:磁盘上已创建供查询的临时表个数Tmp_table_sizes:查询中使用的所有临时表的总大小,以字节为单位
查询计划信息¶
每个查询可以以不同的方式执行。例如,它可能使用索引或执行全表扫描,或者可能需要一个临时表。这些是你跑步时通常能看到的东西解释关于查询。该特性现在允许您在日志文件中查看有关执行的最重要事实。
预期的输出
# Full_scan: Yes Full_join: No Tmp_table: No Tmp_table_on_disk: No # Filesort: No Filesort_on_disk: No Merge_passes: 0
这些值及其含义用log_slow_filter选项进行了记录。
InnoDB使用信息¶
输出的最后一部分是InnoDB使用统计数据。MySQL的操作当前显示许多会话统计信息显示会话状态,但这还不包括InnoDB,它们总是全局的,并由所有线程共享。该特性允许您查看给定查询的这些值。
预期的输出
# InnoDB_IO_r_bytes: 105103360 InnoDB_IO_r_wait: 0.001279 # InnoDB_rec_lock_wait: 0.000000 InnoDB_queue_wait: 0.000000 # InnoDB_pages_distinct: 6430
价值观:
innodb_IO_r_ops:计划读页次数。读取操作的实际数量可能不同,但由于这可以异步完成,因此没有很好的方法来测量它。innodb_IO_r_bytes:类似于innodb_IO_r_ops,但单位为字节。innodb_IO_r_wait:显示耗时(以秒为单位)InnoDB从存储器中实际读取数据。innodb_rec_lock_wait:显示查询等待行锁的时间(秒)。innodb_queue_wait:显示查询花费多长时间(秒)等待进入InnoDB队列或队列内等待执行。innodb_pages_distinct:统计查询访问的惟一页面的数量。这个近似是基于一个表示整个缓冲池的小哈希数组,因为映射所有页面可能会占用大量内存。不准确性随着查询访问的页面数量的增加而增加,因为存在更高的散列碰撞概率。
如果查询没有使用InnoDB表,该信息被写入日志,而不是上面的统计信息。