如何从MYSQL查询日志中过滤出的慢查询日志并找出TOP SQL

网友投稿 177 2023-12-25

如何从MYSQL查询日志中过滤出的慢查询日志并找出TOP SQL

如何从MYSQL查询日志中过滤出的慢查询日志并找出TOP SQL,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

 在 MYSQL 慢查询日志中 # Time 中只有时间但没有日期的信息,需要知道一条慢查询SQL具体是哪天的,

就需要 unix_timestamp 函数把 # Time 中的时间戳信息转换为日期信息。

unix_timestamp(datetime=>timestamp)

from_unixtime(timestamp=>datetime)

mysql> select unix_timestamp(2021-10-26 17:30:00);

+---------------------------------------+

| unix_timestamp(2021-10-26 17:30:00) |

+---------------------------------------+

|                            1451122200 |

+---------------------------------------+

1 row in set (0.10 sec)

select from_unixtime(1451122200);

mysql> select from_unixtime(1451122200);

+-----------------------------+

| from_unixtime(1451122200) |

+-----------------------------+

| 2021-10-26 17:30:00.000000  |

+-----------------------------+

过滤出16:30到17:30的慢查询日志

方法一:使用时间戳过滤

mysql> select unix_timestamp(2021-10-26 17:30:00);

+---------------------------------------+

| unix_timestamp(2021-10-26 17:30:00) |

+---------------------------------------+

|                            1451122200 |

+---------------------------------------+

1 row in set (0.00 sec)

mysql> select unix_timestamp(2021-10-26 16:30:00);

+---------------------------------------+

| unix_timestamp(2021-10-26 16:30:00) |

+---------------------------------------+

|                            1451118600 |

+---------------------------------------+

1 row in set (0.00 sec)

sed -n   /SET timestamp=14511186../,/SET timestamp=14511222../p QITV0223-slow.log > test3.log

方法二:

mysql> select unix_timestamp(2015-12-26 16:30:00);

+---------------------------------------+

| unix_timestamp(2021-10-26 16:30:00) |

+---------------------------------------+

|                            1451118600 |

+---------------------------------------+

sed -n   /SET timestamp=14511186../,$p QITV0223-slow.log > test4.log

mysql> select unix_timestamp(2021-10-26 17:30:00);

+---------------------------------------+

| unix_timestamp(2021-10-26 17:30:00) |

+---------------------------------------+

|                            1451122200 |

+---------------------------------------+

1 row in set (0.00 sec)

--使用gred 在 test4.log 定位到17:30执行的SQL,比如定位出在 1085行

grep -n SET timestamp=14511222..  QITV0223-slow.log  test4.log

1085:SET timestamp=1451122200;

--使用sed 过滤出第一行到1085行的数据

sed -n 1,1085p test3.log  > test5.log

方法三:如果所有的SQL都有 #TIME 项,则使用 #TIME进行过滤

sed -n   /# Time: 151226 16:30:../,/# Time: 151226 17:30:../p QITV0223-slow.log > test10.log

如果没有匹配到 “# Time: 151226 17:30:..”,则会把从16:30到慢查询日志结尾的日志全过滤出来。

对于过滤好的慢查询日志检索 TOP SQL:

1. 获取执行时间最长的 10个 TOP SQL。

mysqldumpslow -s t -t 10 test10.log > slow_t_top_sql.txt

2. 获取平均查询时间最长的 10 个 TOP SQL。

mysqldumpslow -s  at -t 10 test10.log > slow_at_top_sql.txt

3. 获取锁定时间最长的 10个 TOP SQL。

mysqldumpslow -s l -t 10 test10.log > slow_l_top_sql.txt

4. 获取平均锁定时间最长的 10个 TOP SQL。

mysqldumpslow -s al -t 10 test10.log > slow_l_top_sql.txt

5. 获取返回记录最多的 10个 TOP SQL。

mysqldumpslow -s r -t 10 test10.log > slow_r_top_sql.txt

6. 获取平均返回记录最多的 10个 TOP SQL。

mysqldumpslow -s ar -t 10 test10.log > slow_r_top_sql.txt

7. 获取执行次数最多的 10个 TOP SQL。

mysqldumpslow -s c -t 10 test10.log > slow_r_top_sql.txt

看完上述内容,你们掌握如何从MYSQL查询日志中过滤出的慢查询日志并找出TOP SQL的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Percona MySQL日志中出现大量Aborted connection该怎么办
下一篇:MySQL主从不一致的修复过程是怎样的
相关文章

 发表评论

暂时没有评论,来抢沙发吧~