2012-12-04 66 views
71

我的Ubuntu计算机崩溃了,当我重新启动它时,MongoDB无法正常工作。我想下面的命令,并得到了以下的输出:服务器崩溃后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 

(输出格式化匹配的网站布局。)

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

回答

165

日志文件告诉你,你有一个“旧锁文件”。 MongoDB在运行时会保留一个lock文件。它在启动时创建该文件,并在停止时删除它。当电脑崩溃(或MongoDB崩溃时,例如通过kill),该文件不会被删除,因此数据库不会启动。这个文件的存在表明MongoDB不干净的关闭。

有两件事情可以做:

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

  2. 更安全的路线是遵循MongoDB的Durability and Repair指南。总之,上述配置的机器时,应执行以下命令:

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

对于Windows,请参阅http://stackoverflow.com/questions/11877930/mongodb-cant-start-on-windows – TrueWill

+1

亲爱的@HosamAly, 我该如何解决它,因为服务器通常会崩溃。所以我必须在服务器崩溃后手动进行操作?这是非常糟糕的,因为其他数据库(mysql,postgresql,..)总是在服务器崩溃后成功启动 –

+1

@JohnNguyen你可以自动化它,但我会建议反对,因为你不会有机会看到损害这可能是由“修复”过程造成的。 –

0

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

+1

这是很好的检查,即使在这种情况下它不正确。 – asmacdo

3

所有我需要做的就是运行: 须藤的mongod --repair

则:

须藤的mongod

+0

'sudo mongod'意味着您的数据库以root用户身份运行,从安全的角度来看这是不推荐的。 –

2

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

*我浏览到数据库安装在我的Ubuntu上,即“数据”文件夹。列出文件(ls) *然后,我将删除在数据库崩溃时自动创建的“mongod.lock”文件,方法是发出“rm mongod.lock”文件。

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

0

这可能不是最好的解决方案,但如果你绝望,你可以试试这个。看来,只有该杂志是为我一个问题,所以我把这些步骤:

  1. 创建一个新的数据目录。可能/ var/lib/mongodb2
  2. 更新您的mongod.conf以指向新的数据目录。
  3. 开始 mongoDB。
  4. 如果它启动成功,那么你可以再次关闭mongo并继续,否则你可以停止在这里阅读。
  5. 找到以前的数据目录和复制的文件为您的数据库(S)到新的数据目录(例如,admin.0 admin.1 admin.ns等)
  6. 开始的MongoDB再次(仍使用新的数据目录)

完成这些步骤后(花了不到5分钟),我开始运行,所有的数据似乎没问题。