获取MySQL历史session

MySQL的show processlist命令可以显示当时的会话情况,但很多时候都需要查看出问题当时的状态,可惜MySQL没有提供类似history session这样的功能。于是为了方便问题排查,自己写了一个非常简单的抓取MySQL现场session的脚本,生产数据库已经用了很长时间,感觉对trouble shooting还是挺有用的。脚本文件get_processlist.sh内容如下:

    #!/bin/bash
    source /home/mysql/.bashrc
    dt=`date '+%y%m%d_%h%m%s'`
     
    mysql -uroot -p123456 -p3306 -h127.0.0.1 -e "
    select t1.*
      from information_schema.processlist t1,
           (select count(1) c from information_schema.processlist where info is not null) t2
     where t2.c>=50;" > /home/mysql/processlist.txt
     
    if test -s /home/mysql/processlist.txt; then
        mv /home/mysql/processlist.txt /home/mysql/processlist_18251/processlist_${dt}.txt
        mysql -uroot -p123456 -p18251 -h127.0.0.1 -e "
        select * from information_schema.innodb_trx;
        select * from information_schema.innodb_lock_waits;
        select * from information_schema.innodb_locks;" > /home/mysql/processlist/innodb_locks_${dt}.txt
     
    else
        rm /home/mysql/processlist.txt
    fi
     
    find /home/mysql/processlist/* -type f -mtime +10 -exec rm {} \;

        说明:

    只抓取当时正在执行的SQL数量大于等于50的会话情况,输出文件名带有抓取时间。
    同时取得事务和锁的相关信息。
    为防止文件数量过多,只保留最近10天的历史会话文件。

        将脚本放到crontab中,每分钟执行一次:

* * * * * /home/mysql/dbbat/get_processlist.sh

        严格说获得的是1分钟之内的准现场,这种设计一是实现简单,二是对生产负载无影响。

你可能感兴趣的:(mysql)