服务器崩溃后MongoDB无法启动


76

我的Ubuntu计算机崩溃了,当我重新启动它时,MongoDB无法正常工作。我尝试了以下命令,并得到以下输出:

$ mongo
Error: couldn't connect to server 127.0.0.1:27017 src/mongo/shell/mongo.js:91
exception: connect failed

$ service mongodb status
mongodb stop/waiting

$ service mongodb restart
stop: Unknown instance: 
start: Rejected send message, 1 matched rules; type="method_call",
       sender=":1.57" (uid=1000 pid=2227 comm="start mongodb ")
       interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)"
       requested_reply="0"
       destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init")

$ tail /var/log/mongodb/mongodb.log
[initandlisten] exception in initAndListen: 12596 old lock file, terminating
dbexit: 
[initandlisten] shutdown: going to close listening sockets...
[initandlisten] shutdown: going to flush diaglog...
[initandlisten] shutdown: going to close sockets...
[initandlisten] shutdown: waiting for fs preallocator...
[initandlisten] shutdown: closing all files...
[initandlisten] closeAllFiles() finished
dbexit: really exiting now

(重新格式化输出以匹配网站布局。)

发生了什么?我该如何解决?

Answers:


175

日志文件告诉您您有一个“旧锁文件”。MongoDB在运行时会保留一个锁定文件。它在启动时创建该文件,并在停止时将其删除。当计算机崩溃时(或MongoDB崩溃时,例如通过崩溃kill),该文件不会被删除,因此数据库不会启动。该文件的存在表明MongoDB关闭异常。

可以完成两件事:

  1. 如果这是一台开发机,并且您没有使用过数据库(也没有程序),则可以手动删除文件。对于在Ubuntu 12.10上运行的MongoDB 2.2.2,它位于中/var/lib/mongodb/mongod.lock。对于其他版本,该文件可以位于其他路径中,也可以命名为mongo.lock

  2. 比较安全的方法是遵循MongoDB的耐用性和维修指南。总之,对于具有以上配置的计算机,应执行以下命令:

    sudo -u mongodb mongod --repair --dbpath /var/lib/mongodb/
    sudo service mongod start
    

2
对于Windows,请参阅stackoverflow.com/questions/11877930/...
TrueWill

1
亲爱的@HosamAly,我如何解决该问题,因为服务器通常会崩溃。所以服务器崩溃后我必须手动执行吗?这太糟糕了,因为其他数据库(mysql,postgresql等)总是在服务器崩溃后成功启动
John Nguyen

1
@JohnNguyen您可以使其自动化,但我建议您这样做,因为您将没有机会查看“维修”过程可能造成的损害。
Hosam Aly 2014年

第一行不应该是:sudo mongod -u mongodb --repair --dbpath / var / lib / mongodb /吗?– joshy 7分钟前
joshy2015年

@joshy我不知道您的版本是否适用。我的mongod以“ mongodb”用户权限运行。您的运行具有root权限。
Hosam Aly

3

我要做的就是运行:sudo mongod --repair

然后:

苏多蒙哥


2
sudo mongod表示您的数据库以root用户身份运行,从安全角度考虑,不建议这样做。
Hosam Aly

2

根据我的经验,我通常会删除数据库文件夹中的“ mongod.lock”文件-在我的情况下:

*我浏览到我的ubuntu上数据库的安装位置,即“数据”文件夹。(cd数据);列出文件(ls)*然后,我将通过发布“ rm mongod.lock”文件来删除数据库崩溃时自动创建的“ mongod.lock”文件。

之后,我将发出“ ./mongod”启动mongo deamon或mongo启动mongo shell。一切都会好起来的。


1

如果您没有使用监控工具(例如BluepillMonit等),那么您将不得不面对此问题,因为在由于某种原因mongo没有自动启动其守护程序导致服务器崩溃之后,您必须使其手动运行,就像sudo service mongod restart 我认为的那样,但是它需要还有更多任务需要完成,请/etc/mongod.conf在启动mongo守护程序之前确保dbpath在。

对我来说

storage:
  dbPath: /var/lib/mongodb

当我输入mongod命令时,它将向我显示MongoDB starting : pid=10795 port=27017 dbpath=/data/db 64-bit host=xyz.com确保您的dbpath与/etc/mongod.conf中提到的相同。

为此,您可以键入sudo mongod --dbpath /var/lib/mongodb,然后使用mongod命令在所需的dbpath处启动mongo进程。

仅供参考:使用mongod命令启动mongo进程



0

这可能不是最佳解决方案,但是如果您不顾一切,可以尝试一下。似乎只有期刊对我来说是个问题,所以我采取了以下步骤:

  1. 创建一个新的数据目录。可能是/ var / lib / mongodb2
  2. 更新您的mongod.conf以指向新的数据目录。
  3. 启动mongoDB。
  4. 如果启动成功,则可以再次关闭mongo并继续,否则可以在此处停止阅读。
  5. 找到先前的数据目录,然后将数据库的文件复制到新的数据目录(例如,admin.0 admin.1 admin.ns等)
  6. 再次启动mongoDB(仍然使用新的数据目录)

完成这些步骤(不到5分钟)后,我启动并运行,所有数据似乎正常。


0

谢谢你们。我们还遇到一个问题,即MongoDB一遍又一遍地重启,它抱怨旧的锁定文件。我从Windows服务列表中停止了MongoDB,然后删除了该mongod.lock文件。之后,我能够正确启动MongoDB服务,并且工作正常。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.