我尝试使用 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)
我有两个问题:
如何从 general_log 生成的大型日志文件中提取查询指纹?
如何提取所有使用过的表?
编辑:
尝试@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 个文件),消化它们并合并结果。
再次阅读手册并经过一些测试后,我找到了 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)
它对于某些查询来说是正确的,但对于大多数查询来说它会失败:(
仍在等待第一季度的解决方案。