作为运维,日常应对 MongoDB 的高频排障、权限分配、性能调优和备份恢复,不需要去记繁杂的开发级查询语法。我们关注的核心是:看状态、查性能、杀会话、查空间、保数据。
本文总结了 MongoDB 运维最常用的实战命令
一、 登录与连接 (Connection)
作为运维,强烈建议习惯使用集群路由模式登录,让系统自动帮你找主库,避免在从库执行写命令报错。
# 终极标准连接命令(自带主库路由、密码认证)
mongosh "mongodb://root:YOUR_PASS@IP1:27017,IP2:27017,IP3:27017/?replicaSet=prodCluster&authSource=admin"
二、 账号与权限管理 (RBAC)
注:分配权限必须在主库的对应数据库下执行。
// 1. 给开发分配【只读】排障账号(最常用,防删库)
use app_db
db.createUser({
user: "dev_readonly",
pwd: "Password123!",
roles: [ { role: "read", db: "app_db" } ]
})
// 2. 给开发分配【读写】账号(测试环境用)
use app_db
db.createUser({
user: "dev_rw",
pwd: "Password123!",
roles: [ { role: "readWrite", db: "app_db" } ]
})
// 3. 修改密码 & 删除账号
db.changeUserPassword("dev_readonly", "NewPass666!")
db.dropUser("dev_readonly")
// 4. 提权(例如给自己补充缺失的真正的 root 角色)
use admin
db.grantRolesToUser("root", [{ role: "root", db: "admin" }])
三、 集群健康与主从监控 (Cluster Health)
注:日常巡检必备,需在 admin 库执行。
// 1. 查看集群总体状态(节点是否健康、谁是主谁是从)
rs.status()
// 2. 快速判断当前节点角色
rs.isMaster() // 新版推荐使用 hello()
// 3. 查看主从延迟(极其重要,监控从库落后主库多少秒)
rs.printSecondaryReplicationInfo()
// 4. 查看 Oplog 窗口期(评估断网多久以内还能追上数据)
rs.printReplicationInfo()
四、 性能排障与查杀慢查询 (Troubleshooting)
注:对应 MySQL 的 show processlist,线上救火专用。
// 1. 抓出正在执行且超过 3 秒的“慢查询”或“卡死会话”
db.currentOp({
"active": true,
"secs_running": { "$gt": 3 }
})
// 2. 强杀卡死的会话(拿到上一步结果里的 opid)
db.killOp(123456)
// 3. 动态开启慢查询日志(记录超过 100ms 的语句,1代表开启慢查询)
db.setProfilingLevel(1, { slowms: 100 })
// 4. 查看最近最慢的 5 条 SQL,发给开发优化
db.system.profile.find().sort({millis:-1}).limit(5).pretty()
// 5. 运维红线:后台建索引(绝对不能前台建,防锁表!)
db.users.createIndex({ "username": 1 }, { background: true })
五、 空间与容量统计 (Storage Stats)
// 1. 查看所有库的大小
show dbs
// 2. 查看当前库的真实数据大小和磁盘占用
db.stats()
// 3. 查看单张表(集合)的详细大小
db.users.stats()
六、 备份与恢复 (Backup & Restore)
注:这是 OS 层面的 Linux 终端命令,在 Shell 中执行,不要在 mongosh 内执行。
1. 逻辑备份与恢复(PITR)
# 企业级全库热备(不影响主库 IO + 保证绝对一致性)
mongodump --uri="mongodb://root:YOUR_PASS@IP1:27017,IP2:27017,IP3:27017/?replicaSet=prodCluster&authSource=admin&readPreference=secondary" --oplog --gzip --out=/data/backup/mongo_full
# 企业级全库恢复(重放增量日志,完美恢复到备份结束的精确时间点)
mongorestore --uri="mongodb://root:YOUR_PASS@IP1:27017,IP2:27017,IP3:27017/?replicaSet=prodCluster&authSource=admin" --oplogReplay --gzip /data/backup/mongo_full
# 单库导出(注意:单库导出不支持 --oplog 参数)
mongodump --uri="mongodb://.../?authSource=admin" --db=core_db --gzip --out=/data/backup/mongo_single
2. 物理备份锁(TB 级数据快照)
当数据量达到数百 GB 甚至 TB 级别,逻辑备份过慢时,采用底层磁盘快照是最佳方案。
# 进入 mongosh 执行,强制刷盘并锁死写入:
db.fsyncLock()
# ... 此时退出终端,去执行 LVM / 阿里云 EBS 等云盘快照 ...
# 快照完成后,立即回到 mongosh 解锁,恢复业务写入:
db.fsyncUnlock()
总结:熟练掌握这些核心命令,配合完善的集群拓扑规划与 Prometheus/Grafana 监控体系,足以应对绝大多数企业级 MongoDB 运维与突发排障需求。