MySQL日志分析工具

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介:

MySQL的性能从查看日志开始。硬件配置低常常导致这样的问题,但事实上大多数情况并不在这里。某些“慢"SQL阻塞了其他语句的执行,优化查询是第一步需要做的。

    “工欲善其事必先利其器”,MySQL自身的一款mysqldumpslow 查询日志分析器,该工具不但陈旧,验证规范不准确。今天要说的是Percona 的工具pt-query-digest,它能够分析慢查询日志内容,生成查询报告,过滤,重放或传送一些查询语句至MySQL,PostgreSQL,memcached或者其他。

     基本语法:pt-query-digest [OPTION...] [FILE]

     pt-query-digest [OPTION...] [FILE]

     缺点: 对系统资源开销较大(可以将慢查询日志拷贝至其他地方分析)

     举例1(在测试库中进行)、

     pt-query-digest /usr/local/mysql3307/data/slow_my3307.log
# 120.6s user time, 1.4s system time, 59.63M rss, 103.21M vsz
# Current date: Fri Aug  3 12:21:26 2012
# Hostname: XXXX
# Files: /usr/local/mysql3307/data/slow_my3307.log
# Overall: 515.52k total, 240 unique, 0.12 QPS, 0.00x concurrency ________
# Time range: 2012-06-14 06:41:25 to 2012-08-03 12:21:26
# Attribute          total     min     max     avg     95%  stddev  median
# ============     ======= ======= ======= ======= ======= ======= =======
# Exec time          4742s    64us     16s     9ms    40ms    35ms   287us
# Lock time            20s    13us    98ms    38us    49us   370us    23us
# Rows sent          5.22M       0   1.10k   10.62   51.63   54.93    0.99
# Rows examine       8.29G       0 101.66k  16.86k  97.04k  33.18k  964.41
# Query size        32.28M      24     930   65.66  107.34   35.79   34.95

部分解释如下:

第一行表示分析该日志所使用的时间。该文件中一共拥有515.52k慢查询(测试的情况稍稍多了点。。),其中有240个完全不同类型的查询,在该时间段内每秒处理的查询数量:0.12(关于区别完全不同的查询稍后讨论)

接下来是:

比较严重SQL的分析部分:

# Profile
# Rank Query ID           Response time   Calls  R/Call Apdx V/M   Item
# ==== ================== =============== ====== ====== ==== ===== =======
#    1 0xF32359E9A4679928 2680.8630 56.5% 116551 0.0230 1.00  0.05 SELECT user_bloods
#    2 0xB05F93CEB2DED5F5 1908.3559 40.2%  62714 0.0304 1.00  0.00 SELECT user_bloods
#    4 0x85E98D19B3A42237   28.8959  0.6%     12 2.4080 0.83 11.49 SELECT appfuse.titems
# MISC 0xMISC              123.5087  2.6% 336240 0.0004   NS   0.0 <237 ITEMS>

其中挑出最为严重的 4个SQL语句,(可以通过参数 --limit 进行设置)它所有语句响应时间总和,调用比例,查询类型等

接下来是单个语句的分析:

String:
# Databases    YYY
# Hosts
# Users        XXX
# Query_time distribution
#   1us
#  10us
# 100us  ################################################################
#   1ms
#  10ms
# 100ms
#    1s  ########################
#  10s+  ########

可以看到在 在数据库YYY中用户XX 利用该语句查询的响应时间分布图,10S+ 还是很多的。

最后是分析情况:

# Tables
#    SHOW TABLE STATUS FROM `YYY` LIKE 'titems'\G
#    SHOW CREATE TABLE `ZZZ`.`titems`\G
# EXPLAIN /*!50100 PARTITIONS*/
select * from `ZZZ`.`titems`  limit 0,1000\G

  # 号部分是分析步骤,最后语句可以再前面 加上 explain 进行复制,进一步分析。

举例二:

    --review 参数

    该参数可以讲分析结果保存在某个数据表中,这样我们可以为查询做出标记,并且当第二次加上 --review 时,如果存在相同的语句分析,就不会记录到数据表中,

表结构如下:

   pt-query-digest  -P 3307 -u root --password='XXXXXX' --review h=localhost,D=test,t=store --limit 5 /usr/local/mysql3307/data/slow_my3307.log 

    CREATE TABLE query_review (

   checksumBIGINTUNSIGNEDNOTNULLPRIMARYKEY,fingerprintTEXTNOTNULL,sampleTEXTNOTNULL,first_seenDATETIME,last_seenDATETIME,reviewed_byVARCHAR(20),reviewed_onDATETIME,commentsTEXT) 

   checksum 一个64位校验码对应于finigerprint

   举例:

      checksum: 16449492566044263938
fingerprint: select id from user_bloods where user_id = ? and monster_family_id = ? order by updated_at desc
     sample: select id from user_bloods where user_id = 48124 and monster_family_id = 2 order by updated_at desc
 first_seen: 2012-06-14 07:31:28
  last_seen: 2012-08-03 10:44:32
reviewed_by: NULL
reviewed_on: NULL
   comments: NULL

举例三:

  只收集:select 语句,并将其应用于其他的MySQLserver,并分析出耗时最长的SQL:

  pt-query-digest   /usr/local/mysql3307/data/slow_my3307.log --execute h=localhost -u root --password='mj20100913' --filter '$event->{fingerprint} =~ m/^select/'

(这个可以讲线上的 日志分析出来,并应用于测试的服务器上,模仿线上的真是环境)

举例四:

   将processlist 收集出来 并输出到其他文件:

    pt-query-digest --processlist h=localhost -u root --password='XXXXX' --print --no-report

(这个默认是每秒进行一次连接并记录,可设置,如果连接失败会等待1秒在继续连接)

所有参数 可以通过--help看到。

本文未详细解释参数信息,并未列出memcached 地址(详细看这里:http://code.google.com/p/maatkit/wiki/EventAttributes),有兴趣的话大家可以参考官方文档:http://www.percona.com/doc/percona-toolkit/2.1/pt-query-digest.html#cmdoption-pt-query-digest--interval






本文转自 位鹏飞 51CTO博客,原文链接http://blog.51cto.com/weipengfei/953075,如需转载请自行联系原作者

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
18
分享
相关文章
ELK实现nginx、mysql、http的日志可视化实验
通过本文的步骤,你可以成功配置ELK(Elasticsearch, Logstash, Kibana)来实现nginx、mysql和http日志的可视化。通过Kibana,你可以直观地查看和分析日志数据,从而更好地监控和管理系统。希望这些步骤能帮助你在实际项目中有效地利用ELK来处理日志数据。
207 90
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
37 16
图解MySQL【日志】——两阶段提交
两阶段提交是为了解决Redo Log和Binlog日志在事务提交时可能出现的半成功状态,确保两者的一致性。它分为准备阶段和提交阶段,通过协调者和参与者协作完成。准备阶段中,协调者向所有参与者发送准备请求,参与者执行事务并回复是否同意提交;提交阶段中,若所有参与者同意,则协调者发送提交请求,否则发送回滚请求。MySQL通过这种方式保证了分布式事务的一致性,并引入组提交机制减少磁盘I/O次数,提升性能。
61 4
图解MySQL【日志】——两阶段提交
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
49 5
图解MySQL【日志】——Redo Log
mysql的undo log、redo log、bin log、buffer pool
MySQL的undo log、redo log、bin log和buffer pool是确保数据库高效、安全和可靠运行的关键组件。理解这些组件的工作原理和作用,对于优化数据库性能和保障数据安全具有重要意义。通过适当的配置和优化,可以显著提升MySQL的运行效率和数据可靠性。
28 4
MySQL日志
本文介绍了MySQL中三个重要的日志:binlog、redolog和undolog。binlog记录数据库更改操作,支持数据恢复、复制和审计;redolog保证事务的原子性和持久性,实现crash-safe;undolog用于事务回滚及MVCC的实现。每个日志都有其独特的作用和应用场景,确保数据库的稳定性和数据一致性。
图解MySQL【日志】——磁盘 I/O 次数过高时优化的办法
当 MySQL 磁盘 I/O 次数过高时,可通过调整参数优化。控制刷盘时机以降低频率:组提交参数 `binlog_group_commit_sync_delay` 和 `binlog_group_commit_sync_no_delay_count` 调整等待时间和事务数量;`sync_binlog=N` 设置 write 和 fsync 频率,`innodb_flush_log_at_trx_commit=2` 使提交时只写入 Redo Log 文件,由 OS 择机持久化,但两者在 OS 崩溃时有丢失数据风险。
58 3
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
1487 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
114 9

热门文章

最新文章