exception in initAndListen: 12596 old lock file, terminating

本文详细介绍了MongoDB在云主机意外关机后,出现持久锁文件导致无法启动的情况,包括错误日志分析、根本原因解释、解决方法以及后续检查步骤。建议使用`db.repairDatabase()`进行数据库修复。

#mongd -f /etc/mongodb.conf时报错


monogdb.log日志分析

Unclean shutdown detected.

Please visit http://dochub.mongodb.org/core/repair for recovery instructions.*************

Wed Nov  5 04:14:35.951 [initandlisten] exception in initAndListen: 12596 old lock file, terminating

Wed Nov  5 04:14:35.951 dbexit: 

Wed Nov  5 04:14:35.951 [initandlisten] shutdown: going to close listening sockets...

Wed Nov  5 04:14:35.951 [initandlisten] shutdown: going to flush diaglog...

Wed Nov  5 04:14:35.951 [initandlisten] shutdown: going to close sockets...

Wed Nov  5 04:14:35.951 [initandlisten] shutdown: waiting for fs preallocator...

Wed Nov  5 04:14:35.951 [initandlisten] shutdown: closing all files...

Wed Nov  5 04:14:35.951 [initandlisten] closeAllFiles() finishe

Wed Apr  1 04:14:35.951 dbexit: really exiting now

提示错误分析:存在一个久的mongod.lock文件

根本原因:云主机意外关机,导致数据库未正常关闭

解决办法:删除mongod.lock文件,再次重启数据库

#mv mongod.lock mongod.lock.bak

#mongd -f /etc/mongodb.conf

检查数据库有无异常

后续作业:如果有异常建议执行


>db.repairDatabase()

def monitor_usb_device(target_vendor,target_product,shell_file): print("\n****Monitor_Picocom_Device****") previous_devices = set() running_process = None # 保存当前运行的进程对象 def terminate_process(): nonlocal running_process if running_process and running_process.poll() is None: # 进程仍在运行 os.killpg(os.getpgid(running_process.pid), signal.SIGTERM) running_process = None print("Terminated running shell script.") try: while True: current_ven_ids, current_pro_ids = get_usb_device_ids() # 获取当前设备列表 current_devices = set(zip(current_ven_ids, current_pro_ids)) # 组合为元组集合 # 检查新插入的设备 for device in current_devices - previous_devices: if device[0] == hex(target_vendor) and device[1] == hex(target_product): print(f"\npicocom_device_in: VendorID={device[0]}, ProductID={device[1]}") sleep(1) print("\nStop_Old_Process...") terminate_process() sleep(1) print("\nStar_New_Process...") running_process = subprocess.Popen( ["/bin/bash", shell_file], preexec_fn=os.setsid, # 创建新进程组,便于整体终止 stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) print(f"Started shell_process (PID: {running_process.pid})") print("Flush_Out:", running_process.stdout) try: for line in running_process.stdout: # 逐行读取 sys.stdout.write(line) # 输出到终端 sys.stdout.flush() # 强制刷新 with open("output.log", "a") as f: f.write(line) # 写入文件 finally: running_process.wait() # 确保进程结束 # 检查已拔出的设备 for device in previous_devices - current_devices: if device[0] == hex(target_vendor) and device[1] == hex(target_product): print(f"\npicocom_device_out: VendorID={device[0]}, ProductID={device[1]}") sleep(1) print("\nStop_New_Process...") terminate_process() previous_devices = current_devices time.sleep(1) except KeyboardInterrupt: print("\nStop") except Exception as e: print(f"Error: {e}")
07-17
你提供的日志是 **MongoDB 启动失败** 的日志信息,核心错误如下: ``` exception in initAndListen: DBPathInUse: Unable to lock the lock file: /var/lib/mongodb/mongod.lock (Resource temporarily unavailable). Another mongod instance is already running on the /var/lib/mongodb directory, terminating ``` --- ### 🔍 问题分析 这个错误的意思是: > MongoDB 在启动时尝试锁定数据目录 `/var/lib/mongodb` 下的 `mongod.lock` 文件,但该文件已被占用,说明 **另一个 `mongod` 进程已经在运行**,或者上一次 MongoDB 没有正常关闭,导致锁文件未被清除。 --- ### ✅ 解决方案 #### ✅ 方案一:检查并杀死已有 MongoDB 进程(推荐) 1. **查找正在运行的 `mongod` 进程** ```bash ps aux | grep mongod ``` 输出示例: ``` mongodb 1234 0.1 2.3 123456 78900 ? Sl 05:50 0:05 /usr/bin/mongod --config /etc/mongod.conf user 5678 0.0 0.0 12345 6789 pts/0 S+ 06:12 0:00 grep mongod ``` 注意第一个进程 PID 是 `1234`,这就是正在运行的 `mongod`。 2. **确认是否需要保留此进程** - 如果是你期望运行的 MongoDB 实例,则无需重新启动。 - 如果你不记得启动过,或它是“僵尸”进程,可以杀掉。 3. **终止进程** ```bash sudo kill -2 1234 # 优雅关闭(推荐) # 或者强制终止 sudo kill -9 1234 ``` > `-2` 是 SIGINT,模拟 Ctrl+C,让 MongoDB 安全退出。 > `-9` 是 SIGKILL,强制杀死,仅在 `-2` 无效时使用。 4. **再次启动 MongoDB** ```bash sudo systemctl start mongod # 或直接运行 sudo mongod --config /etc/mongod.conf ``` --- #### ✅ 方案二:手动删除 `mongod.lock` 文件(谨慎操作!) > ⚠️ 只有在确认 **没有其他 `mongod` 进程在运行** 时才可执行! 1. 确认无运行中的 `mongod` ```bash ps aux | grep mongod # 确保只有 grep 自身 ``` 2. 删除锁文件 ```bash sudo rm /var/lib/mongodb/mongod.lock ``` 3. 修复数据目录权限(可选) ```bash sudo chown -R mongodb:mongodb /var/lib/mongodb sudo chown -R mongodb:mongodb /var/log/mongodb sudo chown -R mongodb:mongodb /var/run/mongodb ``` 4. 启动服务 ```bash sudo systemctl start mongod ``` --- #### ✅ 方案三:如果怀疑数据损坏,进行修复 ```bash sudo mongod --repair --dbpath /var/lib/mongodb --config /etc/mongod.conf ``` 修复完成后,再启动服务。 --- ### 🛠️ 补充建议 - **不要手动删锁文件而不检查进程!** 否则可能导致数据库损坏。 - 使用 systemd 管理服务更安全: ```bash sudo systemctl status mongod # 查看状态 sudo systemctl restart mongod # 重启 sudo systemctl enable mongod # 开机自启 ``` - 配置文件路径通常是 `/etc/mongod.conf`,你可以查看其中的数据路径设置: ```yaml storage: dbPath: /var/lib/mongodb journal: enabled: true ``` --- ### ❓为什么会出现这个问题? | 原因 | 说明 | |------|------| | 正常运行中重复启动 | 已有一个实例在跑,不能同时多个实例访问同一数据目录 | | 上次异常关闭 | 断电、kill -9、崩溃等导致 `mongod.lock` 没被清理 | | 手动复制数据目录后误用 | 多个实例指向了同一个数据路径 | --- ### ✅ 最佳实践总结 | 措施 | 建议 | |------|------| | 启动前检查进程 | `ps aux \| grep mongod` | | 使用 systemd 控制 | `systemctl start/restart mongod` | | 不要随意 kill -9 | 尽量用 `kill -2` 或 `systemctl stop` | | 备份重要数据 | 避免修复过程中出错 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值