percona-toolkit是一组高级命令行工具的集合,可以查看当前服务的摘要信息,磁盘检测,分析慢查询日志,查找重复索引,实现表同步等等。
这个工具套件对DBA及运维人员着实不可多得
1 下载
wget https://www.percona.com/downloads/percona-toolkit/3.1.0/binary/redhat/7/x86_64/percona-toolkit-3.1.0-2.el7.x86_64.rpm
2 安装
yum install -y percona-toolkit-3.1.0-2.el7.x86_64.rpm
3 验证 安装完成后会生成以下命令:
[root@huazai007 src]# pt
pt-align pt-fk-error-logger pt-pg-summary pt-summary
pt-archiver pt-heartbeat pt-pmp pt-table-checksum
ptaskset pt-index-usage pt-query-digest pt-table-sync
pt-config-diff pt-ioprofile pt-secure-collect pt-table-usage
pt-deadlock-logger pt-kill pt-show-grants pt-upgrade
pt-diskstats pt-mext pt-sift pt-variable-advisor
pt-duplicate-key-checker pt-mongodb-query-digest pt-slave-delay pt-visual-explain
pt-fifo-split pt-mongodb-summary pt-slave-find ptx
pt-find pt-mysql-summary pt-slave-restart
pt-fingerprint pt-online-schema-change pt-stalk
4 命令详解
pt-upgrade
#该命令主要用于对比不同mysql版本下SQL执行的差异,通常用于升级前进行对比。
#会生成SQL文件或单独的SQL语句在每个服务器上执行的结果、错误和警告信息等。
pt-online-schema-change
#功能为支持在线变更表构,且不锁定原表,不阻塞原表的DML操作。
#该特性与Oracle的dbms_redefinition在线重定义表原理基本类似。
pt-mysql-summary
#对连接的mysql服务器生成一份详细的配置情况以及sataus信息
#在尾部也提供当前实例的的配置文件的信息
pt-mext
#并行查看SHOW GLOBAL STATUS的多个样本的信息。
#pt-mext会执行你指定的COMMAND,并每次读取一行结果,把空行分割的内容保存到一个一个的临时文件中,最后结合这些临时文件并行查看结果。
pt-kill
#Kill掉符合指定条件mysql语句
pt-ioprofile
#pt-ioprofile的原理是对某个pid附加一个strace进程进行IO分析
pt-fingerprint
#用于生成查询指纹。主要将将sql查询生成queryID,pt-query-digest中的ID即是通过此工具来完成的。
#类似于Oracle中的SQL_ID,涉及绑定变量,字面量等
pt-find
#用与查找mysql表并执行指定的命令,类似于find命令
pt-fifo-split
#模拟切割文件并通过管道传递给先入先出队列而不用真正的切割文件
pt-deadlock-logger
#用于监控mysql服务器上死锁并输出到日志文件,日志包含发生死锁的时间、死锁线程id、死锁的事务id、发生死锁时事务执行时间等详细信息。
pt-archiver
#将mysql数据库中表的记录归档到另外一个表或者文件
#该工具具只是归档旧的数据,对线上数据的OLTP查询几乎没有影响。
#可以将数据插入另外一台服务器的其他表中,也可以写入到一个文件中,方便使用load data infile命令导入数据。
pt-agent
#基于Percona Cloud的一个客户端代理工具
pt-visual-explain
#用于格式化explain的输出
pt-variable-advisor
#用于分析mysql系统变量可能存在的一些问题,可以据此评估有关参数的设置正确与否。
pt-stalk
#用于收集mysql数据库故障时的相关信息便于后续诊断处理。
pt-slave-delay
#用于设定从服务器落后于主服务器的时间间隔。
#该命令行通过启动和停止复制sql线程来设置从落后于主指定时间。
pt-sift
#用于浏览pt-stalk生成的文件。
pt-show-grants
#将当前实例的用户权限全部输出,可以用于迁移数据库过程中重建用户。
pt-query-digest
#用于分析mysql服务器的慢查询日志,并格式化输出以便于查看和分析。
pt-pmp
#为查询程序执行聚合的GDB堆栈跟踪,先进性堆栈跟踪,然后将跟踪信息汇总。
pt-index-usage
#从log文件中读取查询语句,并用分析当前索引如何被使用。
#完成分析之后会生成一份关于索引没有被查询使用过的报告,可以用于分析报告考虑剔除无用的索引。
pt-heartbeat
#用于监控mysql复制架构的延迟。
#主要是通过在主库上的--update线程持续更新指定表上的一个时间戳,从库上--monitor线程或者--check线程检查主库更新的时间戳并与当前系统时间对比,得到延迟值。
pt-fk-error-logger
#将外键相关的错误信息记录到日志或表。
pt-duplicate-key-checker
#功能为从mysql表中找出重复的索引和外键,这个工具会将重复的索引和外键都列出来
#同时也可以生成相应的drop index的语句
pt-diskstats
#类似于iostat,打印磁盘io统计信息,但是这个工具是交互式并且比iostat更详细。可以分析从远程机器收集的数据。
pt-config-diff
#用于比较mysql配置文件和服务器变量
#至少2个配置源需要指定,可以用于迁移或升级前后配置文件进行对比
pt-align
#格式化输出
pt-slave-find
#连接mysql主服务器并查找其所有的从,然后打印出所有从服务器的层级关系。
pt-table-checksum
#用于校验mysql复制的一致性。
#该工具主要是高效的查找数据差异,如果存在差异性,可以通过pt-table-sync来解决
5 https://blog.csdn.net/wanbin6470398/article/details/83178755
安装sysbench 性能压测工具
yum -y install sysbench
压测前的准备工作:
主库上操作:
MariaDB [(none)]> create database sbtest;
MariaDB [(none)]> grant all on *.* to 'sbtest'@'172.18.47.110' identified by '123456';
MariaDB [(none)]> flush privileges;
1 pt-heartbeat
用于监控主从延迟的工具
1.1 pt-heartbeat 原理
主库创建一张heartbeat表,表中有个时间戳字段。主库上pt-heartbeat的update线程会在指定时间间隔更新时间戳。
从库上的pt-heartbeat的monitor线程会检查复制的心跳记录,这个记录就是主库修改的时间戳。然后和当前系统时间进行对比,得出时间上的差异,差异值就是延迟的时间大小。由于heartbeat表中有server_id字段,在监控某个从库的延迟时指定参考主库的server_id即可。
1.2 pt-heartbeat 主要参数介绍
注意:需要指定的参数至少有 --stop,--update,--monitor,--check。
其中--update,--monitor和--check是互斥的,--daemonize和--check也是互斥。
`--ask-pass`:隐式输入MySQL密码
`--charset`:字符集设置
`--check`:检查从的延迟,检查一次就退出,除非指定了--recurse会递归的检查所有的从服务器。
`--check-read-only`:如果从服务器开启了只读模式,该工具会跳过任何插入。
`--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
);
heratbeat表一直在更改ts和position,而ts是我们检查复制延迟的关键。
`--daemonize`:执行时,放入到后台执行
`--user | -u`:连接数据库的帐号
`--database | -D`:连接数据库的名称
`--host|-h`:连接的数据库地址
`--password | -p`:连接数据库的密码
`--port | -P`:连接数据库的端口
`--socket | -S`:连接数据库的套接字文件
`--file 【--file=output.txt】`:打印--monitor最新的记录到指定的文件,很好的防止满屏幕都是数据的烦恼。
`--frames 【--frames=1m,2m,3m】`:在--monitor里输出的[]里的记录段,默认是1m,5m,15m。可以指定1个,如:--frames=1s,多个用逗号隔开。可用单位有秒(s)、分钟(m)、小时(h)、天(d)。
`--interval`:检查、更新的间隔时间。默认是见是1s。最小的单位是0.01s,最大精度为小数点后两位,因此0.015将调整至0.02。
`--log`:开启daemonized模式的所有日志将会被打印到制定的文件中。
`--monitor`:持续监控从的延迟情况。通过--interval指定的间隔时间,打印出从的延迟信息,通过--file则可以把这些信息打印到指定的文件。
`--master-server-id`:指定主的server_id,若没有指定则该工具会连到主上查找其server_id。
`--print-master-server-id`:在--monitor和--check 模式下,指定该参数则打印出主的server_id。
`--recurse`:多级复制的检查深度。模式M-S-S...不是最后的一个从都需要开启log_slave_updates,这样才能检查到。
`--recursion-method`:指定复制检查的方式,默认为processlist,hosts。
`--update`:更新主上的心跳表。
`--replace`:使用--replace代替--update模式更新心跳表里的时间字段,这样的好处是不用管表里是否有行。
`--stop`:停止运行该工具(--daemonize),在/tmp/目录下创建一个“pt-heartbeat-sentinel” 文件。后面想重新开启则需要把该临时文件删除,才能开启(--daemonize)。
`--table`:指定心跳表名,默认heartbeat。
1.3 pt-heartbeat 实战
1): 主库创建 heartbeat心跳表,通过update执行更新时间戳,心跳表指定建立在sbtest库下
pt-heartbeat -S /var/lib/mysql/mysql.sock --database sbtest --update --create-table --daemonize
2): 主库利用sysbench模拟数据操作
prepare:准备压测数据 在sbtest库里建10张表,每张表里插入50w条数据
run:执行压测
cleanup:清除压测数据
[root@huazai007 src]# sysbench /usr/share/sysbench/oltp_read_write.lua \
--mysql-host='172.18.47.110' \
--mysql-user=sbtest \
--mysql-password=123456 \
--mysql-port=3306 \
--db-driver=mysql \
--mysql-db=sbtest \
--tables=10 \
--table-size=500000 \
--report-interval=10 \
--threads=128 \
--time=120 \
prepare|run|cleanup
3):从库进行监测
[root@localhost src]# pt-heartbeat -S /var/lib/mysql/mysql.sock --master-server-id=1 --monitor --database sbtest
0.00s [ 8.57s, 66.24s, 22.64s ]
0.00s [ 6.40s, 66.22s, 22.64s ]
0.00s [ 4.25s, 66.20s, 22.64s ]
0.00s [ 2.10s, 66.18s, 22.64s ]
0.00s [ 0.00s, 66.15s, 22.64s ]
0.00s [ 0.00s, 66.12s, 22.64s ]
0.00s [ 0.00s, 66.09s, 22.64s ]
0.00s [ 0.00s, 66.06s, 22.64s ]
0.00s [ 0.00s, 66.02s, 22.64s ]
结果表示有延时0s左右,中括号中的数据分别表示1m,5m,15m的平均值
2 pt-slave-restart
pt-slave-restart是一个可以跳过特定错误并自动重启slave的工具。
2.1 pt-slave-restart 原理
pt-slave-restart监控一个或者多个MySQL复制slave,试图跳过引起错误的语句。它以指数变化的睡眠时间职能地检查slave。你可以指定要跳过的错误然后运行slave一直到一个确定的binlog位置。
pt-slave-restart一旦检测到slave有错误就会打印一行。默认情况下该打印行为:时间戳、连接信息、relay_log_file,relay_log_pos,以及last_errno。你可以使用–verbose选项添加更多信息,也可以使用–quiet选项阻止所有输出。
2.2 pt-slave-restart 主要参数介绍
- ` --always ` :永不停止slave线程,手工停止也不行
- ` --ask-pass` :替换`-p`命令,不显示密码输入
- ` --error-numbers` :指定跳过哪些错误,可用`,`进行分隔
- ` --error-text` :根据错误信息进行匹配跳过
- ` --log` :输出到文件
- ` --recurse` :在主端执行,监控从端
- ` --runtime ` :工具执行多长时间后退出:默认秒, m=minute,h=hours,d=days
- ` --slave-user --slave-password` :从库的账号密码,从主端运行时使用
- ` --skip-count ` :一次跳过错误的个数,胆大的可以设置大些,不指定默认1个
- `--master-uuid` :级联复制的时候,指定跳过上级或者上上级事务的错误
- ` --until-master` :到达指定的master_log_pos,file位置后停止,格式:”file:pos“
- `--until-relay` :和上面一样,但根据relay_log的位置来停止
- `--sleep`:默认值为1,检查slave间隔的初始sleep秒数。
2.3 pt-slave-restart 实战
#1. 在master上创建表
create table z1(id int not null,uname varchar(32),primary key(id));
#2. 在slave上插入数据
set sql_log_bin=0;
set global read_only=off;
insert into z1(id,uname) values(3,'python');
#3. 在master上插入数据
insert into z1(id,uname) values(2,'mysql');
insert into z1(id,uname) values(3,'java');
#4. 在slave上查看复制状态
show slave status\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: No
...
Last_SQL_Errno: 1062
Last_SQL_Error: Could not execute Write_rows event on table test.z1; Duplicate entry '3' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log my3306_binlog.000071, end_log_pos 1214
#5. 在slave上使用pt-slave-restart跳过指定错误
[root@localhost src]# pt-slave-restart --error-numbers=1062
2019-12-12T16:54:56 mysql-relay.000006 1073644063 1062
#6. 在slave上查看复制状态
···
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
···
#说明复制已经正常,跳过了错误事务。
#但是master与slave上的这张表数据不一致,所以这种修复方法只能算暂时的。
#之后还需进行修复
3 pt-table-checksum
pt-table-checksum工具用来检查主从数据一致性
3.1 pt-table-checksum 原理
pt-table-checksum用于校验主从数据的一致性,该命令在主库上执行校验,然后对复制的一致性进行检查,来对比主从之间的校验值,并输出对比结果
3.2 pt-table-checksum 主要参数介绍
- `--[no]check-replication-filters`:是否检查复制的过滤器,默认是yes,建议启用不检查模式。
- `--databases | -d`:指定需要被检查的数据库,多个库之间可以用逗号分隔。
- `--[no]check-binlog-format`:是否检查binlog文件的格式,默认值yes。建议开启不检查。因为在默认的row格式下会出错。
- `--replicate`:把checksum的信息写入到指定表中。
- `--replicate-check-only`:只显示不同步信息
3.3 pt-table-checksum 实战
主库上操作:
[root@huazai007 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=z1 h=172.18.47.110,u=huazai007,p=123456,P=3306
返回值:
# A software update is available:
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
12-16T16:45:46 0 1 2 0 1 0 0.147 test.z1
#解释:
`TS` :完成检查的时间。
`ERRORS` :检查时候发生错误和警告的数量。
`DIFFS`:0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
`ROWS` :表的行数。
`CHUNKS` :被划分到表中的块的数目。
`SKIPPED` :由于错误或警告或过大,则跳过块的数目。
`TIME` :执行的时间。
`TABLE` :被检查的表名。
【注意】:
1)根据测试,需要一个即能登录主库,也能登录从库的账号;huazai007 123456
2)只能指定一个host,必须为主库的IP;
3)在检查时会向表加S锁;
4)运行之前需要从库的同步IO和SQL进程是YES状态。
4 pt-table-sync
用来修复主从数据不一致
4.1 pt-table-sync 原理
pt-table-sync高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。
4.2 pt-table-sync 主要参数介绍
`--replicate` :指定通过pt-table-checksum得到的表,这2个工具差不多都会一直用。
`--databases` : 指定执行同步的数据库。
`--tables` :指定执行同步的表,多个用逗号隔开。
`--sync-to-master` :指定一个DSN,即从的IP,他会通过show processlist或show slave status 去自动的找主。
`h=` :服务器地址,命令里有2个ip,第一次出现的是Master的地址,第2次是Slave的地址。
`u=` :帐号。
`p=` :密码。
`--print` :打印,但不执行命令。
`--execute :执行命令。
4.3 pt-table-sync 实战
主库上执行以下命令
#print 修复命令
会把修复的sql语句打印出来
1
2
[root@huazai007 ~]# pt-table-sync --replicate=test.checksums h=172.18.47.110,u=huazai007,p=123456,P=3306 h=172.18.47.112,u=huazai007,p=123456,P=3306 --print
REPLACE INTO `test`.`z1`(`id`, `uname`) VALUES ('3', 'java') /*percona-toolkit src_db:test src_tbl:z1 src_dsn:P=3306,h=172.18.47.110,p=...,u=huazai007 dst_db:test dst_tbl:z1 dst_dsn:P=3306,h=172.18.47.112,p=...,u=huazai007 lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:7027 user:root host:huazai007*/;
#execute 修复命令
[root@huazai007 ~]# pt-table-sync --replicate=test.checksums h=172.18.47.110,u=huazai007,p=123456,P=3306 h=172.18.47.112,u=huazai007,p=123456,P=3306 --execute
##再使用pt-table-checksum 验证下
[root@huazai007 ~]# pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=z1 h=172.18.47.110,u=huazai007,p=123456,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
12-16T17:06:33 0 0 2 0 1 0 0.075 test.z1