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

时间:2017-08-07 12:50:01

标签: mongodb backup database-restore

我的mongodb今天遭到黑客入侵,所有数据都被删除了,黑客需要一些金额才能收回,我不会付钱给他,因为我知道他不会把我的数据库发回给我。

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

是否有可以从此日志恢复数据的工具?

1 个答案:

答案 0 :(得分:4)

根据您的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转储oplog集合

  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}}

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

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

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

    恢复到安全的新部署

    注意oplogLimit的参数,它基本上告诉mongorestore一旦达到时间戳(这是步骤3中dropDatabase命令的时间戳),就停止重放oplog。 / p>

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

  5. 在第4步之后,如果您的oplog回到开始时间并且您在正确的时间停止了oplog重播,那么您希望在执行dropDatabase命令之前看到您的数据。< / p>