运维管理28 分钟阅读
MongoDB 运维命令 100 条
MongoDB 的日常运维并不只是执行几条查询语句。对于 DBA 来说,真正需要掌握的是实例状态检查、存储空间分析、慢操作定位、索引管理、用户权限、复制集维护、分片集群管理以及备份恢复。
2026年7月21日阅读—点赞—收藏—
dba100mongodb墨力计划
在知识库中专注阅读,并随时返回相关工具与课程
MongoDB 的日常运维并不只是执行几条查询语句。对于 DBA 来说,真正需要掌握的是实例状态检查、存储空间分析、慢操作定位、索引管理、用户权限、复制集维护、分片集群管理以及备份恢复。
MongoDB 的日常运维并不只是执行几条查询语句。对于 DBA 来说,真正需要掌握的是实例状态检查、存储空间分析、慢操作定位、索引管理、用户权限、复制集维护、分片集群管理以及备份恢复。
下面整理的 100 条命令以 mongosh 和 MongoDB Database Tools 为主,覆盖 MongoDB 6.0、7.0、8.x 等主流版本。不同版本、部署架构和授权模式下,部分命令的参数与返回字段可能存在差异,生产环境执行前应先确认当前版本和节点角色。MongoDB 数据库命令通常通过 db.runCommand()、db.adminCommand() 或相应的 mongosh 辅助方法执行。

文中的数据库名称、集合名称、主机地址和用户名称均为示例:
1数据库:appdb2集合:orders3复制集:rs04分片:shard01、shard02涉及删除数据、删除索引、终止操作、切换主节点和恢复覆盖的命令,均应经过变更审批并提前做好备份。
1mongosh "mongodb://mongo1:27017,mongo2:27017,mongo3:27017/admin?replicaSet=rs0" \2 --username dba \3 --authenticationDatabase admin生产环境建议通过复制集连接串连接,而不是只连接单个节点。这样即使发生 Primary 切换,客户端也可以重新发现新的 Primary。
命令中未直接填写密码,执行时由终端提示输入,可避免密码明文出现在 Shell 历史记录中。
1show dbs该命令只显示当前用户有权限访问的数据库。没有数据的空数据库通常不会出现在结果中。
1use appdbMongoDB 的 use 只是切换当前数据库上下文,并不会立即创建数据库。只有真正写入数据后,数据库才会落盘。
1db.getName()在执行删除集合、修改用户或创建索引前,建议先确认当前数据库,避免在错误的数据库上下文中执行操作。
1show collections用于快速确认集合是否存在,也可以检查恢复或数据迁移后集合是否已经创建。
1db.getMongo().getDBNames()相比 show dbs,该方法更适合在 mongosh 脚本中调用和处理返回结果。
1db.version()升级、故障排查和兼容性检查时应首先确认服务端版本,不要只看客户端 mongosh 的版本。
1db.hello()重点关注:
1isWritablePrimary2secondary3setName4hosts5primary6me7maxWireVersion在复制集环境中,该命令可以快速判断当前连接的是 Primary、Secondary,还是独立实例。
1db.adminCommand({ ping: 1 })正常情况下返回:
1{2 ok: 13}该命令常用于监控探测、连接池健康检查和自动化巡检。
1db.adminCommand({ getCmdLineOpts: 1 })可以查看 MongoDB 实际使用的配置文件路径和解析后的启动参数,排查“配置文件已经修改但没有生效”之类的问题时非常有用。
1db.runCommand({2 dbStats: 1,3 scale: 1024 * 10244})scale 设置为 MB,重点关注:
1collections2views3objects4dataSize5storageSize6indexes7indexSize8totalSize9fsUsedSize10fsTotalSize需要注意,dataSize 是逻辑数据大小,storageSize 是实际分配给集合的存储空间,两者并不相同。
1db.orders.aggregate([2 {3 $collStats: {4 count: {},5 storageStats: {6 scale: 1024 * 10247 }8 }9 }10])可以查看集合文档数量、数据大小、存储大小、索引大小、平均文档大小以及 WiredTiger 存储信息。
1db.getCollectionInfos()结果中通常包括:
1集合名称2集合类型3UUID4validator5validationLevel6validationAction7视图定义8集合选项该命令适合做元数据巡检,也可以用于对比两个环境的集合定义。
1db.createCollection("orders", {2 validator: {3 $jsonSchema: {4 bsonType: "object",5 required: ["orderNo", "createdAt"],6 properties: {7 orderNo: {8 bsonType: "string"9 },10 createdAt: {11 bsonType: "date"12 }13 }14 }15 },16 validationLevel: "strict",17 validationAction: "error"18})MongoDB 虽然是文档数据库,但生产系统仍然建议为核心集合配置必要的数据校验规则,避免错误类型和缺失字段持续进入数据库。
1db.runCommand({2 collMod: "orders",3 validationLevel: "moderate"4})collMod 可以修改校验规则、校验级别、TTL 索引参数和部分集合属性。修改前应确认版本是否支持对应参数。
1db.orders.renameCollection(2 "orders_archive",3 true4)第二个参数为 true 时,表示目标集合已经存在则先删除目标集合。
这是一个高风险选项,生产环境通常不建议直接设置为 true。
1db.orders.validate({2 full: true3})重点检查返回结果中的:
1valid2warnings3errors4nInvalidDocuments5nNonCompliantDocumentsfull: true 会执行更完整的检查,大集合上可能消耗较多 I/O 和 CPU,不建议在高峰期执行。
1db.runCommand({2 compact: "orders"3})compact 用于重新整理集合及其索引占用的磁盘空间。不同 MongoDB 版本、存储引擎和部署架构下,其行为和限制不同。
该操作可能产生明显的磁盘 I/O,不应在未评估影响的情况下直接对生产大集合执行。
1db.orders.drop()执行后会删除集合中的全部文档、索引和集合元数据。
操作前至少应确认:
1db.getName()2db.orders.estimatedDocumentCount()1db.dropDatabase()这是 MongoDB 中风险最高的命令之一,会删除当前数据库中的所有集合。
生产环境执行前必须再次确认当前数据库:
1db.getName()1db.orders.countDocuments({2 status: "PAID"3})countDocuments() 会按照查询条件执行准确计数。大集合无索引条件下可能触发大量扫描。
1db.orders.estimatedDocumentCount()该方法通常基于集合元数据返回估算数量,速度较快,适合巡检和容量统计,但不适合需要严格准确性的业务计算。
1db.orders.findOne({2 orderNo: "ORD202607210001"3})适合快速确认单条业务数据是否存在,以及字段结构是否符合预期。
1db.orders.find(2 {3 status: "PAID"4 },5 {6 _id: 0,7 orderNo: 1,8 userId: 1,9 amount: 1,10 createdAt: 111 }12)合理使用投影可以减少网络传输和 BSON 反序列化开销,但不会自动解决集合扫描问题。
1db.orders.find({2 status: "PAID"3})4.sort({5 createdAt: -16})7.limit(20)对应的常用索引可以设计为:
1{2 status: 1,3 createdAt: -14}是否适合仍需结合字段选择性、查询频率和返回数据量判断。
1db.orders.distinct(2 "status",3 {4 createdAt: {5 $gte: ISODate("2026-07-01T00:00:00Z")6 }7 }8)适合检查状态字段、租户字段、业务类型字段的实际取值范围。
1db.orders.aggregate([2 {3 $match: {4 createdAt: {5 $gte: ISODate("2026-07-01T00:00:00Z")6 }7 }8 },9 {10 $group: {11 _id: "$status",12 orderCount: {13 $sum: 114 },15 totalAmount: {16 $sum: "$amount"17 }18 }19 },20 {21 $sort: {22 orderCount: -123 }24 }25])聚合管道是 MongoDB 数据分析和复杂查询的核心。DBA 排查聚合性能时,应重点检查 $match 是否尽量前置、是否命中索引,以及中间结果集是否过大。
1db.orders.insertOne({2 orderNo: "ORD202607210001",3 userId: 1001,4 status: "NEW",5 amount: NumberDecimal("99.00"),6 createdAt: new Date()7})金额字段不建议直接使用普通浮点数,可以根据业务精度要求使用 Decimal128。
1db.orders.insertMany(2 [3 {4 orderNo: "ORD202607210002",5 status: "NEW",6 createdAt: new Date()7 },8 {9 orderNo: "ORD202607210003",10 status: "NEW",11 createdAt: new Date()12 }13 ],14 {15 ordered: false16 }17)ordered: false 表示其中一条写入失败后,MongoDB 可以继续尝试写入后续文档,适合大批量导入场景。
1db.orders.updateOne(2 {3 orderNo: "ORD202607210001"4 },5 {6 $set: {7 status: "PAID"8 },9 $currentDate: {10 updatedAt: true11 }12 }13)执行后应关注:
1matchedCount2modifiedCountmatchedCount 为 1 但 modifiedCount 为 0,通常说明目标值与原值相同。
1db.orders.updateMany(2 {3 status: "NEW",4 createdAt: {5 $lt: ISODate("2026-07-01T00:00:00Z")6 }7 },8 {9 $set: {10 status: "EXPIRED"11 }12 }13)批量更新前建议先使用相同条件执行 countDocuments(),确认影响范围。
1db.orders.replaceOne(2 {3 orderNo: "ORD202607210001"4 },5 {6 orderNo: "ORD202607210001",7 userId: 1001,8 status: "PAID",9 amount: NumberDecimal("99.00"),10 updatedAt: new Date()11 }12)replaceOne() 会替换除 _id 之外的整个文档。如果新文档遗漏原有字段,这些字段会被删除。
1db.orders.deleteOne({2 orderNo: "ORD202607210001"3})如果过滤条件不唯一,MongoDB 只删除匹配到的一条文档,因此生产环境最好使用唯一键或 _id 定位。
1db.orders.deleteMany({2 status: "EXPIRED",3 createdAt: {4 $lt: ISODate("2025-01-01T00:00:00Z")5 }6})大批量删除可能产生大量 WiredTiger 写入、复制集 Oplog 和磁盘空间碎片。
对于海量历史数据清理,更稳妥的方式通常是按时间窗口分批删除,并持续监控复制延迟、磁盘 I/O 和 Oplog 窗口。
MongoDB 的 explain 可以返回查询优化器选择的执行计划,并支持 queryPlanner、executionStats 和 allPlansExecution 等分析级别。执行 explain 时不会直接使用已有计划缓存,也不会因为本次分析创建新的计划缓存项。
1db.orders.getIndexes()重点检查:
1name2key3unique4sparse5partialFilterExpression6expireAfterSeconds7hidden1db.orders.createIndex(2 {3 orderNo: 14 },5 {6 name: "idx_order_no"7 }8)建议显式指定索引名称,方便后续监控、变更和删除。
1db.orders.createIndex(2 {3 userId: 1,4 status: 1,5 createdAt: -16 },7 {8 name: "idx_user_status_created"9 }10)复合索引字段顺序不能只凭经验决定,需要结合等值条件、排序条件、范围条件和查询选择性综合判断。
1db.orders.createIndex(2 {3 orderNo: 14 },5 {6 name: "uk_order_no",7 unique: true8 }9)如果集合中已经存在重复数据,唯一索引创建会失败。创建前可以先通过聚合查询检查重复值。
1db.orders.createIndex(2 {3 createdAt: -14 },5 {6 name: "idx_active_created",7 partialFilterExpression: {8 status: {9 $in: ["NEW", "PAID"]10 }11 }12 }13)部分索引只索引满足条件的文档,可以减少索引体积和维护开销,但查询条件必须与部分索引条件兼容才能使用。
1db.sessions.createIndex(2 {3 createdAt: 14 },5 {6 name: "idx_session_ttl",7 expireAfterSeconds: 25920008 }9)2592000 秒等于 30 天。
TTL 删除是后台异步执行的,并不保证文档在到期的瞬间被删除。TTL 字段应保存 BSON Date 类型,而不是普通字符串。
1db.orders.createIndex(2 {3 tenantId: "hashed"4 },5 {6 name: "idx_tenant_hashed"7 }8)哈希索引常用于哈希分片键,可以改善数据分布,但不适合范围查询和基于原字段值的排序。
1db.orders.createIndex(2 {3 status: 1,4 createdAt: -15 },6 {7 name: "idx_status_created_hidden",8 hidden: true9 }10)隐藏索引仍然会随数据写入进行维护,但查询优化器不会选择它。
隐藏索引适合在正式启用前完成索引构建,也适合模拟删除索引后的执行计划变化。
1db.runCommand({2 collMod: "orders",3 index: {4 name: "idx_status_created_hidden",5 hidden: false6 }7})取消隐藏后,查询优化器才可能选择该索引。是否立即使用仍取决于查询形态和计划选择结果。
1db.orders.dropIndex(2 "idx_status_created"3)删除索引前应确认索引使用情况,避免把业务正在使用的关键索引误删。
_id 索引1db.orders.dropIndexes()该命令会删除集合上除 _id 索引之外的全部索引,生产环境风险极高。
1db.orders.aggregate([2 {3 $indexStats: {}4 }5])重点关注:
1name2accesses.ops3accesses.sinceaccesses.ops 为 0 不代表索引永远无用,因为统计会在实例重启、节点切换或部分维护操作后重新计算。
1db.orders.explain("queryPlanner").find({2 userId: 1001,3 status: "PAID"4})重点检查:
1winningPlan2rejectedPlans3stage4indexName5indexBounds1db.orders.explain("executionStats").find({2 userId: 1001,3 status: "PAID"4})重点关注:
1executionTimeMillis2nReturned3totalKeysExamined4totalDocsExamined5executionStages典型判断指标:
1totalDocsExamined / nReturned2totalKeysExamined / nReturned如果扫描数量远大于返回数量,通常需要重新检查索引设计或查询条件。
1db.orders.find({2 userId: 1001,3 status: "PAID"4})5.hint("idx_user_status_created")hint() 适合用于验证索引效果和临时诊断,不建议把它当成长期掩盖索引设计问题的手段。
db.serverStatus() 用于查看 MongoDB 实例的运行状态,db.currentOp() 用于查看当前正在执行的操作。现代版本的 mongosh 在执行 db.currentOp() 时会使用 $currentOp 聚合阶段。
1db.serverStatus()返回内容非常多,常用模块包括:
1connections2opcounters3network4mem5metrics6wiredTiger7repl8locks9transactions10asserts1db.serverStatus().connections重点关注:
1current2available3active4threaded5exhaustHello6exhaustIsMaster如果 current 持续增加,应检查应用连接池配置、连接泄漏和空闲连接回收策略。
1db.serverStatus().opcounters常见字段包括:
1insert2query3update4delete5getmore6command通过连续采样计算增量,可以判断实例当前的读写负载类型。
1db.serverStatus().metrics.document通常可以看到:
1deleted2inserted3returned4updated这些指标是实例启动以来的累计值,应结合采样时间差计算每秒变化量。
1db.serverStatus().wiredTiger.cache重点关注:
1maximum bytes configured2bytes currently in the cache3tracked dirty bytes in the cache4pages read into cache5pages written from cache6unmodified pages evicted7modified pages evicted如果缓存长期接近上限、脏页比例过高、读入缓存的页数快速增加,应进一步检查工作集大小、查询扫描量和磁盘延迟。
1db.serverStatus().network重点关注:
1bytesIn2bytesOut3numRequests4physicalBytesIn5physicalBytesOut网络流量异常升高可能来自大结果集查询、缺少投影、批量读取、全量同步或备份任务。
1db.serverStatus().mem通常包括:
1resident2virtual3mapped4mappedWithJournalMongoDB 使用的操作系统内存、WiredTiger Cache 和文件系统缓存不能简单地通过单个 RSS 数值判断是否存在内存泄漏。
1db.currentOp({2 active: true3})重点查看:
1opid2secs_running3microsecs_running4ns5op6command7planSummary8client9appName10waitingForLock1db.currentOp({2 active: true,3 secs_running: {4 $gte: 55 }6})这是排查业务卡顿、长查询、批量更新和索引构建时最常用的命令之一。
1db.killOp(123456)其中 123456 为 db.currentOp() 返回的 opid。
终止操作前必须确认客户端、命名空间、SQL 等价查询条件和操作类型,避免误杀关键业务任务或内部复制操作。
1db.getProfilingStatus()可以查看:
1was2slowms3sampleRate4filter其中:
1was = 0:关闭 Profiler2was = 1:只记录慢操作3was = 2:记录所有操作1db.setProfilingLevel(2 1,3 {4 slowms: 200,5 sampleRate: 1.06 }7)表示记录执行时间超过 200 毫秒的操作。
Profiler 会将数据写入当前数据库的 system.profile 集合,可能产生额外开销,不建议未经评估直接设置为级别 2。
1db.system.profile.find({2 millis: {3 $gte: 2004 }5})6.sort({7 ts: -18})9.limit(20)重点分析:
1ns2command3millis4planSummary5keysExamined6docsExamined7nreturned8numYield9locks10client11appName1db.setProfilingLevel(0)Profiler 是数据库级别配置,需要切换到相应数据库后分别关闭。
1db.adminCommand({2 getLog: "global"3})适合在没有服务器文件系统权限时,从数据库端获取最近的日志信息。
1db.adminCommand({2 logRotate: 13})通常用于日志归档、日志文件过大处理和运维脚本。执行前应确认当前日志输出方式及操作系统日志轮转配置。
1mongostat \2 --uri="$MONGODB_URI" \3 --rowcount 10 \4 2最后的 2 表示每 2 秒采样一次,--rowcount 10 表示输出 10 行。
重点关注:
1insert2query3update4delete5getmore6command7dirty8used9flushes10vsize11res12qrw13arw14net_in15net_out16conn17time1mongotop \2 --uri="$MONGODB_URI" \3 5表示每 5 秒输出一次各命名空间的读写耗时。
如果某个集合的 read 或 write 时间持续偏高,应进一步结合慢日志、执行计划、磁盘延迟和锁等待分析。
MongoDB Database Tools 中包含 mongostat、mongotop、mongodump、mongorestore、mongoexport 和 mongoimport 等工具,并采用独立于 MongoDB Server 的版本号。
1db.getSiblingDB("admin").getUsers({2 showCredentials: false3})只能看到当前数据库中定义的用户。MongoDB 用户属于具体的认证数据库,而不是全局独立存在。
1db.getSiblingDB("admin").getRoles({2 rolesInfo: 1,3 showBuiltinRoles: true,4 showPrivileges: true5})可以检查内置角色、自定义角色及其继承关系和具体权限。
1db.getSiblingDB("appdb").createUser({2 user: "app_rw",3 pwd: passwordPrompt(),4 roles: [5 {6 role: "readWrite",7 db: "appdb"8 }9 ]10})该用户的认证数据库是 appdb,应用连接串中应相应设置:
1authSource=appdb1db.getSiblingDB("admin").createUser({2 user: "monitor",3 pwd: passwordPrompt(),4 roles: [5 {6 role: "clusterMonitor",7 db: "admin"8 },9 {10 role: "read",11 db: "local"12 }13 ]14})监控系统通常需要读取实例状态和复制集相关信息,但不应直接授予 root 权限。
1db.getSiblingDB("admin").changeUserPassword(2 "monitor",3 passwordPrompt()4)修改密码后,应同步更新监控平台、应用配置或密码管理系统中的凭据。
1db.getSiblingDB("appdb").grantRolesToUser(2 "app_rw",3 [4 {5 role: "read",6 db: "reportdb"7 }8 ]9)执行后,app_rw 除了可以读写 appdb,还可以读取 reportdb。
1db.getSiblingDB("appdb").revokeRolesFromUser(2 "app_rw",3 [4 {5 role: "read",6 db: "reportdb"7 }8 ]9)权限回收后,应重新建立连接进行验证,避免旧连接或应用连接池影响测试结果。
1db.getSiblingDB("appdb").dropUser(2 "app_rw"3)删除前应确认用户是否仍被应用、监控程序、备份程序或自动化脚本使用。
MongoDB 复制集由多个维护同一份数据集的 mongod 成员组成,用于提供数据冗余和高可用能力。rs.status() 返回复制集状态,rs.conf() 返回复制集配置,修改配置时通常需要先读取配置、修改配置文档,再执行 rs.reconfig()。
1rs.status()重点关注:
1set2myState3term4members.name5members.stateStr6members.health7members.uptime8members.optimeDate9members.lastHeartbeatMessage常见成员状态包括:
1PRIMARY2SECONDARY3STARTUP24RECOVERING5ROLLBACK6UNKNOWN7DOWN1rs.conf()重点检查:
1_id2version3term4members.host5members.priority6members.votes7members.hidden8members.arbiterOnly9settings1rs.initiate({2 _id: "rs0",3 members: [4 {5 _id: 0,6 host: "mongo1:27017"7 },8 {9 _id: 1,10 host: "mongo2:27017"11 },12 {13 _id: 2,14 host: "mongo3:27017"15 }16 ]17})复制集名称必须与各节点配置文件中的 replication.replSetName 一致。
1rs.add({2 host: "mongo4:27017",3 priority: 0,4 votes: 05})新成员加入后通常需要执行 Initial Sync。大数据量环境中,应提前评估网络带宽、源节点压力和 Oplog 窗口。
1rs.remove(2 "mongo4:27017"3)删除成员前应先确认该节点不是 Primary,并确保剩余投票节点仍能形成多数派。
1cfg = rs.conf()23member = cfg.members.find(4 m => m.host === "mongo3:27017"5)67member.priority = 08member.hidden = true910rs.reconfig(cfg)该示例将 mongo3 设置为隐藏节点,并禁止其成为 Primary。
修改复制集配置可能触发重新选举。强制参数 force: true 只应在多数派不可用等特殊恢复场景中使用。
1rs.stepDown(60)表示当前 Primary 在 60 秒内不参与重新成为 Primary。
执行后当前连接通常会断开,应用端应具备自动重连和 Primary 重新发现能力。
1rs.freeze(300)表示当前 Secondary 在 300 秒内不参与 Primary 选举。
取消冻结可以执行:
1rs.freeze(0)1rs.printSecondaryReplicationInfo()输出各 Secondary 的同步时间和延迟信息。
该结果适合快速查看,但自动化监控应优先读取结构化的 rs.status() 返回值。
1db.getSiblingDB("local").getReplicationInfo()重点关注:
1logSizeMB2usedMB3timeDiff4timeDiffHours5tFirst6tLasttimeDiffHours 表示当前 Oplog 大致能够覆盖的时间窗口。
如果 Secondary 中断时间超过 Oplog 窗口,就可能无法通过增量复制追上 Primary,只能重新执行 Initial Sync。
sh.status() 用于查看分片集群配置和数据分布,分片相关操作通常应连接到 mongos 执行。不同 MongoDB 版本对自动 Chunk 拆分、Balancer 和分片命令的行为可能存在变化。
1sh.status()需要更详细输出时可以执行:
1sh.status(true)重点检查:
1shards2databases3collections4shard key5balancer6chunks7orphaned documents1sh.addShard(2 "shard01/mongo-sh1a:27018,mongo-sh1b:27018,mongo-sh1c:27018"3)生产环境中的数据分片通常应使用复制集,而不是单节点 mongod。
1sh.enableSharding(2 "appdb"3)该操作只是允许数据库中的集合进行分片,并不会自动把已有集合转换成分片集合。
1sh.shardCollection(2 "appdb.orders",3 {4 tenantId: 1,5 createdAt: 16 }7)分片键一旦选错,后续可能导致热点写入、数据倾斜、Scatter-Gather 查询和迁移压力。
执行前应分析:
1基数2单调性3查询命中方式4写入分布5Chunk 分布6租户数据规模7是否需要范围查询1sh.getBalancerState()返回 true 表示 Balancer 处于启用状态,但并不等于当前一定正在执行 Chunk 迁移。
1sh.balancerCollectionStatus(2 "appdb.orders"3)可以判断集合是否已经均衡,以及是否仍存在需要迁移的数据范围。
1sh.startBalancer()Balancer 会根据集群中的数据分布执行 Chunk 迁移。大规模迁移可能增加网络、磁盘和复制压力。
1sh.stopBalancer()停止 Balancer 不一定会立即中断已经进入执行阶段的迁移任务,应继续观察活动操作和分片状态。
1sh.moveChunk(2 "appdb.orders",3 {4 tenantId: 1001,5 createdAt: ISODate("2026-01-01T00:00:00Z")6 },7 "shard02"8)第二个参数用于定位包含指定分片键值的 Chunk,第三个参数是目标分片。
手动迁移可能与 Balancer、业务写入和其他迁移任务相互影响,应在明确数据分布和迁移目的后执行。
MongoDB Database Tools 需要从操作系统命令行运行,而不是在 mongosh 中运行。mongodump 用于生成 BSON 二进制备份,mongorestore 用于恢复对应备份;mongoexport 和 mongoimport 主要用于 JSON、CSV 或 TSV 数据交换,不能替代完整数据库备份。
MongoDB Database Tools 与 MongoDB Server 独立发布,建议使用受支持且与目标环境兼容的版本。官方文档同时要求,使用 mongorestore 恢复 BSON 备份时,应关注源端和目标端的 MongoDB 主版本及 Feature Compatibility Version。
1mongodump \2 --uri="$MONGODB_URI" \3 --archive="/backup/mongo_$(date +%F).archive" \4 --gzip \5 --oplog参数说明:
1--archive:生成单个归档文件2--gzip:压缩备份3--oplog:记录备份期间产生的 Oplog--oplog 主要用于复制集一致性备份。分片集群的一致性备份不能简单等同于对 mongos 执行一条 mongodump --oplog。
1mongorestore \2 --uri="$TARGET_MONGODB_URI" \3 --archive="/backup/mongo_2026-07-21.archive" \4 --gzip \5 --oplogReplay--oplogReplay 会重放备份期间记录的 Oplog,使数据恢复到更一致的时间点。
恢复前应先在隔离环境验证备份文件、恢复耗时、对象数量、索引创建结果和数据完整性。
1mongodump \2 --uri="$MONGODB_URI" \3 --archive="/backup/appdb_orders.archive" \4 --gzip \5 --nsInclude="appdb.orders"--nsInclude 用于指定需要备份的命名空间,格式为:
1数据库名.集合名1mongorestore \2 --uri="$TARGET_MONGODB_URI" \3 --archive="/backup/appdb_orders.archive" \4 --gzip \5 --nsInclude="appdb.orders" \6 --nsFrom="appdb.orders" \7 --nsTo="restoredb.orders_20260721"该命令把:
1appdb.orders恢复为:
1restoredb.orders_20260721适合恢复验证、历史数据查询和单集合故障修复。
1mongoexport \2 --uri="$MONGODB_URI" \3 --db="appdb" \4 --collection="orders" \5 --query='{"status":"PAID"}' \6 --out="/backup/orders_paid.json"mongoexport 适合数据交换和临时导出,但不会完整保存集合选项、索引、用户权限和全部 BSON 类型语义,因此不能作为完整备份方案。
1mongoimport \2 --uri="$TARGET_MONGODB_URI" \3 --db="appdb" \4 --collection="orders" \5 --file="/backup/orders_paid.json" \6 --mode="upsert" \7 --upsertFields="_id"--mode=upsert 表示:
_id 已经存在时更新对应文档;_id 不存在时插入新文档。执行前应确认导出文件格式、字符编码、字段类型和 Upsert 匹配字段,避免把原本的 BSON Date、Decimal128、ObjectId 等类型错误地导入为普通字符串。
真正的 MongoDB 日常巡检,并不是把这 100 条命令全部执行一遍,而是根据架构和问题场景建立固定的检查路径。
对于普通复制集,可以优先检查:
11. db.hello()22. db.serverStatus().connections33. db.serverStatus().wiredTiger.cache44. db.currentOp({active:true})55. rs.status()66. rs.printSecondaryReplicationInfo()77. local 库的 Oplog 时间窗口88. mongostat99. mongotop1010. 数据库和集合空间增长如果业务反馈查询变慢,排查顺序通常应是:
1当前活动操作2慢操作记录3查询执行计划4扫描文档数量5索引使用情况6WiredTiger Cache7磁盘延迟8连接数与并发9复制延迟10分片数据分布不要一看到 CPU 升高就直接认定是机器配置不足,也不要看到集合很大就立即创建大量索引。MongoDB 的性能问题往往是查询模型、索引结构、文档模型、工作集大小、复制延迟和存储性能共同作用的结果。
同样,备份完成也不代表备份一定可用。MongoDB DBA 至少应定期验证:
1备份文件能否读取2是否包含预期数据库和集合3恢复后文档数量是否一致4索引是否完整5用户和权限是否符合预期6恢复耗时是否满足业务要求7恢复后的应用连接是否正常数据库运维的价值,不在于记住多少命令,而在于知道什么时候执行、执行前检查什么、执行后验证什么,以及一旦出现异常应该如何回退。
更多 Oracle、MySQL、PostgreSQL、MongoDB 实战内容,可以访问 DBA 学习平台:ora100.com