MongoDB正在运行,但无法使用shell进行连接

时间:2011-10-31 18:50:28

标签: shell mongodb

使用MongoDB 2.0.1的CentOS 5.x Linux(尝试使用main和legacy-static)

MongoDB正在运行:

root     31664  1.5  1.4  81848 11148 ?        Sl   18:40   0:00 ./mongod -f mongo.conf -vvvvv --fork

使用简单的shell连接来访问服务器失败:

[root@xxxx bin]# ./mongo
MongoDB shell version: 2.0.1
connecting to: test
Mon Oct 31 18:41:32 Error: couldn't connect to server 127.0.0.1 shell/mongo.js:84
exception: connect failed

端口28017上的Web界面加载正常,就像从远程Linux主机使用MongoDB shell一样。也可以telnet到localhost:27017,这意味着没有端口被阻止。此机器上没有运行SELinux。我也尝试明确指定localhost:2017/db无济于事。

$ ./mongo remote-ip:27017
MongoDB shell version: 2.0.1
connecting to: remote-ip:27017/test
> show dbs
local   0.03125GB
>

日志对此主题完全沉默:

.....
Mon Oct 31 18:40:34 [initandlisten] fd limit hard:1024 soft:1024 max conn: 819
Mon Oct 31 18:40:34 [initandlisten] waiting for connections on port 27017
Mon Oct 31 18:40:34 BackgroundJob starting: snapshot
Mon Oct 31 18:40:34 BackgroundJob starting: ClientCursorMonitor
Mon Oct 31 18:40:34 BackgroundJob starting: PeriodicTask::Runner
Mon Oct 31 18:40:34 [websvr] fd limit hard:1024 soft:1024 max conn: 819
Mon Oct 31 18:40:34 [websvr] admin web console waiting for connections on port 28017

支持mongo shell客户端只显示一个有问题的电话:

[pid 31708] connect(4, {sa_family=AF_INET, sin_port=htons(27017), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EBADF (Bad file descriptor)

文件系统干净,没有ulimit限制(以root身份运行以进行测试)。我可以从strace看到mongo客户端试图通过TCP(AF_INET)进行连接,但由于它是本地的并且MongoDB创建了一个文件套接字,有没有办法告诉客户端连接通过那而不是?或者更好的是,为什么客户会投掷EBADF?

编辑:我的基本Mongo conf:

dbpath=/root/mongodb-linux-i686-2.0.1/data
logpath=/root/mongodb-linux-i686-2.0.1/logs/mongo.log
slowms=15
rest=1

16 个答案:

答案 0 :(得分:39)

我认为这个版本的mongoDb客户端缺少一些默认配置。尝试运行:

mongo 127.0.0.1:27017

这很奇怪,但后来我经历了这个问题消失了:)(所以简单的命令'mongo'没有任何params开始为我工作了)

[Ubuntu Linux 11.10 x64 / MongoDB 2.0.1]

答案 1 :(得分:20)

您可能需要检查配置以查看bind_ip是否已设置

  

bind_ip:127.0.0.1

如果是,则仅允许本地登录。对此进行评论并重新启动mongo,这可能有所帮助。

答案 2 :(得分:17)

我有类似的问题,实际上是相同的(mongo进程正在运行,但无法连接到它)。 我做了什么去了我的数据库路径并删除了mongod.lock,然后再次尝试(重新启动mongo)。之后它起作用了。

希望它也适合你。 mongodb repair on ubuntu

答案 3 :(得分:14)

我有同样的问题。在我的情况下, MongoDB 服务器没有运行。

尝试在网络浏览器中打开它:

  

http://localhost:28017

如果你不能,这意味着你必须启动MongoDB服务器。

在另一个终端标签中运行mongod。 然后在主选项卡中运行mongo,它是连接到MongoDB服务器的shell。

答案 4 :(得分:3)

打开文件/etc/mongod.conf并将您要连接的机器的IP添加到 bind_ip

bind_ip = 127.0.0.1,你的远程机器IP地址

例如: -

bind_ip = 127.0.0.1,192.168.1.5

重启mongodb服务:

sudo service mongod restart

确保在防火墙中打开mongodb端口。

如果您不担心安全问题,也可以对该行进行评论。

答案 5 :(得分:2)

我也有这个问题。你的MongoDB是日记吗? 我注意到日志文件中有以下“preallocate”条目。 一旦我看到最后一行“等待端口连接”,我就可以连接了。 请注意,这种“更快”的模式需要12分钟来初始化。

威廉

Tue Apr 17 16:48:01 [initandlisten] MongoDB starting : pid=2248 port=27017 dbpath=E:\MongoData 64-bit host=ME
Tue Apr 17 16:48:01 [initandlisten] db version v2.0.0-rc0, pdfile version 4.5
Tue Apr 17 16:48:01 [initandlisten] git version: 8d4bf50111352cee5a4f1abf25b63442d6c45dc4
Tue Apr 17 16:48:01 [initandlisten] build info: windows (6, 1, 7601, 2, 'Service Pack 1') BOOST_LIB_VERSION=1_42
Tue Apr 17 16:48:01 [initandlisten] options: { bind_ip: "ip", dbpath: "E:\MongoData", directoryperdb: true, journal: true, logpath: "E:\MongoData\mongo.log", quiet: true, rest: true, service: true }
Tue Apr 17 16:48:01 [initandlisten] journal dir=E:/MongoData/journal
Tue Apr 17 16:48:01 [initandlisten] recover : no journal files present, no recovery needed
Tue Apr 17 16:48:02 [initandlisten] preallocateIsFaster=true 9.68
Tue Apr 17 16:48:04 [initandlisten] preallocateIsFaster=true 8.44
Tue Apr 17 16:48:06 [initandlisten] preallocateIsFaster=true 9.68
Tue Apr 17 16:48:06 [initandlisten] preallocateIsFaster check took 4.921 secs
Tue Apr 17 16:48:06 [initandlisten] preallocating a journal file E:/MongoData/journal/prealloc.0
Tue Apr 17 16:52:37 [initandlisten] preallocating a journal file E:/MongoData/journal/prealloc.1
Tue Apr 17 16:56:54 [initandlisten] preallocating a journal file E:/MongoData/journal/prealloc.2
Tue Apr 17 17:01:42 [initandlisten] waiting for connections on port 27017
Tue Apr 17 17:01:42 [websvr] admin web console waiting for connections on port 28017

答案 6 :(得分:1)

这实际上不是错误......这里发生的是Mongo依赖守护程序来运行本地数据库服务器,所以为了“启动”你的shell中有mongo服务器,你必须先启动 mongo服务

对于 Fedora Linux (我使用的是Distro)你必须运行这些命令:

1 sudo service mongod start
2 mongo

你有它!服务器将运行。现在,如果你想要Mongo服务 在系统启动时启动,然后您必须运行:

sudo chkconfig --levels 235 mongod on

就是这样!如果你这样做,现在在shell中你只需要按顺序键入 mongo 启动服务器,但这就是它,问题是你必须首先启动服务器然后启动服务器:)

P.S。我发布的命令也可能适用于其他Linux发行版,而不仅仅是在fedora中......如果不是,你可能需要调整一些单词取决于你正在使用的发行版;)

答案 7 :(得分:1)

面对与Garrett上述错误相同的问题。 1.启用了日记功能的MongoDB服务器正在运行,如使用ps命令所示 2. Mongo客户端或Mongoose驱动程序无法连接到数据库。

解决方案: 1.删​​除Mongo.lock文件似乎可以让CentOS服务器恢复正常生活。 2.我们在生产中运行MongoDB是相当新的,并且已经看到同样的问题每周出现几次。 3.我们设置了一个cron计划,以定期清理锁定文件,并向管理员发出事件发生的警觉。

正在搜索此问题的错误修复程序或任何其他更永久的解决方法。

答案 8 :(得分:1)

如果您的bind_ip设置为127.0.0.1以外的任何值,那么您甚至需要从本地计算机显式添加ip。因此,只需使用您在本地盒子上的远程盒子上使用的相同方法。至少那是为我做的。

答案 9 :(得分:1)

默认情况下,mongodb配置为仅侦听localhost。摘自mongodb默认配置文件:

# Listen to local interface only. Comment out to listen on all interfaces.
bind_ip=127.0.0.1

需要注释bind_ip以从外部实体进行监听。

除非您开始侦听非本地接口,否则无法添加分片。

HTH,

Abhay Dandekar

答案 10 :(得分:0)

不是一个答案,而是更多的一个FYI:我只是点击了这个并且因为搜索而发现了这个问题。以下是我的经历细节:

Shell错误

markdsievers@ip-xx-xx-xx-xx:~$ mongo
MongoDB shell version: 2.0.1
connecting to: test
Wed Dec 21 03:36:13 Socket recv() errno:104 Connection reset by peer 127.0.0.1:27017
Wed Dec 21 03:36:13 SocketException: remote: 127.0.0.1:27017 error: 9001 socket exception [1] server [127.0.0.1:27017] 
Wed Dec 21 03:36:13 DBClientCursor::init call() failed
Wed Dec 21 03:36:13 Error: Error during mongo startup. :: caused by :: DBClientBase::findN: transport error: 127.0.0.1 query: { whatsmyuri: 1 } shell/mongo.js:84
exception: connect failed

Mongo日志显示

Wed Dec 21 03:35:04 [initandlisten] connection accepted from 127.0.0.1:50273 #6612
Wed Dec 21 03:35:04 [initandlisten] connection refused because too many open connections: 819

这或许表明了另一个答案(JaKi)正在经历同样的事情,其中​​一些连接被清除,并且再次为shell(其他客户端)进行访问

答案 11 :(得分:0)

我发现 this 非常有用。

如果您收到以下消息

start: Rejected send message, 1 matched rules; type="method_call", sender=":1.84" (uid=1000 pid=3215 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")
shriprasad@shriprasad-HP-430-Notebook-PC:/var/lib/mongodb$ mongo

您必须尝试以非root用户身份启动mongodb服务。您必须是root用户。因此,以root身份登录,然后运行以下命令,如下所示:

sudo bash

接着是

service mongodb start

答案 12 :(得分:0)

我还没有看到这个已经接受的答案,所以我只需加2美分。

我刚才遇到了完全相同的问题。过了一会儿,我意识到我已经在我的iptables规则中锁定了localhost。所以,检查防火墙。

答案 13 :(得分:0)

在Ubuntu上:

Wed Jan 27 10:21:32错误:无法连接到服务器127.0.0.1 shell / mongo.js:84 异常:连接失败

解决方案

通过以下命令查找mongodb是否正在运行:

ps -ef | grep mongo

如果mongo没有运行,你会得到:

 vimal     1806  1698  0 10:11 pts/0    00:00:00 grep --color=auto mongo

您看到mongo守护程序不存在。

然后通过配置文件(使用root priev)启动它:

root@vimal:/data# mongod --config /etc/mongodb.conf &
[1] 2131
root@vimal:/data# all output going to: /var/log/mongodb/mongodb.log

你可以看到其他细节:

root@vimal:~# more /etc/mongodb.conf

打开一个新终端以查看mongod的结果--config /etc/mongodb.conf& 然后键入mongo。它应该是运行或grep

root@vimal:/data# ps -ef | grep mongo

root      3153     1  2 11:39 ?        00:00:23 mongod --config /etc/mongodb.conf
root      3772  3489  0 11:55 pts/1    00:00:00 grep --color=auto mongo 

现在

root@vimal:/data# mongo

MongoDB shell version: 2.0.4
connecting to: test

你得到了mongoDB shell

这不是故事的结尾。我将发布修复方法,以便每次都自动启动,大多数开发机器每天都会关闭,并且VM必须在下次启动时自动启动mongo。

答案 14 :(得分:0)

启动mongod后

$mongod --dbpath <db name>

获取shell

$mongo --shell

答案 15 :(得分:0)

如果您的mongoDB服务器(远程服务器)的版本大于4.0.3,那么您将面临此问题。因此,您应该使用以下mongo替换当前的mongo-client shell:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org

然后,您的mongo客户端将能够连接已删除的mongodb