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 日志、使用监控工具,或直接终止占用锁的长时间操作。

相关推荐
金仓数据库5 小时前
平替MongoDB | 金仓多模数据库助力电子证照国产化实践
数据库·mongodb
RestCloud10 小时前
MongoDB到关系型数据库:JSON字段如何高效转换?
数据库·mysql·mongodb
csdn_aspnet2 天前
在 C# .NETCore 中使用 MongoDB(第 1 部分):驱动程序基础知识和插入文档
mongodb·.netcore
csdn_aspnet2 天前
在 C# .NETCore 中使用 MongoDB(第 3 部分):跳过、排序、限制和投影
mongodb·c#·.netcore
熊文豪2 天前
政务系统国产化的“教科书级“实践:MongoDB平滑迁移成功案例解析
数据库·mongodb·政务·kingbasees·金仓数据库
诺青2352 天前
MongoDB副本集
数据库·mongodb
正在走向自律2 天前
金仓数据库打通电子证照国产化“最后一公里”——福建某地2TB MongoDB无缝迁移实践
数据库·mongodb·国产数据库·电科金仓
檀越剑指大厂2 天前
平替MongoDB:金仓多模数据库助力电子证照国产化实践
数据库·mongodb
FinTech老王3 天前
一场“无感换心”手术:金仓数据库如何让电子证照系统平滑告别MongoDB
数据库·mongodb
枫叶丹43 天前
金仓数据库替代MongoDB:电子证照系统国产化改造实战
数据库·mongodb