Percona Toolkit

Percona Toolkit

一、Percona Toolkit 简介

percona-toolkit 是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的 mysql 任务和系统任务,这些任务包括:

  1. 检查 master 和 slave 数据的一致性——复制类工具
  2. 有效地对记录进行归档——实用类工具
  3. 查找重复的索引——开发类工具
  4. 对服务器信息进行汇总——配置类工具
  5. 分析来自日志和 tcpdump 的查询——监控类工具
  6. 当系统出问题的时候收集重要的系统信息——系统类工具
  7. 七类:开发类、性能类、监控类、配置类、复制类、系统类、实用类

二、Percona Toolkit 安装

环境架构: Centos 5.5 64 BIT

1、rpm 安装方式

rpm  -ivh  perl-TermReadKey-2.30-1.el5.rf.x86_64.rpm 
rpm  -ivh  percona-toolkit-2.1.1-1.noarch.rpm 
注意:需要安装 Term::ReadKey 包,否则会报 perl(Term::ReadKey) >= 2.10 is needed by percona-toolkit-2.1.1-1.noarch 错误
因为:PT工具是使用Perl语言编写和执行的,所以需要系统中有Perl环境
 
2、percona-toolkit 的编译安装方
tar  xzvf  percona-toolkit-2.1.1.tar.gz 
cd  percona-toolkit-2.1.1 
perl  Makefile.PL 
make 
make  test 
make  install 

三、Percona Toolkit 使用

1、开发类工具

  • pt-duplicate-key-checker
    • 功能:为从 mysql 表中找出重复的索引和外键,这个工具会将重复的索引和外键都列出来,并生成了删除重复索引的语句非常方便
    • 使用示例:pt-duplicate-key-checker [OPTION...] [DSN]DNS 为数据库或者表
    • pt-duplicate-key-checker --host=localhost --user=root --password=zhang@123 --databases=test 
      
  • pt-online-schema-change

    • 功能:为在 alter 作更改表结的时候不用定表,也就说执alter 的时候不会阻塞写和读取操作注意执行这个工具的时候必须做好备份
    • 工作原理:是创建一个和你要执行 alter 操作的表一样的空表结构,执行表结构修改,然后从原表中 copy 原始数据到表结构修改后的表,当数据 copy成以后就会将原表移走,用新表代替原表,默认动作是将原表 drop copy 数据的过程中,任何在原表的更新操作都会更新到新表,因为这个工具在会在原表上创建触发器触发器会将在原表上更新的内容更新到新表。如果表中已经定义了触发器,这个工具就不能工作了
    • 使用说明:pt-online-schema-change [OPTIONS] DSN:--dry-run 这个参数不建立触发器,不拷贝数据,也不会替换原表,只是创建和更改新表;--execute 这个参数的作用和前面工作原理的介绍的一样,会建立触发器,来保证最新变更的数据会影响至新表
    • 使用示例:
    • # 在线更改表的的引擎
      pt-online-schema-change  --user=root  --password=zhang@123  --host=localhost  --lock-wait-time=120  --alter="ENGINE=InnoDB"  D=test,t=oss_pvinfo2 --execute 
      # 大表添加字段的
      pt-online-schema-change  --user=root  --password=zhang@123  --host=localhost --lock-wait-time=120  --alter="ADD  COLUMN  domain_id  INT" D=test,t=oss_pvinfo2  --execute 
      
  • pt-query-advisor
    • 根据一些规则分析查询语句,可能的问题提出建议。那些查询语句可以来自慢查询文件、general日志文件或者使用 pt-query-digest 截获的查询语句
    • 用法:
      • pt-query-advisor /path/to/slow-query.log
      • pt-query-advisor --type genlog mysql.log
      • pt-query-digest --type tcpdump.txt --print --no-report | pt-query-advisor
    • 使用示例:
    • # 分析一个语句的例子
      pt-query-advisor --query "select * from aaa"
      #分析 general log 中的查询语句的例子
      pt-query-advisor /data/dbdata/general.log 
      #分析慢查询(slow,log)中的查询语句的例子
      pt-query-advisor /data/dbdata/localhost-slow.log
      
  • pt-show-grants
    • 功能:规范化和打印 mysql 权限,让你在复制、比较 mysql 权限以及进行版本控制的时候更有效
    • 用法介绍:
      • pt-show-grants [OPTION...] [DSN]
    • 使用示例:
    • # 查看指定 mysql 的所有用户权限
      pt-show-grants --host='localhost' --user='root' --password='zhang@123'
      #查看执行数据库的权限
      pt-show-grants  --host='localhost'  --user='root'  --password='zhang@123' --database='hostsops'
      #查看每个用户权限生成 revoke 收回权限的语句
      pt-show-grants --host='localhost' --user='root' --password='zhang@123' --revoke 
      
  • pt-upgrade

    • 功能:在多台服务器上执行查询,并比较有什么不同!这在升级服务器的时候非常有用,可以先安装并导数据到新的服务器上,然后使用这个工具跑一下sql 看看有什么不同,可以找出不同版本之间的差异。
    • 用法:pt-upgrade [OPTION...] DSN [DSN...] [FILE]——比较文件中每一个查询语句在两个主机上执行的结果,并检查在每个服务器上执行的结果、错误和警告!
    • 使用示例:
    • # 只查看某个sql 在两个服务器的运行结果
      pt-upgrade  h='localhost'  h=192.168.3.92  --user=root  --password=zhang@123  --query="select  *  from  user_data.collect_data  limit  5"
      # 查看文件中的对应sql 在两个服务器的运行结果
      pt-upgrade  h='localhost'  h=192.168.3.92  --user=root  --password=zhang@123    aaa.sql 
      #查看慢查询、compare的类型—主要包含三个query_times,results,warnings
      pt-upgrade  h='localhost'  h=192.168.3.92  --user=root  --password=zhang@123    slow.log 
      pt-upgrade  h=192.168.3.91  h=192.168.3.92  --user=root  --password=zhang@123  --query="select  *  from  user_data.collect_data"  --compare  query_times 
      

2、性能类工具

  • pt-index-usage
    • 功能:log 文件中读取插叙语句,并用explain 分析他们是如何利用索引。完成分析之后会生成一份关于索引没有被查询使用过的报告
    • 用法介绍:pt-index-usage [OPTION...] [FILE...]——可以直接从慢查询中获取sqlFILE 文件中的sql格式必须和慢查询是一致。如果不是一直需要用pt-query-digest转换一下,也可以不生成报告直接保存到数据库中。
    • 使用示例:
    • # 从满查询中的sql 查看索引使用情况
      pt-index-usage  /data/dbdata/localhost-slow.log  --host=localhost  --user=root  --password=zhang@123
      # 并将分析结构保存到数据库(使用--create-save-results-database会自动生成数据库和表来保存结果)
      pt-index-usage  /data/dbdata/localhost-slow.log  --host=localhost  --user=root  --password=zhang@123    --no-report  --create-save-results-database 
      
  • pt-pmp
    • 功能:为查询程序执行聚合的GDB堆栈跟踪,先进性堆栈跟踪,然后将跟踪信息汇总。
    • 用法介绍:pt-pmp [OPTIONS] [FILES]
    • 使用示例:
    • pt-pmp  -p  21933 
      pt-pmp  -b  /usr/local/mysql/bin/mysqld_safe 
      
  • pt-visual-explain
    • 功能:格式化explain 出来的执行计划按照tree方式输出,方便阅读
    • 用法介绍:pt-visual-explain [OPTION...] [FILE...]
    • 使用示例:
    • # 查看包含explain 结果的aaa 文件
      pt-visual-explain    aaa
      # 查看包含查询语句的aaa 文件
      pt-visual-explain  --connect  aaa  --user=root  --password=zhang@123
      # 通过管道直接查看explain 输出结果
      mysql  -uroot  -pzhang@123    -e  "explain  select  email  from  test.collect_data  where  id=101992419"  | pt-visual-explain 
      

3、配置类工具

  • pt-config-dif
    • 功能:比较mysql 配置文件和服务器参数
    • 用法:pt-config-diff [OPTION...] CONFIG CONFIG [CONFIG...]
    • 使用示例:
    • # 查看本地和远程服务器的配置文件差异
      pt-config-diff  h=localhost  h=192.168.3.92  --user=root  --password=zhang@123
      #比较本地配置文件和远程服务器
      pt-config-diff  /etc/my.cnf  h=192.168.3.92  --user=root  --password=zhang@123
      #比较本地两个配置文件
      pt-config-diff  /usr/local/mysql/share/mysql/my-large.cnf    /usr/local/mysql/share/mysql/my-medium.cnf 
      
  • pt-mysql-summary
    • 功能:精细地对mysql的配置和status信息进行汇总
    • 原理::连接 mysql 后查询出 status 和配置信息保存到临时目录中,然后用 awk 和其他的脚本工具进行格式化
    • 使用示例:
    • # 汇总本地 mysql 服务器的 status 和配置信息
      pt-mysql-summary  --  --user=root  --password=zhang@123  --host=localhost 
      # 汇总服务器 192.168.3.92的 status 和配置信息
      pt-mysql-summary  --  --user=root  --password=zhang@123  --host=192.168.3.92 
      
  • pt-variable-advisor

    • 功能:分析 mysql 的参数变量,并对可能存在的问题提出建议
    • 原理:根据预先定义的规则检查 show variables 中的配置错误的设置和值
    • 使用示例:
    • # 从 localhost 获取变量值
      pt-variable-advisor --user=root --password=zhang@123    localhost
      # 从指定的文件中读取配置,这个有格式要求
      pt-variable-advisor  --user=root  --password=zhang@123   --source-of-variables my.cnf     
      

4、监控类工具

  • pt-deadlock-logger
    • 功能:提取和记录 mysql 死锁的相关信息
    • 用法介绍:pt-deadlock-logger [OPTION...] SOURCE_DSN
    • 详细:收集和保存 mysql 上最近的死锁信息,可以直接打印死锁信息和存储死锁信息到数据库中,死锁信息包括发生死锁的服务最近发生锁的时间死锁线程 id死锁的事务 id发生死锁时事务执行了多长时间等等非常多的信
    • 使用示例:
    • # 打印本地 mysql 的死锁信息
      pt-deadlock-logger    --user=root  --password=zhang@123  h=localhost  –print 
      # 将本地的 mysql 死锁信息记录到数据库的表中,也打印出来
      pt-deadlock-logger    --user=root  --password=zhang@123  h=localhost --print  D=test,t=deadlocks 
      
  • pt-fk-error-logger
    • 功能:提取和记录 mysql 外键错误信息
    • 用法介绍:pt-fk-error-logger [OPTION...] SOURCE_DSN
    • 详细:通过 SHOW INNODB STATUS 提取和保存 mysql 数据库最近发生的外键错误信息。可以通过参数控制直接打印错误信息或者将错误信息存储到数据库的表
    • 使用示例:
    • # 我在服务器上运行的时候一直报如下错误
      Use  of  uninitialized  value  in  concatenation  (.)  or  string  at  /usr/bin/pt-fk-error-logger  line  2045 
      
  • pt-mext
    • 并行查看 SHOW GLOBAL STATUS 的多个样本的信息
    • pt-mext [OPTIONS] -- COMMAND
    • 原理:pt-mext 执行你指定 COMMAND,并每次读取一行结果,把空行分割的内容保存到一个一个的临时文件中,最后结合这些临时文件并行查看结果
    • 使用示例:
    • # 每隔 10s 执行一次 SHOW GLOBAL STATUS,并将结果合并到一起查看
      pt-mext    --  mysqladmin  ext  -uroot  -pzhang@123    -i10  -c3 
      
  • pt-query-digest
    • 分析查询执行日志,并产生一个查询报告,为 MySQL、PostgreSQLmemcached 过滤、重放或者转换语句
    • pt-query-digest [OPTION...] [FILE]
    • 使用示例:
    • # 分析本地的慢查询文件
      pt-query-digest  --user=root  --password=zhang@123  /data/dbdata/localhost-slow.log 
      # 重新回顾满查询日志,并将结果保存到 query_review 中,注意 query_review 表的表结构必须先建好
      CREATE  TABLE  query_review  ( 
         checksum          BIGINT  UNSIGNED  NOT  NULL  PRIMARY  KEY, 
         fingerprint    TEXT  NOT  NULL, 
         sample              TEXT  NOT  NULL, 
         first_seen      DATETIME, 
         last_seen        DATETIME, 
         reviewed_by    VARCHAR(20), 
         reviewed_on    DATETIME, 
         comments          TEXT 
      ); 
      pt-query-digest  --user=root  --password=zhang@123  --review  h=localhost,D=test,t=query_review  /data/dbdata/localhost-slow.log 
      

  • # Column        Meaning
    # Rank          The query's rank within the entire set of queries analyzed
    # Query ID      The query's fingerprint
    # Response time The total response time, and percentage of overall total
    # Calls         The number of times this query was executed
    # R/Call        The mean response time per execution
    # V/M           The Variance-to-mean ratio of response time
    # Item          The distilled query
    
  • pt-trend
    • 居于一组时间序列的数据点做统计
    • pt-trend [OPTION...] [FILE ...]
    • 读取一个慢查询日志,并输出统计信息。也可以指定多个文件。如果不指定文件的话直接从标准输入中读取信息
    • 使用示例:
    • # 读取本地慢查询日志并输出统计信息
      pt-trend  /data/dbdata/localhost-slow.log 
      

5、复制类工具

  • pt-heartbeat
    • 监控 mysql 复制延迟
    • pt-heartbeat [OPTION...] [DSN] --update|--monitor|--check|--stop
    • 测量复制落后主 mysql 或者主 PostgreSQL 少时间,可以使用这个脚本去更新主或者监控复制
    • pt-heartbeat 通过真实的复制数据来确认 mysql postgresql复制延迟,这个避免了对复制机的依赖,从而能得出准确的落后复制时间。包含两部分:第一部分在主 pt-heartbeat --update 线程会在指定的时间间隔更新一个时间戳,第二部分是 pt-heartbeat --monitor 线程或者--check 线程连接到从上检查复制的心跳记录(前
      面更新的时间戳),并和当前系统时间进行比较,得出时间的差异。可以手工创建 heartbeat 表或者添加--create-table 参数,推荐使用MEMORY 引擎。
    • # MEMORY表结构
      CREATE  TABLE  heartbeat  ( 
        ts                            varchar(26)  NOT  NULL, 
        server_id                int  unsigned  NOT  NULL  PRIMARY  KEY, 
        file                          varchar(255)  DEFAULT  NULL,        --  SHOW  MASTER  STATUS 
        position                  bigint  unsigned  DEFAULT  NULL,  --  SHOW  MASTER  STATUS 
        relay_master_log_file  varchar(255)  DEFAULT  NULL,        --  SHOW  SLAVE  STATUS 
        exec_master_log_pos    bigint  unsigned  DEFAULT  NULL    --  SHOW  SLAVE  STATUS 
      ); 
      
    • 使用示例:
    • # 创建一个后台进程定期更新主上的 test 库的 heartbeat 表()默认是 1s,可以--interval 指定,执行后会成一个 heartbeat 表,test库为我监控的同步库
      pt-heartbeat  -D  test  --update  --user=root  --password=zhang@123  -h192.168.3.135  --create-table  –daemonize 
      # 监控复制在 slave 上的落后程度(会一直监控)
      pt-heartbeat  -D  test  --monitor  --user=root  --password=zhang@123  -h192.168.3.92
      # 监控复制在 slave 上的落后程度(监控一次退出)
      pt-heartbeat  -D  test  --check  --user=root  --password=zhang@123  -h192.168.3.92
      # 监控 PostgreSQL 需要添加--dbi-driver Pg
      pt-heartbeat  -D  test  --check  --user=root  --password=zhang@123  -h192.168.3.92  --dbi-driver  Pg  
      
  • pt-slave-delay
    • 设置从服务器落后于主服务器指定时间

    • pt-slave-delay [OPTION...] SLAVE-HOST [MASTER-HOST]
    • 原理:通过启动和停止复制 sql 线程来设置从落后于主指定时间认是基于从上 relay 日志的二进制日志的位置来判断,因此不需要连接到主服务器,如果 IO 进程不落后主服务器太多的话,这个检查方式工作很好,如果网络通畅的话,一般 IO 线程落后主通常都是毫秒级别。一般是通过--delay and --delay"+"--interval 来控制。--interval 指定检查是否启动或者停止从上 sql 线程的频繁度默认的是 1 分钟检查一次
    • 使用示例:
    • # 使从落后主 1 分钟,并每隔 1 分钟检测一次,运行 10 分钟
      # 如果不加--run-time 参数会一直执行
      pt-slave-delay  --user=root  --password=zhang@123  --delay  1m  --run-time  10m  --host=192.168.3.92
      # 使从落后主 1 分钟,并每隔 15 秒钟检测一次,运行 10 分钟
      pt-slave-delay  --user=root  --password=zhang@123  --delay  1m  --interval  15s  --run-time  10m  --host=192.168.3.92 
      
  • pt-slave-find
    • 查找和打印mysql 所有从服务器复制层级关系
    • pt-slave-find [OPTION...] MASTER-HOST
    • 原理:连接mysql主服务器并查找其所有的从,然后打印出所有从服务器的层级关系
    • 使用示例:
    • # 查找主服务器为 192.168.3.135 的 mysql 有所有从的层级关系
      pt-slave-find  --user=root  --password=zhang@123  --host=192.168.3.135 
      
  • pt-slave-restart
    • 监视mysql 复制错误,并尝试重启mysql 复制当复制停止的时候
    • pt-slave-restart [OPTION...] [DSN]
    • 监视一个或者多个mysql 复制错误,当从停止的时候尝试重新启动复制。你可以指定跳过的错误并运行从到指定的日志位置
    • # 监视 192.168.3.92 的从,跳过 1 个错误 
      pt-slave-restart  --user=root  --password=zhang@123  --host=192.168.3.92  --skip-count=1 
      # 监视 192.168.3.92 的从,跳过错误代码为 1062 的错误
      pt-slave-restart  --user=root  --password=zhang@123  --host=192.168.3.92  --error-numbers=1062 
      
  • pt-table-checksum
    • 检查mysql 复制一致性
    • pt-table-checksum [OPTION...] [DSN]
    • 原理:pt-table-checksum 在主上执行检查语句在线检查mysql 制的一致性,生成replace语句,然后通过复制传递到从,再通过update更新master_src的值。通过检测从上this_src master_src 值从而判断复制是否一致。注意:使用的时候选择业务地峰的时候运行,因为运行的时候会造成表的部分记录锁定。使用--max-load 来指定最大的负载情况,如果达到那个负载这个暂停运行。如果发现有不一致的数据,可以使用pt-table-sync 工具来修复。注意:和1.0 版本不同,新版本的pt-table-checksum 只需要在master上执行即可。通过 explain参数再结合二进制日志就可以看出脚本的工作原理,如我的test 库有一个名字为zhang的表,我们通过抓取二进制日志来查看脚本的原理。
    • REPLACE  INTO  `test`.`checksums`  (db,  tbl,  chunk,  chunk_index,  lowe
      r_boundary,  upper_boundary,  this_cnt,  this_crc)  SELECT  'test',  'zhan
      g',  '1',  NULL,  NULL,  NULL,  COUNT(*)  AS  cnt,  COALESCE(LOWER(CON
      V(BIT_XOR(CAST(CRC32(CONCAT_WS('#',  `id`,  `name`,  CONCAT(ISNULL
      (`name`))))  AS  UNSIGNED)),  10,  16)),  0)  AS  crc  FROM  `test`.`zhang`
        /*checksum  table*/; 
      UPDATE  `test`.`checksums`  SET  chunk_time  =  '0.000563',  master_crc
        =  '31012777',  master_cnt  =  '4'  WHERE  db  =  'test'  AND  tbl  =  'zha
      ng'  AND  chunk  =  '1' 
      
    • 使用示例:
    • # 比较 test 数据库同步是否一致,结果显示所有的表
      pt-table-checksum    --nocheck-replication-filters  --databases=test  --replicate=test.checksums  --create-replicate-table  --host=192.168.3.135
        --port  3306    -uroot  -pzhang@123
      # 第一次运行的时候需要添加--create-replicate-table 参数,如果不加这个就需要手工运行添加表结构的 SQL,表结构 SQL 如下
      CREATE  TABLE  checksums  ( 
         db                          char(64)          NOT  NULL, 
         tbl                        char(64)          NOT  NULL, 
         chunk                    int                    NOT  NULL, 
         chunk_time          float                        NULL, 
         chunk_index        varchar(200)      NULL, 
         lower_boundary  text                          NULL, 
         upper_boundary  text                          NULL, 
         this_crc              char(40)          NOT  NULL, 
         this_cnt              int                    NOT  NULL, 
         master_crc          char(40)                  NULL, 
         master_cnt          int                            NULL, 
         ts                          timestamp        NOT  NULL, 
         PRIMARY  KEY  (db,  tbl,  chunk), 
         INDEX  ts_db_tbl  (ts,  db,  tbl) 
      )  ENGINE=InnoDB; 
      # 之所以使用--nocheck-replication-filters 参数是因为我的 my.cnf 配置了replicate-ignore-db 和 replicate-wild-do-table 等参数。另外需要特别注意执行的 checksums 所在的数据库必须是同步的数据库。
      # 比较 test 数据库同步是否一致,结果只显示数据不一致的表(添加--replicate-check-only 参数即可)
      pt-table-checksum    --nocheck-replication-filters  --databases=test  --replicate=test.checksums  --replicate-check-only  --lock-wait-timeout=120
        --host=192.168.3.135    --port  3306    --user=root  --password=zhang@123 
      
  • pt-table-sync
    • 高效同步mysql 表的数据
    • pt-table-sync [OPTION...] DSN [DSN...]
    • 原理:总是在主上执行数据的更改,再同步到从上,不会直接更改成从的数据,在主上执行更改是基于主上现在的数据,不会更改主上的数据。注意使用之前先备份你的数据,避免造成数据的丢失.执行execute之前最好先换成--print --dry-run查看一下会变更哪些数据.
    • # 同步 3.135 的 test 库的 aaa 表到 192.168.3.92,在执行之前可以用--execute 参数换成--print 来查看会变更什么东西,后面那个主机必须是 master,否则会报错推出
      pt-table-sync  --execute  --user=root  --password=zhang@123  h=192.168.3.135,D=test,t=aaa  h=192.168.3.92 
      # 将主的 test 数据库同步到 192.168.3.92,使从上具有一样的数据
      pt-table-sync  --execute  --sync-to-master  --user=root  --password=zhang@123    h=192.168.3.92  --database  test 
      # 只同步指定的表 
      pt-table-sync  --execute  --sync-to-master  --user=root  --password=zhang@123    h=192.168.3.92  D=test,t=aaa 
      # 根据 pt-table-checksum 的结果进行数据同步
      pt-table-sync  --execute  --replicate  test.checksums  --user=root  --password=zhang@123    h=192.168.3.135
      # 根据 pt-table-checksum 使从的数据和主的数据一致
      pt-table-sync  --execute  --replicate  test.checksums  --user=root  --password=zhang@123  --sync-to-master  h=192.168.3.92  D=test,t=aaa 
      

6、系统类工具

  • pt-diskstats
    • 是一个对GUN/LINUX 的交互式监控工具
    • pt-diskstats [OPTION...] [FILES]
    • GUN/LINUX打印磁盘io统计信息,和iostat有点像,但是这个工具是交互式并且比iostat更详细。可以分析从远程机器收集的数据
    • # 查看本机所有的磁盘的状态情况
      pt-diskstats 
      # 只查看本机 sda2 磁盘的状态情况
      pt-diskstats  --devices-regex  sda2 
      
  • pt-fifo-split
    • 模拟切割文件并通过管道传递给先入先出队列而不用真正的切割文件
    • pt-fifo-split [options] [FILE ...]
    • pt-fifo-split 读取大文件中的数据并打印到fifo 文件,每次达到指定行数就往fifo文件中打印一个EOF 字符,读取完成以后,关闭掉fifo件并移走,然后重建fifo文件,打印更多的行。这样可以保证你每次读取的时候都能读取到制定的行数直到读取完成。注意此工具只能工作在类unix操作系统。这个程序对大文件的数据导入数据库非常有用。
    • # 一个每次读取一百万行记录的范例
      pt-fifo-split  --lines  1000000  hugefile.txt while  [  -e  /tmp/pt-fifo-split  ];  do  cat  /tmp/pt-fifo-split;  done
      # 一个每次读取一百万行,指定 fifo 文件为/tmp/my-fifo,并使用 load data 命令导入到 mysql 中
      pt-fifo-split  infile.txt  --fifo  /tmp/my-fifo  --lines  1000000
      while  [  -e  /tmp/my-fifo  ]; 
      do mysql  -e  "set  foreign_key_checks=0;  set  sql_log_bin=0;  set  unique_checks=0;  load  data  local  infile  '/tmp/my-fifo'  into  table  load_test  fields  terminated  by  '\t'  lines  terminated  by  '\n'  (col1,  col2);" 
      sleep  1;done 
      
  • pt-summary
    • 友好地收集和显示系统信息概况,此工具并不是一个调优或者诊断工具,这个工具会产生一个很容易进行比较和发送邮件的报告
    • pt-summary
    • 原理:此工具会运行和多命令去收集系统状态和配置信息,先保存到临时目录的文件中去,然后运行一些unix命令对这些结果做格式化,最好是用root 用户或者有权限的用户运行此命令
    • 使用示例:
    • # 查看本地系统信息概况
      pt-summary
      
  • pt-stalk
    • 出现问题的时候收集mysql 的用于诊断的数据
    • pt-stalk [OPTIONS] [-- MYSQL OPTIONS]
    • pt-stalk等待触发条件触发,然后收集数据帮助错误诊断,它被设计成使用root权限运行的守护进程,因此你可以诊断那些你不能直接观察的间歇性问题。默认的诊断触发条件为SHOW GLOBAL STATUS也可以指定processlist为诊断触发条件,使用--function 参数指定
    • # 指定诊断触发条件为 status,同时运行语句超过 20 的时候触发,收集的数据存放在/tmp/test 目录下
      pt-stalk    --function  status  --variable  Threads_running  --threshold  20 --dest  /tmp/test    --  -uroot  -pzhang@123    -h192.168.3.135 
      # 指定诊断触发条件为 processlist,超过 20 个状态为 statistics触发,收集的数据存放在/tmp/test 目录下
      pt-stalk    --function  processlist  --variable  State    --match  statistics  --threshold  20  --dest  /tmp/test  --  -uroot  -pzhang@123    -h192.168.3.135 
      

7、实用类工具

  • pt-archiver
    • mysql 数据库中表的记录归档到另外一个表或者文件,也可以直接进行记录的删除操作
    • pt-archiver [OPTION...] --source DSN --where WHERE
    • 这个工具只是归档旧的数据,不会对线上数据的OLTP 查询造成太大影响,你可以将数据插入另外一台服务器的其他表中,也可以写入到一个文件中,方便使用load data infile 命令导入数据。另外你还可以用它来执行delete操作。这个工具默认的会删除源中的数据
    • # 将 192.168.3.135 上的 sanmao 库的 oss_log 表 id 小于 100000的 记 录 转 移 到192.168.3.92 上的 sanmao 库 , 并 归 档 到oss_log_archive_20120605.log 文件中
      pt-archiver  --source  h=192.168.3.135,D=sanmao,t=oss_log  --user=root
        --password=zhang@123  --dest  h=192.168.3.92,D=sanmao,t=oss_log  --file  '/var/log/oss_log_archive_20120605.log'  --where  "id<=100000"   --commit-each 
      # 将 192.168.3.135 上的 sanmao 库的 oss_log 小于 160000 的记录归档到 oss_log_archive_20120607.log 文件
      pt-archiver  --source  h=192.168.3.135,D=sanmao,t=oss_log  --user=root
        --password=zhang@123  --file  '/var/log/oss_log_archive_20120607.log'  --where  "id<=160000"    --commit-each 
      # 删除 192.168.3.135 上的 sanmao 库的 oss_log 表中 id 小于167050 的记录
      pt-archiver  --source  h=192.168.3.135,D=sanmao,t=oss_log  --user=root
        --password=zhang@123  --purge  --where  'id<=167050' 
      # 注意:如果是字符集是 utf8 的话,需要在 my.cnf 中的[client]下面添加 default-character-set = utf8,否则导出的文件内容中文会乱码。
      
  • pt-find
    • 查找mysql 表并执行指定的命令,和gnufind命令类似
    • pt-find [OPTION...] [DATABASE...]   默认动作是打印数据库名和表名
    • # 查找 192.168.3.135 中 1 天以前创建的 InnoDB 的表  ,并打印
      pt-find  --ctime  +1    --host=192.168.3.135  --engine  InnoDB  --user=root  --password=zhang@123 
      # 查找 192.168.3.135 中 1 天以前更改过的数据库名字匹配%hostsops%的并且引擎为 MYISAM 的表,并将表的引擎更改为InnoDB 引擎
      pt-find  --mtime  +1  --dblike  hostsops  --engine  MyISAM  --host=192.168.3.135  --user=root  --password=zhang@123    --exec  "ALTER  TABLE  %D.%N  ENGINE=InnoDB" 
      # 查找 192.168.3.135 中 aaa 库和 zhang 库中的空表,并删除
      pt-find  --empty  aaa  zhang  --host=192.168.3.135  --user=root  --password=zhang@123    --exec-plus  "DROP  TABLE  %s" 
      # 查找 192.168.3.135 中超过 100M 的表
      pt-find  --tablesize  +100M  --host=192.168.3.135  --user=root  --password=zhang@123 
      
  • pt-kil
    • Kill掉符合指定条件mysql 语句
    • pt-kill [OPTIONS]
    • 假如没有指定文件的话pt-kill连接到mysql并通过SHOW PROCESSLIST找到指定的语句,反之pt-kill从包含SHOW PROCESSLIST 结果的文件中读取mysql 语句
    • # 查找 192.168.3.135 服务器运行时间超过 60s 的语句,并打印 
      pt-kill  --busy-time  60  --print  --host=192.168.3.135  --user=root  --password=zhang@123
      # 查找 192.168.3.135 服务器运行时间超过 60s 的语句,并 kill
      pt-kill  --busy-time  60  --kill  --host=192.168.3.135  --user=root  --password=zhang@123 
      # 从 proccesslist 文件中查找执行时间超过 60s 的语句
      mysql  -uroot  -pzhang@123  -h192.168.3.135  -e  "show  processlist"  >
        processlist.txt 
      pt-kill  --test-matching  processlist.txt  --busy-time  60  --print     
      

转载于: https://www.modb.pro/doc/1288

 

工具类别工具命令工具作用备注

开发类

pt-duplicate-key-checker列出并删除重复的索引和外键 

pt-online-schema-change在线修改表结构 

pt-query-advisor分析查询语句,并给出建议,有bug已废弃

pt-show-grants规范化和打印权限 

pt-upgrade在多个服务器上执行查询,并比较不同 

性能类

pt-index-usage分析日志中索引使用情况,并出报告 

pt-pmp为查询结果跟踪,并汇总跟踪结果 

pt-visual-explain格式化执行计划 

pt-table-usage分析日志中查询并分析表使用情况pt 2.2新增命令

配置类

pt-config-diff比较配置文件和参数 

pt-mysql-summary对mysql配置和status进行汇总 

pt-variable-advisor分析参数,并提出建议 

监控类

pt-deadlock-logger提取和记录mysql死锁信息 

pt-fk-error-logger提取和记录外键信息 

pt-mext并行查看status样本信息 

pt-query-digest分析查询日志,并产生报告常用命令

pt-trend按照时间段读取slow日志信息已废弃

复制类

pt-heartbeat监控mysql复制延迟 

pt-slave-delay设定从落后主的时间 

pt-slave-find查找和打印所有mysql复制层级关系 

pt-slave-restart监控salve错误,并尝试重启salve 

pt-table-checksum校验主从复制一致性 

pt-table-sync高效同步表数据 

系统类

pt-diskstats查看系统磁盘状态 

pt-fifo-split模拟切割文件并输出 

pt-summary收集和显示系统概况 

pt-stalk出现问题时,收集诊断数据 

pt-sift浏览由pt-stalk创建的文件pt 2.2新增命令

pt-ioprofile查询进程IO并打印一个IO活动表pt 2.2新增命令

实用类

pt-archiver将表数据归档到另一个表或文件中 

pt-find查找表并执行命令 

pt-killKill掉符合条件的sql常用命令

pt-align对齐其他工具的输出pt 2.2新增命令

pt-fingerprint将查询转成密文pt 2.2新增命令

posted @ 2020-03-07 15:38  石斛  阅读(582)  评论(0编辑  收藏  举报