必须用mongodump导出admin.system.users集合,因mongoexport不支持系统集合;需backup角色权限、显式指定--db admin --collection system.users,并注意credentials字段脱敏与停机还原。

导出 admin.system.users 集合必须用 mongodump,不能用 mongoexport
因为 system.users 是系统集合,存储的是带角色、密码哈希、认证机制等元数据的 BSON 文档,mongoexport 只支持导出普通集合的 JSON/CSV,且会跳过系统集合(即使加 --forceTableScan 也无效)。只有 mongodump 能完整读取并序列化这类内部结构。
实操要点:
- 必须连接到
admin数据库,且账号需有backup角色或clusterAdmin权限(仅readAnyDatabase不够) - 命令中显式指定
--db admin --collection system.users,否则默认不备份系统集合 - 加
--gzip和--archive可避免生成临时文件夹,适合脚本化备份
示例命令:
mongodump --host localhost:27017 --username backupUser --password "xxx" --authenticationDatabase admin --db admin --collection system.users --gzip --archive=users_backup.archive
权限不足时常见报错及对应解决方式
执行 mongodump 时最常遇到两类错误:
-
not authorized on admin to execute command { listCollections: 1, ... }→ 当前用户缺少listDatabases或find权限。需在admin库中赋予backup角色:db.grantRolesToUser("backupUser", [{role:"backup", db:"admin"}]) -
Failed: error writing data for collection `admin.system.users`: not authorized on admin to execute command { find: "system.users", ... }→ 用户虽有backup角色,但未在admin库作用域下授权。确认角色是绑定在admin数据库上,而不是其他库
导出内容包含敏感字段,注意脱敏与存储控制
system.users 中的 credentials 字段含 SCRAM-SHA-256 密码哈希(如 "SCRAM-SHA-256": { "iterationCount": 15000, "salt": "...", "storedKey": "..." }),虽然不是明文密码,但属于高敏感数据。
- 导出文件严禁上传至 Git、共享网盘或非加密邮件
- 若用于测试环境还原,建议用
mongorestore --drop前先手动编辑 archive 文件,删掉credentials字段(用mongodump --archive | jq流式处理更安全) - 生产环境备份建议配合 OS 级加密(如
gpg)或 KMS 托管密钥
还原时不能直接 mongorestore 到运行中的副本集
system.users 是集群级元数据,直接还原会破坏一致性,尤其在分片或带仲裁节点的副本集中。
- 必须停机还原:关闭所有 mongod 实例,清空
data/db后再用mongorestore --archive=users_backup.archive --db admin - 更安全的做法是只还原用户定义部分:用
mongodump --archive=users_backup.archive --collection system.users --out - | jq 'del(.credentials)' | mongorestore --db admin --collection system.users --drop(需提前安装jq) - 如果只是想同步权限配置,优先用
db.createUser()/db.updateUser()脚本,而非整表还原
真正麻烦的从来不是导出动作本身,而是搞清哪个角色能读这个集合、导出后怎么安全流转、以及还原时要不要连同密码哈希一起写回去——这三个环节漏掉任一,备份就等于埋雷。


















