关于mongodb服务自动停止问题

本文介绍了因意外关闭Xshell导致MongoDB服务挂起的问题及解决方案。通过分析日志,发现关闭Xshell会使得MongoDB接收到SIGHUP信号而异常终止。文中提供了正确的启动命令及配置文件设置方法,确保服务稳定运行。
昨天发现系统宕机了,查了下原因是mongodb服务停了,看了下日志:
2017-10-18T18:09:59.181+0800 I CONTROL  [signalProcessingThread] got signal 1 (Hangup), will terminate after current cmd ends
2017-10-18T18:09:59.181+0800 I FTDC     [signalProcessingThread] Shutting down full-time diagnostic data capture
2017-10-18T18:09:59.225+0800 I CONTROL  [signalProcessingThread] now exiting
2017-10-18T18:09:59.226+0800 I NETWORK  [signalProcessingThread] shutdown: going to close listening sockets...
2017-10-18T18:09:59.226+0800 I NETWORK  [signalProcessingThread] closing listening socket: 6
2017-10-18T18:09:59.226+0800 I NETWORK  [signalProcessingThread] closing listening socket: 7
2017-10-18T18:09:59.226+0800 I NETWORK  [signalProcessingThread] removing socket file: /tmp/mongodb-27017.sock
2017-10-18T18:09:59.226+0800 I NETWORK  [signalProcessingThread] shutdown: going to flush diaglog...
2017-10-18T18:09:59.226+0800 I NETWORK  [signalProcessingThread] shutdown: going to close sockets...
2017-10-18T18:09:59.226+0800 I STORAGE  [signalProcessingThread] WiredTigerKVEngine shutting down
2017-10-18T18:09:59.226+0800 I NETWORK  [conn14] end connection 127.0.0.1:37191 (3 connections now open)
2017-10-18T18:09:59.227+0800 I NETWORK  [conn13] end connection 127.0.0.1:37190 (3 connections now open)
2017-10-18T18:09:59.227+0800 I NETWORK  [conn12] end connection 127.0.0.1:37189 (3 connections now open)
2017-10-18T18:09:59.227+0800 I NETWORK  [conn11] end connection 127.0.0.1:37188 (3 connections now open)
2017-10-18T18:09:59.258+0800 I STORAGE  [signalProcessingThread] shutdown: removing fs lock...
2017-10-18T18:09:59.258+0800 I CONTROL  [signalProcessingThread] dbexit:  rc: 0

重新起mongodb的服务(命令:nohup /home/mongodb-linux-x86_64-rhel62-3.2.3/bin/mongod -dbpath /home/mongodb &),系统又重新正常运行了。关闭Xshell之后系统又宕了。

查了下资料,原因是直接关闭Xshell窗口之后,linux认为是异常退出,这个shell进程会收到SIGNUP信号,然后给它所有的子进程发送SIGHUP信号。

但是在mongodb启动命令中加-fork参数,会自动将其挂到init进程(pid为1)下启动,如果不加的话ppid(父进程id)就是当前的shell进程,所以加上–fork问题就可以解决了。
1.启动命令:/home/mongodb-linux-x86_64-rhel62-3.2.3/bin/mongod --dbpath /home/mongodb --logpath=/home/mongodb/rs2.1.log --fork
(命令参考:./mongod -dbpath=/usr/local/mongodb/data -logpath=/usr/local/mongodb/mongodb.log -logappend -port=27017 -fork)

2.通过配置文件启动.mongodb.conf

dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/mongodb.log
port=27017
bind_ip=0.0.0.0 //开启远程访问,注意做好权限配置
logappend=true 
fork=true

./mongod --config /usr/local/mongodb/etc/mongodb.conf

参考:http://blog.youkuaiyun.com/shawyeok/article/details/46486683

<think>首先,用户的问题是:“我想解决Docker中MongoDB在断电后启动一段时间自动停止问题”。这涉及到Docker容器中的MongoDB在异常断电后无法正常启动的问题。 从系统指令中,我需要: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用,但用户提供的引用是关于MongoDB断电问题的背景和错误日志,不是直接相关的数学内容。用户引用包括: - [^1]: 异常断电导致MongoDB容器无法启动,修复方法包括手动启动、查看日志、使用mongod命令修复。 - [^2]: Docker启动问题,提示Docker daemon未运行。 - [^3]: MongoDB主机断电后重启无法连接,但服务启动后解决。 - [^4]: Docker MongoDB断电后启动自动停止,错误涉及WiredTiger文件损坏。 用户的核心问题MongoDB在Docker中启动后自动停止,错误与WiredTiger文件损坏相关(引用[^4])。 我的回答需要: 1. **结构清晰**:逐步引导用户解决问题。 2. **真实可靠**:基于常见解决方案,如修复数据库文件或重新初始化。 3. **生成相关问题**:在最后添加相关问题。 4. **使用中文**:整个回答用中文。 5. **处理引用**:自然地添加引用标识。用户提供了引用,所以我应该在相关部分引用它们。 由于问题涉及数据库和Docker,而不是数学,我可能不需要使用数学表达式。但系统指令说“所有行内数学表达式必须使用$...$格式”,但在这个上下文中,可能没有数学内容。用户的问题是关于技术问题的,所以我会避免不必要的数学。 步骤: - **介绍问题**:简述问题原因,如断电导致数据文件损坏。 - **解决方案步骤**:提供逐步修复方法。 - **验证**:建议如何验证修复。 - **预防措施**:建议如何避免类似问题。 - **生成相关问题**:添加3-4个相关问题。 引用用户提供的引用: - 引用[^4]直接相关:错误消息是关于WiredTiger文件损坏。 - 引用[^1]提到使用mongod命令修复,但容器无法启动。 - 引用[^2]和[^3]是次要的。 回答结构: 1. **问题分析**:解释为什么断电后MongoDB停止(数据文件损坏)。 2. **修复步骤**:基于引用[^1]和[^4],提供详细步骤。 3. **验证方法**:如何检查MongoDB是否正常运行。 4. **预防建议**:如使用持久化存储、定期备份。 5. **相关问题**:生成相关的问题列表。 生成相关问题: - 如何防止Docker容器在断电后数据损坏? - MongoDB数据文件损坏的其他修复方法? - Docker中MongoDB的最佳实践? 确保回答用中文。</think>### Docker中MongoDB断电后启动自动停止的解决方案 当Docker容器中的MongoDB在异常断电后启动一段时间自动停止时,通常是由于数据文件损坏导致的。断电可能导致WiredTiger存储引擎的文件(如.wt文件)出现校验和错误,MongoDB在启动时会尝试修复,但如果修复失败,容器就会自动终止[^4]。错误日志中常见类似提示:`WiredTiger error: potential hardware corruption, read checksum error`[^4]。下面我将一步步指导您解决此问题。修复的核心思路是:**隔离损坏的数据文件,使用MongoDB内置工具进行修复,然后恢复服务**。整个过程需谨慎操作,避免数据丢失。 #### 步骤1: 确认问题并备份数据 在尝试修复前,先备份当前数据,以防操作失误导致进一步损坏。 - **停止Docker容器**:如果容器正在运行或处于异常状态,先停止它。 ```bash docker stop <容器名称或ID> # 例如,docker stop mymongo ``` - **备份MongoDB数据卷**:找到容器挂载的数据目录(通常在`/var/lib/mongodb`或自定义路径),复制整个目录到安全位置。 ```bash cp -r <源数据目录> <备份目录> # 例如,cp -r /data/mongodb /backup/mongodb_backup ``` - **查看错误日志**:启动容器以获取详细错误信息,帮助诊断。 ```bash docker start <容器名称或ID> docker logs -f <容器名称或ID> # 检查是否有WiredTiger文件损坏的报错[^4] ``` 如果日志显示文件校验错误(如`index-*.wt`文件损坏),则确认是数据文件问题。 #### 步骤2: 修复损坏的数据文件 由于容器无法正常启动,无法直接在容器内运行`mongod`命令修复[^1]。采用“数据目录对调”方法:将损坏目录临时移出挂载点,创建一个空目录让MongoDB启动,然后在容器内执行修复命令。以下是详细步骤: 1. **对调数据目录位置**: - 假设您的数据卷挂载点为`/host/path/data`(宿主机路径),容器内路径为`/data/db`。 - 在宿主机上,将原数据目录重命名(例如,添加`_corrupt`后缀),并创建一个新的空目录。 ```bash mv /host/path/data /host/path/data_corrupt # 重命名原目录 mkdir /host/path/data # 创建新空目录 ``` - 启动MongoDB容器,挂载新空目录。这会让MongoDB以“干净”状态启动。 ```bash docker run -d --name temp_mongo -v /host/path/data:/data/db mongo:latest ``` 2. **在容器内执行修复命令**: - 进入临时容器,使用`mongod`命令修复原损坏目录(现在位于`/host/path/data_corrupt`)。 ```bash docker exec -it temp_mongo /bin/bash # 进入容器 ``` - 在容器内,运行修复命令(`--repair`选项)。注意:原损坏目录需挂载到容器中(例如挂载到`/repair`)。 ```bash mongod --repair --dbpath /repair # /repair是原损坏目录的挂载点 ``` 等待修复完成(可能需要几分钟)。修复过程中,MongoDB会重建索引并修复文件错误[^1]。 3. **恢复数据目录并重启容器**: - 退出容器,停止临时容器。 ```bash exit # 退出容器 docker stop temp_mongo docker rm temp_mongo # 删除临时容器 ``` - 将修复后的目录移回原位。 ```bash rm -rf /host/path/data # 删除空目录 mv /host/path/data_corrupt /host/path/data # 恢复原目录 ``` - 重启原MongoDB容器。 ```bash docker start <原容器名称或ID> # 例如,docker start mymongo ``` - 检查日志确认是否成功。 ```bash docker logs -f <原容器名称或ID> ``` 如果日志显示`MongoDB starting`且无错误,表示修复成功[^1]。 #### 步骤3: 验证和预防措施 - **验证服务**:连接MongoDB检查数据完整性。 ```bash docker exec -it <容器名称或ID> mongosh # 进入MongoDB shell use test_db db.stats() # 查看数据库状态,确认无错误 ``` - **预防断电问题**:避免未来类似故障。 - **使用持久化存储**:确保Docker卷使用持久化存储(如AWS EBS或本地SSD),减少文件损坏风险。 - **启用日志和备份**:配置MongoDB的日志级别(`systemLog.verbosity: 1`),并设置定期备份(如`mongodump`)。 - **Docker配置优化**:在`docker run`命令中添加`--restart=always`,让容器自动重启;使用Docker Compose管理服务,方便故障恢复[^2]。 - **硬件检查**:如果频繁断电,检查宿主机硬件(如磁盘健康),确保无物理损坏[^4]。 如果以上步骤无效,可能是硬件损坏或文件系统错误,建议从备份恢复数据或重新初始化MongoDB容器[^3]。 #### 相关问题 1. 如何防止Docker容器在断电后数据损坏? 2. MongoDB数据文件损坏的其他修复方法有哪些? 3. Docker中运行数据库的最佳实践是什么? [^1]: 异常断电导致MongoDB容器无法启动,通过数据目录对调和`mongod`命令修复成功。 [^2]: Docker启动问题提示daemon未运行,需检查Docker服务状态。 [^3]: MongoDB主机断电后重启无法连接,但服务启动后解决。 [^4]: Docker MongoDB断电后启动自动停止,错误涉及WiredTiger文件校验失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值