我可以从 mongo oplog 恢复数据吗?

Can I restore data from mongo oplog?

我的mongodb今天被黑了,所有数据都被删除了,黑客需要一定的金额才能找回,我不会付钱给他,因为我知道他不会把我的数据库还给我。

但是我打开了 oplog,我看到它包含超过 300 000 个文档,保存了所有操作。

有什么工具可以从这个日志中恢复我的数据吗?

根据您的 oplog 有多远,您也许能够恢复部署。我建议您备份 dbpath 的当前状态以防万一。

请注意,像这样进行还原有很多变数,因此永远不能保证成功。它可以使用 mongodumpmongorestore 来完成,但前提是你的 oplog 回到时间的开始(即首次创建部署时)。如果是,您可能能够恢复您的数据。如果没有,您将在此过程中看到错误。

  1. 在执行任何其他操作之前保护您的部署。这种情况的出现是由于缺乏安全感。 MongoDB 中提供了广泛的安全功能。查看 Security Checklist page 了解详情。

  2. 使用mongodump --host <old_host> --username <user> --password <pwd> -d local -c oplog.rs -o oplogDump转储操作日志集合

  3. 检查 oplog 的内容 以确定使用 bsondump oplogDump/local/oplog.rs.bson 发生违规删除操作时的时间戳。您要查找的行大致如下所示:

    {"ts":{"$timestamp":{"t":1502172266,"i":1}},"t":{"$numberLong":"1"},"h":{"$numberLong":"7041819298365940282"},"v":2,"op":"c","ns":"test.$cmd","o":{"dropDatabase":1}}

    这一行表示在 test 数据库上执行了 dropDatabase() 命令。

    记下 {"$timestamp":{"t":1502172266,"i":1}} 中的 t 值。

  4. 使用mongorestore --host <new_host> --username <user> --password <pwd> --oplogReplay --oplogLimit=1502172266 --oplogFile=oplogDump/local/oplog.rs.bson oplogDump

    恢复到安全的新部署

    注意 oplogLimit 的参数,它基本上告诉 mongorestore 一旦达到该时间戳(即第 3 步中 dropDatabase 命令的时间戳)就停止重放 oplog .

    oplogFile 参数是 MongoDB 3.4 的新增参数。对于旧版本,您需要将 oplogDump/local/oplog.rs.bson 复制到转储目录的根目录到名为 oplog.bson 的文件,例如oplogDump/oplog.bson 并从上面的示例命令中删除 oplogFile 参数。

在第 4 步之后,如果您的 oplog 回到时间的开始并且您在正确的时间停止了 oplog 重放,希望您应该在执行 dropDatabase 命令之前看到您的数据.