mysql中root@%与root@localhost是两个独立账号,权限互不继承;建库报access denied本质是root@%无对应库授权,需显式grant并flush privileges。

必须在 admin 数据库中创建,且 roles 字段必须显式指定 { role: "root", db: "admin" } —— 任何省略 db: "admin" 或在其他数据库(如 test)下执行的操作,都会导致权限失效。
为什么一定要先关闭 auth 再创建 root 用户
MongoDB 启用 authorization: enabled 后,未认证连接仍可进入 shell,但所有操作(包括 use admin、db.createUser)都会被拒绝,报错 not authorized on admin to execute command { createUser: ... }。所以必须在配置开启前完成创建。
实操建议:
- 确认
/etc/mongod.conf(或对应配置文件)中security.authorization当前为disabled或注释状态 - 重启 mongod 服务确保无认证运行:
sudo systemctl restart mongod - 连接后立即执行:
use admin→db.createUser({ user: "root", pwd: "your_strong_password", roles: [{ role: "root", db: "admin" }] })
db.createUser 中 roles 的写法差异直接影响权限范围
常见错误是写成 roles: ["root"] 或 roles: ["root", "dbAdminAnyDatabase"] —— 这在 MongoDB 4.0+ 会静默失败或降权,因为 root 是「受限内置角色」,只在 admin 库上下文中有效,不支持字符串简写。
正确写法只有一种:
db.createUser({
user: "root",
pwd: "a1B2#c3D",
roles: [{ role: "root", db: "admin" }]
})
注意:
-
db: "admin"不可省略,也不能写成db: "any"或留空 - 不要叠加其他角色(如
userAdminAnyDatabase),root已包含全部权限 - 密码必须满足强度要求(MongoDB 4.0+ 默认要求至少 8 位,含大小写字母、数字、符号)
启用 auth 后,root 用户登录必须指定 --authenticationDatabase admin
即使用户名是 root,MongoDB 也不会自动推断认证库。直接运行 mongosh -u root -p 会提示 Authentication failed。
正确命令格式:
mongosh -u root -p --authenticationDatabase admin
或者连接后手动认证:
use admin
db.auth("root", "your_strong_password")
关键点:
-
--authenticationDatabase必须是admin,不是用户数据所在的业务库 - 如果用连接字符串,需在 query 参数中加
authSource=admin - 驱动连接时(如 Node.js 的
mongodb://URL),同样要显式设置authSource=admin
最容易被忽略的是:root 用户创建成功后,若未重启服务并启用 authorization: enabled,所有后续用户(比如给 orders 库建的 app_user)都无法生效 —— 权限系统根本没启动。别只改配置不重启,也别重启后忘了验证 db.runCommand({ connectionStatus: 1 }) 返回里 authEnabled: true。











