MongoDB作为一款基于文档的NoSQL数据库,在日常运维中涉及大量常用命令。掌握这些命令可以帮助运维人员高效完成数据库状态查看、集合与文档维护、索引优化、权限分配、性能排查以及数据备份恢复等任务。本文按照运维工作的实际场景,将这些命令分类整理并给出可直接执行的示例。

基础数据库操作命令
基础操作命令是MongoDB运维的起点,主要用于识别实例中已存在的数据库、在各数据库之间切换,以及查看集合列表。通过 show dbs 命令,运维人员可以快速获取所有数据库的名称与占用存储空间,从而判断哪些库体积增长过快,是否需要进行数据清理或容量规划。
use 命令的作用比较特殊,它既负责切换到指定数据库,也会在目标数据库不存在时创建该数据库。不过,这种创建只有在真正写入数据后才会持久化,单独执行 use 命令不会产生实际的存储文件。show collections 则需要在进入某个数据库之后执行,用于列出当前库下的全部集合,是确认数据结构是否完整、集合是否意外增多的重要手段。
这些命令虽然简单,但在日常巡检、故障定位以及新环境初始化时都会频繁使用,建议运维人员熟练掌握并理解其背后的行为。
# 查看所有数据库 show dbs # 切换到test数据库,不存在则创建 use test # 查看test数据库下的所有集合 show collections
集合与文档操作命令
集合是MongoDB中存储文档的容器,文档则是实际的数据记录。运维工作经常会涉及临时创建集合、删除无效集合,以及对文档进行增删改查等操作。创建集合时可以使用 createCollection 方法指定集合名称和可选配置,例如最大文档数、大小限制等;删除集合则使用 drop 方法,删除后集合中的数据与索引都会一并清除。
文档操作的常用方法包括 insertOne、find、updateOne 和 deleteMany。insertOne 用于插入单条文档;find 配合比较操作符可以按条件查询,例如 $gt 表示大于;updateOne 通常配合 $set 修改指定字段,避免覆盖整个文档;deleteMany 则用于按条件批量删除。执行更新或删除前,建议先使用相同条件进行查询,确认影响范围后再继续操作。
在数据修复、测试数据清理和业务异常处理场景中,这些命令能够帮助运维人员快速定位并处理问题,但也必须注意操作的严谨性,避免误删或误改生产数据。
# 创建名为user的集合,设置最大文档数为1000
db.createCollection("user", {max: 1000})
# 删除user集合
db.user.drop()
# 向user集合插入一条文档
db.user.insertOne({name: "张三", age: 25, city: "北京"})
# 查询user集合中所有年龄大于20的文档
db.user.find({age: {$gt: 20}})
# 更新user集合中name为张三的文档,将年龄改为26
db.user.updateOne({name: "张三"}, {$set: {age: 26}})
# 删除user集合中city为北京的文档
db.user.deleteMany({city: "北京"})
索引管理命令
索引是提升MongoDB查询效率的核心手段。当集合数据量增大时,没有索引的查询会扫描整个集合,导致响应时间变长。运维人员需要根据实际查询字段创建合适的索引,并定期检查已有索引是否仍然有效。
创建索引使用 createIndex 方法,字段值为 1 表示升序索引,-1 表示降序索引。getIndexes 可以列出集合所有的索引信息,包括系统自动创建的 _id 索引。dropIndex 用于删除指定名称的索引,删除后相关查询可能会变慢,因此在删除前需要确认该索引确实不再需要。
索引不是越多越好,每个索引都会占用存储空间并增加写入时的维护成本。运维中应重点关注重复索引、长期未被使用的索引以及低选择性字段上的索引,及时清理可以平衡读写性能。
# 给user集合的name字段创建升序索引
db.user.createIndex({name: 1})
# 查看user集合的所有索引
db.user.getIndexes()
# 删除名为name_1的索引
db.user.dropIndex("name_1")
用户与权限管理命令
MongoDB通过基于角色的权限控制来保障数据安全。用户通常需要在 admin 数据库中创建,以便获得全局管理权限;针对业务库,则应创建权限范围更小的用户,遵循最小权限原则。这样即使业务账号泄露,也不会影响其他数据库。
createUser 方法用于创建用户,其中 user 指定用户名,pwd 指定密码,roles 数组定义用户拥有的角色。角色由 role 和 db 两个部分组成,例如 root 角色拥有所有数据库的管理权限,而 read 角色只能读取指定数据库的数据。不同角色可以组合使用,以满足不同业务场景的需要。
在日常运维中,应避免所有业务系统都使用 root 或管理员账号连接数据库。为每个业务库单独创建读写用户或只读用户,能够在发生误操作时缩小影响范围,也便于后续的责任追溯和操作审计。updateUser 可以修改现有用户的密码或角色,例如定期轮换密码或调整权限范围。dropUser 用于删除不再需要的用户,当某个业务系统下线或不再使用 MongoDB 时,对应的数据库账号应及时清理。以下是一些常用的用户管理操作示例:
# 在admin库创建管理员用户
use admin
db.createUser({
user: "root_admin",
pwd: "SecurePass123",
roles: [ { role: "root", db: "admin" } ]
})
# 为业务库app_database创建读写用户
use app_database
db.createUser({
user: "app_user",
pwd: "AppUser2024",
roles: [ { role: "readWrite", db: "app_database" } ]
})
# 为业务库app_database创建只读用户
db.createUser({
user: "report_user",
pwd: "ReportUser2024",
roles: [ { role: "read", db: "app_database" } ]
})
# 修改用户密码
db.updateUser("app_user", { pwd: "NewAppUser2025" })
# 删除用户
db.dropUser("report_user")
在实际操作中,用户的创建和授权需要与业务部署流程相结合。例如在应用发布时同步创建数据库账号,在业务下线时同步回收权限。对于多人协作的运维环境,还应当为每个运维人员创建独立的个人账号,而不是共用同一个管理员账号,这样所有操作都能通过 MongoDB 的审计日志追踪到具体执行者。
## 数据备份与恢复命令
数据备份是数据库运维中不可忽视的环节。MongoDB 提供了多种备份方式,其中最常用的是 mongodump 和 mongorestore。mongodump 可以将指定数据库或集合的数据导出为 BSON 格式的备份文件,mongorestore 则用于将这些备份文件恢复到目标数据库中。这两个命令通常在服务器命令行执行,而不是在 mongo shell 内部执行。
# 备份整个数据库到当前目录下的dump文件夹 mongodump --db app_database --out /backup/mongodb/20250101 # 备份指定集合 mongodump --db app_database --collection user --out /backup/mongodb/20250101 # 恢复整个数据库 mongorestore --db app_database /backup/mongodb/20250101/app_database # 恢复指定集合 mongorestore --db app_database --collection user /backup/mongodb/20250101/app_database/user.bson对于大型生产环境,建议使用文件系统快照或 MongoDB 的副本集隐藏节点进行备份,以减少备份操作对主库性能的影响。备份文件需要定期验证可恢复性,不能等到真正需要恢复时才发现备份文件损坏或不完整。同时备份文件应当异地存储,防止单机房故障导致所有数据丢失。 ## 数据导出与导入命令 与 mongodump 类似,mongoexport 和 mongoimport 用于处理 JSON 或 CSV 格式的数据。它们更侧重于数据迁移、数据交换以及与其他系统的集成。mongoexport 可以将集合中的数据导出为人类可读的 JSON 或 CSV 文件,方便数据分析、导入到其他数据库或满足审计需求。mongoimport 则可以将 JSON 或 CSV 文件中的数据导入到 MongoDB 集合中。
# 导出user集合为JSON文件 mongoexport --db app_database --collection user --out /export/user.json # 导出user集合为CSV文件,只包含指定字段 mongoexport --db app_database --collection user --type=csv --fields name,age,email --out /export/user.csv # 导入JSON文件到user集合 mongoimport --db app_database --collection user --file /import/user.json # 导入CSV文件到user集合 mongoimport --db app_database --collection user --type=csv --headerline --file /import/user.csv需要注意的是,mongoimport 在导入 JSON 文件时,默认情况下会替换掉已存在的同名集合,如果需要保留已有数据可以使用 --drop 选项控制行为。对于 CSV 导入,--headerline 参数表示使用文件第一行作为字段名,如果 CSV 文件没有表头,则需要通过 --fields 参数指定字段名。 ## 性能监控与诊断命令 MongoDB 提供了多种用于监控数据库运行状态的命令,帮助运维人员及时发现性能瓶颈。其中最常用的是 serverStatus 命令,它可以返回服务器当前的连接数、内存使用情况、锁状态、操作计数器等信息。通过定期采集 serverStatus 的输出并进行分析,可以了解数据库的整体运行趋势。
# 查看服务器运行状态 db.serverStatus() # 查看当前正在执行的操作 db.currentOp() # 终止指定操作 db.killOp(opid)db.currentOp 用于查看当前正在执行的数据库操作,包括查询、写入、索引构建等。当数据库响应变慢时,可以通过该命令找到执行时间过长的操作,分析其查询条件是否合理,是否缺少索引,或者是否涉及大量数据扫描。对于确认有问题的操作,可以使用 killOp 终止该操作,防止其长时间占用资源导致其他请求排队。 对于慢查询的分析,则通过系统日志或 profile 数据完成。可以在启动 MongoDB 时设置 --profile 参数,或者通过 db.setProfilingLevel 命令动态开启慢查询记录。开启后,MongoDB 会将超过指定阈值的操作记录到 system.profile 集合中,运维人员可以定期分析这些慢查询,优化索引和查询语句。
# 开启慢查询记录,记录超过100毫秒的操作
db.setProfilingLevel(1, { slowms: 100 })
# 查看最近10条慢查询记录
db.system.profile.find().sort({ ts: -1 }).limit(10)
# 关闭慢查询记录
db.setProfilingLevel(0)
## 副本集与分片集群相关命令
对于高可用和数据量较大的生产环境,MongoDB 通常采用副本集或分片集群部署。副本集提供数据冗余和故障自动切换能力,分片集群则通过将数据分散到多个节点来提升写入和存储能力。运维人员需要熟悉这些集群模式下的状态检查和节点管理命令。
# 查看副本集状态
rs.status()
# 查看副本集配置
rs.conf()
# 手动触发主节点切换
rs.stepDown()
# 添加新成员到副本集
rs.add("mongodb1.ippipp.com:27017")
# 移除副本集成员
rs.remove("mongodb2.ippipp.com:27017")
rs.status 返回副本集各节点的健康状态、同步延迟和选举信息。当主节点发生故障时,副本集会自动进行选举,选择一个从节点提升为新的主节点。rs.stepDown 可以让当前主节点主动降级,常用于计划内的维护操作,比如需要重启主节点时,先降级再重启可以避免写入中断。对于分片集群,则需要在 mongos 上执行 sh.status 查看分片分布和均衡状态。
# 在mongos上查看分片集群状态 sh.status() # 启用分片均衡器 sh.startBalancer() # 停止分片均衡器 sh.stopBalancer()在日常运维中,均衡器的运行状态需要密切关注。当集群正在进行大规模数据迁移时,均衡器会消耗额外的网络和磁盘资源,可能影响正常业务的响应时间。对于有周期性业务高峰的环境,可以在高峰期间手动停止均衡器,在低峰期间再开启,以优先保障业务性能。 ## 日志管理命令 MongoDB 的日志记录了数据库启动、关闭、连接、操作异常和错误信息,是排查问题的重要依据。MongoDB 的日志可以输出到文件或系统日志中,通过启动参数 --logpath 指定日志文件路径,--logappend 控制是否追加写入。运维人员应当合理配置日志轮转,避免日志文件过大占用磁盘空间。
# 查看日志相关配置 db.getLogComponents() # 设置查询日志级别 db.setLogLevel(1, "query")db.getLogComponents 可以查看当前各个模块的日志级别,包括写入、查询、索引、复制、分片等。通过调整日志级别,可以在排查问题时获取更详细的日志信息,问题解决后再恢复默认级别,避免长期输出过多日志影响性能并占用大量磁盘空间。系统级日志文件则通过操作系统工具进行轮转和管理,例如使用 logrotate 定期切割 MongoDB 日志文件。 ## 数据库统计与容量规划命令 了解数据库的存储占用和数据增长趋势对于容量规划至关重要。dbStats 命令可以返回数据库的存储大小、索引大小、集合数量和对象数量等信息。collStats 则针对单个集合给出更详细的统计,包括文档数量、平均文档大小、索引大小和存储碎片情况。
# 查看数据库统计信息 db.stats() # 查看user集合的统计信息 db.user.stats()通过定期采集这些统计数据,运维人员可以分析数据的增长趋势,提前规划磁盘扩容或数据归档策略。当集合的存储碎片较多时,数据存储效率会降低,查询性能也会受到影响。此时可以使用 compact 命令对集合进行压缩整理,释放未使用的磁盘空间。需要注意的是,compact 命令会阻塞数据库操作,应选择业务低峰期执行,或者在副本集的从节点上执行后再切换。
# 压缩整理user集合
db.runCommand({ compact: "user" })
## 总结
MongoDB 的日常运维涉及索引管理、权限控制、备份恢复、数据导入导出、性能监控、集群维护、日志分析和容量规划等多个方面。本文介绍的命令覆盖了这些核心运维场景,可以帮助运维人员建立基础的 MongoDB 操作能力。在实际工作中,建议将常用命令整理成运维手册或自动化脚本,结合监控告警系统实现主动运维。同时,对生产环境的任何变更操作都应先在测试环境验证,确认无误后再在生产环境执行。数据安全和系统稳定始终是运维工作的首要目标,任何命令的执行都应秉持谨慎态度,确保每一步操作都有明确的回退方案。