使用 pt-query-digest 从大型日志文件中提取查询指纹和表

Rad*_*ris 5 mysql logs

我尝试使用 pt-query-digest 解析一个大型日志文件,但它给出了“内存不足!” 当我尝试读取文件时。我有 3GB 内存,40GB 硬盘空间,文件是 20GB。我没有在有关内存的文档中找到任何内容。

我减少命令:

pt-query-digest --group-by fingerprint --print --no-report /path/to/largeLogFile.log
pt-query-digest --table-access /path/to/largeLogFile.log
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 如何从 general_log 生成的大型日志文件中提取查询指纹?

  2. 如何提取所有使用过的表?

编辑:
尝试@DTest --sample 选项(带有 2 和 1),但结果相同。就在它在 htop 中达到 50% 内存之前,它每次都会死亡(请参阅 screnshoot):在此处输入图片说明

我在它死之前做了一个 strace 我得到:

read(3, "phone from teams as t ri"..., 4096) = 4096
mremap(0x5b27a000, 1543499776, 1543503872, MREMAP_MAYMOVE) = -1 ENOMEM (Cannot allocate memory)
mmap2(NULL, 1543503872, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
brk(0x64c2d000)                         = 0x8c2e000
mmap2(NULL, 1543634944, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap2(NULL, 2097152, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x5b07a000
munmap(0x5b07a000, 548864)              = 0
munmap(0x5b200000, 499712)              = 0
mprotect(0x5b100000, 135168, PROT_READ|PROT_WRITE) = 0
mmap2(NULL, 1543503872, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
write(2, "Out of memory!\n", 15Out of memory!
)        = 15
munmap(0x5b27a000, 1543499776)          = 0
... [output removed] ...
Run Code Online (Sandbox Code Playgroud)

到目前为止,我能想到的唯一选择是拆分文件“一口大小”的部分(假设每个 1GB 的 20 个文件),消化它们并合并结果。

Rad*_*ris 2

再次阅读手册并经过一些测试后,我找到了 2/3 问题的答案:

0. “内存不足”- 由于--type指定给 的文件类型 ( )不正确而导致pt-query-digest。日志文件来自general_log,pt-query-digest默认解析它,因为它是慢查询日志,当然数据会加载到内存中,直到找到不存在的模式。正确用法:

pt-query-digest --type genlog --group-by fingerprint --print --no-report /path/to/largeLogFile.log
Run Code Online (Sandbox Code Playgroud)

2.提取使用的表,--table-access按预期工作(如果类型正确使用)

pt-query-digest --type genlog --table-access /path/to/largeLogFile.log
Run Code Online (Sandbox Code Playgroud)

1.提取指纹。还是没有找到正确的用法。我尝试的所有操作都会打印带有空格、制表符、参数的完整查询。我试过--group by, --sample, --no-report, pt-query-fingerprint...

对于问题 1。我试图仅提取查询指纹,仅提取:

pt-query-digest --type genlog --fingerprints --group-by fingerprint --print --no-report /path/to/largeLogFile.log
Run Code Online (Sandbox Code Playgroud)

打印类似:

update some_table set some_column=0 where another_column='some_value';
# Time: 120716 11:08:27
# Thread_id: 201
# Query_time: 0.000000  Lock_time: 0.000000  Rows_sent: 0  Rows_examined: 0
use some_database;
insert into some_table (col1, col2, col3) VALUES ('val1','val2','val2');
# Time: 120716 11:08:27
# Thread_id: 202
# Query_time: 0.000000  Lock_time: 0.000000  Rows_sent: 0  Rows_examined: 0
Run Code Online (Sandbox Code Playgroud)

和:

pt-fingerprint --match-embedded-numbers /path/to/largeLogFile.log
Run Code Online (Sandbox Code Playgroud)

打印类似:

?:ca:?a:cc???????????value_a??:c0:a8:f7:?f:???????value_b??:?:b0:?:fd:???????value_c??c:af:f7:?:?:?d??????value_d??:c0:a8:f7:?f:??value_e??c:af:f7:?:?:?d??????w' where col_a=? ? query update table_a set col_a=now(), col_b=?, col_c=?, col_d=?, col_e=?, col_f=?, col_g=?, col_h=? where col_i=? and col_j=? ? quit ? query commit ?
Run Code Online (Sandbox Code Playgroud)

它对于某些查询来说是正确的,但对于大多数查询来说它会失败:(

仍在等待第一季度的解决方案。