# tar -zxvf percona-toolkit-2.2.17.tar.gz
# yum -y install perl perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl-TermReadKey
# yum -y install perl-Digest-MD5

[root@hongquan1 bin]# pwd
/data/soft/percona-toolkit-2.2.17/bin

pt-archiver--将表数据归档到另一个表或文件中
删除或归档一张大表,导出文件等,可以进行主从同步数据
[mysql@mysqlt1 bin]$ ./pt-archiver --help
Archive all rows from oltp_server to olap_server and to a file:
pt-archiver --source h=oltp_server,D=test,t=tbl --dest h=olap_server \
--file '/var/log/archive/%Y-%m-%d-%D.%t' \
--where "1=1" --limit 1000 --commit-each
Purge (delete) orphan rows from child table:
pt-archiver --source h=host,D=db,t=child --purge \
--where 'NOT EXISTS(SELECT * FROM parent WHERE col=child.col)'

参数说明:注意:至少需要指定--dest,--file,--purge 其中的一个
--ignore and --replace are mutually exclusive.
--txn-size and --commit-each are mutually exclusive.
--low-priority-insert and --delayed-insert are mutually exclusive.
--share-lock and --for-update are mutually exclusive.
--analyze and --optimize are mutually exclusive.
--no-ascend and --no-delete are mutually exclusive.

--source :指定要归档表的信息,兼容DSN选项
--source h=my_server,D=my_database,t=my_tbl
b:如果为true,则使用SQL_LOG_BIN禁用binlog--If true, disable binlog with SQL_LOG_BIN.
i:进行操作时,被指定使用的索引 --Index to use.
h=host,D=database,t=table,u=user,p=password,P=port,S=socket
A:Default character set
L:Explicitly enable LOAD DATA LOCAL INFILE.
m:Plugin module name
--source D=test,t=test1,m=My::Module1 --dest m=My::Module2,t=test2
--analyze:Run ANALYZE TABLE afterwards on --source and/or --dest ###--analyze=ds
--ascend-first:Ascend only first column of index ###升序索引优化,提供最左索引(多列主键)的升序。
--no-ascend:Do not use ascending index optimization.
--ask-pass:Prompt for a password when connecting to MySQL. ##连接mysql时输入密码
--buffer:缓冲区输出到--file并在提交时刷新,每次事务提交禁止刷写到磁盘,有操作系统决定刷写。该参数可以提高刷写到文件的性能,但崩溃可能会有数据丢失。
--commit-each:Commit each set of fetched and archived rows (disables --txn-size).##控制事务大小,每次提取、归档就提交。禁用--txn-size
--config:以逗号分隔的配置文件列表; 如果指定,则必须是命令行上的第一个选项
--delayed-insert:Add the DELAYED modifier to INSERT statements##在insert后面添加delayed,延迟写入
--dry-run: Print queries and exit without doing anything##打印查询并退出而不做任何事情
--file:File to archive to, with DATE_FORMAT()-like formatting
%d Day of the month, numeric (01..31)
%H Hour (00..23)
%i Minutes, numeric (00..59)
%m Month, numeric (01..12)
%s Seconds (00..59)
%Y Year, numeric, four digits
%D Database name
%t Table name
Example:-file '/var/log/archive/%Y-%m-%d-%D.%t'
--for-update:Adds the FOR UPDATE modifier to SELECT statements.
--ignore:insert语句加入ignore
--no-delete:不要删除存档的行,默认会删除。不允许--no-ascend,因为启用它们都会导致无限循环。
--progress:每多少行打印进度信息:打印当前时间,已用时间以及每X行存档的行数
--purge:清除而不是归档; 允许省略--file和--dest。如果只想清除行,请考虑使用--primary-key-only指定表的主键列。 这样可以防止无缘无故地从服务器获取所有列
--quick-delete:delete语句里添加quick
--replace:replace into代替insert into
--statistics:收集并打印时间统计信息
--txn-size:每个事务的行数,默认1。指定每个事务的大小(行数)。0完全禁用事务。在pt-archiver处理这么多行之后,如果指定该参数,它会提交--source和--dest,并刷新--file给出的文件。
--where:指定WHERE子句以限制存档的行。 子句里不要包含单词WHERE,不需要WHERE子句,请使用--where 1=1。如
--where 'ts < current_date - interval 90 day'
--limit:限制检索要归档的行的SELECT语句返回的行数,默认是1。这可能会导致与其他查询的更多争用,具体取决于存储引擎,事务隔离级别和--for-update等选项。
--bulk-delete:使用单个DELETE语句批量删除每个行块。该语句删除块的第一行和最后一行之间的每一行,隐含--commit-each.批量删除source上的旧数据
--bulk-insert:批量插入数据到dest主机
--charset:-A,设置默认字符集
--why-quit:除非行耗尽,否则打印退出原因
使用场景
注意: 归档的表大小写敏感,表必须至少有一个索引(Cannot find an ascendable index in table )。
这里需要注意的是,根据自增id进行归档的话,默认最大的id不会进行归档,需要添加参数:--no-safe-auto-increment 才能对最大id进行处理。
--where:删除表中指定的数据,根据自己的需求限定,全部删除就给1=1即可
--statistics:打印出整个归档过程的统计信息
--limit:每次fecth多少行数据,类似游标获取,默认为1。增改该值,有助于加速归档 --limit 10000 每次取1000行数据给pt-archive处理
--progress:打印导出过程中的信息,当前时间,当前一共耗费多少时间,当前fetch数据行数,--progress 5000 每处理5000行输出一次处理信息
--txn-size:每个事物提交的数据行数,批量提交。增加该值可以提升归档性能。 --txn-size 1000 设置1000行为一个事务提交一次
--local:不把optimize或analyze操作写入到binlog里面(防止造成主从延迟巨大)
--analyze=ds:操作结束后,优化表空间(d表示dest,s表示source),默认情况下,pt-archiver操作结束后,不会对source、dest表执行analyze或optimize操作

10.15.7.114 :mysql version=5.6.15,charset=utf8

192.168.19.145:mysql version=5.7.22,charset=utf8mb4

1导出到文件,不删除源数据
2019-03-26T02:02:14 0 0
Cannot find encoding "utf8mb4" at /usr/lib64/perl5/IO/File.pm line 182.
Cannot open :encoding(utf8mb4) /tmp/2019-03-26-test.t1: Invalid argument

[mysql@mysqlt1 bin]$ ./pt-archiver --source u=system,p=**,h=10.15.7.114,P=3306,D=test,t=t1 --file=/tmp/%Y-%m-%d-%D.%t --where="1=1" \
> --no-delete --no-safe-auto-increment --progress=1000 --statistics --no-check-charset
TIME ELAPSED COUNT
2019-03-26T02:04:10 0 0
2019-03-26T02:04:10 0 1000
2019-03-26T02:04:10 0 1000
Started at 2019-03-26T02:04:10, ended at 2019-03-26T02:04:10
Source: D=test,P=3306,h=10.15.7.114,p=...,t=t1,u=system
SELECT 1000
INSERT 0
DELETE 0
Action Count Time Pct
select 1001 0.1258 58.07
commit 1001 0.0316 14.57
print_file 1000 0.0015 0.68
other 0 0.0578 26.68
[mysql@mysqlt1 bin]$ ll /tmp/2019-03-26-test.t1
-rw-rw-r-- 1 mysql mysql 11679 Mar 26 02:04 /tmp/2019-03-26-test.t1
2删除,不导出和迁移
[mysql@mysqlt1 bin]$ ./pt-archiver --source u=system,p=**,h=10.15.7.114,P=3306,D=test,t=t1 --where="1=1" --purge \
> --no-safe-auto-increment --progress=1000 --statistics --no-check-charset
TIME ELAPSED COUNT
2019-03-26T02:07:49 0 0
2019-03-26T02:07:50 1 1000
2019-03-26T02:07:50 1 1000
Started at 2019-03-26T02:07:49, ended at 2019-03-26T02:07:50
Source: D=test,P=3306,h=10.15.7.114,p=...,t=t1,u=system
SELECT 1000
INSERT 0
DELETE 1000
Action Count Time Pct
commit 1001 1.5619 81.38
deleting 1000 0.1455 7.58
select 1001 0.1315 6.85
other 0 0.0804 4.19
(system@127.0.0.1:3306) [test]> select count(*) from test.t1;
+----------+
| count(*) |
+----------+
| 0 |
3全表归档,源表不删除,非批量
DBD::mysql::st execute failed: Duplicate entry '1' for key 'PRIMARY' [for Statement "INSERT INTO `test`.`t37`(`id`,`a`,`b`) VALUES (?,?,?)" with ParamValues: 0='1', 1='1', 2='1'] at ./pt-archiver line 6563.
'1', 1='1', 2='1'] at ./pt-archiver line 6563.
[mysql@mysqlt1 bin]$ ./pt-archiver --source u=system,p=**,h=10.15.7.114,P=3306,D=test,t=t1 --dest u=system,p=**,h=192.168.19.145,P=3306,D=test,t=t37 --where="1=1" --progress=1000 --statistics --no-delete --no-check-charset
TIME ELAPSED COUNT
2019-03-26T02:20:09 0 0
2019-03-26T02:20:11 2 1000
2019-03-26T02:20:11 2 1000
Started at 2019-03-26T02:20:09, ended at 2019-03-26T02:20:11
Source: D=test,P=3306,h=10.15.7.114,p=...,t=t1,u=system
Dest: D=test,P=3306,h=192.168.19.145,p=...,t=t37,u=system
SELECT 1000
INSERT 1000
DELETE 0
Action Count Time Pct
commit 2002 1.6199 70.67
inserting 1000 0.4391 19.16
select 1001 0.1419 6.19
other 0 0.0913 3.98
全表归档,源表不删除,批量插入
[mysql@mysqlt1 bin]$ ./pt-archiver --source u=system,p=**,h=10.15.7.114,P=3306,D=test,t=t1 --dest u=system,p=**,h=192.168.19.145,P=3306,D=test,t=t37 \
> --where="1=1" --limit=1000 --statistics --bulk-insert --txn-size=1000 --no-delete --no-check-charset
Started at 2019-03-26T02:22:48, ended at 2019-03-26T02:22:48
Source: D=test,P=3306,h=10.15.7.114,p=...,t=t1,u=system
Dest: D=test,P=3306,h=192.168.19.145,p=...,t=t37,u=system
SELECT 1000
INSERT 1000
DELETE 0
Action Count Time Pct
bulk_inserting 1 0.0544 61.78
commit 4 0.0034 3.84
select 2 0.0015 1.69
print_bulkfile 1000 -0.0017 -1.91
other 0 0.0304 34.61
5全表归档,源表删除,批量插入,批量删除
./pt-archiver --source u=system,p=**,h=10.15.7.114,P=3306,D=test,t=t1 --dest u=system,p=**,h=192.168.19.145,P=3306,D=test,t=t37 \
--where="1=1" --limit=1000 --statistics --bulk-insert --bulk-delete --txn-size=1000 --no-delete --no-check-charset
6指定条件归档,源表删除,批量(每1000个插入提交一次)
./pt-archiver --source u=system,p=**,h=10.15.7.114,P=3306,D=test,t=t1 --dest u=system,p=**,h=192.168.19.145,P=3306,D=test,t=t37 \
--where="id<=49999" --limit=1000 --statistics --bulk-insert --bulk-delete --txn-size=1000 --no-delete --no-check-charset
7指定索引的归档,不走自增主键索引。参数:i
./pt-archiver --source u=system,p=**,h=10.15.7.114,P=3306,D=test,t=t1,i=a --dest u=system,p=***,h=192.168.19.145,P=3306,D=test,t=t37 \
--where="a >=80000 and a<100000" --limit=1000 --statistics --bulk-insert --bulk-delete --txn-size=1000 --no-delete --no-check-charset
8有从库的归档
./pt-archiver --source u=system,p=**,h=10.15.7.114,P=3306,D=test,t=t1,i=a --dest u=system,p=**,h=192.168.19.145,P=3306,D=test,t=t37 \
--where="a >=80000 and a<100000" --limit=1000 --statistics --bulk-insert --bulk-delete --txn-size=1000 --no-delete --no-check-charset \
--max-lag=1 --check-slave-lag u=system,p=**,h=10.15.7.115,P=3306
9不做任何操作,只打印要执行的查询语句
[mysql@mysqlt1 bin]$ ./pt-archiver --source u=system,p=**,h=10.15.7.114,P=3306,D=test,t=t1,i=a --dest u=system,p=**,h=192.168.19.145,P=3306,D=test,t=t37 \> --where="a >=1000 and a<3000" --limit=1000 --replace --statistics --txn-size=1000 --no-delete --no-check-charset --dry-run
SELECT /*!40001 SQL_NO_CACHE */ `id`,`a`,`b` FROM `test`.`t1` FORCE INDEX(`a`) WHERE (a >=1000 and a<3000) ORDER BY `a` LIMIT 1000
SELECT /*!40001 SQL_NO_CACHE */ `id`,`a`,`b` FROM `test`.`t1` FORCE INDEX(`a`) WHERE (a >=1000 and a<3000) AND ((((? IS NULL AND `a` IS NOT NULL) OR (`a` > ?)))) ORDER BY `a` LIMIT 1000
REPLACE INTO `test`.`t37`(`id`,`a`,`b`) VALUES (?,?,?)
10常用的命令:归档到另一个数据库,源表删除,批量删除和插入,每1000次修改进行提交。跳过错误并且指定字符集连接
[mysql@mysqlt1 bin]$ ./pt-archiver --source u=system,p=**,h=10.15.7.114,P=3306,D=test,t=t1,i=a --dest u=system,p=**,h=192.168.19.145,P=3306,D=test,t=t37 --no-version-check\
> --where="a >=500 and a<800" --ignore --txn-size=200 --limit=200 --bulk-delete --bulk-insert --progress=5000 --statistics --why-quit --no-check-charset
TIME ELAPSED COUNT
2019-03-26T03:13:10 0 0
2019-03-26T03:13:11 0 300
Started at 2019-03-26T03:13:10, ended at 2019-03-26T03:13:11
Source: D=test,P=3306,h=10.15.7.114,i=a,p=...,t=t1,u=system
Dest: D=test,P=3306,h=192.168.19.145,i=a,p=...,t=t37,u=system
SELECT 300
INSERT 300
DELETE 300
Action Count Time Pct
commit 4 0.0081 23.57
bulk_inserting 2 0.0061 17.83
bulk_deleting 2 0.0032 9.38
select 3 0.0013 3.74
print_bulkfile 300 -0.0011 -3.28
other 0 0.0168 48.75
Exiting because there are no more rows.
可以根据实际情况,进行相关参数的调整。另外其他相关参数说明
--ignore或则--replace:归档冲突记录跳过或则覆盖,批量插入的时候因为是load data,索引看不到主键冲突记录的报错。要是非批量插入,则需要添加。
--sleep:指定两次SELECT语句的sleep时间.默认是没有sleep的。
--why-quit:打印退出的原因,归档数据正常完成的除外。
--charset=UTF8:指定字符集。
--analyze:结束归档后,优化表空间。

文档参考

https://www.percona.com/doc/percona-toolkit/LATEST/pt-archiver.html#cmdoption-pt-archiver-source
https://www.cnblogs.com/zhoujinyi/p/9925508.html

pt工具之pt-archiver的更多相关文章

  1. 快速安装Percona pt工具

    yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-Time-HiRes perl-IO-Socket-SSLwget http://pk ...

  2. pt工具主从一致性检查并修复以及版本3.0.4的版本缺点

    pt-table-checksum和pt-table-sync分别检验master-slave的数据不一致并修复. 1.本次测试环境 [root@172-16-3-190 we_ops_admin]# ...

  3. pt工具校验主从数据一致性之dsns方式

    mysql主从数据一致性校验,常用的方法是Percona-Toolkit的组件pt-table-checksum,这东西怎么用网上一大堆,就不啰嗦了.主要说一下通过dsns方式发现从库的一种方式. p ...

  4. mysql瑞士军刀–pt工具

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

  5. pt工具加字段脚本

    #!/bin/bashcnn_db=$1table=$2alter_conment=$3 cnn_host='192.168.10.14'cnn_user='root'cnn_pwd='123456' ...

  6. mysql管理工具之pt

    之前我一直用Seconds_behind_master来衡量主从的延迟,今天看到文档,才觉得多么不可靠!以下是官方文档的描述: In essence, this field measures the ...

  7. pt工具

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

  8. iptables防火墙原理详解+mysql pt工具

    http://seanlook.com/2014/02/23/iptables-understand/

  9. mysql 案例 ~ pt校验工具介绍

    简介:今天咱们来聊聊PT校验工具pt-table-checksum 注意事项:    1. 根据测试,需要一个即能登录主库,也能登录从库的账号:    2. 只能指定一个host,必须为主库的IP:  ...

随机推荐

  1. sql内连接外连接自然连接

    为什么我们要使用内连接和外连接呢?可以从两张或者多张表中找出,我们需要的属性. 这个比较好:http://www.cnblogs.com/youzhangjin/archive/2009/05/22/ ...

  2. Neutron的安全组原理

    ​ Security group通过Linux IPtables来实现,为此,在Compute节点上引入了qbr*这样的Linux传统bridge(iptables规则目前无法加载到直接挂在到ovs的 ...

  3. mysql 字段属性 与 排序

    mysql中常见的数据类型:varchar(n).float.int(n).bigint(n).date.datetime.text 字段属性 默认值:DEFAULT '默认值' 非空:NOT NUL ...

  4. [转载]java在线比较两个word文件

    一.项目背景 开发文档管理系统或OA办公系统的时候,实现在线处理word文档的功能比较容易,但是也经常会有客户提出文档版本管理的需求,这就需要同时在线打开两个word文件,对比两个不同版本的word文 ...

  5. 关于微软C#中的CHART图表控件的简单使用

    最近公司项目要用到Chart图表控件,这是一个比较老的东西了,目前网络上似乎已经不太流行这个控件,但是只要配置了相关的属性,效果还是可以的.前前后后摸索了好久,接下来谈谈这个件控件最重要的几个属性. ...

  6. Git_学习_11_Git rebase合并提交信息

    一.前言 二.操作过程 (1)先后两次进行文件修改,然后提交到本地仓库. (2)使用 git rebase -i origin/dev 来合并提交信息. 会弹出一个编辑框 p 07c5abd Intr ...

  7. docker 私有registry 配置

    备注:此处使用linux镜像配置仓库 registry 启动步骤 https://hub.docker.com/_/registry/ docker login docker pull registr ...

  8. LeetCode OJ:Permutations II(排列II)

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  9. Android数据库代码优化(2) - 从SQLite说起

    从SQLite说起 如果没有SQLite的基础,我们只是从Android封装的SQLite API去学习的话,难免思路会受到限制.所以,我们还是需要老老实实从头开始学习SQLite. 当我们有一身的S ...

  10. 10.Linux网卡的配置及详解

    1.网卡配置文件在/etc/sysconfig/network-scripts/下: [root@oldboy network-scripts]# ls /etc/sysconfig/network- ...