percona-toolkit初探

percona-toolkit

最近公司项目需要,所以试着先调研一下percona-toolkit ,之前没有接触过这个工具,简单google后,大概汇总一下:

percona-toolkit是一组高级命令行工具的集合,可以查看当前服务的摘要信息,磁盘检测,分析慢查询日志,查找重复索引,实现表同步等等…

这些工具主要包括开发、性能、配置、监控、复制、系统、实用六大类

是优秀DBA必备的工具之一,如果熟练掌握并加以灵活应用,能极大的提高工作效率。

来自官网的简要介绍

Percona Toolkit是一个高级开源命令行工具的集合,由Percona技术人员开发和使用,这些工具被设计用来执行各种各样的MySQL、MongoDB和系统任务,这些任务太困难或太复杂,无法手动执行。超过1500000 +下载,Percona工具包支持Percona MySQL服务器,MySQL,MariaDB®,Percona MongoDB服务器,MongoDB。

首先在自己的阿里云ecs上,安装试用一下。PT工具是使用Perl语言编写和执行的,所以需要系统中有Perl环境。我的阿里云ecs系统为centos 7,64位。

检查&安装相关依赖模块

使用一下命令检查依赖包是否安装

rpm -qa perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL
检查结果如下图所示: ![check_ret](./percona-toolkit初探采坑记/ck_ret.jpg) 如图所示不缺失依赖包,如果显示缺失依赖包,可以通过下面的命令分别安装:
yum install perl-DBI
yum install perl-DBD-MySQL
yum install perl-Time-HiRes
yum install perl-IO-Socket-SSL

下载和安装percona-toolkit(下文简称pt)

如果一切正常显示,则说明已经安装成功了。

percona-toolkit的使用

根据pt工具的类型大概划分为7类,下面来依次介绍这些工具的使用方法

  1. 开发类工具

    1. pt-duplicate-key-checker
      功能: 在MySQL表中找到重复索引和外键。 检查MySQL表的重复或冗余索引和外键。会将重复的索引和外键都列出来,并生成了删除重复索引的语句。
      使用:

      pt-duplicate-key-checker [OPTIONS] [DSN]

      包含的选项比较多,具体的选项可以点击这里 查看,或者运行下面命令查看

      pt-duplicate-key-checker –help
      [DNS]指的是数据库或者数据表
      示例:

      pt-duplicate-key-checker –host=localhost –user=xxx –password=xxx –databases=wx

      结果报错了,怎么回事?技术有限,只能Google
      checker-error
      解决方法:

      ln -sv /usr/lib64/mysql/libmysqlclient.so.18 /lib64/

      solution-1
      解决问题之后,再是执行
      pt-duplicate-key-checker
    2. pt-online-schema-change
      功能:
      在不锁定数据表的情况下修改表。即在 alter 操作更改表结构的时候不用锁定表,也就是说执行 alter 的时候不会阻塞写和读取操作。
      使用:

      pt-online-schema-change [OPTIONS] DSN

      包含的选项option比较多,具体的选项可以点击这里 查看,或者运行下面命令查看

      pt-online-schema-change –help
      [DNS]指的是你要操作的数据库或者数据表
      示例:

      pt-online-schema-change –host=localhost –user=xxx –password=xxx –alter “ADD COLUMN fieldName INT” D=wx,t=wp_admin_log –execute

      执行结果如下,新增加一个字段成功
      pt-online-schema-change
    3. pt-show-grants
      功能:
      规范化和打印MySQL授权,这样您就可以有效地复制、比较和进行版本控制。
      使用:

      pt-show-grants [OPTIONS] [DSN]

      具体的选项option和DNS可以点击这里 查看,或者运行下面命令查看

      pt-show-grants –help

      示例:

      // 查看执行数据库的权限
      pt-show-grants –host=’localhost’ –user=’xxx’ –password=’xxx’ –database=’wx’
      // 查看每个用户权限生成 revoke 收回权限
      pt-show-grants –host=’localhost’ –user=’xxx’ –password=’xxx’ –revoke

      结果如下所示
      pt-show-grants
    4. pt-upgrade
      功能:
      验证不同服务器上的查询结果是否相同。有助于确定升级(或降级)到新版本的MySQL是否安全。一个安全和保守的升级计划有几个步骤,其中之一是确保查询在新版本的MySQL中产生相同的结果。 在多台服务器上执行查询,并比较有什么不同!这在升级服务器的时
      候非常有用,可以先安装并导数据到新的服务器上,然后使用这个工
      具跑一下 sql 看看有什么不同,可以找出不同版本之间的差异。
      使用:(比较文件中每一个查询语句在两个主机上执行的结果,并检查在每个
      服务器上执行的结果、错误和警告。)
      pt-upgrade [OPTIONS] LOGS|RESULTS DSN [DSN]
      
      具体的参数选项可以[点击这里](https://www.percona.com/doc/percona-toolkit/3.0/pt-upgrade.html) 查看,或者运行下面命令查看
      pt-upgrade --help 
      
      示例:
      // 将host2与host1进行比较,使用慢速查询。 
      pt-upgrade h=host1 h=host2 slow.log
      
  2. 性能类工具

    1. pt-index-usage
      功能:
      从日志中读取查询并分析它们如何使用索引。即从 log 文件中读取插叙语句,并用 explain 分析他们是如何利用索引。
      完成分析之后会生成一份关于索引没有被查询使用过的报告。
      使用:

      pt-index-usage [OPTIONS] [FILES]

      示例:

      pt-index-usage /data/mysql/mysql-slow.log –host=localhost –user=root –password=xxx –no-report –create-save-results-database

      –no-report –create-save-results-database 禁用报告并将结果保存到数据库,以便稍后进行分析
    2. pt-visual-explain
      功能:
      格式化 explain 出来的执行计划按照 tree 方式输出,方便阅读。
      使用: (如果给定文件,则从文件中读取输入。没有文件,读取标准输入。)

      pt-visual-explain [OPTIONS] [FILES]

      示例:

      pt-visual-explain –connect /demo.txt –user=xxx –password=xxx –database=wx

      pt-visual-explain
      demo.txt文件
      demo.txt
  3. 配置类工具
    1. pt-config-diff
      功能:比较 mysql 配置文件和服务器参数
      使用:

      pt-config-diff [OPTIONS] CONFIG CONFIG [CONFIG…]

      CONFIG 可以是文件也可以是数据源名称,最少必须指定两个配置文
      件源,就像 unix 下面的 diff 命令一样,如果配置完全一样就不会输
      出任何东西。
      示例:

      // 查看本地和远程服务器的配置文件差异
      pt-config-diff h=localhost h=122.114.247.118 –user=xxx –password=xxx
      // 比较本地配置文件和远程服务器的差异
      pt-config-diff /etc/my.cnf h=122.114.247.118 –user=xxx –password=xxx

      pt-config-diff
    2. pt-variable-advisor
      功能: 分析MySQL变量,并就可能出现的问题提供建议。
      使用: 根据预先定义的规则检查 show variables 中的配置错误的设置
      和值。

      pt-variable-advisor [OPTIONS] [DSN]

      示例:

      // 从 localhost 获取变量值
      pt-variable-advisor –user=xxx –password=xxx localhost
      // 从指定的文件中读取配置
      pt-variable-advisor –user=xxx –password=xxx –source-of-variables /etc/my.cnf

      pt-variable-advisor
  4. 监控类工具

    1. pt-deadlock-logger
      功能:
      死锁是指两个或则多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,而导致恶性循环的现象;当产生死锁的时候,MySQL会回滚一个小事务的SQL,确保另一个完成。上面是死锁的概念,而在MySQL中innodb会出现死锁的情况,但是查看死锁却很不“智能”。只能通过 show engine innodb status 查看,但只保留最后一个死锁的信息,之前产生的死锁都被刷掉了。pt-deadlock-logger却很容易做到记录。
      pt-deadlock-logger在给定的DSN上,记录MySQL死锁的信息。 显示指定的DSN的死锁日志信息,他能够标准输出到屏幕也可以把信息写日志文件中(–log参数)甚至可以保留到指定的表中(–dest参数),该工具默认是永久执行,除非指定–run-time 或 –iterations 。
      使用:
      pt-deadlock-logger [OPTIONS] DSN
      
      收集和保存 mysql 上最近的死锁信息,可以直接打印死锁信息和存储 死锁信息到数据库中,死锁信息包括发生死锁的服务器、最近发生死 锁的时间、死锁线程 id、死锁的事务 id、发生死锁时事务执行了多长 时间等等非常多的信息。 示例:
      pt-deadlock-logger --ask-pass --create-dest-table --dest D=wx,t=deadlocks u=root,P=3306,h=localhost
      
    2. pt-mext
      功能:并行查看 SHOW GLOBAL STATUS 的多个样本的信息。
      使用:

      pt-mext [OPTIONS] – COMMAND

      pt-mext 执行你指定的 COMMAND,并每次读取一行结果,把
      空行分割的内容保存到一个一个的临时文件中,最后结合这些临时文
      件并行查看结果。
      示例:

      pt-mext – mysqladmin ext -uxxx -pxxx -i10 -c3

      pt-mext
  5. 复制类工具

    1. pt-heartbeat
      功能:监控MySQL复制延迟。众所周知,传统的通过show slave status\G命令中的Seconds_Behind_Master值来判断主从延迟并不靠谱。
      pt-heartbeat的思路比较巧妙,它在master中插入一条带有当前时间(MySQL中的now()函数)的记录到心跳表中,然后,该记录会复制到slave中。slave根据当前的系统时间戳(Perl中的time函数)减去heartbeat表中的记录值来判断主从的延迟情况。
      使用:

      pt-heartbeat [OPTIONS] [DSN] --update|--monitor|--check|--stop
      
      示例:
      // 创建一个后台进程定期更新主上的 test 库的 heartbeat 表,默认是 1s,可以--interval 指定,执行后会成一个 heartbeat 表,test库为我监控的同步库
      pt-heartbeat -D test --update --user=root --password=xxx -h101.200.186.40 --create-table --daemonize
      
      执行后查看数据库,已存在test库、heartbeat表、以及一条记录 ![pt-heartbeat](./percona-toolkit初探采坑记/pt-heartbeat-0.jpg)
      // 监控复制在 slave 上的落后程度(会一直监控)
      pt-heartbeat -D test --monitor --user=root -h47.94.238.24
      // 监控复制在 slave 上的落后程度(监控一次退出)
      
      
    2. pt-slave-delay
      功能:设置从服务器落后于主服务器指定时间。
      使用:
      pt-slave-delay [OPTIONS] SLAVE_DSN [MASTER_DSN]
      
      通过启动和停止复制 sql 线程来设置从落后于主指定时间。默 认是基于从上 relay 日志的二进制日志的位置来判断,因此不需要连 接到主服务器,如果 IO 进程不落后主服务器太多的话,这个检查方 式工作很好,如果网络通畅的话,一般 IO 线程落后主通常都是毫秒 级别。一般是通过--delay and --delay"+"--interval 来控制。--interval 是 指定检查是否启动或者停止从上 sql 线程的频繁度,默认的是 1 分钟 检查一次。 示例:
      // 使从落后主 1 分钟,并每隔 1 分钟检测一次,运行 10 分钟
      pt-slave-delay --user=xxx --password=xxx --delay 1m --run-time 10m --host=192.168.3.92  
      // :使从落后主 1 分钟,并每隔 15 秒钟检测一次,运行 10 分钟
      pt-slave-delay --user=xxx --password=xxx --delay 1m --interval 15s --run-time 10m --host=192.168.3.92
      
    3. pt-slave-find
      功能:查找和打印 mysql 所有从服务器复制层级关系
      使用:
      pt-slave-find [OPTIONS] [DSN]
      
      连接 mysql 主服务器并查找其所有的从,然后打印出所有从服 务器的层级关系。 示例:
      // 查找主服务器为192.168.3.135的mysql有所有从的层级关系
      pt-slave-find --user=xxx --password=xxx --host=192.168.3.17
      
    4. pt-slave-restart
      功能:监视 mysql 复制错误,并且当复制停止的时候尝试重启 mysql 复制
      使用:
      pt-slave-restart [OPTIONS] [DSN]
      
      示例:
      // 监视 192.168.1.17 的从,跳过错误代码为 1062 的错误
      pt-slave-restart --user=xxx --password=xxx --host=192.168.1.17 --error-numbers=1062
      
    5. pt-table-checksum
      功能:
      验证MySQL复制的完整性。在主上执行检查语句在线检查 mysql 复
      制的一致性,生成 replace 语句,然后通过复制传递到从,再通过
      update 更新 master_src 的值。通过检测从上 this_src 和 master_src 的
      值从而判断复制是否一致。
      注意:
      使用的时候选择业务地峰的时候运行,因为运行的时候会造成
      表的部分记录锁定。使用–max-load 来指定最大的负载情况,如果达
      到那个负载这个暂停运行。如果发现有不一致的数据,可以使用
      pt-table-sync 工具来修复。
      使用:
      pt-table-checksum [OPTIONS] [DSN]
      
      示例:
      pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --create-replicate-table --host=192.168.1.17 --port 3306 -uroot -pxxx
      
    6. pt-table-sync
      功能:同步MySQL表数据
      使用:
      pt-table-sync [OPTIONS] DSN [DSN]
      
      总是在主上执行数据的更改,再同步到从上,不会直接更改成 从的数据,在主上执行更改是基于主上现在的数据,不会更改主上的 数据。注意使用之前先备份你的数据,避免造成数据的丢失.执行 execute 之前最好先换成--print 或--dry-run 查看一下会变更哪些数据。 示例:
      pt-table-sync --execute --user=xxx --password=xxx h=192.168.1.17,D=wx,t=wx_admin_log h=192.168.1.22
      
  6. 系统类工具
    1. pt-diskstats
      功能:一个用于GNU/Linux的交互式I/O监控工具。
      使用:
      pt-diskstats [OPTIONS] [FILES]
      
      为 GUN/LINUX 打印磁盘 io 统计信息,和 iostat(可以给我们提供丰富的IO状态数据) 有点像,但是这个工具是交互式并且比 iostat 更详细。可以分析从远程机器收集的数据。 示例:
      // 查看本机所有的磁盘的状态情况
      pt-diskstats
      // 只查看本机 dv2 磁盘的状态情况
      pt-diskstats --devices-regex xvda1
      
  7. 实用类工具

    1. pt-archiver
      功能:将 mysql 数据库中表的记录归档到另外一个表或者文件,也可以直接进行记录的删除操作。
      使用:


      pt-archiver [OPTIONS] –source DSN –where WHERE

      这个工具只是归档旧的数据,不会对线上数据的 OLTP 查询造成太大
      影响,你可以将数据插入另外一台服务器的其他表中,也可以写入到
      一个文件中,方便使用 load data infile 命令导入数据。另外你还可以用它来执行 delete 操作。这个工具默认的会删除源中的数据。使用
      的时候请注意。
      示例:

      // 全表归档,不删除原表数据,非批量插入
      pt-archiver –source h=101.200.186.40,P=3306,u=root,p=’xxx’,D=yfch,t=admin_log –dest h=122.114.247.118,P=3306,u=root,p=’xxx’,D=yfch,t=admin_log –charset=UTF8 –where ‘1=1’ –progress 10000 –limit=10000 –txn-size 10000 –statistics –no-delete

      如图所示:
      pt-archiver

      // 全表归档,不删除原表数据,批量插入
      pt-archiver –source h=101.200.186.40,P=3306,u=root,p=‘xxx’,D=yfch,t=admin_log –dest h=122.114.247.118,P=3306,u=root,p=‘xxx’,D=yfch,t=admin_log –charset=UTF8 –where ‘1=1’ –progress 10000 –limit=10000 –txn-size 10000 –bulk-insert –bulk-delete –statistics –no-delete

      如图所示:
      pt-archiver-1

      // 全表归档,删除原表数据,非批量插入,非批量删除
      pt-archiver –source h=101.200.186.40,P=3306,u=root,p=‘xxx’,D=yfch,t=admin_log –dest h=122.114.247.118,P=3306,u=root,p=‘xxx’,D=yfch,t=admin_log –charset=UTF8 –where ‘id<100’ –progress 10000 –limit=10000 –txn-size 10000 –statistics –purge

      如图所示:
      pt-archiver-2

      // 全表归档,删除原表数据,批量插入,批量删除
      pt-archiver –source h=101.200.186.40,P=3306,u=root,p=’xxx’,D=yfch,t=admin_log –dest h=122.114.247.118,P=3306,u=root,p=’xxx’,D=yfch,t=admin_log –charset=UTF8 –where ‘id>99’ –progress 10000 –limit=10000 –txn-size 10000 –bulk-insert –bulk-delete –statistics –purge

      如图所示:
      pt-archiver-3

      // 导出数据到归档文件,不删除源数据
      pt-archiver –source h=101.200.186.40,u=root,p=xxx,P=3306,D=yfch,t=admin_log –file ‘/arch/admin_log.log’ –progress 5000 –where ‘id>100’ –no-delete –statistics –charset=UTF8 –limit=10000 –txn-size 1000
      // 导出数据到归档文件,删除源数据
      pt-archiver –source h=101.200.186.40,u=root,p=xxx,P=3306,D=yfch,t=admin_log –file ‘/arch/admin_log.log’ –progress 5000 –where ‘id>80’ –statistics –charset=UTF8 –limit=10000 –txn-size 1000 –purge

      如图所示:
      pt-archiver-5
      –purge:删除source数据库的相关匹配记录
      –statistics:结束的时候给出统计信息
      –bulk–delete: 批量删除source上的旧数据
      –bulk-insert: 批量插入数据到dest服务器主机
      –txn-size 10000: 设置10000行作为一个事务提交一次
      –limit=10000: 每次处理的数据量
      –progress 10000: 没处理5000行输出一次处理信息
      –no-delete: 不删除旧数据

    2. pt-find
      功能:查找MySQL表并执行操作,和 gnu 的 find 命令类似。
      使用:


      pt-find [OPTIONS] [DATABASES]

      示例:

      // 查找 本机localhost 中 1 天以前创建的 InnoDB 的表 ,并打印。
      pt-find –ctime +1 –host=localhost –engine InnoDB –user=root –password=xxx

      pt-find

    3. pt-kill
      功能:杀掉符合指定条件 mysql 语句
      使用:
      pt-kill [OPTIONS] [DSN]
      
      pt-kill杀死MySQL连接。如果没有文件,pt-kill连接到MySQL并从SHOW PROCESSLIST获取查询。另外,它从一个或多个文件读取查询,其中包含SHOW PROCESSLIST的输出。如果文件是-,pt-kill从STDIN读取 示例:
      // 查找并打印本机运行时间超过5s的语句
      pt-kill --busy-time 5 --print --host=localhost --user=root --password=xxx
      // 查找并杀掉本机运行时间超过5s的语句
      pt-kill --busy-time 5 --kill --host=localhost --user=root --password=xxx
      // 从 proccesslist 文件中查找执行时间超过 5s 的语句
      mysql -hlocalhost -uroot -pxxx  -e "show processlist" > processlist.txt
      pt-kill --test-matching processlist.txt --busy-time 5 --print
      
chosen1cwp wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!