Percona Toolkit使用测试(6)PT-FIND

PT-FIND —— 查找MySQL表并执行操作,如GNU查找
概要
使用:

pt-find [OPTIONS] [DATABASES]

pt-find搜索MySQL表并执行操作,如GNU find。默认操作是打印数据库和表名。
查找一天以上创建的所有使用MyISAM引擎的表,并打印它们的名称:

pt-find --ctime +1 --engine MyISAM

查找InnoDB表,并将其转换为MyISAM:

pt-find --engine InnoDB --exec "ALTER TABLE %D.%N ENGINE=MyISAM"

按照name_sid_pid命名约定,查找由不再存在的进程创建的表,并删除它们。

pt-find --connection-id '\D_\d+_(\d+)$' --server-id '\D_(\d+)_\d+$' --exec-plus "DROP TABLE %s"

在test和junk数据库中查找空表并删除:

pt-find --empty junk test --exec-plus "DROP TABLE %s"

查找总大小超过5g的表:

pt-find --tablesize +5G

查找所有表并打印它们的总数据和索引大小,首先对最大的表进行排序(顺便说一下,排序是另一个程序)。

pt-find --printf "%T\t%D.%N\n" | sort -rn

为后代将数据插入数据库:

pt-find --noquote --exec "INSERT INTO sysdata.tblsize(db, tbl, size) VALUES('%D', '%N', %T)"

描述:
pt-find查找通过指定测试的MySQL表,并执行指定的操作。默认操作是将数据库和表名打印到STDOUT。

pt-find比GNU find简单。它不允许您在命令行上指定复杂的表达式。

pt-find在可能时使用SHOW TABLES,在需要时使用SHOW TABLE STATUS 。

参数类型:
有三种类型的选项:普通选项,它决定一些行为或设置;
测试,确定一个表是否应该包含在找到的表列表中;
和actions,它对pt-find查找到的表做一些事情。

pt-find使用标准的Getopt::Long选项解析,因此您应该在长选项名前面使用双破折号,这与GNU find不同。

参数
- -ask-pass
连接数据库询问密码
- -case-insensitive
指定所有正则表达式搜索不区分大小写。
- -charset
字符集
- -config
读取这个逗号分隔的配置文件列表;如果指定,这必须是命令行上的第一个选项。
- -database
连接到的数据库
- -day-start
度量从今天开始而不是从当前时间开始的时间
- -defaults-file
mysql配置文件
- -help
帮助并退出
- -host
连接主机名、ip
- -or
使用OR进行联合测试
默认情况下,测试被评估为它们之间有一个AND。这个选项将它切换到OR。
选项解析不是由pt-find本身实现的,因此不能使用圆括号和OR和and的混合物指定复杂的表达式。
- -password
数据库连接密码
- -pid
pid文件
- -port
数据库端口
- -[no]quote
默认yes
使用反引号字符引用MySQL标识符名称。
引用发生在测试运行之后,以及操作运行之前。
- -set-vars
设置mysql变量
- -socket
socket文件
- -user
连接用户名
- -version
查看版本并退出
- -[no]version-check
检查数据库,pt工具版本

TESTS

大多数测试针对“SHOW TABLE STATUS”输出列检查一些标准。
数值参数可以指定为+n(大于n)、-n(小于n)和n(正好是n)。所有数值选项都可以选择k、M或G作为后缀乘法器(分别为1_024、1_048_576和1_073_741_824)。所有模式都是Perl正则表达式(参见“man perlre”),除非指定为类似SQL的模式。

日期和时间都是相对于同一时刻测量的,当pt-find首先询问数据库服务器时间。所有的日期和时间操作都是在SQL中完成的,因此,如果您说要查找5天前修改过的表,那么就需要
SELECT DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 5 DAY).
如果你指定-day-start,那么course是相对于CURRENT_DATE的。

然而,表大小和其他度量在某个时刻是不一致的。MySQL可能需要一些时间来处理所有的SHOW查询,而pt-find对此无能为力。这些测量是根据它们被测量的时间。

如果您需要一些不在此列表中的测试,请提交一个bug报告,我将为您增强pt-find。它真的很容易。
- -autoinc
类型:字符串;测试组:Tests
查询下一个AUTO_INCREMENT是n的表。这将测试AUTO_INCREMENT列。
如:
[root@bogon percona]# pt-find -u root -p123456 -h 10.10.80.16 -P 5000  --autoinc=36.
- -avgrowlen
类型:大小
表平均每行长度是n字节。这将测试Avg_row_length列。指定的大小可以为“NULL”,以测试Avg_row_length为NULL的位置。
在这里插入图片描述
- -checksum
类型:字符串;测试组:
表校验和为n。这测试Checksum列。
- -cmin
显示n分钟前创建的表。这将测试Create_time列。
在这里插入图片描述
- -collation
表排序规则匹配模式 Collation列
在这里插入图片描述
- -column-name
表中的列名与模式匹配。
在这里插入图片描述
- -column-type
类型:字符串;

表中的一列匹配这种类型(不区分大小写)。

类型的例子有:varchar、char、int、smallint、bigint、decimal、year、timestamp、text、enum。
在这里插入图片描述
- -comment
表注释匹配。这将测试Comment列
在这里插入图片描述
- -connection-id
类型:字符串
表名包含不存在的MySQL连接ID,这将测试模式的表名。
这个测试的参数必须是一个Perl正则表达式,它捕获这样的数字:(d+)。如果表名与模式匹配,这些捕获的数字将被视为某个进程的MySQL连接ID。如果根据SHOW FULL PROCESSLIST不存在连接,则测试返回true。如果连接ID大于pt-find自己的连接ID,则出于安全考虑,测试返回false。

你为什么要这么做?如果使用基于MySQL语句的复制,您可能知道临时表可能会引起的问题。您可以选择通过创建具有惟一名称的实际表来解决这个问题,而不是创建临时表。一种方法是将连接ID附加到表的末尾,即:

scratch_table_12345。这可以确保表名是惟一的,并使您能够找到它与哪个连接相关联。也许最重要的是,如果连接不再存在,您可以假设连接在不清理表的情况下死亡,而该表是删除的候选表。

如果这样做,请确保用户pt-find具有process特权!否则,它只会看到来自同一用户的连接,并且可能认为一些表已经准备好在仍然使用时删除。为了安全起见,pt-find为您检查这个。
- -createopts
类型:字符串;
表创建选项匹配模式。这将测试Create_options列
- -ctime
类型:大小;
表是n天前创建的。这将测试Create_time列。
在这里插入图片描述
- -datafree
类型:大小;
表有n个字节的空闲空间。这将测试Data_free列。指定的大小可以为“NULL”来测试Data_free为NULL的地方。

[root@bogon percona]# pt-find -u root -p123456 -h 10.10.80.16 -P 5000 --datafree +10
- -datasize
类型:大小;
表数据使用n字节的空间。这将测试Data_length列。指定的大小可以为“NULL”来测试Data_length为NULL的地方。
注意:从MySQL 8.0开始,空表返回0而不是NULL。

[root@bogon percona]# pt-find -u root -p123456 -h 10.10.80.16 -P 5000 --datasize +50M

- -dblike
类型:字符串;
数据库名称与SQL类似的模式匹配。
在这里插入图片描述
- -dbregex
类型:字符串;
数据库名称与此模式匹配。(正则)
在这里插入图片描述
- -empty
没有行的表。这将测试Rows列。
在这里插入图片描述
- -engine
类型:字符串;
显示存储引擎为参数的表
- -function
类型:字符串;
函数定义匹配模式。
- -indexsize
类型:大小;
表索引使用n个字节的空间。这将测试Index_length列。指定的大小可以为“NULL”,以测试Index_length为NULL的位置。
[root@bogon percona]# pt-find -u root -p123456 -h 10.10.80.16 -P 5000 --indexsize +1M
- -kmin
类型:大小;
桌子n分钟前被检查过了。这将测试Check_time列。
- -ktime
类型:大小;
这张桌子是n天前检查过的。这将测试Check_time列。
- -mmin
类型:大小;
上次修改表格是在n分钟前。这将测试Update_time列。
- -mtime
类型:大小;
上次修改表格是在n天前。这将测试Update_time列。
- -procedure
存储过程定义与模式匹配。
- -rowformat
类型:字符串;
表行格式匹配模式。这将测试Row_format列。
- -rows
类型:大小;
表有n行。这将测试Rows列。指定的大小可以为“NULL”,以测试行是否为空。
[root@bogon percona]# pt-find -u root -p123456 -h 10.10.80.16 -P 5000 --rows +10000

- -server-id
类型:字符串
表名包含server_id
- -tablesize
类型:大小;
表使用n字节的空间。这将测试Data_length和Index_length列的和。
- -tbllike
类型:字符串
使用like 匹配表名
- -tblregex
类型:字符串
使用正则匹配表名
- -tblversion
类型:大小
表version为n。这将测试version列。
- -trigger
类型:字符串
触发器动作语句匹配模式。
- -trigger-table
类型:字符串
定义了触发器的表
- -view
类型:字符串
CREATE VIEW匹配此模式

ACTIONS

--exec-plus操作发生在所有其他操作之后,但其他操作则以不确定的顺序发生。如果您需要确定性,请提交bug报告,我将添加此功能。

- -exec
type: string;
对找到的每个项执行此SQL。SQL可以包含转义和格式化指令(参见——printf)。
- -exec-dsn
type: string;
指定一个键值格式的DSN,以便在执行带有- -exec和- -exec-plus的SQL时使用。任何未指定的值都从命令行参数继承。
- -exec-plus
type: string;
一次对所有项执行此SQL。这个选项与exec不同。没有转义或格式化指令;数据库和表名列表只有一个特殊的占位符%s。找到的表列表将与逗号连接在一起,并替换您放置%s的位置。
例如,你可以用这个来删除你找到的所有表:

- -print
打印数据库和表名,然后换行。如果没有指定其他操作,这是默认操作。
- -printf
按照格式打印,选择你想要的列打印结果
在这里插入图片描述

在这里插入图片描述
示例:

(1)查找一天前建立的InnoDB引擎的表

pt-find --ctime +1 --engine InnoDB --host=10.10.80.16 --port=5000 --user=root --password=123456

(2)查找yanglun数据库下所有空表并删除

pt-find --empty yanglun --host=10.10.80.16 --port=5000 --user=root --password=123456 --exec-plus “DROP TABLE %s”

(3)把查询到的数据插入到某个表中
pt-find yanglun --host=10.10.80.16 --port=5000 --user=root --password=123456 --noquote --exec “INSERT INTO test.tb1(db, name1, size) VALUES(’%D’, ‘%N’, %T)”

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值