Percona工具的使用

开发类工具:
pt-duplicate-key-checker
功能介绍:
从mysql表 中找出重复的索引和外键,这个工具会将重复的索引和外键都列出来,并生成了删除重复索引的语句,非常方便
用法:Pt-duplicate-key-checker[option…][DSN] DSN为数据库或者表。
使用示例:
查看test数据库重复的索引和外键的使用情况的命令:
Pt_duplicate_ket_checker  --host=localhost –user=root –password=123456 –database=test
参数说明: 
--all-structs:
结构(B树,哈希等)的索引,默认情况下是禁止的。因为BTREE索引可能会覆盖作为FULLTEXT索引的列,其实他们不是真正
的重复,因为是不同的索引结构。
--ask-pass
提示输入密码。
--charset
缩写-A,字符集设置:utf8,gbk,latin1 …
--[no]clustered 主键和第二索引一起是重复的,默认开启。检测时的非主键索引的多列索引的后缀是一个主键最左边的前缀,则作为一个重复键。如:
PRIMARY KEY  (`a`)
KEY `b` (`b`,`a`)
SELECT ... WHERE b=1 ORDER BY a;
如果按照这个工具去掉b索引,则会出现filesort,他给的意见是 留下b(b)单列索引,把order by a去掉,因为他们的结果是一样的,a是主键。
--config 
 读取该配置文件的列表。
--databases
只检查该列表中的数据库。
--defaults-file
缩写-F,读取Mysql的配置文件,需要绝对路径。
--engines
缩写-e,只检查该列表中指定的表的存储引擎。
--tables
缩写-t,只检查列表中指定的表。
--help
显示帮助
--host
缩写-h,连接到主机地址。
--ignore-databases
 跳过检查的某些数据库。
--ignore-engines
跳过检查的某些存储引擎。
--ignore-tables
 跳过检查某些表。
--ignore-order
加了这个参数会报: KEY(a,b)和 KEY(b,a) 是重复索引,默认关闭。
--key-types
检查索引的类型:f=foreignkeys, k=keys or fk=both,默认是fk。
--password
缩写-p,连接mysql时候的密码。
--user
缩写-u,连接mysql时候的用户
--pid
连接的PID
--port
缩写-P,连接时候的端口。
--socket
缩写-S,连接时候的套接字。
--[no]sql
打印出sql,如果有重复会答应出删除重复索引的sql。默认开启。
--[no]summary
打印出索引的统计信息。默认开启。
--verbose
缩写-v,打印出所有的索引信息,包括重复索引。
--version
打印版本信息。
 
 
列子说明:
create table a(id int primary key,name varchar(10),ageint);
1,create index idx_a on a(name);
2,create index idx_b on a(age);
3,create index idx_ab on a(name,age);--重复 和1
4,create index idx_p on a(age,id);   --重复和2
按理说只有2个重复的索引但是图出现了3个

打印出了索引的统计信息,还有删除重复索引的sql
为什么会把索引4都删除掉呢,原来是因为默认开启了--[no]clustered 参数。
去掉参数的话:显示2个。


pt-online-schema-change


功能介绍:


 功能为在alter操作更改表结构的时候不用锁定表,也就是说执行alter的时候不会阻塞写和读取操作,注意执行这个工具的时候必须做好备份,操作之前最好详细读一下官方文档


http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html


 


工作原理是创建一个和你要执行alter操作的表一样的空表结构,执行表结构修改,然后从原表中copy原始数据到表结构修改后的表,当数据copy完成以后就会将原表移走,用新表代替原表,默认动作是将原表drop掉。在copy数据的过程中,任何在原表的更新操作都会更新到新表,因为这个工具在会在原表上创建触发器,触发器会将在原表上更新的内容更新到新表。如果表中已经定义了触发器这个工具就不能工作了。


 


不锁表的情况下,修改表结构.该工具执行的基本流程如下:


 


判断各种参数


根据原表"t",创建一个名称为"_t_new"的新表


执行ALTER TABLE语句修改新表"_t_new"


创建3个触发器,名称格式为pt_osc_库名_表名_操作类型,比如


CREATE TRIGGER `pt_osc_dba_t_del` AFTER DELETE ON `dba`.`t` FOR EACH ROW DELETE IGNORE FROM `dba`.`_t_new` WHERE `dba`.`_t_new`.`id` <=> OLD.`id`


CREATE TRIGGER `pt_osc_dba_t_upd` AFTER UPDATE ON `dba`.`t` FOR EACH ROW REPLACE INTO `dba`.`_t_new` (`id`, `a`, `b`, `c1`) VALUES (NEW.`id`, NEW.`a`, NEW.`b`, NEW.`c1`)


CREATE TRIGGER `pt_osc_dba_t_ins` AFTER INSERT ON `dba`.`t` FOR EACH ROW REPLACE INTO `dba`.`_t_new` (`id`, `a`, `b`, `c1`) VALUES (NEW.`id`, NEW.`a`, NEW.`b`, NEW.`c1`)


开始复制数据,比如


INSERT LOW_PRIORITY IGNORE INTO `dba`.`_t_new` (`id`, `a`, `b`, `c1`) SELECT `id`, `a`, `b`, `c1` FROM `dba`.`t` LOCK IN SHARE MODE /*pt-online-schema-change 28014 copy table*/


复制完成后,交互原表和新表,执行RENAME命令, RENAME TABLE t to _t_old, _t_new to t;


删除老表,_t_old


删除触发器


修改完成


 


用法介绍:  pt-online-schema-change [OPTIONS] DSN  options可以自行查看helpDNS为你要操作的数据库和表。


这里有两个参数需要介绍一下:


--dry-run  这个参数不建立触发器,不拷贝数据,也不会替换原表。只是创建和更改新表。 


--execute  这个参数的作用和前面工作原理的介绍的一样,会建立触发器,来保证最新变更的数据会影响至新表。注意:如果不加这个参数,这个工具会在执行一些检查后退出。这一举措是为了让使用这充分了解了这个工具的原理,同时阅读了官方文档。


 


使用示例: 


 


范例1:在线更改表的的引擎,这个尤其在整理innodb表的时候非常有用,


示例如下:


pt-online-schema-change --user=root --password=123456 --host=localhost --lock-wait-time=120 --alter="ENGINE=InnoDB" D=test,t=oss_pvinfo2 --execute 


从下面的日志中可以看出它的执行过程:


Altering `test`.`oss_pvinfo2`...


Creating new table... 


Created new table test._oss_pvinfo2_new OK.


Altering new table...  Altered `test`.`_oss_pvinfo2_new` OK.


Creating triggers... Created triggers OK. 


Copying approximately 995696 rows... Copied rows OK.


Swapping tables... 


Swapped original and new tables OK.


Dropping old table... 


Dropped old table `test`.`_oss_pvinfo2_old` OK.


Dropping triggers... Dropped triggers OK.


Successfully altered `test`.`oss_pvinfo2`.


范例2:大表添加字段的,


语句如下


pt-online-schema-change --user=root --password=123456 --host=localhost --lock-wait-time=120 --alter="ADD COLUMN domain_id INT" D=test,t=oss_pvinfo2 –execute


 


pt-query-advisor:


功能介绍:  根据一些规则分析查询语句,对可能的问题提出建议,这些评判规则大家可以看一下官网的链接:


http://www.percona.com/doc/percona-toolkit/2.1/pt-query-advisor.html,这里就不详细列举了,那些查询语句可以来自慢查询文件、general日志文件或者使用pt-query-digest截获的查询语句。


目前这个版本有bug,当日志文件非常大的时候会需要很长时间甚至进入死循环。  用法介绍: 


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-show-grants:


功能介绍:范化和打印mysql权限,让你在复制、比较mysql权限以及进行版本控制的时候更有效率!


用法介绍:t-show-grants [OPTION...] [DSN]  选项自行用help查看,DSN选项也请查看help,选项区分大小写。


使用示例:看指定mysql的所有用户权限:


Pt-show-grants --host='localhost' --user='root' --password='123456'


查看执行数据库的权限:


t-show-grants -host='localhost' -user='root' --password='123456'  --database='hostsops' 


查看每个用户权限生成revoke收回权限的语句:


pt-show-grants --host='localhost' --user='root' --password='123456'  --revoke


pt-upgrade:


功能介绍:在多台服务器上执行查询,并比较有什么不同!这在升级服务器的时候非常有用,可以先安装并导数据到新的服务器上,然后使用这个工具跑一下sql看看有什么不同,可以找出不同版本之间的差异。


用法介绍:pt-upgrade [OPTION...] DSN [DSN...] [FILE]  比较文件中每一个查询语句在两个主机上执行的结果,并检查在每个服务器上执行的结果、错误和警告。


使用示例:


只查看某个sql在两个服务器的运行结果范例: 


pt-upgrade h='localhost' h=192.168.3.92 --user=root --password=123456 --query="select * from user_data.collect_data limit 5"


查看文件中的对应sql在两个服务器的运行结果范例:


pt-upgrade h='localhost' h=192.168.3.92 --user=root --password=123456  aaa.sql 


查看慢查询中的对应的查询SQL在两个服务器的运行结果范例:


pt-upgrade h='localhost' h=192.168.3.92 --user=root --password=123456  slow.log


此外还可以执行compare的类型,主要包含三个query_times,results,warnings,比如下面的例子,只比较sql的执行时间


pt-upgrade h=192.168.3.91 h=192.168.3.92 --user=root --password=123456 --query="select * from user_data.collect_data" --compare query_times


 


性能类工具:


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=123456 


将分析结果保存到数据库范例: 


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


使用--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...]


option请参阅官方网站,这里不一一例举!


使用示例:


查看包含explain结果的aaa文件的范例:


pt-visual-explain  aaa


查看包含查询语句的aaa文件的范例:


pt-visual-explain --connect aaa --user=root --password=123456


通过管道直接查看explain输出结果的范例:


mysql -uroot -p123456  -e "explain select email from test.collect_data where id=101992419" |pt-visual-explain


配置类工具:


pt-config-diff


功能介绍:


比较mysql配置文件和服务器参数


用法介绍:


pt-config-diff [OPTION...] CONFIG CONFIG [CONFIG...]


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


使用示例:


范例1:查看本地和远程服务器的配置文件差异:


pt-config-diff h=localhost h=192.168.3.92 --user=root --password=123456


比较出来内容如下:


22 config differences


Variable                  localhost.localdomain localhost.localdomain


========================= ===================== =====================


binlog_cache_size         8388608               2097152


have_ndbcluster           DISABLED              NO


innodb_additional_mem_... 16777216              33554432


innodb_buffer_pool_size   1677721600            1073741824


 


范例2:比较本地配置文件和远程服务器的差异:


pt-config-diff /etc/my.cnf h=192.168.3.92 --user=root --password=123456


比较出来内容如下:


12 config differences


Variable                  /etc/my.cnf localhost.localdomain


========================= =========== =====================


binlog_cache_size         8388608     2097152


binlog_format             mixed       MIXED


 


范例3:比较本地两个配置文件的差异:


pt-config-diffusr/local/mysql/share/mysql/my-large.cnf  /usr/local/mysql/share/mysql/my-medium.cnf


pt-mysql-summary


功能介绍:


精细地对mysql的配置和sataus信息进行汇总,汇总后你直接看一眼就能看明白。


用法介绍:


pt-mysql-summary [OPTIONS] [-- MYSQL OPTIONS]


工作原理:连接mysql后查询出status和配置信息保存到临时目录中,然后用awk和其他的脚本工具进行格式化。OPTIONS可以查阅官网的相关页面。


使用示例:


范例1:汇总本地mysql服务器的status和配置信息:


pt-mysql-summary -- --user=root --password=123456 --host=localhost


范例2:汇总本地mysql服务器192.168.3.92status和配置信息:


pt-mysql-summary -- --user=root --password=123456 --host=192.168.3.92


 


pt-variable-advisor


功能介绍:


分析mysql的参数变量,并对可能存在的问题提出建议


用法介绍:


pt-variable-advisor [OPTION...] [DSN]


原理:根据预先定义的规则检查show variables中的配置错误的设置和值。


使用示例:


范例1:从localhost获取变量值


pt-variable-advisor --user=root --password=123456  localhost


范例2:从指定的文件中读取配置,这个有格式要求


pt-variable-advisor --user=root --password=123456 --source-of-variables my.cnf


 


监控类工具:


pt-deadlock-logger


功能介绍:


提取和记录mysql死锁的相关信息


用法介绍:


pt-deadlock-logger [OPTION...] SOURCE_DSN


收集和保存mysql上最近的死锁信息,可以直接打印死锁信息和存储死锁信息到数据库中,死锁信息包括发生死锁的服务器、最近发生死锁的时间、死锁线程id、死锁的事务id、发生死锁时事务执行了多长时间等等非常多的信息。详情见下面的示例。


使用示例:


范例1:打印本地mysql的死锁信息


pt-deadlock-logger  --user=root --password=123456 h=localhost –print


范例2:将本地的mysql死锁信息记录到数据库的表中,也打印出来


pt-deadlock-logger  --user=root --password=123456 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,并每次读取一行结果,把空行分割的内容保存到一个一个的临时文件中,最后结合这些临时文件并行查看结果。


使用示例:


范例1:每隔10s执行一次SHOW GLOBAL STATUS,并将结果合并到一起查看


pt-mext  -- mysqladmin ext -uroot -p123456  -i10 -c3


 


pt-query-digest


功能介绍:


分析查询执行日志,并产生一个查询报告,为MySQLPostgreSQL memcached过滤、重放或者转换语句。


用法介绍:


pt-query-digest [OPTION...] [FILE]


解析和分析mysql日志文件


使用示例:


范例1:分析本地的慢查询文件


pt-query-digest --user=root --password=123456 /data/dbdata/localhost-slow.log


范例2:重新回顾满查询日志,并将结果保存到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=123456 --review h=localhost,D=test,t=query_review /data/dbdata/localhost-slow.log


 


pt-trend


功能介绍:


居于一组时间序列的数据点做统计。


用法介绍:


pt-trend [OPTION...] [FILE ...]


读取一个慢查询日志,并输出统计信息。也可以指定多个文件。如果不指定文件的话直接从标准输入中读取信息。


使用示例:


范例1:读取本地慢查询日志并输出统计信息


pt-trend /data/dbdata/localhost-slow.log


 


复制类工具:


pt-heartbeat


功能介绍:


监控mysql复制延迟


用法介绍:


pt-heartbeat [OPTION...] [DSN] --update|--monitor|--check|--stop


测量复制落后主mysql或者主PostgreSQL多少时间,你可以使用这个脚本去更新主或者监控复制,具体用法见后面的示例.


原理:pt-heartbeat通过真实的复制数据来确认mysqlpostgresql复制延迟,这个避免了对复制机制的依赖,从而能得出准确的落后复制时间,包含两部分:第一部分在主上pt-heartbeat--update线程会在指定的时间间隔更新一个时间戳,第二部分是pt-heartbeat--monitor线程或者--check线程连接到从上检查复制的心跳记录(前面更新的时间戳),并和当前系统时间进行比较,得出时间的差异。


你可以手工创建heartbeat表或者添加--create-table参数,推荐使用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


);


 


使用示例:


范例1:创建一个后台进程定期更新主上的test库的heartbeat表()默认是1s,可以--interval指定,执行后会成一个heartbeat表,test库为我监控的同步库:


pt-heartbeat -D test --update --user=root --password=123456 -h192.168.3.135 --create-table –daemonize


范例2:监控复制在slave上的落后程度(会一直监控):


pt-heartbeat -D test --monitor --user=root --password=123456 -h192.168.3.92


监控结果如下:


0.00s [  0.00s,  0.00s,  0.00s ]


0.00s [  0.00s,  0.00s,  0.00s ]


0.00s [  0.00s,  0.00s,  0.00s ]


0.00s [  0.00s,  0.00s,  0.00s ]


0.00s [  0.00s,  0.00s,  0.00s ]


0.00s [  0.00s,  0.00s,  0.00s ]


范例3:监控复制在slave上的落后程度(监控一次退出):


pt-heartbeat -D test --check --user=root --password=123456 -h192.168.3.92


范例4:监控PostgreSQL需要添加--dbi-driver Pg


pt-heartbeat -D test --check --user=root --password=123456 -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分钟,并每隔1分钟检测一次,运行10分钟


pt-slave-delay --user=root --password=123456 --delay 1m --run-time 10m --host=192.168.3.92


如果不加--run-time参数会一直执行。


范例2:使从落后主1分钟,并每隔15秒钟检测一次,运行10分钟


pt-slave-delay --user=root --password=123456 --delay 1m --interval 15s --run-time 10m --host=192.168.3.92


运行结果如下:


2012-05-20T16:34:50 slave running 0 seconds behind


2012-05-20T16:34:50 STOP SLAVE until 2012-05-20T16:35:50 at master position mysql-bin.000032/4392054


2012-05-20T16:35:05 slave stopped at master position mysql-bin.000032/4397124


2012-05-20T16:35:20 slave stopped at master position mysql-bin.000032/4402194


2012-05-20T16:35:35 slave stopped at master position mysql-bin.000032/4407264


2012-05-20T16:35:50 no new binlog events


2012-05-20T16:36:05 START SLAVE until master 2012-05-20T16:35:05 mysql-bin.000032/4397124


 


pt-slave-find


功能介绍:


查找和打印mysql所有从服务器复制层级关系


用法介绍:


pt-slave-find [OPTION...] MASTER-HOST


原理:连接mysql主服务器并查找其所有的从,然后打印出所有从服务器的层级关系。


使用示例:


范例1:查找主服务器为192.168.3.135mysql有所有从的层级关系:


pt-slave-find --user=root --password=123456 --host=192.168.3.135


 


pt-slave-restart


功能介绍:


监视mysql复制错误,并尝试重启mysql复制当复制停止的时候


用法介绍:


pt-slave-restart [OPTION...] [DSN]


监视一个或者多个mysql复制错误,当从停止的时候尝试重新启动复制。你可以指定跳过的错误并运行从到指定的日志位置。


使用示例:


范例1:监视192.168.3.92的从,跳过1个错误


pt-slave-restart --user=root --password=123456 --host=192.168.3.92 --skip-count=1


范例2:监视192.168.3.92的从,跳过错误代码为1062的错误。


pt-slave-restart --user=root --password=123456 --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_srcmaster_src的值从而判断复制是否一致。


注意:使用的时候选择业务地峰的时候运行,因为运行的时候会造成表的部分记录锁定。使用--max-load来指定最大的负载情况,如果达到那个负载这个暂停运行。如果发现有不一致的数据,可以使用pt-table-sync工具来修复。


注意:和1.0版本不同,新版本的pt-table-checksum只需要在master上执行即可。


通过 –explain参数再结合二进制日志就可以看出脚本的工作原理,如我的test库有一个名字为zhang的表,我们通过抓取二进制日志来查看脚本的原理:


REPLACE INTO `test`.`checksums` (db, tbl, chunk, chunk_index, lower_boundary, upper_boundary, this_cnt, this_crc) SELECT 'test', 'zhang', '1', NULL, NULL, NULL, COUNT(*) AS cnt, COALESCE(LOWER(CONV(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 = 'zhang' AND chunk = '1'


从这里可以很明显的看出原理了,前面已经说了,这里就不赘述了。


使用示例:


范例1:比较test数据库同步是否一致,结果显示所有的表。


pt-table-checksum  --nocheck-replication-filters --databases=test --replicate=test.checksums --create-replicate-table  --host=192.168.3.135  --port 3306  -uroot -p123456


参数说明:第一次运行的时候需要添加--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-dbreplicate-wild-do-table等参数。另外需要特别注意执行的checksums所在的数据库必须是同步的数据库。我刚开始使用的时候摸索的很久,官网也没有范例。呵呵!


结果如下:


TS         ERRORS DIFFS  ROWS  CHUNKS SKIPPED  TIME TABLE


05-23T16:19:29  0   1        2   1  0  0.006 test.aaa


05-23T16:19:29  0   0        1   1  0  0.017 test.bbb


05-23T16:19:29  0   0        0   1  0  0.007 test.category_part


05-23T16:19:31  0   0   233617   6  0  1.887 test.collect_data


05-23T16:19:34  0   0   250346   5  0  2.709 test.effective_user


05-23T16:19:34  0   1        1   1  0  0.008 test.heartbeat


05-23T16:19:39  0   0  1000000  11  0  5.353 test.oss_pvinfo2


从结果中,我们可以看到test.aaatest.heartbeat表的DIFFS不为0,那么就是这两个表不同步了。


 


范例2:比较test数据库同步是否一致,结果只显示数据不一致的表(添加--replicate-check-only参数即可,这个值查看checksums数据不会重新对表进行比较,因此需要先运行上面的比较语句之后再运行这个语句,否则显示不了最新的变化。)。


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=123456


结果如下:


Differences on localhost.localdomain


TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY


test.aaa 1 1 1 


test.heartbeat 1 0 1


从结果可以看出,只显示了两个不同步的表。


 


pt-table-sync


功能介绍:


高效同步mysql表的数据


用法介绍:


pt-table-sync [OPTION...] DSN [DSN...]


原理:总是在主上执行数据的更改,再同步到从上,不会直接更改成从的数据,在主上执行更改是基于主上现在的数据,不会更改主上的数据。注意使用之前先备份你的数据,避免造成数据的丢失.执行execute之前最好先换成--print--dry-run查看一下会变更哪些数据。


使用示例:


范例1:同步3.135test库的aaa表到192.168.3.92,在执行之前可以用--execute参数换成--print来查看会变更什么东西,后面那个主机必须是master,否则会报错推出。


pt-table-sync --execute --user=root --password=123456 h=192.168.3.135,D=test,t=aaa h=192.168.3.92


范例2:将主的test数据库同步到192.168.3.92,使从上具有一样的数据。


pt-table-sync --execute --sync-to-master --user=root --password=123456  h=192.168.3.92 --database test


范例3:只同步指定的表


pt-table-sync --execute --sync-to-master --user=root --password=123456  h=192.168.3.92,D=test,t=aaa


范例4:根据pt-table-checksum的结果进行数据同步


pt-table-sync --execute --replicate test.checksums --user=root --password=123456  h=192.168.3.135


范例5:根据pt-table-checksum使从的数据和主的数据一致


pt-table-sync --execute --replicate test.checksums --user=root --password=123456  --sync-to-master h=192.168.3.92,D=test,t=aaa


 


系统类工具:


pt-diskstats


功能介绍:


是一个对GUN/LINUX的交互式监控工具


用法介绍:


pt-diskstats [OPTION...] [FILES]


GUN/LINUX打印磁盘io统计信息,和iostat有点像,但是这个工具是交互式并且比iostat更详细。可以分析从远程机器收集的数据。


使用示例:


范例1:查看本机所有的磁盘的状态情况:


pt-diskstats


范例2:只查看本机sda2磁盘的状态情况


pt-diskstats --devices-regex sda2


 


pt-fifo-split


功能介绍:


模拟切割文件并通过管道传递给先入先出队列而不用真正的切割文件


用法介绍:


pt-fifo-split [options] [FILE ...]


pt-fifo-split读取大文件中的数据并打印到fifo文件,每次达到指定行数就往fifo文件中打印一个EOF字符,读取完成以后,关闭掉fifo文件并移走,然后重建fifo文件,打印更多的行。这样可以保证你每次读取的时候都能读取到制定的行数直到读取完成。注意此工具只能工作在类unix操作系统。这个程序对大文件的数据导入数据库非常有用,具体的可以查看http://www.mysqlperformanceblog.com/2008/07/03/how-to-load-large-files-safely-into-innodb-with-load-data-infile/


 


使用示例:


范例1:一个每次读取一百万行记录的范例:


pt-fifo-split --lines 1000000 hugefile.txt


while [ -e /tmp/pt-fifo-split ]; do cat /tmp/pt-fifo-split; done


范例2:一个每次读取一百万行,指定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用户或者有权限的用户运行此命令。


使用示例:


范例1:查看本地系统信息概况


pt-summary


 


pt-stalk


功能介绍:


出现问题的时候收集mysql的用于诊断的数据


用法介绍:


pt-stalk [OPTIONS] [-- MYSQL OPTIONS]


pt-stalk等待触发条件触发,然后收集数据帮助错误诊断,它被设计成使用root权限运行的守护进程,因此你可以诊断那些你不能直接观察的间歇性问题。默认的诊断触发条件为SHOW GLOBAL STATUS。也可以指定processlist为诊断触发条件 ,使用--function参数指定。


使用示例:


范例1:指定诊断触发条件为status,同时运行语句超过20的时候触发,收集的数据存放在/tmp/test目录下:


pt-stalk  --function status --variable Threads_running --threshold 20 --dest /tmp/test  -- -uroot -p123456  -h192.168.3.135


范例2:指定诊断触发条件为processlist,超过20个状态为statistics触发,收集的数据存放在/tmp/test目录下:


pt-stalk  --function processlist --variable State  --match statistics --threshold 20 --dest /tmp/test -- -uroot -p123456  -h192.168.3.135


贴一下达到触发条件以后收集的信息:


2012_06_04_17_31_49-df


2012_06_04_17_31_49-disk-space


2012_06_04_17_31_49-diskstats


2012_06_04_17_31_49-hostname


2012_06_04_17_31_49-innodbstatus1


2012_06_04_17_31_49-innodbstatus2


2012_06_04_17_31_49-interrupts


2012_06_04_17_31_49-log_error


2012_06_04_17_31_49-lsof


2012_06_04_17_31_49-meminfo


2012_06_04_17_31_49-mutex-status1


2012_06_04_17_31_49-mysqladmin


2012_06_04_17_31_49-netstat


2012_06_04_17_31_49-netstat_s


2012_06_04_17_31_49-opentables1


2012_06_04_17_31_49-opentables2


2012_06_04_17_31_49-output


2012_06_04_17_31_49-pmap


2012_06_04_17_31_49-processlist


2012_06_04_17_31_49-procstat


2012_06_04_17_31_49-procvmstat


2012_06_04_17_31_49-ps


2012_06_04_17_31_49-slabinfo


2012_06_04_17_31_49-sysctl


2012_06_04_17_31_49-top


2012_06_04_17_31_49-trigger


2012_06_04_17_31_49-variables


2012_06_04_17_31_49-vmstat


2012_06_04_17_31_49-vmstat-overall


实用类工具


pt-archiver


功能介绍:


mysql数据库中表的记录归档到另外一个表或者文件


用法介绍:


pt-archiver [OPTION...] --source DSN --where WHERE


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


使用示例:


范例1:将192.168.3.135上的sanmao库的oss_logid小于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=123456 --dest h=192.168.3.92,D=sanmao,t=oss_log --file '/var/log/oss_log_archive_20120605.log' --where "id<=100000"  --commit-each


范例2:将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=123456 --file '/var/log/oss_log_archive_20120607.log' --where "id<=160000"  --commit-each


范例3:删除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=123456 --purge --where 'id<=167050'


注意:如果是字符集是utf8的话,需要在my.cnf中的[client]下面添加default-character-set = utf8,否则导出的文件内容中文会乱码。


 


pt-find


功能介绍:


查找mysql表并执行指定的命令,和gnufind命令类似。


用法介绍:


pt-find [OPTION...] [DATABASE...]


默认动作是打印数据库名和表名


使用示例:


范例1:查找192.168.3.1351天以前创建的InnoDB的表 ,并打印。


pt-find --ctime +1  --host=192.168.3.135 --engine InnoDB --user=root --password=123456


范例2:查找192.168.3.1351天以前更改过的数据库名字匹配%hostsops%的并且引擎为MYISAM的表,并将表的引擎更改为InnoDB引擎。


pt-find --mtime +1 --dblike hostsops --engine MyISAM --host=192.168.3.135 --user=root --password=123456  --exec "ALTER TABLE %D.%N ENGINE=InnoDB"


范例3:查找192.168.3.135aaa库和zhang库中的空表,并删除。


pt-find --empty aaa zhang --host=192.168.3.135 --user=root --password=123456  --exec-plus "DROP TABLE %s"


范例4:查找192.168.3.135中超过100M的表:


pt-find --tablesize +100M --host=192.168.3.135 --user=root --password=123456


 


pt-kill


功能介绍:


Kill掉符合指定条件mysql语句


用法介绍:


pt-kill [OPTIONS]


加入没有指定文件的话pt-kill连接到mysql并通过SHOW PROCESSLIST找到指定的语句,反之pt-kill从包含SHOW PROCESSLIST结果的文件中读取mysql语句


使用示例:


范例1:查找192.168.3.135服务器运行时间超过60s的语句,并打印


pt-kill --busy-time 60 --print --host=192.168.3.135 --user=root --password=123456


范例2:查找192.168.3.135服务器运行时间超过60s的语句,并kill


pt-kill --busy-time 60 --kill --host=192.168.3.135 --user=root --password=123456


范例3:从proccesslist文件中查找执行时间超过60s的语句


mysql -uroot -p123456 -h192.168.3.135 -e "show processlist" > processlist.txt


pt-kill --test-matching processlist.txt --busy-time 60 –print


posted @ 2017-08-05 19:16  yijiaotu  阅读(291)  评论(0)    收藏  举报