pt工具使用
查找一天以前创建的InnoDB的表,并打印输出
pt-find --ctime +1 --host=localhost --engine InnoDB --user=root --password=mysql --socket=/tmp/mysql.sock
查找空表并删除
pt-find --empty course --host=localhost --engine InnoDB --user=root --password=mysql --socket=/tmp/mysql.sock --exec-plus "drop table %s"
首先安装pt工具
1.安装perl相关依赖包
yum install -y perl perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl-Digest-MD5 perl-ExtUtils-MakeMaker
2.linux系统下载安装
1.下载Percona Toolkit编译安装包
wget "https://www.percona.com/downloads/percona-toolkit/3.0.3/binary/tarball/percona-toolkit-3.0.3_x86_64.tar.gz"
2.解压
tar xf percona-toolkit-3.0.3.tar.gz
3.进入目录安装
cd percona-toolkit-3.0.3.tar.gz
4.开始编译
perl Makefile.PL
make
make install
编译完成后就可以看到默认安装路径.查看
ll /usr/local/bin/pt-*
-r-xr-xr-x 1 root root 41480 Jan 19 11:03 /usr/local/bin/pt-align
-r-xr-xr-x 1 root root 263438 Jan 19 11:03 /usr/local/bin/pt-archiver
-r-xr-xr-x 1 root root 168985 Jan 19 11:03 /usr/local/bin/pt-config-diff
3.测试是否安装成功
[root@localhost etc]# pt-mysql-summary -u root -p mysql --socket=/tmp/mysql.sock
mysql: [Warning] Using a password on the command line interface can be insecure.
# Percona Toolkit MySQL Summary Report #######################
System time | 2019-07-02 08:02:35 UTC (local TZ: CST +0800)
# Instances ##################################################
Port Data Directory Nice OOM Socket
===== ========================== ==== === ======
/usr/local/mysql/data 0 0
# MySQL Executable ###########################################
Path to executable | /usr/local/mysql/bin/mysqld
Has symbols | Yes
# Report On Port 3306 ########################################
User | root@localhost
Time | 2019-07-02 16:02:35 (CST)
Hostname | localhost.localdomain
Version | 8.0.16 MySQL Community Server - GPL
Built On | linux-glibc2.12 x86_64
Started | 2019-07-02 15:10 (up 0+00:51:39)
Databases | 5
Datadir | /usr/local/mysql/data/
Processes | 1 connected, 2 running
Replication | Is not a slave, has 0 slaves connected
Pidfile | /usr/local/mysql/data/localhost.localdomain.pid (exists)
# Processlist ################################################
.
.
.
表示安装成功
4.找出重复的索引和外键
[root@localhost etc]# pt-duplicate-key-checker -u root -p mysql --socket=/tmp/mysql.sock
说明一下:
这里在进行排查索引的时候需要指定socket进行排查.如果不指定的话报错.
5.为现有的表添加索引
首先现有的表需要有主键 primary key.如果没有的话索引添加是不成功的.
pt-online-schema-change -u root -p mysql --critical-load="Threads_running=200" --alter='add key indx_vid(name)' --execute D=course,t=students --socket=/tmp/mysql.sock
6.添加字段
pt-online-schema-change -u root -pmysql -h 127.0.0.1 --alter='add column name2 varchar(32)' --execute D=course,t=students
7.删除字段
pt-online-schema-change -u root -pmysql -h 127.0.0.1 --alter='drop column name2' --execute D=course,t=students
8.远程添加索引
pt-online-schema-change -uroot -pmysql -h127.0.0.1 -P 3306 --alter='add key idx_nam(name)' --execute D=course,t=students
9.查看当前所有用户权限
pt-show-grants -uroot -pmysql -h127.0.0.1
10.慢日中出现最多的是哪些语句
pt-query-digest slow_query.log
4.用法示例
(1)直接分析慢查询文件:
pt-query-digest slow.log > slow_report.log
(2)分析最近12小时内的查询:
pt-query-digest --since=12h slow.log > slow_report2.log
(3)分析指定时间范围内的查询:
pt-query-digest slow.log --since '2014-04-17 09:30:00' --until '2014-04-17 10:00:00'> > slow_report3.log
(4)分析指含有select语句的慢查询
pt-query-digest--filter '$event->{fingerprint} =~ m/^select/i' slow.log> slow_report4.log
(5) 针对某个用户的慢查询
pt-query-digest--filter '($event->{user} || "") =~ m/^root/i' slow.log> slow_report5.log
(6) 查询所有所有的全表扫描或full join的慢查询
pt-query-digest--filter '(($event->{Full_scan} || "") eq "yes") ||(($event->{Full_join} || "") eq "yes")' slow.log> slow_report6.log
(7)把查询保存到query_review表
pt-query-digest --user=root –password=abc123 --review h=localhost,D=test,t=query_review--create-review-table slow.log
(8)把查询保存到query_history表
pt-query-digest --user=root –password=abc123 --review h=localhost,D=test,t=query_ history--create-review-table slow.log_20140401
pt-query-digest --user=root –password=abc123--review h=localhost,D=test,t=query_history--create-review-table slow.log_20140402
(9)通过tcpdump抓取mysql的tcp协议数据,然后再分析
tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt
pt-query-digest --type tcpdump mysql.tcp.txt> slow_report9.log
(10)分析binlog
mysqlbinlog mysql-bin.000093 > mysql-bin000093.sql
pt-query-digest --type=binlog mysql-bin000093.sql > slow_report10.log
(11)分析general log
pt-query-digest --type=genlog localhost.log > slow_report11.log
11.查一下 pt工具如何修复主从数据库不一致情况.并且进行主从数据修复
丛库上执行:
--print 将不一致的推荐语句的恢复方式打印出来.
--sync-to-master 表示与主库比较
h=192.168.15.22 本机的ip地址,或者丛库的ip地址(如果远程执行的话.)
P=3306 数据库端口
u=root 数据库连接用户(这里可以使用其他用户)
p=mysql 数据库用户连接密码
--databases=course 指定course数据库
--tables=students 指定students表
pt-table-sync --print --sync-to-master h=192.168.15.22,P=3306,u=root,p='mysql' --databases=course --tables=students
如果出现如下报错可能是复制停止导致.原因需要进入数据库查看
show slave status\G 进行查看是什么问题.
MASTER_POS_WAIT() returned NULL. Verify that the slave is running. Sleeping 10 seconds then retrying 2 more times.
Retrying MASTER_POS_WAIT() for --wait 60... at /usr/local/bin/pt-table-sync line 6232.
MASTER_POS_WAIT() returned NULL. Verify that the slave is running. Sleeping 10 seconds then retrying 1 more times.
Retrying MASTER_POS_WAIT() for --wait 60... at /usr/local/bin/pt-table-sync line 6232.
Slave did not catch up to its master after 3 attempts of waiting 60 seconds with MASTER_POS_WAIT. Check that the slave is running, increase the --wait time, or disable this feature by specifying --wait 0. at /usr/local/bin/pt-table-sync line 6269. while doing course
问题排出后stop slave 然后直接start slave即可 无需重新制定主库节点位置(GTID复制的情况下)
注释:
如果丛库有而主库没有的表在进行比对的时候没法将差异比对出来.如果单纯表结构
发生改变的话是没法比对出来的.所以只能比对数据(如果丛库增加表结构的话.也是检测不出来的).
貌似是根据主库的表结构来到丛库的表结构上进行数据对比
12.使用pt-table-checksum检查主从库差距(这个功能可以使用navicat直接比对.)
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=course.students --databases=course h=127.0.0.1,u=root,p="mysql",P=3306
13.打印某个数据库中的死锁信息.然后将死锁信息输出到某个指定的数据库表中.
pt-deadlock-logger --user=root --password=mysql --host = 192.168.15.21 --interval=3 --create-dest-table --dest u=root,p=mysql,h=192.168.15.22,D=course,t=dealock21
出现死锁信息的时候会将相关的语句在指定表中打印出来.如果需要
进行修改的时候需要先查一下当前已经执行成功的条目是哪条然后将.
然后分析执行失败原因.
--daemonize : 守护进程
--create-dest-table :创建指定的表。
--dest :创建存储死锁信息的表。
--database :-D,指定链接的数据库。
--table :-t,指定存储的表名。
--log :指定死锁日志信息写入到文件。
--run-time :运行次数,默认永久
--interval :运行间隔时间,默认30s。
u,p,h,P :链接数据库的信息。
14.查找mysql表并执行命令
查找一天一千创建的InnoDB的表,并打印输出
pt-find --ctime +1 --host=localhost --engine InnoDB --user=root --password=mysql --socket=/tmp/mysql.sock
查找空表并删除
pt-find --empty course --host=localhost --engine InnoDB --user=root --password=mysql --socket=/tmp/mysql.sock --exec-plus "drop table %s"
查找一下某台服务器上大小超过10G的表
浙公网安备 33010602011771号