MongoDB服务器崩溃后无法启动

78

我的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

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

发生了什么?我该如何修复它?

8个回答

179
该日志文件告诉您有一个“旧的锁定文件”。MongoDB在运行时会保留lock文件。它在启动时创建此文件,并在停止时删除。当计算机崩溃(或MongoDB崩溃,例如通过kill),此文件未被删除,因此数据库无法启动。该文件的存在表示MongoDB并没有干净地关闭。
可以采取两种措施:
  1. If this is a development machine and you haven't been using your database (and neither have your programs), you can remove the file manually. For MongoDB 2.2.2 running on Ubuntu 12.10, it's in /var/lib/mongodb/mongod.lock. For other versions, the file could be in a different path or it could be named mongo.lock.

  2. The safer route is to follow MongoDB's Durability and Repair guide. In summary, for a machine with the above configuration, you should execute the following commands:

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

2
对于Windows,请参见https://dev59.com/Pmct5IYBdhLWcg3wuPq6 - TrueWill
1
亲爱的@HosamAly, 我该如何解决这个问题,因为服务器经常崩溃。所以每次服务器崩溃后我都必须手动操作?这太糟糕了,因为其他数据库(mysql、postgresql等)在服务器崩溃后总是能够成功启动。 - John Nguyen
1
@JohnNguyen 你可以自动化处理,但我建议不要这样做,因为你将没有机会查看“修复”过程可能造成的损坏。 - Hosam Aly
@joshy 我不知道你的版本是否可行。我的版本使用“mongodb”用户权限运行mongod。而你的版本则使用root权限运行。 - Hosam Aly
@HosamAly 我使用了 -u 参数,因此 -u mongodb 表示使用 mongodb 用户运行。 - joshy
显示剩余3条评论

3
一切我需要做的就是运行: sudo mongod --repair 然后运行: sudo mongod

2
sudo mongod 的意思是你的数据库以 root 身份运行,从安全角度来看这并不推荐。 - Hosam Aly

3
根据我的经验,我通常会删除数据库文件夹内的“mongod.lock”文件 - 在我的情况下:
* 我浏览到数据库所在的位置,即Ubuntu上的“data”文件夹(cd data);列出文件(ls) * 然后,我将通过发出“rm mongod.lock”命令删除在数据库崩溃时自动创建的“mongod.lock”文件。
之后,我要么发出“./mongod”以启动mongo守护程序,要么发出“mongo”以启动mongo shell。一切都会很好。

1
如果您没有使用像BluepillMonit等监控工具,那么由于某种原因导致服务器崩溃后Mongo未能自动启动其守护程序,则必须手动使其正常工作,例如sudo service mongod restart。我解决了这个问题,但还需要完成一些其他任务,请确保在启动mongo守护进程之前检查/etc/mongod.conf中的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进程。 FYI:使用mongod命令启动您的mongo进程。

1

检查服务器上是否有足够的可用空间。如果没有剩余空间,mongodb将无法启动。


1
这是一个好东西,即使在这种情况下它是不正确的,也值得检查一下。 - asmacdo

0

从Mongo数据目录dbpath中删除.lock文件对我有用。

例如:sudo sudo rm {data-directory}/mongod.lock


0

谢谢大家。我们也遇到了一个问题,MongoDB一直在重启,并且抱怨有一个旧的锁文件。我从Windows服务列表中停止了MongoDB,然后删除了mongod.lock文件。之后,我能够正确启动MongoDB服务并且它正常工作。


0

这可能不是最好的解决方案,但如果你很绝望,可以尝试一下。对我来说,似乎只有日志是个问题,所以我采取了以下步骤:

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

完成这些步骤后(不到 5 分钟),我就可以正常运行了,所有数据看起来都没问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接