是否可以修改MongoDB oplog并重播它?

一个错误导致一个更新被应用到了比预期更多的文档上,从而覆盖了一些数据。数据是从备份中恢复并重新集成的,因此实际上没有丢失,但是我想知道是否存在一种方法可以修改操作日志以删除或修改有问题的更新并重播它。

我对MongoDB的内部知识没有深入的了解,因此,“您不了解它的工作原理,就像这样”这样的信息性回答也将被考虑接受。

最佳答案

应用程序或人为错误数据损坏中的主要问题之一是,对主数据库的违规写入将立即复制到辅助数据库。

这是用户利用“slaveDelay”的原因之一-一种以固定的时间延迟运行您的辅助节点之一的选项(当然,只有当您发现的错误或bug的时间短于该次要对象的延迟)。

如果没有这样的设置,则必须依靠备份来重新创建需要恢复到错误前状态的记录的状态。

在单独的数据独立副本上执行所有操作-仅在确认正确创建了所有内容之后,才可以将更正的数据移至生产系统中。

要执行此操作,需要的是备份的最新副本(比方说,该备份已存在X个小时),并且群集上的操作日志必须保存超过X个小时的数据。我没有指定哪个节点的oplog,因为(a)副本集的每个成员在oplog中的内容都相同,并且(b)在不同的节点成员上,您的oplog大小可能不同,在这种情况下,您要检查“最大”的一个。

假设您的最新备份时间为52小时,但幸运的是,您有一个Oplog可以保存75小时的数据(是的)。

您已经意识到所有节点(主节点和次节点)都具有“不良”数据,因此您要做的就是将最新备份还原到新mongod中。在这里,您可以将这些记录还原到有问题的更新之前的状态-然后您可以将它们移到当前的主记录中,从那里将它们复制到所有辅助记录中。

在还原备份时,通过以下命令创建oplog集合的mongodump:
mongodump -d local -c oplog.rs -o oplogD
将oplog移至其自己的目录,将其重命名为oplog.bson:

mkdir oplogR
mv oplogD/local/oplog.rs.bson oplogR/oplog.bson

现在,您需要找到“违规”操作。您可以使用oplogR / oplog.bson文件上的bsondump命令将oplog转储为易于阅读的格式(然后使用grep或what-not查找“不良”更新)。或者,您可以通过 shell 程序中的use localdb.oplog.rs.find()命令在副本集中查询原始操作日志。

您的目标是找到该条目并记下其ts字段。

它可能看起来像这样:
"ts" : Timestamp( 1361497305, 2789 )
请注意,mongorestore命令有两个选项,一个称为--oplogReplay,另一个称为oplogLimit。现在,您将在已恢复的独立服务器上重播此操作日志,但是在进行该令人讨厌的更新操作之前将停止该操作。

该命令将是(主机和端口是您新还原的备份所在的位置):
mongorestore -h host --port NNNN --oplogReplay --oplogLimit 1361497305:2789 oplogR
这将从oplogR目录中的oplog.bson文件恢复每个操作,该操作在ts值Timestamp(1361497305,2789)条目之前停止。

回想一下,您在单独的实例上执行此操作的原因是可以验证还原并重放创建的正确数据-验证数据之后,您可以将还原的记录写入真实主数据库中的适当位置(并允许复制传播更正后的记录发送给中学。

关于mongodb - 修改并重播MongoDB oplog,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15444920/

10-10 10:51