WriteConcern在mognodb中检测到错误

时间:2016-02-07 17:21:00

标签: mongodb save document

当我在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 }).}"

任何帮助,请

1 个答案:

答案 0 :(得分:1)

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

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

  1. 未确认(客户端不等待写入操作的确认)
  2. 已确认(客户等待写入操作的成功或异常确认)
  3. Journaled(mongodb仅在将记录提交给期刊后发送确认)
  4. 副本已确认(对副本集的主要成员和/或其他成员的写入操作的确认)
  5. 您可以根据写入操作的重要性将WriteConcerns的级别设置为任何级别。

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

    1. 通过Mongodb shell(如果可以连接到MongoDb)
    2. 通过mongod的命令行,见下文
    3. 如果你可以进入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