如何解压Mongo日志文件

7

我了解到,Mongodb创建的日志文件使用snappy压缩算法进行压缩。但是我无法解压这个压缩的日志文件。尝试解压时会出现错误。

错误流中缺少snappy标识符

我使用的Python代码如下:

import collections
import bson
from bson.codec_options import CodecOptions
import snappy
from cStringIO import StringIO
try:
    with open('journal/WiredTigerLog.0000000011') as f:
        content = f.readlines()
        fh = StringIO()
        snappy.stream_decompress(StringIO("".join(content)),fh)
        print fh
except Exception,e:
    print str(e)
    pass

请帮忙,我在这之后无法继续进行。


1
也许你的日志文件没有压缩。尝试在十六进制编辑器中打开它,看看是否可以读取明文数据。 - Reto Aebersold
同@RetoAebersold所说。似乎找不到预期的Snappy头 - Dan
尝试了你的代码片段,它可以在框架化的 Snappy 数据上工作。除了其他人指出的之外,如果你在十六进制编辑器中打开文件,就应该能够确定它是否是 Snappy 框架化数据。签名是(从文件偏移量零开始):\377\006\0\0sNaPpY,如 *nix 魔术文件或十六进制中的 ff06 0000 734e 6150 7059。也许 WiredTiger 存储引擎正在使用不同的压缩选项进行写入? - Lex Scarisbrick
1个回答

1
有两种Snappy压缩形式,基本形式和流式形式。基本形式的局限性在于必须全部放在内存中,因此存在流式形式以便能够压缩更大量的数据。流式格式具有头部和被压缩的子范围。如果缺少头部,则可能是使用基本形式进行压缩,并尝试使用流式形式进行解压缩。 https://github.com/andrix/python-snappy/issues/40 如果是这种情况,请使用decompress而不是stream_decompress
但也可能数据根本没有被压缩:
with open('journal/WiredTigerLog.0000000011') as f:
    for line in f:
        print line

能够工作。

WiredTiger的最小日志记录大小为128字节。如果日志记录小于或等于128字节,WiredTiger不会压缩该记录。 https://docs.mongodb.com/manual/core/journaling/


由于WiredTiger仅压缩大于128字节的记录。我们如何检测哪些行已经被压缩,哪些没有? - Cybersupernova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接