Percona Toolkit使用测试(7)PT-FINGERPRINT
pt-fingerprint——将一类SQL语句转换成绑定变量的模式
单个语句转换:
pt-fingerprint --query “select a, b, c from users where id = 500”
文件语句转换:
pt-fingerprint /path/to/file.txt
pt-fingerprint是查询的抽象形式,这使得将类似的查询组合在一起成为可能。
抽象查询删除了文字值,规范化了空格,等等。例如,考虑以下两个查询:
两个查询都将被抽象为:
一旦知道查询的指纹,我们就可以讨论一个单独的查询来替代讨论所有类似查询一样。
以下是指纹识别过程中的一系列转换 :
- 1.将所有来自mysqldump的SELECT查询组合在一起,即使它们针对的是不同的表。对于pt-table checksum的所有校验和查询也是如此。
- 2.将多值INSERT 语句缩短为单个 VALUES() 列表。
- 3.去除注释
- 4.抽象USE语句中的数据库,因此所有的USE语句都被分组在一起。
- 5.替换所有的文字,例如带引号的字符串。为了提高效率,替换文字数字的代码在某种程度上是非选择性的,并且可能会替换一些实际上不是数字的东西。
十六进制文字也被替换。NULL被视为文字。
嵌入到标识符中的数字也被替换,因此类似名称的表将被指纹识别为相同的值(例如users_2009和users_2010将指纹识别为相同的值)。 - 6.将所有空格折叠成一个空格。
- 7.将整个查询小写。
- 8.用一个占位符替换IN()和VALUES()列表中的所有文字,不管基数如何。
- 9.将多个相同的UNION查询合并为一个查询
参数
- -config
读取这个逗号分隔的配置文件列表;如果指定,这必须是命令行上的第一个选项。
- -help
帮助并退出
- -match-embedded-numbers
匹配嵌入在单词中的数字并替换为单个值。
这个选项使该工具在匹配数字时更加小心,防止将带有数字的单词(如catch22)匹配并替换为单词+?占位符。
否则,默认的数字匹配模式将把catch22替换为catch?。
如果数据库或表名包含数字,这将非常有用。
示例:
- -match-md5-checksums
匹配MD5校验和并替换为单个值。这个选项使工具在匹配数字时更加小心,以便将fbc5e685a5d3d45aa1d0347fdb7c4d35这样的MD5校验和匹配并替换为单个校验和?占位符。否则,默认的数字匹配模式将替换fbc5e685a5d3d45aa1d0347fdb7c4d35作为fbc?。
- -query
转换单个语句
- -version
显示版本并退出
使用:
慢查询内容 slow.log:
pt-fingerprint --match-embedded-numbers slow.log
pt-fingerprint --match-embedded-numbers slow.log >slow1.log
由于每条语句没有换行,所以先sed替换;为换行,再排序去重,也可以入库统计
pt-fingerprint --match-embedded-numbers slow.txt |sed ‘s/;/\n/g’ |sort|uniq