我可以从 mongo oplog 恢复数据吗?
Can I restore data from mongo oplog?
我的mongodb今天被黑了,所有数据都被删除了,黑客需要一定的金额才能找回,我不会付钱给他,因为我知道他不会把我的数据库还给我。
但是我打开了 oplog,我看到它包含超过 300 000 个文档,保存了所有操作。
有什么工具可以从这个日志中恢复我的数据吗?
根据您的 oplog 有多远,您也许能够恢复部署。我建议您备份 dbpath
的当前状态以防万一。
请注意,像这样进行还原有很多变数,因此永远不能保证成功。它可以使用 mongodump
和 mongorestore
来完成,但前提是你的 oplog 回到时间的开始(即首次创建部署时)。如果是,您可能能够恢复您的数据。如果没有,您将在此过程中看到错误。
在执行任何其他操作之前保护您的部署。这种情况的出现是由于缺乏安全感。 MongoDB 中提供了广泛的安全功能。查看 Security Checklist page 了解详情。
使用mongodump --host <old_host> --username <user> --password <pwd> -d local -c oplog.rs -o oplogDump
转储操作日志集合。
检查 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
值。
使用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
命令之前看到您的数据.
我的mongodb今天被黑了,所有数据都被删除了,黑客需要一定的金额才能找回,我不会付钱给他,因为我知道他不会把我的数据库还给我。
但是我打开了 oplog,我看到它包含超过 300 000 个文档,保存了所有操作。
有什么工具可以从这个日志中恢复我的数据吗?
根据您的 oplog 有多远,您也许能够恢复部署。我建议您备份 dbpath
的当前状态以防万一。
请注意,像这样进行还原有很多变数,因此永远不能保证成功。它可以使用 mongodump
和 mongorestore
来完成,但前提是你的 oplog 回到时间的开始(即首次创建部署时)。如果是,您可能能够恢复您的数据。如果没有,您将在此过程中看到错误。
在执行任何其他操作之前保护您的部署。这种情况的出现是由于缺乏安全感。 MongoDB 中提供了广泛的安全功能。查看 Security Checklist page 了解详情。
使用
mongodump --host <old_host> --username <user> --password <pwd> -d local -c oplog.rs -o oplogDump
转储操作日志集合。检查 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
值。使用
恢复到安全的新部署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
命令之前看到您的数据.