暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL维护工具包percona-toolkit(1)

数据库知多少 2021-04-26
1395
MySQL维护工具包percona-toolkit(1)

    作为DBA,在维护管理MySQL数据库的时候,经常要使用MySQL自带的mysql/mysqladmin命令,根据各种场景需要拼接sql,耗时耗力,我们可以借助Percona提供的一组命令工具包来管理维护数据库,简单高效。Percona-toolkit工具包是一组高级的管理mysql的工具包集 ,同percona-xtrabackup一样都是用Perl写的工具包,可以用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,在生产环境中能极大的提高效率。

    今天我们就要了解下运维中常用的pt-kill工具的使用;pt-kill是用来杀死MySQL线程(连接)的工具(MySQL中通过show processlist查询线程情况),杀死某些匹配特定的Queries,如负载较高的SQL或Sleep较久的查询(短连接时杀死空闲久的以防止超过最大连接数)。

数据库信息

Current user: root@localhost

SSL:         Not in use

Server version: 8.0.18 MySQL Community Server - GPL

Protocol version: 10

Connection:  Localhost via UNIX socket

percona-toolkit工具包安装


    要使用工具包,需要先安装percona-toolkit工具包,可以登录Percona官网进行下载:

https://www.percona.com/software/database-tools/percona-toolkit

工具包提供了两种方式:

    percona-toolkit-3.3.0_x86_64.tar.gz
    percona-toolkit-3.3.0-1.el7.x86_64.rpm

    可以下载rpm包,或是二进制压缩包,个人推荐是二进制包,路径可灵活放置,可以跟MySQL软件放在一起,便于管理;

    根据平台和方式进行下载即可。

    我下载的是二进制压缩包,解压之后在bin目录下即可可执行脚本。

    我把该工具包放在了目录下,/mysql/tools/toolskit/bin。

    为了方便使用,我在MySQL用户登录的.bash_profile文件中增加了工具包的路径,这样就可以不用每次输入完整路径来使用各个工具了。

      mysql@Tdongkf[11:14:12]:~$cat .bash_profile |grep PATH
      PATH=$MYSQL_HOME/bin:/mysql/tools/toolkit/bin:$PATH
      export PATH TERM EDITOR TEMP


      PT工具包使用之pt-kill

          生产环境中我们时常遇到这样的情况,可能数据库性能恶劣,需要马上杀掉全部会话,不然数据库就挂起来;可能因为空闲连接较多导致超过最大连接数、某个有问题的sql导致mysql负载很高时,都需要将一些连接kill掉,如果通过show processlist的输出来杀会话,但是比较麻烦。pt-kill为我们解决了管理会话问题的简单的方式。

          pt-kill是从show processlist 中获取满足条件的连接或者从包含show processlist的文件中读取满足条件的连接并打印或者杀掉或者执行其他操作,这个工具在工作中实用性很高,当服务器连接出现异常后第一想到的就是pt-kill,自己写一个脚本也可以,但是功能还是没有pt-kill强大。

      使用工具包之前,可能会提示缺少某些依赖,我们可以提前安装下如下的依赖包:

        yum install perl-DBD-MySQL
        yum install perl-Digest-MD5
        yum install perl-devel

        pt-kill使用范例:

          Usage: pt-kill [OPTIONS] [DSN]
          示例:
          pt-kill --host=127.0.0.1--user=root --password=root1234 --port=3306 --busy-time=10 --print --match-info "SELECT|select" --victims all

          对所有查询时间超过10秒的SELECT语句进行print显示出来,如果需要kill,则将--print 替换为--kill 即可。pt-kill 默认检查间隔为5秒。

          常用参数:

            --daemonize     放在后台以守护进程的形式运行;
            --interval 多久运行一次,单位可以是s,m,h,d等,默认是s。默认30s,有点长,可以根据实际情况来调节
            --victims      默认是oldest,只杀最久的查询。这是防止被查杀是不是真的长时间运行的查询,他们只是长期等待。这种匹配按时间查询,杀死一个时间最高值。
            all 杀掉所有满足的线程
                           all-but-oldest 杀死所有,但连接时间最长的保留不杀。
            --busy-time 批次查询已运行的时间超过这个时间的线程;
            --idle-time 杀掉sleep 了多少时间的连接线程,必须在--match-command sleep时才有效
            –busy-time 批次查询已运行的时间超过这个时间的线程;
            –idle-time 杀掉sleep了多少时间的连接线程,必须在--match-command sleep时才有效
            –match-command 匹配当前连接的命令,command有:Query、Sleep、Binlog Dump、Connect、Delayed insert、
            Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump
            --match-state 根据状态进行匹配,state类型有:Locked、login、copy to tmp table、Copying to tmp table、
            Copying to tmp table on disk、Creating tmp table、executing、Reading from net、
                            Sending data、Sorting for order、Sorting result、Table lock、Updating
            --match-info    区分大小写的,匹配SELECT也就意味着对select无法匹配,因此使用"SELECT|select"包含大小写,
            info可以使用select、update、insert、delete来进行匹配,并可使用"|"进行多项匹配,
            "select|SELECT|delete|DELETE|update|UPDATE"

            Action:

              --kill为杀掉相关线程id
              --kill-query为杀掉相关SQL保留线程id
              --print 打印出来kill掉的连接id

              风险提示: 

              在使用之前,请记得: 

              1. 阅读官方文档;

              2. 查阅该工具的bug list;

              3. 在测试环境进行测试验证;

              4. 备份生产数据库并验证备份;


              pt-kill工具使用场景

              1. 每10秒检查一次,发现有 Query 的进程就给杀掉

                # 只打印
                pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-command="Query" --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_print.log
                # 执行kill
                pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-command="Query" --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_kill.log

                2.查杀select大于30s的会话

                  # 只打印
                  pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr  --password=dbmgr --match-db='dongkf'  --match-info "select|SELECT" --busy-time 30 --victims all --daemonize --print --log=/tmp/pt_print.log
                  # 执行kill
                  pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-info "select|SELECT" --busy-time 30 --victims all --daemonize --kill --log=/tmp/pt_kill.log

                  3.查杀某IP来源的会话

                    # 只打印
                    pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr  --password=dbmgr --match-db='dongkf'  --match-host "192.168.65.129" --busy-time 30 --victims all --daemonize --print --log=/tmp/pt_print.log
                    # 执行kill
                    pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-host "192.168.65.129" --busy-time 30 --victims all --daemonize --kill --log=/tmp/pt_kill.log

                    4.查杀访问某用户的会话

                      # 只打印
                      pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr  --password=dbmgr pwd  --match-db='dongkf'  --match-user "u2" --busy-time 30 --victims all --daemonize  --print --log=/tmp/pt_print.log
                      # 执行kill
                      pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr pwd --match-db='dongkf' --match-user "u2" --busy-time 30 --victims all --daemonize --kill --log=/tmp/pt_kill.log

                      5.杀掉正在进行filesort的sql

                        # 只打印
                        pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr  --password=dbmgr pwd  --match-db='dongkf'  --match-command Query --match-state "Sorting result"  --run-time 1 --busy-time 30 --victims all --daemonize  --print --log=/tmp/pt_print.log
                        # 执行kill
                        pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr pwd --match-db='dongkf' --match-command Query --match-state "Sorting result" --run-time 1 --busy-time 30 --victims all --daemonize --kill --log=/tmp/pt_kill.log

                        6.杀掉正在进行Creating sort index的sql

                          # 只打印
                          pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf'  --match-command Query --match-state "Creating sort index"  --run-time 10 --busy-time 30 --victims all --daemonize --print --log=/tmp/pt_print.log
                          # 执行kill
                          pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-command Query --match-state "Creating sort index" --run-time 10 --busy-time 30 --victims all --daemonize --kill --log=/tmp/pt_kill.log

                          如果想缩短输入命令的长度,也可以将常用命令的选项写入到配置文件中,简化命令:

                            pt-kill --config ptcon.cnf  --match-info "SELECT|select" --victims all
                            ####查看配置文件内容:
                            cat ptcon.cnf
                            host=127.0.0.1
                            user=dbmgr
                            password=dbmgr
                            port=3306
                            busy-time=30
                            print


                            总结

                                    pt-kill工具为我们提供了众多的参数和选项来进行数据库会话的管理,通过这些参数组合,我们可以方便的管理数据库上的不同会话,大大方便了DBA的工作。

                            下期我们在介绍下Percona-Toolkit工具包里的其它工具。相信,你会爱上这个便捷的工具包的。

                            =end=

                            文章转载自数据库知多少,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                            评论