MongoDB7.0一些有用的功能
摘要
-
本文介绍MongoDB7.0的一些有用的功能,比如运行js,查看慢查询日志等等
-
MongoDB官方文档
-
本文基于
CentOS8(x86_64)
运行js
-
运行js文件
insertMany.js
1 | var tags = ['nosql', 'mongodb', 'document', 'developer', 'popular'] |
1 | # -f 运行js文件 |
-
运行js语句
1 | # ---eval 运行js语句 |
Profiler模块
-
Profiler模块可以用来记录、分析MongoDB的详细操作日志,默认情况下该功能是关闭的。
-
Profiler模块开启对于每个业务库来说是独立的,对某个业务库开启Profiler模块之后,符合条件的慢操作日志会被写入该库的
system.profile集合中。 -
Profiler模块的调试级别有:
1 | 0:关闭Profiler模块; |
-
设置Profiler模块的调试级别:
1 | # 设置Profiler模块的调试级别为2 |
-
查看日志
1 | # 查看操作日志 |
-
system.profile是一个1MB的固定大小的集合,随着记录日志的增多,一些旧的记录会被滚动删除。 -
Profiler模块的设置是内存级的,重启服务器后会自动恢复默认状态。
db.currentOp()
-
Profiler模块所记录的日志都是已经发生的事情,
db.currentOp()命令则与此相反,它可以用来查看数据库当前正在执行的一些操作。 -
db.currentOp()读取的是当前数据库的命令快照,该命令可以返回许多有用的信息,比如:
1 | 操作的运行时长,快速发现耗时漫长的低效扫描操作。 |
1 | > db.currentOp() |
mongod.lock
-
mongod.lock 是 MongoDB 在数据目录(dbpath)中创建的进程锁文件。
-
默认位置
1 | <dbpath>/mongod.lock |
mongod.lock 的核心作用
-
1️⃣ 防止多个 mongod 实例使用同一个 dbpath
1 | MongoDB 启动时会: |
-
2️⃣ 记录异常退出状态(2.x 时代的“安全标记”)
1 | 在 MongoDB 2.x 中: |
mongod.lock 什么时候会产生?
-
✅ 正常启动时(一定会产生)
-
❌ 异常退出时(不会被清理)
| 场景 | 是否残留 |
|---|---|
| kill -9 mongod | ✅ |
| 服务器突然断电 | ✅ |
| Docker 容器被强制 kill | ✅ |
| 启动过程中 crash | ✅ |
MongoDB 为什么不自动处理旧 lock?
1 | 这是 MongoDB 2.x 的设计缺陷: |
mongod.lock 是否可以直接删除?
-
✅ 可以删除的前提(必须同时满足)
1 | ✔ 当前 没有任何 mongod 进程 |
-
❌ 绝对不能删除的情况
| 情况 | 后果 |
|---|---|
| mongod 仍在运行 | 数据立即损坏 |
| 同一 dbpath 多实例 | 不可逆破坏 |
| NFS/共享存储 | 锁失效,极其危险 |
标准、安全的处理流程(推荐)
-
✅ Step 1:确认 mongod 未运行
1 | ps aux | grep mongod |
-
✅ Step 2:删除 lock 文件
1 | rm -f /data/db/mongod.lock |
-
⚠️ Step 3(强烈推荐):执行 repair
1 | mongod --dbpath /data/db --repair |
1 | 尤其适用于: |
-
✅ Step 4:正常启动 mongod
1 | mongod --config /var/config/mongod.conf |
为什么 MongoDB 3.x+ 很少再遇到这个问题?
-
原因:存储引擎变化
| 版本 | 引擎 | lock 行为 |
|---|---|---|
| 2.x | MMAPv1 | 强依赖 mongod.lock |
| 3.2+ | WiredTiger | 基于 journal + metadata |
| 4.x+ | WiredTiger | 自动恢复为主 |