Percona Toolkit使用测试(1)PT-ALIGN、PT-ARCHIVER
1.PT-ALIGN
pt-align—— 将其他工具的输出对齐到列。
pt-align读取行并将它们分成单词。它计算每行有多少个单词,如果有一个占主导地位的数字,它假设这是每行单词的数量。然后它丢弃所有没有那么多单词的行,然后看第二行。它假设这是第一个非标题行。根据每个单词看起来是否像数字,它决定列对齐。最后,它遍历并决定每个列的宽度,然后将它们打印出来。这对于调整vmstat或iostat的输出非常有用,以便更容易阅读。
2.PT-ARCHIVER
pt-archiver——将MySQL表中的行归档到另一个表或文件中。
pt-archiver是用来存档表的工具。
其目标是一个低影响的、只向前的工作,在不影响OLTP查询的情况下从表中清除旧数据。
您可以将数据插入到另一个表中,而这个表不需要位于相同的服务器上。
您还可以将其以适合于“LOAD DATA INFILE”的格式写入文件。
或者两者都不能做,在这种情况下,它只是一个增量删除。
pt-archiver可以通过插件机制进行扩展。
您可以注入您自己的代码来添加高级归档逻辑,这些逻辑对于归档相关数据、应用复杂的业务规则或在归档过程中构建数据仓库非常有用。
您需要为某些选项仔细选择值。
最重要的就是 --limit, --retries, and --txn-size.
该策略是找到第一行,然后根据某些索引向后查找更多行的数据,包含在命令最后面的where段中的条件
应当可以依靠索引查找所满足的数据,而不是靠扫描整个表。
可以在–source声明中指定 i参数(index),这对于想要根据索引获取数据行的操作非常关键。
使用–dry-run声明此次工具执行后只生成对应的SQL语句,而不真正操作数据,接着对生成的SQL语句进行explain操作,检查其索引使用情况。更好的方法是,在运行查询之前和之后检查处理程序状态计数器中的差异,并确保它不会扫描每个查询的整个表确保语句没有进行全表扫描
您可以使用-no-ascend和-ascend-first部分或全部禁用搜索扫描优化。
有时,对于多列键,这可能更有效。
请注意,pt-archiver是在它选择的索引开始时构建的,并且只向前扫描索引。
如果您试图通过一个索引(而不是它喜欢的索引)从表的末尾读取数据,这可能会导致长表扫描。
如果指定–progress,输出是一个头行,加上每隔一段时间的状态输出。状态输出中的每一行列出当前日期和时间、运行pt-archiver的秒数,以及它存档了多少行。
如果指定–statistics, pt-archiver输出计时和其他信息,以帮助您确定归档过程中哪个部分花费的时间最多。
pt-archiver试图捕捉信号并优雅地退出;例如,如果您向它发送SIGTERM (UNIXish系统上的Ctrl-C),它将捕获信号,打印关于信号的消息,然后正常退出。它不会执行—分析或—优化,因为这些可能需要很长时间才能完成。它将正常运行所有其他代码,包括在任何插件上调用after_finish()(参见“extension”)。
换句话说,如果捕获到一个信号,它将跳出主存档循环并跳过优化/分析。
参数:
至少要指定--dest
,--file
,或者--purge
参数--ignore
与 --replace
互斥--txn-size
与 --commit-each
互斥--low-priority-insert
与 --delay-insert
互斥--share-lock
与 --for-update
互斥--analyze
与 --optimize
互斥--no-ascend
与 --no-delete
互斥
如果在COPY模式下,--dest
的参数值默认继承--source
参数的值
常用参数:
例:
pt-archiver --source h=10.10.80.16,u=root,p=123456,P=5000,D=yanglun,t=t_desc3 --dest h=10.10.80.16,P=5001,u=root,p=123456,D=yanglun,t=t_desc3 --progress 2000 --where “id>1000” --statistics --charset=utf8mb4 --limit=1000 --txn-size 1000 --purge
pt-archiver Bug不会迁移max(id)那条数据的解决方法:
经过迁移测试之后,发现最大id的那条数据没有被迁移走,原因是代码中的条件范围不够,自行修改代码:
修改前: $first_sql .= " AND ($col < " . $q->quote_val($val) . ")";
修改后: $first_sql .= " AND ($col <= " . $q->quote_val($val) . ")";
修改后的source机器的general_log:
通过日志可以发现删除操作是按照主键进行的尽管命令里的条件不是主键
使用以下参数查看两个主机的general_log --sleep 5:每次归档一条数据 sleep 5s
[[email protected] mariadb]# pt-archiver --source h=10.10.80.16,u=root,p=123456,P=5000,D=yanglun,t=asdasd --dest h=10.10.80.16,P=5001,u=root,p=123456,D=yanglun,t=asdasd --progress 2 --where “id>=1” --statistics --charset=utf8mb4 --limit=2 --txn-size 3 --sleep 5 --no-delete
TIME ELAPSED COUNT
2019-06-05T18:10:13 0 0 #–progress 2 每两条显示输出一次
2019-06-05T18:10:13 0 2
2019-06-05T18:10:18 5 4
2019-06-05T18:10:23 10 6
2019-06-05T18:10:28 15 8
2019-06-05T18:10:33 20 10
2019-06-05T18:10:38 25 12
2019-06-05T18:10:43 30 14
2019-06-05T18:10:48 35 16
2019-06-05T18:10:53 40 18
2019-06-05T18:10:58 45 20
2019-06-05T18:11:03 50 22
2019-06-05T18:11:08 55 24
2019-06-05T18:11:13 60 26
2019-06-05T18:11:13 60 26
Started at 2019-06-05T18:10:13, ended at 2019-06-05T18:11:18
Source: A=utf8mb4,D=yanglun,P=5000,h=10.10.80.16,p=…,t=asdasd,u=root
Dest: A=utf8mb4,D=yanglun,P=5001,h=10.10.80.16,p=…,t=asdasd,u=root
SELECT 26 #结果
INSERT 26
DELETE 0
Action Count Time Pct
sleep 13 65.0023 99.96
select 14 0.0076 0.01
inserting 26 0.0049 0.01
commit 18 0.0045 0.01
other 0 0.0105 0.02
如果在运行命令过程中,源表发生了修改,工具按照向前原则:如已经归档id<10的数据,此时源表删除了id=11的数据,那么归档继续的时候将无法归档id=11的数据,如果修改源表id=9的数据,那么没有任何影响,因为id=9的数据已经归档完毕,工具只会向前不会向后运行
参数 | 解释 |
---|---|
- -analyze=s | 在源主机和/或归档主机上运行ANALYZE TABLE |
- -ascend-first | 仅上升索引的第一列 |
- -ask-pass | 连接到MySQL时,询问密码提示 |
- -buffer | 禁用自动刷新缓存到–file参数指定的的文件,将结果集存在操作系统缓存中,提交的时候刷新缓存。危险在于崩溃可能导致数据丢失。使用--buffer 带来的性能提升大约是5%到15% |
- -bulk-delete | 使用一条Delete语句批量删除每个行块。 ① |
- -[no]bulk-delete-limit | 默认值:yes 给--bulk-delete 语句添加 --limit 这是一个高级选项,你不应该禁用它,除非你知道你在做什么和为什么! |
- -bulk-insert | 使用LOAD DATA INFILE 来插入每个块 ② |
- -charset=s | 默认字符集,只识别MySQL已知的字符集 |
- -[no]check-charset | 【不】检查字符集,确保连接和表字符集相同。当需要进行字符集转换时,禁用此检查可能有用或必要。 |
- -[no]check-columns | 确保原表和新表具有相同的表列,默认启用;使pt-archiver检查源表和目标表是否相同列。它不检查列顺序、数据类型等。它只是检查源中的所有列是否存在在目的地,反之亦然。如果有任何差异,pt-archiver将带着错误退出。 |
- -check-interval=m | 默认值: 1s 如果该参数被给出,将在检测到从库延迟时暂停工具--check-interval 秒 ,这个检查每100行执行一次 |
- -check-slave-lag=s | 暂停归档,直到主从延迟小于--max-lag 如果指定了–check-slave-lag参数, 则只检查指定的slave延迟情况,而不是所有的slave |
- -columns=a 简写: -c | 要归档的列(用逗号分隔的list)指定一个逗号分隔的列列表,用于获取、写入文件和插入目标表。如果指定,pt-archiver将忽略其他列,除非需要将它们添加到SELECT语句中以升序索引或删除行。 |
- -commit-each | 每一组数据提交一次,并自动屏蔽–txn-size参数 ③ |
- -config=A | 读取这个逗号分隔的配置文件列表;如果指定,这必须是命令行上的第一个选项 |
- -database=s 简写: -D | 连接到这个数据库 |
- -delayed-insert | 将延迟修饰符添加到INSERT语句中。 |
- -dest=d | 指定要归档到的表。 |
- -dry-run | 使用–dry-run声明此次工具执行后只生成对应的SQL语句,而不真正操作数据 |
- -file=s | 要归档到的文件,格式类似于DATE_FORMAT()。 |
- -for-update | 向SELECT语句添加FOR UPDATE修饰符 |
- -header | 在“–file”顶部打印列标题将列名写入’–file '给出的文件的第一行(只有在文件不存在时会写入列名)。如果文件已经存在,则不写标头; |
- -help | 帮助 |
- -high-priority-select | 向SELECT语句添加 HIGH_PRIORITY 修饰符 |
- -host=s 简写: -h | 连接到的主机 |
- -ignore | 向SELECT语句添加 ignore 修饰符。 |
- -limit=i | 默认值:1 每个语句要获取和存档的行数。增加limit值可能更有效,但如果您的存档很稀疏,跳过许多行,那么要小心 |
- -local | 不要向binlog写入OPTIMIZE or ANALYZE语句 |
- -low-priority-delete | 向delete语句添加 LOW_PRIORITY 修饰符。 |
- -low-priority-insert | 向insert语句添加 LOW_PRIORITY 修饰符。 |
- -max-flow-ctl=f | 有点类似于-max-lag,但适用于PXC集群。检查集群用于流控制的平均暂停时间,如果超过选项中指示的百分比,则使工具暂停。默认情况下没有流控制检查。 |
- -max-lag=m | 从库滞后的时间,超出此时间将暂停工具 |
- -no-ascend | 不使用升序索引优化。这在默认情况下是启用的,因为它通常是重复访问的好策略。 |
- -no-delete | 不删除存档行。 |
- -optimize=s | 工具运行后 执行OPTIMIZE TABLE (值:d(新表执行)、s(源表执行)、ds(都执行))④ |
- -password=s 简写:-p | 连接时使用的密码。如果密码包含逗号,则必须用反斜杠转义 |
- -pid=s | 创建给定的PID文件。如果PID文件已经存在并且其中包含的PID与当前PID不同,则该工具不会启动。但是,如果PID文件存在并且其中包含的PID不再运行,则该工具将用当前PID覆盖PID文件。当工具退出时,PID文件将自动删除。 |
- -plugin=s | 将Perl模块名用作通用插件 |
- -port=i 简写:-P | 数据库端口 |
- -primary-key-only | 只使用主键来指定行 |
- -progress=i | 每处理X行输出一次信息 |
- -purge | 允许在没有- -file或- -dest参数的情况下进行归档,这实际上是一种清除,因为这些行只是被删除了。 |
- -quick-delete | 添加快速修改符来删除语句 |
- -quiet 简写: -q | 不输出任何信息 |
- -replace | 把写入dest库的insert语句转换成replace语句 |
- -retries=i | 每次超时或死锁的重试次数。默认值1,当重试耗尽时,pt-archiver将带着错误退出。 |
- -run-time=m | 运行多久后退出(无论是否全部执行完)。可选后缀s=秒,m=分钟,h=小时,d=天;如果没有后缀,则使用s。 |
- -[no]safe-auto-increment | 默认yes 是否使用max AUTO_INCREMENT存档行。添加一个额外的WHERE子句,以防止pt-archiver在升序单列AUTO_INCREMENT键时删除最新行。这可以防止在服务器重新启动时重用AUTO_INCREMENT值,默认情况下是启用的。 |
- -sentinel=s | 类型:字符串;默认值:/ tmp / pt-archiver-sentinel 如果存在此文件,则退出。- -sentinel指定的文件的存在将导致pt-archiver停止归档并退出。默认值是/tmp/pt-archiver-sentinel。如果有必要,您可能会发现这对于优雅地停止cron作业非常方便。(touch /tmp/pt-archiver-sentinel) |
- -slave-user | 设置可以连接从库的用户,该用户必须存在于所有从节点 |
- -slave-password | 连接从库的用户的密码,该用户密码必须存在于所有从节点 |
- -set-vars=A | 在以逗号分隔的list中设置mysql的variable值,在命令行中指定的变量覆盖这些默认值,如果无法设置变量,该工具将打印警告并继续。 |
- -share-lock | 在select语句中添加 LOCK IN SHARE MODE修饰符 |
- -skip-foreign-key-checks | 禁用外键检查:SET FOREIGN_KEY_CHECKS=0 |
- -sleep=i | 指定SELECT语句之间的睡眠时间。如果指定了- -commit-each,那么提交和刷新将在睡觉前发生 |
- -sleep-coef=f | 把最后一次select的时间的几倍的值 赋值给- -sleep |
- -socket=s 简写: -S | 连接用的socket文件 |
- -source=d | 指定要存档的表 |
- -statistics | 收集和打印即时统计数据 如果- -why-quit被给出,它的行为会发生轻微的变化。这个选项使它打印退出的原因,即使只是因为没有更多的行 |
- -stop | 通过创建标记文件来停止运行实例。 ⑤ |
- -txn-size=i | 默认值:1 每个事务的行数。设置为0完全禁用事务。如果您正在从活动服务器进行归档,例如正在进行繁重的OLTP工作,那么您需要在事务大小和提交开销之间选择一个良好的平衡。较大的事务可能会导致更多的锁争用和死锁,但是较小的事务会导致更频繁的提交开销,这可能非常重要 |
- -user=s 简写: -u | 链接数据库的用户 |
- -version | 显示版本并退出 |
- -[no]version-check | 默认yes 查看Percona Toolkit、MySQL和其他程序的最新版本。⑥ |
- -where=s | 查询语句的where条件,如果不需要where条件 使用where 1=1 |
- -why-quit | 打印退出原因,除非行耗尽。即使- -quiet被给定,这个输出也会打印出来。 |
参数测试:
① 使用bulk-delete参数语句:
DELETE FROM yanglun
.asdasd
WHERE (((id
>= ‘28’))) AND (((id
<= ‘29’))) AND (id>=1) LIMIT 3
未使用bulk-delete参数语句(–purge):
DELETE FROM yanglun
.asdasd
WHERE (id
= ‘28’)
DELETE FROM yanglun
.asdasd
WHERE (id
= ‘29’)
DELETE FROM yanglun
.asdasd
WHERE (id
= ‘30’)
②使用- -bulk-insert参数
LOAD DATA LOCAL INFILE ‘/tmp/pTMbnpHb3Fpt-archiver’ INTO TABLE yanglun
.asdasd
(id
)
commit
未使用- -bulk-insert参数:
INSERT INTO yanglun
.asdasd
(id
) VALUES (‘28’)
INSERT INTO yanglun
.asdasd
(id
) VALUES (‘29’)
INSERT INTO yanglun
.asdasd
(id
) VALUES (‘30’)
③使用 - -commit-each
例如,假设您正在从一个非常大的表的开头归档旧行,使用参数 - -limit 1000和- -txn-size 1000。
在一次查找和归档1000行之后,pt-archiver找到最后999行并归档它们,然后执行下一个SELECT以查找更多行。
这将扫描表的其余部分,但再也找不到任何行。它持有打开的事务很长一段时间,只是为了确定它已经完成了。
您可以使用- -commit-each来避免这种情况。
④ pt-archiver --source h=10.10.80.16,u=root,p=123456,P=5000,D=yanglun,t=asdasd --dest h=10.10.80.16,P=5001,u=root,p=123456,D=yanglun,t=asdasd --progress 3 --where “id>=1” --statistics --no-check-charset --limit=3 --txn-size 3 --sleep 5 --no-delete --optimize ‘ds’
–optimize后的字符串包含d或s就会执行语句在dest或source机器上,如果都不包含,参数无效
使用 --optimize 'ds’的效果 左源表 右新表
⑤ 使用–stop:
⑥ - -[no]version-check
还有两个附加特性:首先,该工具检查自己的版本以及以下软件的版本:操作系统、Percona监视和管理(PMM)、MySQL、Perl、Perl驱动程序(DBD:: MySQL)和Percona工具包。第二,它检查和警告具有已知问题的版本
DSN选项
这些DSN选项用于创建DSN。每个选项都像option=value一样给出。选项对案例敏感,所以P和P不是同一个选项。在=之前或之后不能有空格,如果值包含空格,则必须引用它。DSN选项是逗号分隔的。
参数 | cpoy | 解释 |
---|---|---|
A | yes | 默认字符集 |
D | yes | 包含表的数据库 |
F | yes | 仅从给定文件中读取默认选项 |
L | yes | 显式启用LOAD DATA LOCAL INFILE |
P | yes | 用于连接的端口号 |
S | yes | 用于连接的套接字文件 |
a | no | 执行查询时使用的数据库 |
b | no | 如果为真,则使用SQL_LOG_BIN禁用binlog |
h | yes | 连接到主机 |
i | yes | 使用索引 |
m | no | 插件模块名称 |
p | yes | 连接时使用的密码 |
t | yes | 要从/到存档的表 |
u | yes | 用于登录的用户(如果不是当前用户) |
扩展
通过插入外部Perl模块来处理一些逻辑和/或操作,pt-archiver是可扩展的。您可以使用规范的“m”部分为—source和—dest指定一个模块。例如:
略