1. 引入
笔者参考2给出的步骤,在CentOS7上安装了mongodb-6.0。安装后,可以用mongosh命令连上DB shell,但是过了三四天后,却无法用这条命令再次连接上mongo shell了。
使用重启大法(sudo systemctl restart mongod
),依然是没法连接。
下面记录处理和修复这个问题的步骤。
2. 处理过程
- 用mongod命令查看系统状态与报错
$ mongod
{"t":{"$date":"2023-10-05T23:29:43.410+08:00"},"s":"I", "c":"CONTROL", "id":123, "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"CentOS Linux release 7.5 (Core) ","version":"Kernel 3.10.0"}}}
{"t":{"$date":"2023-10-05T23:29:43.411+08:00"},"s":"E", "c":"NETWORK", "id":124, "ctx":"initandlisten","msg":"Failed to unlink socket file","attr":{"path":"/tmp/mongodb-27017.sock","error":"Operation not permitted"}}
{"t":{"$date":"2023-10-05T23:29:43.411+08:00"},"s":"F", "c":"ASSERT", "id":125, "ctx":"initandlisten","msg":"Fatal assertion","attr":{"msgid":40486,"file":"src/mongo/transport/transport_layer_asio.cpp","line":1130}}
{"t":{"$date":"2023-10-05T23:29:43.411+08:00"},"s":"F", "c":"ASSERT", "id":126, "ctx":"initandlisten","msg":"\n\n***aborting after fassert() failure\n\n"}
可以看到,问题主要出在“Failed to unlink socket”,报错中也给出了path:“/tmp/mongodb-27017.sock”
这里,也可以直接查看mongodb的log(sudo tail /var/log/mongodb/mongod.log
),能看到相同的报错。
- 删除这个.sock文件
$ sudo rm -rf /tmp/mongodb-27017.sock
在linux下,同一台服务器上,多个进程之间的通信,就使用一个.sock文件来进行。比如php与mysql通信、可以采用一个socket文件来进行。
- 重启mongo
$ sudo systemctl restart mongod
- 再次查看log,报错消失
$ sudo tail /var/log/mongodb/mongod.log
- 使用命令连接mongo shell
$ mongosh
这样就能使用"show dbs"之类的命令来管理mongodb了。
3. 总结
当mongodb出现问题时,可以通过mongodb的log(sudo tail /var/log/mongodb/mongod.log
),或者看命令mongod
的输出,来定位问题。
4. 参考
- https://stackoverflow.com/questions/29813648/failed-to-unlink-socket-file-error-in-mongodb-3-0
- https://www.digitalocean.com/community/tutorials/how-to-install-mongodb-on-centos-7