MongoDB 死锁 锁定问题

要查看 MongoDB 是否出现"锁死" (也就是所谓的 锁定问题,通常指长时间的锁定导致数据库操作无法正常进行),可以通过以下几种方法来检测数据库的锁定状态和锁定相关信息。

  1. 使用 db.currentOp() 检查活动操作

MongoDB 提供了 db.currentOp() 命令来查看当前正在执行的操作。这个命令会返回所有活动的数据库操作,并包含有关锁定的信息。你可以通过此命令来检查是否有长时间运行的操作占用了锁。

javascript

db.currentOp({ "locks": { "$exists": true } })

  • db.currentOp():返回所有当前正在执行的操作。

  • 通过 { "locks": { "$exists": true } } 来过滤出有锁定的操作。

输出示例:

json

{

"inprog": [

{

"opid": 12345,

"active": true,

"locks": {

"Global": "R",

"Database": "r",

"Collection": "w"

},

"secs_running": 120,

"ns": "mydb.mycollection",

"query": { "find": "mycollection" },

...

}

]

}

  • secs_running:显示操作已经运行的秒数。如果某个操作运行了非常长的时间(如几分钟甚至更久),则有可能导致其他操作被锁住。

  • locks:显示当前的锁级别。如果看到某个操作长时间保持了写锁(w),则可能会导致其他读写操作被阻塞。

  1. 检查锁统计信息 db.serverStatus()

MongoDB 提供了 db.serverStatus() 命令,包含了有关 MongoDB 当前状态的大量信息,其中 locks 部分显示了数据库的锁定统计。

javascript

db.serverStatus().locks

输出示例:

json

{

"Global": {

"acquireCount": { "r": 12345, "w": 678 },

"acquireWaitCount": { "r": 123, "w": 45 },

"timeAcquiringMicros": { "r": 123456, "w": 7890 }

},

"Database": {

"acquireCount": { "r": 12345, "w": 678 },

"acquireWaitCount": { "r": 123, "w": 45 },

"timeAcquiringMicros": { "r": 123456, "w": 7890 }

}

}

  • acquireCount:读取和写入锁的获取次数。

  • acquireWaitCount:锁请求等待的次数。如果写锁或读锁的等待次数非常多,可能说明有锁定问题。

  • timeAcquiringMicros:锁定时等待的时间(以微秒为单位),值越大表明锁等待时间越长。

  1. 使用 MongoDB 日志

MongoDB 日志文件中可能包含与锁定相关的信息。如果某些操作被锁住或者出现锁超时,通常会在日志中有相关记录。检查 MongoDB 的日志(通常位于 /var/log/mongodb/mongod.log)以确认是否有锁相关的错误或者警告。

bash

cat /var/log/mongodb/mongod.log | grep -i lock

查找是否有锁相关的错误信息,例如:

text

2023-10-11T15:00:45.123+0000 W STORAGE [conn1234] Unable to acquire lock for session id 5678: Resource temporarily unavailable

  1. 使用 killOp 终止长时间运行的操作

如果确定某个操作长时间占用锁导致 MongoDB 其他操作被阻塞,可以使用 db.killOp() 终止该操作。

先用 db.currentOp() 找到长时间运行的操作的 opid,然后通过以下命令终止:

javascript

db.killOp(opid)

  1. 使用 MongoDB Monitoring Service (MMS) 或其他监控工具

可以通过 MongoDB 的官方监控服务(MongoDB Atlas)或者第三方工具(如 mongotop、mongostat)监控锁使用情况。这些工具能帮助你实时查看 MongoDB 的读写操作和锁定情况。

  • mongotop:显示 MongoDB 实例的读写活动,能帮助查看某个集合是否被长期锁定。

  • mongostat:能显示锁定百分比(locked %),如果数值较高,说明存在锁问题。

bash

mongostat --host your_mongodb_host

总结

要查看 MongoDB 是否锁死,可以使用 db.currentOp() 命令检查长时间运行的操作,或使用 db.serverStatus() 查看锁定统计信息。你还可以检查 MongoDB 日志、使用监控工具,或直接终止占用锁的长时间操作。

相关推荐
杨云龙UP5 小时前
Docker 部署 MongoDB 6.0 数据库每日自动备份实践:本地 + 异地保留 7 天_20260429
linux·运维·数据库·mongodb·docker·容器·centos
稳联技术老娜20 小时前
Profinet转EtherCAT网关通讯架构及EtherCAT超距故障解决原理
mongodb
别来无恙blwy2 天前
windows MongoDB升级-自动升级脚本-自动检测升级到任意版本
数据库·windows·mongodb
snow@li2 天前
数据库-MongoDB:常用语法 / MongoDB 核心知识技能梳理
数据库·mongodb
刘晨鑫16 天前
MongoDB数据库应用
数据库·mongodb
爬山算法6 天前
MongoDB(92)什么是变更流(Change Streams)?
数据库·mongodb
小冯不疯6 天前
旺店通与金蝶云星空入库单管理对接方案
mongodb
MongoDB 数据平台7 天前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
忍冬行者7 天前
MongoDB 三节点副本集离线部署运维手册
运维·数据库·mongodb
卢傢蕊8 天前
MongoDB
数据库·mongodb