• ADADADADAD

    如何从MYSQL查询日志中过滤出的慢查询日志并找出TOP SQL[ mysql数据库 ]

    mysql数据库 时间:2024-11-26 22:10:18

    作者:文/会员上传

    简介:

    在 MYSQL 慢查询日志中 # Time 中只有时间但没有日期的信息,需要知道一条慢查询SQL具体是哪天的,就需要 unix_timestamp 函数把 # Time 中的时间戳信息转换为日期信息。unix_t

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。


    在 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,1085'p 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

    热门标签: mysqlsqltop