WiredTiger 如何修复 MongoDB 7.0.14 集合 WT 文件

作者 | 吴守阳

审校 | 重楼

目录

1. 概述

2. 主要特性

3. 安装依赖

4.安装WiredTiger

5. WiredTiger编译支持的参数

6. 找到故障WT文件

7. 恢复

8. 总结

概述

WiredTiger 是一个高性能的键值存储和数据引擎,最初由 WiredTiger Inc. 开发,后来被 MongoDB 收购并集成到 MongoDB 中。WiredTiger 提供了高效的数据存储和检索能力,支持多种数据结构和压缩算法,适用于高并发和大规模数据处理场景。

主要特性高性能:WiredTiger 通过高效的内存管理和并发控制机制,提供了卓越的读写性能。多种数据结构:支持 B-Tree、LSM 树等多种数据结构,适用于不同的应用场景。压缩算法:支持多种压缩算法(如 Snappy、LZ4、Zlib、Zstd),可以显著减少存储空间占用。事务支持:提供 ACID 事务支持,确保数据的一致性和可靠性。可扩展性:设计为高度可扩展,适用于从小型嵌入式设备到大型分布式系统的各种环境。灵活的配置:可以通过丰富的配置选项来优化性能和资源使用。数据恢复:提供数据恢复功能,确保在数据损坏或系统故障后能够恢复数据。

数据库节点出现无法启动的问题,显示某个集合文件损坏,使用 --repair修复后,还是不能启动。接下来使用WT修复,此次修复的数据库版本的是7.0.14

安装依赖
---安装依赖(尽量保证这些依赖都安装完) yum install -y swig python3-devel openssl-devel epel-release libtool automake cmake-filesystem snappy snappy-devel lz4 lz4-devel zstd zstd-devel libzstd-devel zlib zlib-devel git make vim-common Package swig-3.0.12-19.module_el8.3.0+557+3d058e38.x86_64 is already installed. Package python36-devel-3.6.8-38.module_el8.5.0+895+a459eca8.x86_64 is already installed. Package openssl-devel-1:1.1.1k-5.el8_5.x86_64 is already installed. Package snappy-1.1.8-3.el8.x86_64 is already installed. Package snappy-devel-1.1.8-3.el8.x86_64 is already installed. No match for argument: zstd-devel Package zlib-1.2.11-17.el8.i686 is already installed. Package zlib-1.2.11-17.el8.x86_64 is already installed. Package zlib-devel-1.2.11-17.el8.x86_64 is already installed. Package git-2.27.0-1.el8.x86_64 is already installed. Package make-1:4.2.1-10.el8.x86_64 is already installed. Package vim-common-2:8.0.1763-15.el8.x86_64 is already installed. Error: Unable to find a match: zstd-devel --安装snappy-devel https://rpmfind.net/linux/rpm2html/search.php?query=snappy-devel wget https://rpmfind.net/linux/almalinux/8.10/PowerTools/x86_64/os/Packages/snappy-devel-1.1.8-3.el8.x86_64.rpm yum install snappy-devel-1.1.8-3.el8.x86_64.rpm ---安装cmake wget https://github.com/Kitware/CMake/releases/download/v3.30.3/cmake-3.30.3-linux-x86_64.tar.gz tar -zxvf cmake-3.30.3-linux-x86_64.tar.gz cd cmake-3.30.3 ./bootstrap make && make install [root@easyliao012 bin]# pwd /opt/cmake-3.30.3-linux-x86_64/bin
安装WiredTiger
---开始编译 wget https://github.com/wiredtiger/wiredtiger/archive/refs/tags/11.2.0.tar.gz tar xvf 11.2.0.tar.gz cd wiredtiger mkdir build cd build /opt/cmake-3.30.3-linux-x86_64/bin/cmake -DENABLE_SNAPPY=1 ../. make && make install ---配置环境变量 export LD_LIBRARY_PATH=/usr/local/lib64/:$LD_LIBRARY_PATH [root@easyliao012 lib64]# ll -h /usr/local/lib64/ -rwxr-xr-x 1 root root 121K Sep 29 14:36 libwiredtiger_snappy.so lrwxrwxrwx 1 root root 23 Sep 27 18:23 libwiredtiger.so -> libwiredtiger.so.11.2.0 -rwxr-xr-x 1 root root 29M Sep 29 14:36 libwiredtiger.so.11.2.0 -rwxr-xr-x 1 root root 152K Sep 29 14:36 libwiredtiger_zlib.so -rwxr-xr-x 1 root root 139K Sep 29 14:36 libwiredtiger_zstd.so ---编译完成 root@easyliao012 data]# cd /opt/wiredtiger/wiredtiger-11.2.0/build [root@easyliao012 build]# ls bench CMakeFiles config examples gdb_scripts install_manifest.txt libwiredtiger.so libwiredtiger.so.11.2.0-gdb.py src wiredtiger.pc CMakeCache.txt cmake_install.cmake CTestTestfile.cmake ext include lang libwiredtiger.so.11.2.0 Makefile test wt
WiredTiger编译支持的参数

WiredTiger 软件支持一些额外的配置选项:

-DHAVE_ATTACH=1

功能:配置 WiredTiger 在发生故障时休眠并等待调试器附加。

用途:主要用于开发和调试,不建议在生产环境中使用。

-DHAVE_DIAGNOSTIC=1

功能:配置 WiredTiger 在运行时执行各种诊断测试。

默认值:默认情况下,非发布(Release)构建类型会启用此选项。

用途:主要用于开发和调试,不建议在生产环境中使用。

-DNON_BARRIER_DIAGNOSTIC_YIELDS=1

功能:配置 WiredTiger 在线程让步时不要使用内存屏障,用于诊断目的。

前提条件:必须同时启用 HAVE_DIAGNOSTIC 选项。

用途:主要用于开发和调试,不建议在生产环境中使用。

-DENABLE_LZ4=1

功能:配置 WiredTiger 使用 LZ4 压缩。

默认值:如果系统中存在 LZ4 库,默认情况下会启用此选项。

用途:提高数据压缩效率。

-DENABLE_PYTHON=1

功能:构建 WiredTiger 的 Python API。

前提条件:需要 SWIG 工具。

默认值:如果系统中存在 Python,默认情况下会启用此选项。

用途:允许使用 Python 访问 WiredTiger 功能。

-DENABLE_SNAPPY=1

功能:配置 WiredTiger 使用 snappy 压缩。

默认值:如果系统中存在 snappy 库,默认情况下会启用此选项。

用途:提高数据压缩效率。

-DENABLE_ZLIB=1

功能:配置 WiredTiger 使用 zlib 压缩。

默认值:如果系统中存在 zlib 库,默认情况下会启用此选项。

用途:提高数据压缩效率。

-DENABLE_ZSTD=1

功能:配置 WiredTiger 使用 Zstd 压缩。

默认值:如果系统中存在 Zstd 库,默认情况下会启用此选项。

用途:提高数据压缩效率。

-DWT_STANDALONE_BUILD=0

功能:配置 WiredTiger 禁用独立构建。独立构建默认是启用的。

用途:如果你希望 WiredTiger 作为某个更大项目的一部分构建,可以禁用独立构建。

-DHAVE_BUILTIN_EXTENSION_LZ4=1, -DHAVE_BUILTIN_EXTENSION_SNAPPY=1, -DHAVE_BUILTIN_EXTENSION_ZLIB=1, -DHAVE_BUILTIN_EXTENSION_ZSTD=1

功能:配置 WiredTiger 在主库中包含对扩展的支持。这避免了需要额外的库来支持这些扩展。目前支持的内置扩展选项包括 lz4, snappy, zlib 和 zstd。

用途:简化依赖管理,减少外部库的依赖。

-DSPINLOCK_TYPE[=pthread, pthread_adaptive, gcc]

功能:配置 WiredTiger 使用特定的互斥锁类型进行序列化。

选项:

pthread(默认):使用 POSIX 1003.1c 线程互斥锁。

pthread_adaptive:使用配置为自适应的 POSIX 1003.1c 线程互斥锁(如果该功能可用)。

gcc:使用基于 GCC 的自旋锁。

用途:优化多线程环境中的性能

找到故障WT文件

找到故障集合对应的wt文件

mongosh mongodb://mon1:30000 -u "admin" --authenticationDatabase "admin" -p sdhjfREWccacFWEF23e mongos>use db2 db2> db.user1.stats() shard1: { ns: db2.user1, size: 9800, count: 214, avgObjSize: 45, numOrphanDocs: 0, storageSize: 40960, freeStorageSize: 16384, capped: false, wiredTiger: { metadata: { formatVersion: 1 }, creationString: access_pattern_hint=none,allocation_size=4KB,app_metadata=(formatVersion=1),write_timestamp_usage=none, type: file, uri: statistics:table:collection-0-7625617652108868965, ###在shard1中找到user1集合对应的collection-0--8815599204543663053.wt [root@shard1 data]# ll -h collection-0--8815599204543663053.wt -rw------- 1 root root 24K Sep 29 14:46 collection-0--8815599204543663053.wt
恢复
---前提条件,数据库应当停止 /opt/mongodb/bin/mongod --config /monogocluster/shard2/config/mongo-conf --shutdown ---修复前备份数据文件 ---修复操作需要在mongo数据目录中执行 /usr/local/bin/wt -v -C "extensions=[/usr/local/lib64/libwiredtiger_snappy.so]" salvage file:collection-0--8815599204543663053.wt ---启动数据库 /opt/mongodb/bin/mongod --config /monogocluster/shard2/config/mongo-conf

数据库恢复成功

--有时会出现这种报错 {"t":{"$date":"2024-09-29T15:38:40.833+08:00"}, F STORAGE [initandlisten] Please read the documentation for starting MongoDB with --repair here: http://dochub.mongodb.org/core/repair {"t":{"$date":"2024-09-29T15:38:40.833+08:00"}, F - [initandlisten] Fatal Assertion 50944 at src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp 922 {"t":{"$date":"2024-09-29T15:38:40.833+08:00"}, F - [initandlisten] \n\n***aborting after fassert() failure\n\n

执行以下操作修复

[root@ data]# /opt/mongodb/bin/mongod --dbpath /monogocluster/shard1/data --repair

再次启动数据库

查询数据库

[direct: mongos] test> use db2 switched to db db2 [direct: mongos] db2> db.user1.find() [ { _id: ObjectId("66f52c1a5e111baf0aa33a76"), id: 1, name: ty1 }, { _id: ObjectId("66f52c1a5e111baf0aa33a7a"), id: 5, name: ty5 }, { _id: ObjectId("66f52c1a5e111baf0aa33a7c"), id: 7, name: ty7 }, { _id: ObjectId("66f52c1a5e111baf0aa33a7e"), id: 9, name: ty9 }, { _id: ObjectId("66f52c1a5e111baf0aa33a7f"), id: 10, name: ty10 }, { _id: ObjectId("66f52c1a5e111baf0aa33a82"), id: 13, name: ty13 }]
总结

WiredTiger 11.2.0 是一个强大且灵活的数据引擎,不仅提供了高效的数据存储和检索能力,还具备强大的数据恢复功能。通过合理的配置和优化,WiredTiger 可以确保数据的完整性和可靠性,适用于多种高性能存储和检索场景。在使用过程中,合理配置和优化是确保性能和数据安全的关键。通过注意配置优化、数据一致性、性能监控、安全性和升级维护,可以充分发挥 WiredTiger 的优势,满足不同应用场景的需求。

作者介绍

吴守阳,51CTO社区编辑,拥有8年DBA工作经验,熟练管理MySQL、Redis、MongoDB等开源数据库。精通性能优化、备份恢复和高可用性架构设计。善于故障排除和自动化运维,保障系统稳定可靠。具备良好的团队合作和沟通能力,致力于为企业提供高效可靠的数据库解决方案。

THE END
本站服务器由亿华云赞助提供-企业级高防云服务器