通过 --repair 和 WiredTiger 恢复 mongoDB

国贵棠*_*国贵棠 6 mongodb recovery disaster-recovery mongo-repair wiredtiger

我们不小心删除了rm -rf /data/db 我们的MongoDB 路径目录,多亏了 extundelete,我们恢复了它并得到了目录/data/db

这是我们在目录中的文件,文件是在 MongoDB 3.4 版本下生成的。

在此处输入图片说明

文件夹diagnostic.data

文件夹诊断数据

文件夹journal

文件夹日记

第 1 步:尝试正常运行 mongod

a)我们运行mongod --port 27017 --dbpath /data/db --bind_ip_allmongo,并期望应该有一个用户定义的数据库wecaXX但是,它没有出现。

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
Run Code Online (Sandbox Code Playgroud)

在 Robo3T 中

在此处输入图片说明

b)然后我尝试运行mongod --port 27017 --dbpath /data/db --bind_ip_all --repair. 结果是:

2019-03-25T14:10:02.170+0800 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2019-03-25T14:10:02.191+0800 I CONTROL  [initandlisten] MongoDB starting : pid=23018 port=27017 dbpath=/data/db 64-bit host=iZj6c0pipuxk17pb7pbaw0Z
2019-03-25T14:10:02.191+0800 I CONTROL  [initandlisten] db version v4.0.7
2019-03-25T14:10:02.191+0800 I CONTROL  [initandlisten] git version: 1b82c812a9c0bbf6dc79d5400de9ea99e6ffa025
2019-03-25T14:10:02.191+0800 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016
2019-03-25T14:10:02.191+0800 I CONTROL  [initandlisten] allocator: tcmalloc
2019-03-25T14:10:02.191+0800 I CONTROL  [initandlisten] modules: none
2019-03-25T14:10:02.191+0800 I CONTROL  [initandlisten] build environment:
2019-03-25T14:10:02.191+0800 I CONTROL  [initandlisten]     distmod: ubuntu1604
2019-03-25T14:10:02.191+0800 I CONTROL  [initandlisten]     distarch: x86_64
2019-03-25T14:10:02.191+0800 I CONTROL  [initandlisten]     target_arch: x86_64
2019-03-25T14:10:02.191+0800 I CONTROL  [initandlisten] options: { net: { bindIpAll: true, port: 27017 }, repair: true, storage: { dbPath: "/data/db" } }
2019-03-25T14:10:02.191+0800 W STORAGE  [initandlisten] Detected unclean shutdown - /data/db/mongod.lock is not empty.
2019-03-25T14:10:02.194+0800 I STORAGE  [initandlisten] Detected data files in /data/db created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
2019-03-25T14:10:02.194+0800 W STORAGE  [initandlisten] Recovering data from the last clean checkpoint.
2019-03-25T14:10:02.194+0800 I STORAGE  [initandlisten]
2019-03-25T14:10:02.194+0800 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2019-03-25T14:10:02.194+0800 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2019-03-25T14:10:02.194+0800 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=256M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress),
2019-03-25T14:10:02.818+0800 E STORAGE  [initandlisten] WiredTiger error (17) [1553494202:818725][23018:0x7f6119074a40], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: File exists Raw: [1553494202:818725][23018:0x7f6119074a40], connection: __posix_open_file, 715: /data/db/WiredTiger.wt: handle-open: open: File exists
2019-03-25T14:10:02.818+0800 I STORAGE  [initandlisten] WiredTiger message unexpected file WiredTiger.wt found, renamed to WiredTiger.wt.1
2019-03-25T14:10:03.832+0800 I STORAGE  [initandlisten] WiredTiger message [1553494203:832267][23018:0x7f6119074a40], txn-recover: Main recovery loop: starting at 4/11366912 to 5/256
2019-03-25T14:10:03.832+0800 I STORAGE  [initandlisten] WiredTiger message [1553494203:832674][23018:0x7f6119074a40], txn-recover: Recovering log 4 through 5
2019-03-25T14:10:03.898+0800 I STORAGE  [initandlisten] WiredTiger message [1553494203:898252][23018:0x7f6119074a40], txn-recover: Recovering log 5 through 5
2019-03-25T14:10:03.964+0800 I STORAGE  [initandlisten] WiredTiger message [1553494203:964880][23018:0x7f6119074a40], txn-recover: Set global recovery timestamp: 0
2019-03-25T14:10:03.998+0800 I RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
2019-03-25T14:10:03.999+0800 E STORAGE  [initandlisten] WiredTiger error (17) [1553494203:999855][23018:0x7f6119074a40], WT_SESSION.create: __posix_open_file, 715: /data/db/_mdb_catalog.wt: handle-open: open: File exists Raw: [1553494203:999855][23018:0x7f6119074a40], WT_SESSION.create: __posix_open_file, 715: /data/db/_mdb_catalog.wt: handle-open: open: File exists
2019-03-25T14:10:04.000+0800 I STORAGE  [initandlisten] WiredTiger message unexpected file _mdb_catalog.wt found, renamed to _mdb_catalog.wt.1
2019-03-25T14:10:04.015+0800 I CONTROL  [initandlisten]
2019-03-25T14:10:04.015+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-03-25T14:10:04.015+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-03-25T14:10:04.015+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2019-03-25T14:10:04.015+0800 I CONTROL  [initandlisten]
2019-03-25T14:10:04.015+0800 I CONTROL  [initandlisten]
2019-03-25T14:10:04.015+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 3824 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
2019-03-25T14:10:04.020+0800 I STORAGE  [initandlisten] createCollection: admin.system.version with provided UUID: 47d8713d-ac61-4081-83bf-60209ad60a7d
2019-03-25T14:10:04.034+0800 W ASIO     [initandlisten] No TransportLayer configured during NetworkInterface startup
2019-03-25T14:10:04.036+0800 I COMMAND  [initandlisten] setting featureCompatibilityVersion to 4.0
2019-03-25T14:10:04.036+0800 I STORAGE  [initandlisten] repairDatabase admin
2019-03-25T14:10:04.037+0800 I STORAGE  [initandlisten] Repairing collection admin.system.version
2019-03-25T14:10:04.040+0800 I STORAGE  [initandlisten] Verify succeeded on uri table:collection-0-4352287918877967674. Not salvaging.
2019-03-25T14:10:04.048+0800 I INDEX    [initandlisten] build index on: admin.system.version properties: { v: 2, key: { _id: 1 }, name: "_id_", ns: "admin.system.version" }
2019-03-25T14:10:04.048+0800 I INDEX    [initandlisten]          building index using bulk method; build may temporarily use up to 500 megabytes of RAM
2019-03-25T14:10:04.055+0800 I STORAGE  [initandlisten] finished checking dbs
2019-03-25T14:10:04.055+0800 I STORAGE  [initandlisten] WiredTigerKVEngine shutting down
2019-03-25T14:10:04.056+0800 I STORAGE  [initandlisten] Shutting down session sweeper thread
2019-03-25T14:10:04.057+0800 I STORAGE  [initandlisten] Finished shutting down session sweeper thread
2019-03-25T14:10:04.140+0800 I STORAGE  [initandlisten] shutdown: removing fs lock...
2019-03-25T14:10:04.140+0800 I CONTROL  [initandlisten] now exiting
2019-03-25T14:10:04.140+0800 I CONTROL  [initandlisten] shutting down with code:0
Run Code Online (Sandbox Code Playgroud)

c)修复后我重新运行mongod --port 27017 --dbpath /data/db --bind_ip_all,它仍然没有显示(与步骤a)相同的结果)。

第二步:使用wiredTiger工具

由于这并没有像我预期的那样工作,我开始寻找任何其他可能对我有帮助的工具或方法。这是从损坏的 MongoDB 安装中恢复 WiredTiger 集合的链接,它介绍了如何使用 WiredTiger 恢复集合。我决定试一试。

我创建了一个文件夹db_backup并将所有文件放入其中。我wiredtiger-3.0.0db_backup.I 安装wiredtiger在文件夹下创建了一个文件夹wiredtiger-3.0.0

在此处输入图片说明

a) 挽救收藏

root@iZj6c0pipuxk17pb7pbaw0Z:/data/db_backup/# cd ./wiredtiger-3.0.0
root@iZj6c0pipuxk17pb7pbaw0Z:/data/db_backup/wiredtiger-3.0.0# ./wt -v -h ../db_for_wt -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R salvage collection-23--360946650994865928.wt
        WT_SESSION.salvage 100
Run Code Online (Sandbox Code Playgroud)

根据上面的文章,这意味着我们已经成功地挽救了这个集合。

发生了错误:

b) 转储集合

root@iZj6c0pipuxk17pb7pbaw0Z:/data/db_backup/wiredtiger-3.0.0# ./wt -v -h ../../db_backup -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R dump -f ../collection.dump collection-23--360946650994865928
lt-wt: cursor open(table:collection-23--360946650994865928) failed: No such file or directory
Run Code Online (Sandbox Code Playgroud)

请注意,上面的命令确实在没有.wt.

我检查了我的目录参数,没有发现任何错误。在图片中,文件 collection-23--360946650994865928.wt 就在这里

在此处输入图片说明

的快照 collection-23--360946650994865928.wt刚刚已被抢救。

我们可以在其中看到一些英文或中文字符。并且该数据确实来自数据库的集合之一wecaXX

在此处输入图片说明

问题:

1)现在,我被倾销收藏卡住了。有谁知道这有什么问题?

2) collection-23--360946650994865928.wt包含我们最重要的数据。如果我们无法恢复整个数据库,从该文件中提取数据仍然非常有用。但是,如果我们手动复制粘贴,则并非所有字符都写得很好;他们仍然需要解密。有谁知道这是怎么做到的吗?

3)是否有可能我们没有恢复下的所有文件(或所有文件的整个主体)/data/db

任何评论或答案将不胜感激!!

Md *_*han 0

根据您的Robo3T屏幕截图,其中仅显示系统数据库(即admin& local)。您连接的主机没有可用的任何用户定义的数据库。

\n\n

尽管您在 mongodb 版本下生成的文件是3.4并且 MongoDB db 版本的开头是v4.0.7

\n\n

我会在某个地方猜测您已经丢失了用户创建的数据库。

\n\n

假设如果用户数据库存在,那么在使用 Robo 3T-1.2 工具连接主机后,它会自动存在。

\n\n

例如,Robo 3T - 1.1 的屏幕截图出现在我的环境中。

\n\n

在此输入图像描述

\n\n

为了验证您还可以使用 mongo shell 检查,连接 mongo shell 后您可以检查命令如show dbs;

\n\n

会出现这样的情况

\n\n
> show dbs\nDynamicsAX  0.006GB\nERP         0.086GB\nadmin       0.000GB\nblog        0.000GB\nconfig      0.000GB\nenron       0.207GB\nlocal       0.000GB\nmflix       0.060GB\ntest        0.001GB\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

注意:- 现在,在进行任何火箭科学之前,您必须\n 获取数据目录的 mongodump 。

\n
\n\n

根据您在此处提到的屏幕截图,数据库恢复是用户定义的数据库。

\n\n

根据您的错误 mongodump 错误日志

\n\n
root@iZj6c0pipuxk17pb7pbaw0Z:/data/db_backup/wiredtiger-3.0.0# ./wt -v -h ../../db_backup -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R dump -f ../collection.dump collection-23--360946650994865928\nlt-wt: cursor open(table:collection-23--360946650994865928) failed: No such file or directory\n
Run Code Online (Sandbox Code Playgroud)\n\n

它无法成功进行 mongodump。

\n\n
\n

注意:如果您\xe2\x80\x99 使用 MongoDB <\n 3.2 版本,mongodump 将失败,因为 3.2 是针对 WiredTiger 2.7 构建的。

\n
\n\n

编辑OP的问题后

\n\n
\n

现在,我在转储集合时陷入困境。我有什么问题吗?

\n
\n\n

是的,因为mongodump没有成功。

\n\n
\n

在collection-23--360946650994865928.wt中,我们真的得到了\n全部数据吗?即使我们无法恢复数据库,我们是否可以从这些 *.wt 文件中提取数据?

\n
\n\n

由于这里已经community wiki 更新了答案,它们*.wt是 WiredTiger 存储引擎使用的二进制数据文件。单个文件不能用作独立备份。如果要对 MongoDB dbPath 进行文件副本备份,则需要使用支持的文件副本备份方法包含所有文件。

\n\n

如需进一步了解,请参考这里这里这里这里这里

\n