《Perconatools 简明教程.docx》由会员分享,可在线阅读,更多相关《Perconatools 简明教程.docx(75页珍藏版)》请在第一文库网上搜索。
1、Perconatools简明教程1、pt-query-digest使用ptquerydigest工具可以通过慢查询日志、普通查询日志、binlog对MySQL中的查询语句进行分析,也可以通过SHOW PROCESSLIST语句输出信息,以及tcpdump抓取的MySQL协议数据对MySQL中的查询语句进行分析。在默认情况下,分析输出结果是按照对语句生成的指纹值进行分组的(去除常量值,对语句进行标准化格式转换),统计出各查询语句的执行时间、次数、占比等,且按照每条语句的查询时间进行降序排列输出(最慢的查询最先打印)。如果在使用pt-query-digest时没有指定任何输入文件,则该工具会从ST
2、DIN中获取数据。 可以将输出结果直接打印在标准输出设备上,也可以保存到历史表中供后续审查。 对于处理的结果,可以使用一些筛选参数进行过滤,例如:可以查看指定时间段、指定语句类型、某个用户的信息,甚至对于SELECT语句还可以进一步筛选查询类型(如FULL JOIN) o使用方法:pt-query-digest (OPTIONS FILES DSN命令行选项 -ask-pass:在连接MySQL时会提示输入密码。 -charset,A:设置数据库的默认字符集,字符串类型,默认值为utf8。如果保持默认值utf8,则将Perl的binmode在STDOUT上设置为utf8,将mysql_enab
3、le_utf8选项传递给DBD:mysql,在连接到MySQL服务器之后执行SET NAMES UTF8语句修祓字符集为该选项指定的utf8。 -config:指定以逗号分隔的配置文件列表。如果使用该选项,则需要将它放在所有选项之前(作为命令行中的第一个选项)。 -nocontinue-on-error:即使出现错误,也仍然继续解析所给定的文件。但是如果累计达到100个错误,则解析会停止(表明PT工具可能存在Bug或者输入文件中的信息无效)。该选项默认启用-continue-onerror,如果需要禁用,则可以使用no-continue-onerror选项。 -nocreate-history
4、-table:当使用-history选项时(表示把解析结果保存到history表中),若history表不存在,则使用该选项来创建表。该选项默认启用-create-history-table,如果需要禁用,则可以使用-no-create-history-table选项。 nocreate-review-table:当使用-review选项时(表示把解析结果保存到review表中),若review表不存在,则使用该选项来创建表。该选项默认启用-create-review- table,如果需要禁用,则可以使用-no-create-review-table选项。 -daemonize:使用daem
5、on方式运行(仅限POSIX操作系统)。 -database,-D:字符串类型值。指定需要连接的数据库名称。 -defaults-file, -F:字符串类型值。仅从给定的文件中读取MySQL配置参数(需要指定配置文件的绝对路径)。 -filter:该选项指定一段Perl代码字符串或包含Perl代码的文件(文件中不要包含#!/usr/bin/perl行),表示将丢弃此Perl代码未返回true的事件数据(也就是说,对于输入的慢查询语句按照指定的字符串进行匹配过滤后再进行分析)。该代码在执行时会被编译成类似于sub Sevent = shift; filter& return$event;的格式
6、,其中filter就是该选项指定的字符串值或者在文件中指定的内容。如果只有一个过滤器,或者没有if-else等复杂的判断逻辑,则可以使用-filter选项直接在命令行指定filter字符串;但是如果存在多个过滤器或者需要使用if-else等复杂的判断逻辑(此时在命令行指定不会生效),则需要在文件中指定,然后使用-filter选项指定filter代码从文件中读取(例如:filter.txt: Hmy $event_ok;if(.)$event_ok= 1; else $event_ok=0; $event_ok,然后指定”filter filter.txt”从filter.txt中读取代码)。p
7、tquery-digest不提供任何代码保护措施,所以在编写过滤器代码时要仔细一些(如果过滤器代码无法被编译,则pt-query-digest将报错退出;如果过滤器代码编译成功,但执行代码时发生一些逻辑错误,则运行时仍然可能会发生错误并退出)。以下是一些过滤器代码示例。 匹配SELECT语句:-filter$event-arg= m/Aselect/i,它将被编译成sub$event = shift;( $event-arg = m/Aselect/i) & return Sevent; 程序。 host/IP地址与匹配:filteT($event-host | $event-ip | ) =
8、m/查。 user匹配john: filter($eventuser = m/john/。 匹酉己Warning_count超过 1 个:filter ($event-Warning_count| 0) 1。 查询执行Full_scan或Fulloin: filter($event-Full_scan | |,n) eq nYes) |($event- Full Join) |,n,) eq ”Yes)。 查询缓存未命中(QC_Hit为No) : filter($event-QC_Hit II“)eq ”NoT 查询数据量为 1MB或更大:一filter$event-bytes = l_048
9、_576,o提示:-filter选项允许更改$event来自定义属性值,因为不同的MySQL发行版本中记录的慢查询的属性值可能不同(例如,Percona Server中记录的慢查询比Oracle MySQL的慢查询更详细,而MariaDB中记录的慢查询又比PerconaServer中的慢查询更详细),所以在不同的发行版本的慢查询H志中可能存在不同的属性值。也正因为如此,为了更好地兼容,pl-query-digest允许修改$0丫6来构造自定义的过滤器。例如,创建一个名为“Lock_ratio”的属性来检查Lock_time与Queryime属性的百分比,并构造一个过滤器(该过滤器并没有真正做数
10、据过滤,只是添加了一个输出属性:Lock_ratio),如-fnter($event-Lock_ralio = $event-Lock_time/($event-Query_time() &,然后在解析结果中会输出类似于# Lock ratio 55.76 0.00 LOO 0.02 0.020.07 0.00”的属性行。 除数的属性值不能为0,否则执行pt-query-digest工具会报错:Pipeline process11 (filter) caused an error: Illegal division by zero at.。 如果遇到在给定的数据源文件中不存在的属性,则会报错:
11、Pipeline process 11(filter) caused an error: Use of uninitialized value in division (/) at。 pt-query-digest工具基于事件解析慢查询只是其中的一种模式。 自定义的$event构造的属性可以在任何选项中使用,如-order-by选项。 -group-by:数组类型值。指定需要按照事件的哪个属性进行分组,默认值为fingerprint (SQL语句去除常量值之后的标准化格式语句)。通常,可以根据查询语句的任何属桎将查询分组到不同的类中,例如一group-by二user或一group-by=db,
12、这时将按照user或db来分组统计解析结果,以便直观地展现哪些用户或数据库消耗了最多的Queryime。可以为group-by选项同时指定多个值,例如-group-by=fingerprint,user,db, 在输出结果中会依次使用fingerprint、user和db三个属性对给定的数据源进行分组统计。并不会按照这三个属性进行混合分组,而是相当于分别按照这三个属性各自做了一遍分组统计。下面是三个预设的定义属性(注意,在日志数据源中并没有真实对应的属性值)。 fingerprint:按照SQL回句去除常量值之后的标准化格式语句进行分组统计(这与performance_schema中记录的标准
13、化语句类似)。 tables:按照单表名称进行分组统计。注意,包含两个或多个表的查询语句将被重复统计(有多少个表就重复多少次)。所以,对于多表查询的语句,不建议使用该属性进行分组统计。 distill:这是一种超级指纹,比fingerprint更简短,例如INSERT SELECT sbtest?,其中代表数字,如果没有数字表,则按照“INSERT SELECTsbtest”格式进行分组统计。 -help:打印帮助信息。 -history: DSN类型值。将分析结果保存到表中,分析结果比较详细,当下次使用-history选项时,如果存在相同的语句,且查询所在的时间IX间和历史表中的不同,则会记
14、录到数据表中,可以通过查询同一个checksum来比较某类型查询的历史变化。默认库表名称为percona_schema.query_history。可以使用DSN的D选项指定数据库(D)和t选项指定表(t)以覆盖默认值。另外,除非指定-no-create-history-table选项,否则,如果指定的表不存在,则会自动创建数据库和表。在历史表中,不同的日志数据源必需的共用字段有checksum和sample,其余的字段名称都是“属性值一度量值”的格式(例如Query_time_min字段的前缀Query_time表示属性名,后缀min表示度量值,存储Queryime属性的最小值。这些字段的后
15、缀,也就是度量值包括pct|avg|cnt|sum|min|max|pct_95|stddev|median|rank),且不同的日志数据源只会用到其中的一部分字段存储分析数据。完整的history表结构详见“47.1.2实战演示”一节。 -host, -h:字符串类型值,表示需要连接的MySQL主机。 -ignore-attributes:数组类型值,默认值为arg, cmd, insert_id, ip,port, Thread_id,timestamp, exptime, flags, key, res, val, server_id, offset,end_log_pos, Xid, 表示在分组统计时忽略这些属性(有时候有些属性不需要或不能做聚合的元数加信息,但并不是说它们不是查询指标)。