percona-toolkit工具使用介绍
依赖包检查:
rpm -qa perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL
yum install percona-toolkit
pt-online-schema-change --user=用户名 --password=密码 --host=127.0.0.1 --port=端口号 --charset=utf8 --nodrop-old-table --alter="modify media_code varchar(64) DEFAULT NULL " D=ad_api,t=t_ad_req_log --exec
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 /tmp/mysql3306.sock --database sbtest --update --create-table --daemonize
2)主库利用sysbench模拟数据操作
sysbench /usr/share/sysbench/oltp_read_write.lua
--mysql-socket=/tmp/mysql3306.sock
--mysql-user=root
--mysql-password=mysql
--mysql-db=sbtest
--db-driver=mysql
--tables=10
--table-size=500000
--report-interval=10
--threads=128
--time=120
prepare|run|cleanup
prepare:准备数据,
run:执行压测,
cleanup:清除数据
3)从库进行监控
pt-heartbeat -S /tmp/mysql3306.sock --master-server-id=1003306 --monitor --database sbtest
1.00s [ 0.02s, 0.00s, 0.00s ]
1.00s [ 0.03s, 0.01s, 0.00s ]
0.86s [ 0.05s, 0.01s, 0.00s ]
0.86s [ 0.06s, 0.01s, 0.00s ]
0.96s [ 0.08s, 0.02s, 0.01s ]
1.00s [ 0.09s, 0.02s, 0.01s ]
0.88s [ 0.11s, 0.02s, 0.01s ]
0.00s [ 0.11s, 0.02s, 0.01s ]
1.01s [ 0.13s, 0.03s, 0.01s ]
0.00s [ 0.13s, 0.03s, 0.01s ]
0.00s [ 0.13s, 0.03s, 0.01s ]
...
结果表示有延时1s左右,中括号中的数据分别表示1m,5m,15m的平均值
- 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选项阻止所有输出。
SLEEP
pt-slave-restart检查slave的过程中智能地sleep。当前的sleep时间是变化的。
初始sleep时间通过--sleep选项给出。
如果检测发现错误,它对半之前的sleep时间。
如果检测到没有错误,它倍增之前的sleep时间。
通过--min-sleep和--max-sleep参数限定sleep时间的下界和上界。
一旦检测到错误,pt-slave-restart假定接下来很可能发生另一个错误,因此它采用当前的sleep时间或者初始sleep时间,取决于哪个值更小。
注意:
从Percona Toolkit 2.2.8版本起,pt-slave-restart开始支持由MySQL 5.6.5版本引入的GTID复制。重点牢记:
当采用多线程复制(slave_parallel_workers > 0)时,pt-slave-restart不能跳过事务。pt-slave-restart不能确定GTID事件是哪个特定slave线程执行失败的事务。
默认行为是跳过来自master的下一个事务。写可以来自不同的服务器,每个服务器都有它自己的UUID。参考–master-uuid选项。
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跳过指定错误
pt-slave-restart --error-numbers=1062
2018-09-19T15:24:02 mysqldb2-relay-bin.000019 1088 1062
6. 在slave上查看复制状态
···
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
···
说明复制已经正常,跳过了错误事务。
但是master与slave上的这张表数据不一致,所以这种修复方法只能算暂时的。
之后还需进行修复
- 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 实战
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=z1 h=192.168.56.100,u=wanbin,p=mysql,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
09-19T15:58:29 0 1 2 0 1 0 0.086 test.z1
解释:
TS
:完成检查的时间。
ERRORS
:检查时候发生错误和警告的数量。
DIFFS
:0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。
ROWS
:表的行数。
CHUNKS
:被划分到表中的块的数目。
SKIPPED
:由于错误或警告或过大,则跳过块的数目。
TIME
:执行的时间。
TABLE
:被检查的表名。
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --replicate-check-only h=192.168.56.100,u=wanbin,p=mysql,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
Differences on mysqldb2
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
test.z1 1 -1 1
【注意】:
1)根据测试,需要一个即能登录主库,也能登录从库的账号;
2)只能指定一个host,必须为主库的IP;
3)在检查时会向表加S锁;
4)运行之前需要从库的同步IO和SQL进程是YES状态。
- pt-table-sync
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修复命令
pt-table-sync --replicate=test.checksums h=192.168.56.100,u=wanbin,p=mysql,P=3306 h=192.168.56.200,u=wanbin,p=mysql,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=192.168.56.100,p=...,u=wanbin dst_db:test dst_tbl:z1 dst_dsn:P=3306,h=mysqldb2,p=...,u=wanbin lock:1 transaction:1 changing_src:test.checksums replicate:test.checksums bidirectional:0 pid:4374 user:root host:mysqldb1/;
execute修复命令
pt-table-sync --replicate=test.checksums h=192.168.56.100,u=wanbin,p=mysql,P=3306 h=192.168.56.200,u=wanbin,p=mysql,P=3306 --execute
再使用pt-table-checksum
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --create-replicate-table --databases=test --tables=z1 h=192.168.56.100,u=wanbin,p=mysql,P=3306
Checking if all tables can be checksummed ...
Starting checksum ...
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
09-19T16:11:50 0 0 2 0 1 0 0.134 test.z1
【注意】:要是表中没有唯一索引或则主键则会报错:
Can't make changes on the master because no unique index exists at /usr/local/bin/pt-table-sync line 10591.
1、服务器摘要
pt-summary
打印出来的信息包括:CPU、内存、硬盘、网卡等信息,还包括文件系统、磁盘调度和队列大小、LVM、RAID、网络链接信息、netstat 的统计,以及前10的负载占用信息和vmstat信息。
2、服务器磁盘监测
pt-diskstats
是一个对GUN/LINUX的交互式监控工具。为GUN/LINUX打印磁盘io统计信息,和iostat有点像,但是这个工具是交互式并且比iostat更详细。可以分析从远程机器收集的数据。
3、mysql服务状态摘要
pt-mysql-summary -- --user=root --password=
4、慢查询日志分析统计
pt-query-digest /data/logs/mysql/mysql-slow.log
5、表同步工具
和mk-tables-sync功能一样, 用法上 稍有不一样 ,--print的结果更详细
pt-table-sync --execute --print --no-check-slave --database=world h='127.0.0.1' --user=root --password=123456 h='192.168.0.212' --user=root --password=123456
6、主从状态监测
提供给它一台mysql服务器的IP用户名密码,就可以分析出整个主从架构中每台服务器的信息,包括但不限于mysql版 本,IP地址,server ID,mysql服务的启动时间,角色(主/从),Slave Status(落后于主服务器多少秒,有没有错误,slave有没有在运行)。
7、mysql死锁监测
pt-deadlock-logger h='127.0.0.1' --user=root --password=123456
8.主键冲突检查
pt-duplicate-key-checker --database=world h='127.0.0.1' --user=root --password=123456
9.监测从库的复制延迟
经过测试 运行这个命令会使从库上的sql线程异常挂掉
pt-slave-delay --host 192.168.0.206 --user=root --password=123456
pt-online-schema-change
在线变更数据表结构,且不锁定原表,不阻塞原表的 DML 操作。
pt-archiver
将 MySQL 数据库中表的记录归档到另外一个表或者文件,该工具只是归档旧的数据,对线上数据的 OLTP 查询几乎没有影响。可以将数据插入另外一台服务器的其他表中。
pt-query-digest
用于分析 MySQL 服务器的慢查询日志,并格式化输出以便于查看和分析。
工具的具体使用可以参照下面的地址:
https://www.percona.com/doc/percona-toolkit/2.1/index.html
https://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
Percona Toolkitpt-archiver
官网地址:
https://www.percona.com/doc/percona-toolkit/LATEST/pt-archiver.html
删除tsys_log表operate_time
案例数据表:
CREATE TABLE tsys_log (
nbr varchar(32) NOT NULL,
link_url varchar(128) DEFAULT NULL,
ip_address varchar(32) DEFAULT NULL,
operator varchar(32) DEFAULT NULL,
operator_name varchar(64) DEFAULT NULL,
operate_time datetime DEFAULT NULL,
operate_platform varchar(32) DEFAULT NULL,
description varchar(512) DEFAULT NULL,
PRIMARY KEY (nbr),
KEY idx_optime (operate_time)
) ENGINE=InnoDB
统计数据表占用的存储空间:
SELECT LOWER(TABLE_SCHEMA) AS TABLE_SCHEMA,
LOWER(TABLE_NAME) AS TABLE_NAME,
ROUND(SUM(data_length+index_length)/1024/1024) AS TOTAL_MB,
ROUND(SUM(data_length)/1024/1024) as DATA_MB
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='pt_test' AND TABLE_NAME='tsys_log'
GROUP BY TABLE_SCHEMA,TABLE_NAME;
查看物理空间的使用量:
ls -lh| grep tsys_log.ibd
查看数据表的总记录数:
select count(*) from tsys_log;
要删除的数据的总行数:
select count(*) from tsys_log where operate_time
测试执行的SQL语句:
pt-archiver --source h=localhost,u=root,p=root,P=3306,S=/usr/local/mysql/data/mysql.sock,D=pt_test,t=tsys_log --no-check-charset --where 'operate_time
解释说明:
--purge 清理数据 直接删除源表里的数据 谨慎使用
--where 指定删除条件必须的条件有字符串的要用引号括起来
--limit 表示一次要删除多少行数据这里设置为1000表示一次只删除一千行
--progress 每处理progress指定的行数后就打印一次信息
--statistics 结束的时候给出统计信息:开始的时间点,结束的时间点,查询的行数,归档的行数,删除的行数,以及各个阶段消耗的总的时间和比例,便于以此进行优化。
--no-delete 表示不删除原来的数据,注意:如果不指定此参数,所有处理完成后,都会清理原表中的数据。
--sleep 120 每次归档了limit个行记录后的休眠120秒(单位为秒)
--no-check-charset 不指定字符集
--local 不把optimize或analyze操作写入到binlog里面(防止造成主从延迟巨大)
--analyze=ds 操作结束后,优化表空间(d表示dest s表示source)
再次查看数据表所占用的存储空间:
SELECT LOWER(TABLE_SCHEMA) AS TABLE_SCHEMA,
LOWER(TABLE_NAME) AS TABLE_NAME,
ROUND(SUM(data_length+index_length)/1024/1024) AS TOTAL_MB,
ROUND(SUM(data_length)/1024/1024) as DATA_MB
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='pt_test' AND TABLE_NAME='tsys_log'
GROUP BY TABLE_SCHEMA,TABLE_NAME;
观察物理文件的使用空间:
结果发现没变化
alter table tsys_log engine=innodb
再次查看该表所占用的物理存储空间
ls -lh| grep tsys_log.ibd
将tsys_log表中operate_time
pt-archiver --source h=localhost,u=root,p=root,P=3306,S=/usr/local/mysql/data/mysql.sock,D=pt_test,t=tsys_log --dest h=localhost,u=root,p=root,P=3306,S=/usr/local/mysql/data/mysql.sock,D=pt_test,t=tsys_logold --no-check-charset --where 'operate_time
查看数据表所占用的存储空间:
ALTER TABLE tsys_log engine=innodb;
SELECT LOWER(TABLE_SCHEMA) AS TABLE_SCHEMA,
LOWER(TABLE_NAME) AS TABLE_NAME,
ROUND(SUM(data_length+index_length)/1024/1024) AS TOTAL_MB,
ROUND(SUM(data_length)/1024/1024) as DATA_MB
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='pt_test' AND TABLE_NAME='tsys_log'
GROUP BY TABLE_SCHEMA,TABLE_NAME;
SELECT LOWER(TABLE_SCHEMA) AS TABLE_SCHEMA,
LOWER(TABLE_NAME) AS TABLE_NAME,
ROUND(SUM(data_length+index_length)/1024/1024) AS TOTAL_MB,
ROUND(SUM(data_length)/1024/1024) as DATA_MB
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='pt_test' AND TABLE_NAME='tsys_logold'
GROUP BY TABLE_SCHEMA,TABLE_NAME;
查看物理空间的使用:
ls -lh| grep tsys_log.ibd
ls -lh| grep tsys_logold.ibd
1.pt-archive ----MySQL的在线归档,无影响生产
2.pt-kill -----自定义查杀。确保慢查询及恶性攻击对生产无影响
3.pt-online-schema-change ----在线DDL操作,对上亿的大表加索引加字段且对生产无影响
4.pt-query-digest -----慢查询Log的分析。
5.pt-slave-delay ---就是指定从库比主库延迟多长时间
6.pt-table-checksum & pt-table-sync-----检查主从是否一致性-----检查主从不一致之后用这个工具进行处理 这两个一搬是搭配使用
pt-find ---找出几天之前建立的表
pt-slave-restart -----主从报错,跳过报错
9.pt-summary ---整个系统的的概述
10.pt-mysql-summary ---MySQL的表述,包括配置文件的描述
11.pt-duplicate-key-checker ---检查数据库重复索引
pt-archive解释使用:##归档 用此操作的表必须有主键。
1.归档历史数据;
2.在线删除大批量数据;
3.数据导出和备份;
4.数据远程归档;
5.数据清理
1.pt-archive –help 参数,用这可以help一下
几个常用说明
--limit10000 每次取1000行数据用pt-archive处理
--txn-size 1000 设置1000行为一个事务提交一次,
--where‘id<3000‘ 设置操作条件
--progress5000 每处理5000行输出一次处理信息
--statistics 输出执行过程及最后的操作统计。(只要不加上--quiet,默认情况下pt- archive都会输出执行过程的)
--charset=UTF8 指定字符集为UTF8—这个最后加上不然可能出现乱码。
--bulk-delete 批量删除source上的旧数据(例如每次1000行的批量删除操作)
例:
(1).将表中CREATE_DATE字段小于2018-01-01 00:00:00时间的数据进行归档,不删除原表记录
pt-archiver --source h=192.168.X.X ,P=3306,u=用户,p=密码,D=库名,t=表名 --dest h=目标IP,P=3306,u=用户,p=密码,D=库名,t=表名 --no-check-charset --where CREATE_DATE<"2015-10-01 00:00:00"' --progress 5000 --no-delete --limit=10000 –statistics
注:字符要加上双单 ---"2015-10-01"
(2).阿里云RDS保留三个月数据
pt-archiver --source h=RDS地址,P=端口,u=用户名,p=密码,D=库名,t=表名 --where nextfetch 注: 阿里云RDS要加 --no-version-check参数 (3).远程归档 (远程归档) pt-archiver --charset ‘utf8’ --source h=127.0.0.1,P=6006,u=root,p=‘密码’,D=源库,t=源表 --dest h=10.59.1.152,P=6006,u=sys_dba,p=‘密码’,D=目标库,t=目标表 --where 'periodID=1' --progress 5000 --limit=5000 –statistics pt-kill ##解释说明 kill MySQL连接的一个工具 kill掉你想Kill的任何语句,特别出现大量的阻塞,死锁,某个有问题的sql导致mysql负载很高黑客攻击。当有很多语句时你不可能用show processlist去查看,当QPS很高时,你根本找不到你找的语句或ID,这时就可以用Pt-kill来完成;他可以根据运行时间,开源IP,用户名,数据库名。SQL语句,sleep,running 等状态进行匹配然后kill PT-kill 参数 --help 常用参数说明 --daemonize 放在后台以守护进程的形式运行; --interval 多久运行一次,单位可以是s,m,h,d等默认是s –不加这个默认是5秒 --victims 默认是oldest,只杀最古老的查询。这是防止被查杀是不是真的长时间运行的查询,他们只是长期等待 这种种匹配按时间查询,杀死一个时间最高值。 --all 杀掉所有满足的线程 --kill-query 只杀掉连接执行的语句,但是线程不会被终止 --print 打印满足条件的语句 --busy-time 批次查询已运行的时间超过这个时间的线程; --idle-time 杀掉sleep 空闲了多少时间的连接线程,必须在--match-command sleep时才有效—也就是匹配使用 -- –match-command 匹配相关的语句。 ----ignore-command 忽略相关的匹配。 这两个搭配使用一定是ignore-commandd在前 match-command在后, --match-db cdelzone 匹配哪个库 command有:Query、Sleep、Binlog Dump、Connect、Delayed insert、Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump 例: ---杀掉空闲链接sleep 5秒的 SQL 并把日志放到/home/pt-kill.log文件中 /usr/bin/pt-kill --user=用户名 --password=密码 --match-command Sleep --idle-time 5 --victim all --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log & ---查询SELECT 超过1分钟路 /usr/bin/pt-kill --user=用户名 --password=密码 --busy-time 60 --match-info "SELECT|select" --victim all --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log & --- Kill掉 select IFNULl.*语句开头的SQL pt-kill --user=用户名 --password=密码 --victims all --busy-time=0 --match-info="select IFNULl.*" --interval 1 -S /tmp/mysqld.sock --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill123.log & ----kill掉state Locked /usr/bin/pt-kill --user=用户名 --password=密码 --victims all --match-state='Locked' --victim all --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log & ---kill掉 qz_business_servic 库,web为110.59.2.37的链接 pt-kill --user=用户名 --password=密码 --victims all --match-db='qz_business_service' --match-host='10.59.2.37' --kill --daemonize --interval 10 -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log & ---指定哪个用户kill pt-kill --user=用户名 --password=密码 --victims all --match-user='root' --kill --daemonize --interval 10 -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log & ---查询SELECT 超过1分钟路 pt-kill --user=用户名 --password=密码 --busy-time 60 --match-info "SELECT|select" --victim all --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log & ----kill掉 command query | Execute pt-kill --user=用户名 --password=密码 --victims all --match-command= "query|Execute" --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log & 注:上面都是说针对手动或紧急情况下处理的事 pt-online-schema-change ###简称 pt-osc 在线更改表结构 MySQL 大字段的DDL操作:加减字段、索引、修改字段属性 注:被操作的表如果有 触发器,或外键不可用 工作原理: 1.创建一个和要执行 alter 操作的表一样的新的空表结构(是alter之前的结构) 2.在新表执行alter table 语句(速度应该很快) 3.在原表中创建触发器3个触发器分别对应insert,update,delete操作 4.以一定块大小从原表拷贝数据到临时表,拷贝过程中通过原表上的触发器在原表进行的写操作都会更新到新建的临时表 5.Rename 原表到old表中,在把临时表Rename为原表 pt-online-schema-change --help 参数 --max-load 默认为Threads_running=25。每个chunk拷贝完后,会检查SHOW GLOBAL STATUS的内容,检查指标是否超过了指定的阈值。如果超过,则先暂停。这里可以用逗号分隔,指定多个条件,每个条件格式: status指标=MAX_VALUE或者status指标:MAX_VALUE。如果不指定MAX_VALUE,那么工具会这只其为当前值的120%。 --critical-load 默认为Threads_running=50。用法基本与--max-load类似,如果不指定MAX_VALUE,那么工具会这只其为当前值的200%。如果超过指定值,则工具直接退出,而不是暂停 --user: -u,连接的用户名 --password: -p,连接的密码 --database: -D,连接的数据库 --port -P,连接数据库的端口 --host: -h,连接的主机地址 --socket: -S,连接的套接字文件 --statistics 打印出内部事件的数目,可以看到复制数据插入的数目。 --dry-run 创建和修改新表,但不会创建触发器、复制数据、和替换原表。并不真正执行,可以看到生成的执行语句,了解其执行步骤与细节。 --dry-run与--execute必须指定一个,二者相互排斥。和--print配合最佳。 --execute 确定修改表,则指定该参数。真正执行。 --dry-run与--execute必须指定一个,二者相互排斥。 --print 打印SQL语句到标准输出。指定此选项可以让你看到该工具所执行的语句,和--dry-run配合最佳。 --progress 复制数据的时候打印进度报告,二部分组成:第一部分是百分比,第二部分是时间。 --quiet -q,不把信息标准输出。 例: (1).对t=learn_tracedb 对learn_tracedb 表的updateTime 列添加索引 pt-online-schema-change --user=root --password=‘密码' --port=6006 --host=127.0.0.1 --critical-load Threads_running=100 --alter "ADD INDEX index_updateTime (updateTime)" D=acc_tasktrace,t=learn_tracedb --print --execute (2).对cware_user_point 添加periodid列 pt-online-schema-change --user=root --password=‘密码' --port=6006 --host=127.0.0.1 --critical-load Threads_running=200 --alter "ADD COLUMN periodID int(11)" D=acc_cwaretiming,t=cware_user_point --print –execute pt-query-digest ###-----慢查询Log的分析 pt-query-digest --help参数 --create-review-table 当使用--review参数把分析结果输出到表中时,如果没有表就自动创建。 --create-history-table 当使用--history参数把分析结果输出到表中时,如果没有表就自动创建。 --filter 对输入的慢查询按指定的字符串进行匹配过滤后再进行分析 --limit限制输出结果百分比或数量,默认值是20,即将最慢的20条语句输出,如果是50%则按总响应时间占比从大到小排序,输出到总和达到50%位置截止。 --host mysql服务器地址 --host mysql服务器地址 --user mysql用户名 --password mysql用户密码 --history 将分析结果保存到表中,分析结果比较详细,下次再使用--history时,如果存在相同的语句,且查询所在的时间区间和历史表中的不同,则会记录到数据表中,可以通过查询同一CHECKSUM来比较某类型查询的历史变化。 --review 将分析结果保存到表中,这个分析只是对查询条件进行参数化,一个类型的查询一条记录,比较简单。当下次使用--review时,如果存在相同的语句分析,就不会记录到数据表中。 --output 分析结果输出类型,值可以是report(标准分析报告)、slowlog(Mysql slow log)、json、json-anon,一般使用report,以便于阅读。 --since 从什么时间开始分析,值为字符串,可以是指定的某个”yyyy-mm-dd [hh:mm:ss]”格式的时间点,也可以是简单的一个时间值:s(秒)、h(小时)、m(分钟)、d(天),如12h就表示从12小时前开始统计。 --until 截止时间,配合—since可以分析一段时间内的慢查询。 例: (1).分析指定时间段的慢查询 pt-query-digest /home/zb/data/my6006/log/mysql_slow_2018-11-07.log --since ‘2018-11-07 00:00:00’ --until ‘2018-11-11 15:50:00’ Overall: 总共有多少条查询,上例为总共2.7k个查询。 Time range: 查询执行的时间范围。 unique: 唯一查询数量,即对查询条件进行参数化以后,总共有多少个不同的查询,该例为64。 total: 总计 min:最小 max: 最大 avg:平均 95%: 把所有值从小到大排列,位置位于95%的那个数,这个数一般最具有参考价值。 median: 中位数,把所有值从小到大排列,位置位于中间那个数。 针对某个用户的慢查询 (2).pt-query-digest --filter '($event->{user} || "") =~ m/^root/i' /web/mysql/data/chinapen40-slow.log > slow_report5.log pt-slave-delay ###---就是指定从库比主库延迟多长时间—---从库上执行 工作原理: 通过启动和停止从服务器的sql线程来设置从落后于主。它是通过slave的relay log(中继日志)的position(偏移量),不断启动,关闭replication SQL thread来保持主从一直延时固定长的时间来实现。因此不需要连接到主服务器。如果IO进程不落后主服务器太多的话,这个检查方式还是有效的,如果IO线程延时过大,pt-slave-delay也可以连接到主库来获取binlog的位置信息。 pt-slave-delay --delay=1m --interval=15s --run-time=10m u=root,p=123456,h=127.0.0.1,P=6006 --从服务器上执行 参数解释: --delay :从库延迟主库的时间,上面为1分钟。 --interval :检查的间隔时间,上面为15s检查一次。(可选),不选则1分钟检查一次(默认)。 --run-time :该命令运行时间,上面为该命令运行10分钟关闭。(可选),不选则永远运行。--一搬不加此参数 pt-table-checksum & pt-table-sync ###-----检查主从是否一致性-----检查主从不一致之后用这个工具进行处理 这两个一搬是搭配使用(一搬主从不一样肯定要查一下,不能直接修复就完事了。这个大家可用于辅助工具。) 参数讲解: replicate=test.checksum:主从不一致的结果放到哪一张表中,一般我放在一个既有的数据库中,这个checksum表由pt-table-checksum工具自行建立。 databases=testdb :我们要检测的数据库有哪些,这里是testdb数据库,如果想检测所有数据库那么就不要写这个参数了,如果有多个数据库,我们用逗号连接就可以了。 host='127.0.0.1' :主库的IP地址或者主机名。 user=dba :主机用户名。 ---确定此用户可以访问主从数据库 port=6006:主库端口号。 recursion-method=hosts :主库探测从库的方式。 empty-replicate-table:清理上一次的检测结果后开始新的检测。 no-check-bin-log-format:不检查二进制日志格式,鉴于目前大多数生产数据库都将二进制日志设置为“ROW”格式,而我们的pt-table-checksum会话会自行设定使用“STATEMENT”格式,所以这个选项请务必加上。 例: pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=test.checksums --recursion-method=hosts --databases=log_manage h=localhost,u=sys_dba,p='密码',P=6006 结果参数: TS :完成检查的时间。 ERRORS :检查时候发生错误和警告的数量。 DIFFS :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会显示不同的信息。 ROWS :表的行数。 CHUNKS :被划分到表中的块的数目。 SKIPPED :由于错误或警告或过大,则跳过块的数目。 TIME :执行的时间。 TABLE :被检查的表名 检测有差异之后到从库上执行一下修复 注:用这个前提是此表必须要有主键或唯一索引 pt-table-sync --sync-to-master --replicate=test.checksums h=127.0.0.1,u=dba,P=6006,p=‘密码’ --print ---------只打印不执行—看详细 pt-table-sync --sync-to-master --replicate=test.checksums h=127.0.0.1,u=dba,P=6006,p=‘密码’ --execute ----开始执行就修复了,再看一下就OK了 再检测就没有了 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的位置来停止 例: 自动跳过主从同步1032的报错 建议大家在从库上如下这个就可以了,多个以逗号隔开就可以了 /usr/bin/pt-slave-restart --user=root --password=‘密码' --port=6006 --host=127.0.0.1 --error-numbers=1032 Pt-summary ###打印出来的信息包括:CPU、内存、硬盘、网卡等信息,还包括文件系统、磁盘调度和队列大小、LVM、RAID、网络链接信息、netstat 的统计,以及前10的负载占用信息和vmstat信息