
MongoDB 内置 WiredTiger wt_verify 工具实战校验、解析与可视化 WT 数据库文件【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo本篇技术指南聚焦 MongoDB 仓库中 WiredTiger 存储引擎自带的wt_verify.py调试工具。该工具封装了 WiredTiger 的wt verify命令行能够对.wt数据文件执行校验verify、以dump_blocks/dump_pages模式转储底层块与页信息并进一步将结果解析为结构化数据、生成统计直方图与交互式 HTML 可视化。读完本文你可以掌握该工具的完整安装步骤、全部命令行参数、两种 dump 模式的底层实现差异以及它如何通过正则解析wt verify输出、绘制块分布图与页大小直方图来辅助分析存储文件的物理布局。工具定位它封装了什么wt_verify.py位于 WiredTiger 源码树MongoDB 中以第三方依赖形式内置的tools/wt_verify目录下脚本头部注释说明了其定位见 wt_verify.py它是一个Python 封装脚本负责拼装并执行 WiredTiger 的wt verify命令捕获其文本输出再对输出做二次加工结构化解析、美化打印、可视化它仅支持 Row store 和 Variable Length Column Store (VLCS)两种页结构的可视化解析脚本第 34 行注释明确写着This script only supports Row store and Variable Length Column Store (VLCS)它的运行依赖 requirements.txt 中声明的四个 Python 包matplotlib、mpld3、tornado、pandasnumpy通过 pandas 依赖链隐式引入脚本第 43 行有import numpy。脚本自身通过find命令在 WiredTiger 源码目录内自动定位已编译的wt可执行文件find_wt_exec_path()见 wt_verify.py它在wt_verify目录的上两级目录内做-maxdepth 2查找要求恰好找到一个wt二进制若找不到或多个则提示用户改用-wt参数显式指定路径。因此运行该工具前需要先构建出 WiredTiger 的wt工具在本仓库中通常需要先按 MongoDB 的构建流程编译出含 wt 工具的 WiredTiger 构建产物或用-wt指向已有二进制。快速开始README 中的标准四步以下完整继承 wt_verify README 给出的操作步骤。1. 进入工具目录cd wiredtiger/tools/wt_verify在 MongoDB 仓库中该目录的完整相对路径为 src/third_party/wiredtiger/tools/wt_verify。2. 创建并激活 Python 虚拟环境virtualenv -p python venv source venv/bin/activate3. 安装 Python 依赖pip install -r requirements.txt依赖清单只有四个包见 requirements.txtmatplotlib mpld3 tornado pandas其中mpld3负责把 matplotlib 图转成可嵌入 HTML 的交互组件tornado则由mpld3._server.serve用于在浏览器中起本地服务展示图表。4. 运行 wt_verify.pypython3 wt_verify.py -d dump_pages -hd DB_DIR -f FILENAME -o OUTPUT.TXT -vREADME 中列出的参数说明如下参数说明-d [option]指定 dump pages 选项-f指定要处理的 WiredTiger 文件名-h显示所有可用选项-hd设置 WiredTiger 数据库目录-o设置输出文件名-v启用可视化可选完整参数说明比 README 更全的 argparse 定义README 只列出了常用子集。以脚本中真正的argparse定义wt_verify.py为准工具支持以下全部参数-d / --dump 必填。wt verify 的配置项仅允许 dump_blocks 或 dump_pages 两种取值 -f / --filename 要校验的 WiredTiger 文件名如 file:foo.wt未提供 -i 时必填 -hd / --home_dir WiredTiger 数据库 home 目录默认当前目录 -i / --input_file 直接指定已有的 wt verify 输出文件作为输入跳过执行 wt 命令 -o / --output_file 将解析后的美化输出写入该文件 -p / --print_output 将解析结果打印到 stdout默认关闭 -v / --visualize 可视化类型可多选不传任何值时默认可视化全部可用数据 可选值page_mem_size、dsk_mem_size、entries、page_type -wt / --wt_exec_path 显式指定 WT 工具可执行文件路径相比 README 有几个关键增量信息值得注意-d是必填且二选一requiredTrue加choices[dump_blocks,dump_pages]不允许其他取值-i是离线复现入口一旦传入input_file脚本完全跳过执行wt verify直接进入解析阶段main()中if not input_file:分支见 wt_verify.py。这意味着你可以把一次昂贵的 dump 输出保存下来反复做可视化迭代而无需重跑 wt-v的参数是可选值列表nargs*即python3 wt_verify.py -d dump_pages -hd . -f file:foo.wt -v entries page_type只画指定维度完全不跟值时-vmain()会自动填充为全部四个可视化维度。两种 dump 模式在脚本主流程中的分流main()在拿到或跳过生成输入文件后按-d的取值走两条解析路径wt_verify.pydump_pages→ 调用parse_dump_pages()随后按-v选定的维度逐页做直方图/饼图dump_blocks→ 调用parse_dump_blocks()随后无条件生成三张图块分布断裂条形图、块大小直方图、空闲块分布图并直接serve(imgs)打开浏览器展示若-o或-p生效两条路径都会先把解析结果经output_pretty()格式化为 JSON 样式的层级文本以 checkpoint 名为一级键、节点/页 id 为二级键。底层机制一wt verify 命令如何被构造与执行construct_command()展示了 wt 命令的拼装方式wt_verify.pycommand f{wt_executable} -h {args.home_dir} verify -t if args.dump: command f -d {args.dump} if args.filename: command f \{args.filename}\注意三个细节-h是 wt 工具的home 目录参数WiredTiger 工具的数据库定位方式不要与本脚本 argparse 的-hhelp混淆脚本把-hd的值填进了 wt 命令的-h位置-tdo_not_clear_txn_id被无条件追加即校验时不清理事务 id保证对含未回滚/多版本数据的文件做只读校验时不产生副作用命令经execute_command()以subprocess.run(..., shellTrue, checkTrue)执行stdout 全文写入固定临时文件wt_output_file.txt常量WT_OUTPUT_FILE失败时打印到 stderr 并sys.exit(1)见 wt_verify.py。对照 WiredTiger 侧的实现wt verify的-d选项在 util_verify.c 中被映射为 verify 的 config 字符串dump_blocks、dump_pages、dump_address、dump_layout、dump_tree_shape、dump_offsets#,#六种取值其中wt_verify.py只使用了后两者中最常用的dump_blocks与dump_pages。而-t对应do_not_clear_txn_id,-ccontinue on error对应read_corrupt,-k/-u分别控制是否解遮蔽 key 或全部应用数据二者互斥见 util_verify.c。这些底层能力在wt verify的使用信息中也有完整列表usage()见 util_verify.cverify [-ackSstu] [-d dump_address | dump_blocks | dump_layout | dump_tree_shape | dump_offsets#,# | dump_pages] [uri]在 B-tree 校验路径 bt_vrfy.c 中dump_blocks与dump_pages从 config 中读出并置位到WT_VERIFY结构体遍历页时按不同 dump 标志输出对应文本——这正是 Python 脚本两种解析器所消费的原始格式来源。底层机制二两种 dump 输出的解析器parse_dump_pages以分隔线为界的页树解析dump_pages的输出以长分隔线------------------------常量SEPARATOR切分 checkpoint。解析流程为parse_chkpt_info()从ckpt_name: ...行提取 checkpoint 名并要求紧随Root:行再从根页的 addr: [...]元数据行解出object_id / offset_range / size / checksumwt_verify.pyparse_node()递归处理以-开头的节点行只接受internal/leaf两种 page_type其余取值直接抛异常每个节点的元数据行被parse_metadata()逐条转为字典形如[a, b]的列表值会拆成数组、数值字符串会尝试转 intwt_verify.py最终得到一个{checkpoint_name: {node_id: {page_type, dsk_mem_size, page_mem_size, entries, ...}}}的嵌套字典供可视化使用。任何一行不符合预期格式比如缺失分隔线、节点行不以-开头都会抛出带上下文的异常——脚本的解析器是格式严格模式wt 输出格式若有变化会导致解析失败而非静默丢数据。parse_dump_blocks按偏移排序的块区间表dump_blocks的解析器parse_dump_blocks()见 wt_verify.py用四组正则识别行checkpoint 头file:*.wt, ckpt_name: ...、Root:行、根地址行、普通页地址行^([A-Za-z_]*):.*addr: \[\d: (\d)-\d, (\d), \d]$。特殊地cell_type行会再解一层拿到真正的页类型。输出结构为{checkpoint: {page_type: [(addr_start, size), ...]}}且每个类型列表按addr_start排序。找不到Root:行直接报错 Root not found, there is no data to parse。底层机制三可视化层如何出图脚本用 matplotlib后端设为WebAgg第 46 行matplotlib.use(WebAgg)画图再经mpld3.fig_to_html转成 HTML 片段最终由mpld3._server.serve()在本地起服务弹出浏览器。dump_pages模式下可用的四个维度定义在文件头部wt_verify.py维度图表类型展示内容page_mem_size直方图internal/leaf 双子图各页内存占用分布dsk_mem_size直方图internal/leaf 双子图各页磁盘占用分布entries直方图internal/leaf 双子图各页条目数分布page_type饼图internal 与 leaf 页数量比例直方图函数histogram()会用 pandas 对 internal 与 leaf 两组数据分别计算mean / 50% / min / max统计行并随图输出wt_verify.py每种维度有固定配色PLOT_COLORS横轴单位按字段区分entries无单位其余标注 bytes。dump_blocks模式下则固定输出三张图wt_verify.py块分布断裂条形图show_block_distribution_broken_barh()每个 checkpoint × 页类型一行用broken_barh把[addr_start, size)区间画在横轴偏移坐标上直观呈现页在文件内的排布与间隙块分布与块大小双直方图show_block_distribution_hist()第一张统计块起始偏移的分布第二张统计块大小的分布默认 100 个 bin空闲块分布图show_free_block_distribution()把所有块按偏移排序后统计相邻块之间的 gap含文件头部第一个块之前的 gap输出各 gap 大小的出现次数直方图max_gap_size参数可过滤过大的 gap。从源码结构看这套可视化面向的典型使用场景是对某个.wt文件连续做多个 checkpoint观察页大小/条目数的分布漂移判断页是否碎片化、是否接近满页以及空闲块的分布评估空间碎片程度。典型用法示例结合以上机制几条可直接套用的命令假设-hd指向含WiredTiger.wt元数据与目标文件的目录# 1) 全量可视化dump 页信息并展示全部四个维度 python3 wt_verify.py -d dump_pages -hd /path/to/wtdb -f file:foo.wt -v # 2) 只画 entries 与 page_type并把解析结果落盘 python3 wt_verify.py -d dump_pages -hd /path/to/wtdb -f file:foo.wt -v entries page_type -o parsed.txt # 3) 只落盘、不打印、不开浏览器 python3 wt_verify.py -d dump_pages -hd /path/to/wtdb -f file:foo.wt -o OUTPUT.TXT # 4) 复用已有 wt 输出跳过执行 wt适合反复迭代可视化参数 python3 wt_verify.py -d dump_pages -i wt_output_file.txt -v dsk_mem_size # 5) 块级分析看页在文件内的排布与空闲块分布 python3 wt_verify.py -d dump_blocks -hd /path/to/wtdb -f file:foo.wt # 6) 显式指定 wt 二进制路径源码树内找不到/存在多个 wt 时 python3 wt_verify.py -d dump_pages -hd /path/to/wtdb -f file:foo.wt -wt /path/to/wt -v适用前提与限制格式支持仅 Row store 与 VLCS 页结构脚本注释与parse_node()中expected_page_type [internal, leaf]的强校验共同决定了这一点Fixed-Length Column Store 等其他页类型不在支持范围需要先有 wt 可执行文件脚本不会编译任何代码只负责找到并执行wt找不到或找到多个时要求-wt显式指定解析器是严格格式匹配解析dump_pages时遇到非预期行直接抛异常dump_blocks缺少Root:行也会报错因此输入必须是当前版本 wt 的输出可视化依赖浏览器serve()会在本地端口起 tornado 服务展示 mpld3 页面无图形环境时建议只用-o/-p获取结构化输出-t行为是硬编码的wt 命令总是带do_not_clear_txn_id校验只读进行但也不保证能校验正在被活跃写入的文件——实际使用时应对已关闭或副本数据文件操作该工具是 WiredTiger 源码树内的开发者调试工具随 MongoDB 仓库以第三方依赖形式存在src/third_party/wiredtiger用于存储引擎层面的文件级诊断不面向 MongoDB 用户日常运维。小结wt_verify.py是 MongoDB 内置 WiredTiger 源码树中一个命令封装 输出解析 可视化三段式诊断工具它把wt verify -d dump_pages|dump_blocks的原始文本输出解析成按 checkpoint 组织的页/块结构数据可落盘为结构化文本也可生成页大小、条目数、页类型比例以及块排布与空闲块分布的交互式图表。理解了construct_command()的拼装规则、两个解析器的严格格式假设和四个可视化维度的数据来源后你可以把它作为排查.wt文件物理布局页碎片、空间间隙、多 checkpoint 间漂移的一线工具来使用。【免费下载链接】mongoThe MongoDB Database项目地址: https://gitcode.com/GitHub_Trending/mo/mongo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考