MongoDB启动异常 报错 及 正确的关闭方法

本文档详细解析了MongoDB在启动过程中可能遇到的多种错误,包括诊断数据捕获关闭、数据库路径已被占用、地址已在使用等问题,并提供了具体的解决步骤,如删除诊断数据、锁文件和执行修复命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错1:

[ftdc] Unclean full-time diagnostic data capture shutdown detected, found interim file, some metrics may have been lost.

解决办法:

1、删除掉diagnostic数据:

rm -f /var/lib/mongo/diagnostic.data/*

2、启动mongodb。

进入MongoDB的bin目录下,

sudo ./mongod

报错2:

2018-07-20T22:42:08.645+0800 I STORAGE  [initandlisten] exception in initAndListen: DBPathInUse: Unable to lock the lock file:

(Unknown error). Another mongod instance is already running on the /data/db directory, terminating.

2018-07-20T22:42:08.645+0800 I CONTROL  [initandlisten] now exiting
2018-07-20T22:42:08.645+0800 I CONTROL  [initandlisten] shutting down with code:100

解决办法:mongodb非正常关闭 删除mongod.lock文件即可.(lock文件所在路径各有不同)

sudo rm /data/db/mongod.lock

报错3:

2018-07-20T22:29:17.982+0800 I CONTROL  [initandlisten] MongoDB starting : pid=3499 port=27017 dbpath=/data/db 64-bit host=xumovm

......

2018-07-20T21:12:05.974+0800 E STORAGE  [initandlisten] Failed to set up listener: SocketException: Address already in use

解决办法:

找到mongo之前运行的PID号,关掉它,重新输入启动命令

sudo netstat -anp|more
激活Internet连接 (服务器和已建立连接的)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
 PID/Program name    
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN     
 2515/./mongod       

sudo kill 2515

正确的关闭方法:停止Mongodb

方法一:查看进程,使用kill命令;不能使用kill -9

方法二:在在客户端进去,使用shutdown命令

/usr/local/mongodb/bin:$ ./mongod
> use admin; 
switched to db admin 
> db.shutdownServer();
 server should be down...

2018-07-20T23:06:30.230+0800 I NETWORK  [initandlisten] waiting for connections on port 27017
2018-07-20T23:13:37.028+0800 I NETWORK  [listener] connection accepted from 127.0.0.1:56738 #1 (1 connection now open)
2018-07-20T23:13:37.029+0800 I NETWORK  [conn1] received client metadata from 127.0.0.1:56738 conn1: { application: { name: "MongoDB Shell" }, driver: { name: "MongoDB Internal Client", version: "4.0.0" }, os: { type: "Linux", name: "Ubuntu", architecture: "x86_64", version: "18.04" } }
2018-07-20T23:13:59.951+0800 I COMMAND  [conn1] terminating, shutdown command received { shutdown: 1.0, $db: "admin" }
2018-07-20T23:13:59.951+0800 I NETWORK  [conn1] shutdown: going to close listening sockets...
2018-07-20T23:13:59.951+0800 I NETWORK  [conn1] removing socket file: /tmp/mongodb-27017.sock
2018-07-20T23:13:59.952+0800 I FTDC     [conn1] Shutting down full-time diagnostic data capture
2018-07-20T23:13:59.956+0800 I STORAGE  [conn1] WiredTigerKVEngine shutting down
2018-07-20T23:14:00.049+0800 I STORAGE  [conn1] shutdown: removing fs lock...
2018-07-20T23:14:00.049+0800 I CONTROL  [conn1] now exiting
2018-07-20T23:14:00.049+0800 I CONTROL  [conn1] shutting down with code:0

1、新安装mongodb,执行sudo service mongod start(sudo service mongod restart),都报启动失败。

查看/var/log/mongodb/mongod.log:

2015-07-27T11:49:10.476+0800 I CONTROL  ***** SERVER RESTARTED *****
2015-07-27T11:49:10.548+0800 E NETWORK  [initandlisten] listen(): bind() failed errno:98 Address already in use for socket: 192.168.1.235:27017
2015-07-27T11:49:10.548+0800 E NETWORK  [initandlisten]   addr already in use
2015-07-27T11:49:10.549+0800 W -        [initandlisten] Detected unclean shutdown - /var/lib/mongo/mongod.lock is not empty.
2015-07-27T11:49:10.582+0800 I STORAGE  [initandlisten] exception in initAndListen: 98 Unable to lock file: /var/lib/mongo/mongod.lock errno:11 Resource temporarily unavailable. Is a mongod instance already running?, terminating
2015-07-27T11:49:10.582+0800 I CONTROL  [initandlisten] dbexit:  rc: 100
2015-07-27T11:56:46.954+0800 I CONTROL  ***** SERVER RESTARTED *****
2015-07-27T11:56:47.017+0800 E NETWORK  [initandlisten] listen(): bind() failed errno:98 Address already in use for socket: 192.168.1.235:27017
2015-07-27T11:56:47.017+0800 E NETWORK  [initandlisten]   addr already in use
2015-07-27T11:56:47.018+0800 W -        [initandlisten] Detected unclean shutdown -/var/lib/mongo/mongod.lock is not empty.
2015-07-27T11:56:47.018+0800 I STORAGE  [initandlisten] exception in initAndListen: 98 Unable to lock file: /var/lib/mongo/mongod.lock errno:11 Resource temporarily unavailable. Is a mongod instance already running?, terminating
2015-07-27T11:56:47.018+0800 I CONTROL  [initandlisten] dbexit:  rc: 100

解决步骤:

  1、删除日志文件/var/log/mongodb/mongod.log

rm /var/log/mongodb/mongod.log

  2、删除lock文件

rm /var/log/mongodb/mongod.log

  3、执行修复

sudo /usr/bin/mongod –repair –dbpath /var/lib/mongodb / –repairpath /tmp/mongodb

4-最终方式:重启服务器端

reboot
<think>我们正在处理的是MongoDB的mongos进程启动时报告的错误:"child process failed, exited with error number 14"。错误号14在Linux系统中通常对应EFAULT(Bad address),即进程试图访问无效的内存地址。结合引用[4]的内容,该错误可能与文件权限和未正常关闭有关。 根据引用[4]中的案例,错误14的常见原因包括: 1. 没有正常关闭MongoDB(例如使用kill -9强制终止)。 2. 使用不同用户启动MongoDB导致文件权限问题(例如用root启动,但systemctl服务配置的用户是mongo)。 因此,我们可以按照以下步骤进行排查和解决: ### 步骤1:检查文件权限 由于mongos进程需要访问配置文件、数据目录和日志文件等,确保这些文件的所有权和权限正确非常重要。 1. **确认mongos运行的用户**:通常mongos服务会以特定的用户(如mongod或mongo)运行。检查服务配置文件(如`/usr/lib/systemd/system/mongos.service`)中指定的用户。 2. **检查相关文件和目录的权限**:确保数据目录、日志文件路径以及配置文件等都属于mongos运行的用户,并且该用户有读写权限。 例如,如果mongos运行的用户是`mongod`,数据目录为`/data/mongos`,日志文件为`/var/log/mongodb/mongos.log`,则执行: ```bash sudo chown -R mongod:mongod /data/mongos sudo chown mongod:mongod /var/log/mongodb/mongos.log ``` ### 步骤2:检查是否已有mongos进程在运行 如果之前启动的mongos没有正常关闭,可能会导致端口被占用或锁文件存在,从而阻止新的进程启动。 1. **检查进程**: ```bash ps aux | grep mongos ``` 如果发现已有mongos进程,尝试用正确的方式停止它(如使用`kill`命令发送SIGTERM信号,而不是SIGKILL)。 2. **检查锁文件**:mongos在启动时会创建锁文件(通常在数据目录中)。如果上次关闭不正常,锁文件可能未被清除。删除锁文件(如果有): ```bash rm -f /data/mongos/mongos.lock # 请根据实际数据目录调整 ``` ### 步骤3:检查日志 启动mongos时,不要使用`--fork`参数,这样可以直接在控制台看到错误信息。例如: ```bash sudo -u mongod mongos --config /etc/mongos.conf ``` 注意:确保以正确的用户(这里是mongod)运行命令。 ### 步骤4:检查配置文件 检查mongos的配置文件(如`/etc/mongos.conf`)是否正确,特别是以下配置项: - `configDB`:指向配置服务器的地址 - `port`:监听的端口 - `logpath`:日志文件路径 - `pidFilePath`:进程ID文件路径 确保这些配置项指向的路径存在,并且mongos运行的用户有权限访问。 ### 步骤5:检查端口冲突 如果mongos配置的端口已被其他进程占用,启动会失败。使用以下命令检查端口占用情况: ```bash netstat -tulnp | grep <port> ``` 其中`<port>`是mongos配置的端口(默认为27017)。 ### 步骤6:修复文件系统错误 如果MongoDB所在的分区有文件系统错误,也可能导致内存映射文件访问失败。可以尝试对数据目录所在的分区进行`fsck`检查(需要先卸载分区,因此需谨慎操作)。 ### 步骤7:使用GDB调试(高级) 如果上述步骤未能解决问题,可以尝试使用GDB调试mongos进程。首先,确保系统安装了GDB和MongoDB的调试符号包(如果可用)。然后运行: ```bash gdb --args mongos --config /etc/mongos.conf ``` 在GDB中运行`run`命令,当程序崩溃时,使用`bt`命令查看堆栈跟踪。 ### 典型解决方案总结 根据引用[4]的经验,最常见的解决方案是: 1. **确保正确关闭mongos**:如果之前有运行中的mongos,使用正确的方式关闭(如通过mongo shell发送shutdown命令)。 2. **修复文件权限**:将数据目录、日志文件等关键路径的所有权更改为mongos运行的用户(如mongod)。 3. **清理残留文件**:删除锁文件(如果有)。 如果问题仍然存在,请提供启动时控制台输出的错误信息(不使用`--fork`参数)以便进一步分析。 生成的相关问题: 1. 如何正确配置mongos以连接MongoDB分片集群? 2. 如何解决MongoDB启动时的端口冲突问题? 3. 如何为MongoDB服务配置SELinux策略? 4. 在systemd服务中如何正确设置MongoDB启动参数?</think>### 解决 MongoDB mongos 启动错误 "child process failed, exited with error number 14" 该错误通常由**文件权限问题**或**异常关闭导致的数据损坏**引起,以下是系统级排查和解决方案: --- #### 1. 检查文件权限(关键步骤) 错误号14(EFAULT)最常见原因是mongos进程无权访问数据文件: ```bash # 查看数据目录权限(根据你的配置替换路径) ls -ld /var/lib/mongo /data/mongos # 修复权限(假设mongos服务用户为mongod) sudo chown -R mongod:mongod /var/lib/mongo sudo chown -R mongod:mongod /data/mongos # 如果使用自定义数据目录 ``` > **注意**:如果之前用root启动过mongos(如`sudo mongos --fork`),会导致文件属主错误[^4] --- #### 2. 清理异常关闭残留 强制终止可能导致锁文件残留: ```bash # 删除锁文件(路径在配置文件中查找) sudo rm -f /var/lib/mongo/mongod.lock # 默认位置 sudo rm -f /data/mongos/mongod.lock # 自定义位置 ``` --- #### 3. 检查配置文件 确认关键配置项正确(特别是数据目录路径): ```bash # 查看mongos配置文件 grep -E "shardsvr|configDB|dbpath|pidFilePath" /etc/mongos.conf ``` 确保: - `dbpath` 指向正确的数据目录 - `pidFilePath` 有写入权限 - `configDB` 配置服务器地址正确 --- #### 4. 前台启动获取详细日志 去掉`--fork`参数查看实时错误: ```bash sudo -u mongod mongos --config /etc/mongos.conf ``` 观察输出中是否有以下关键信息: - `Failed to unlink socket file`(套接字文件残留) - `Permission denied`(权限问题) - `Invalid argument`(配置错误) --- #### 5. 检查端口冲突 ```bash # 检查默认端口27017是否被占用 sudo netstat -tulnp | grep 27017 # 如果冲突,在配置文件中修改端口: net: port: 27018 ``` --- #### 6. 修复数据文件(最终手段) 如果怀疑数据损坏: 1. 备份数据目录 2. 尝试修复: ```bash sudo -u mongod mongos --config /etc/mongos.conf --repair ``` --- ### 完整解决流程 ```mermaid graph TD A[启动失败 error 14] --> B[检查数据目录权限] B -->|权限错误| C[chown修复属主] B -->|权限正常| D[清理lock文件] D --> E[前台启动查看日志] E -->|显示套接字错误| F[删除socket文件] E -->|显示配置错误| G[检查configDB设置] E -->|显示端口冲突| H[修改端口] F/G/H --> I[重新启动服务] ``` > **重要提示**: > 如果使用systemd管理服务,修复后执行: > ```bash > sudo systemctl daemon-reload > sudo systemctl start mongos > ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值