【问题标题】:WriteConcern detected an error in mognodbWrite Concern 在 mongodb 中检测到错误
【发布时间】:2025-11-27 01:35:01
【问题描述】:

当我在monogdb中保存文档时,出现以下错误

"{WriteConcern detected an error 'bad offset:0 accessing file:xxxx - consider
 repairing database'. (Response was { \"err\" : \"bad offset:0 accessing file:
  xxxxx - consider repairing database\", \"code\" : 13440, \"n\" : 0, 
 \"connectionId\" : 13, \"ok\" : 1.0 }).}"

请帮忙

【问题讨论】:

  • 您尝试修复数据库了吗?

标签: mongodb save document


【解决方案1】:

正如错误所述,由于导致unexpected shutdown 的任何操作,数据库需要修复,因为它位于inconsistent state 中。

在 MongoDB 中,WriteConcern 提供反馈/确认以响应写入操作。写操作是否成功有多个级别的 WriteConcerns 或保证。 WriteConcerns 级别如下:

  1. 未确认(客户端不等待确认写入操作)
  2. 已确认(客户端等待写入操作的成功或异常确认)
  3. Journaled(mongodb 仅在提交写入日志后才发送确认)
  4. 已确认副本(对副本集的主要和/或其他成员的写入操作的确认)

您可以根据写入操作的重要性将WriteConcerns 的级别设置为任意级别。

在您的情况下,WriteConcern 返回一个异常,指出数据库处于不一致状态,可能/可能不是数据已损坏。为了回到操作模式,您需要以多种方式之一修复数据库。

  1. 通过 Mongodb shell(如果可以连接到 MongoDb)
  2. 通过命令行使用mongod 见下文

如果你可以进入MongoDB shell,那么你需要找到数据库并修复它,如下所示

use dbName
db.repairDatabase() //repairs the above database 

如果您无法进入 MongoDB shell 或希望使用其他方法,则可以使用以下方法

修复数据文件并保留原始文件

mongod --dbpath /data/db --repair --repairpath /data/db0
mongod --dbpath /data/db0

上面第一个命令完成后,新修复的数据将在/data/db0目录下,您可以使用第二个命令使用修复的数据启动mongodb。原始数据文件保存在默认的/data/db 或自定义位置(如果不是默认位置)

修复数据文件而不保留原始文件

此方法您只提供--repair 而没有--repathpath,它将尝试修复原始数据文件。首先你要删除mongod.lock文件,步骤如下:

rm /data/db/mongod.lock

假设您的数据在 /data/db 目录中,如果没有指定位置。

mongod --dbpath /data/db --repair

仅使用 --repair 选项启动 mongod,您不必传递 --repairpath 选项。这将尝试修复数据。然后最后启动数据库

mongod --dbpath /data/db

如果您按照第一种修复方法,那么您可以在修复成功后删除mongod.lock。如果您按照第二种方法,那么您可以在执行修复操作之前删除他mongod.lock

阅读documentation如何安全关闭数据库,mongod.lock中有什么?您应该如何进行修复(例如以相同的用户运行它以保留文件所有权)。也可能是您的数据文件的权限已更改,您可以chown 回复它们,请参阅此question 了解更多详细信息。

【讨论】: