MySQL 用户管理围绕 “账号 - 角色 - 权限” 三层架构展开,通过身份认证确认用户合法性,通过精细化权限分配控制资源访问,支持插件化认证、密码生命周期管理等企业级特性,保障数据库安全与合规。
- 创建并管理用户账号与角色,实现权限的批量分配与回收
- 设计合理的权限结构,遵循 “最小权限原则” 分配访问权限
- 配置身份认证方式,支持本地 / 远程连接及企业级认证(如 PAM、LDAP)
- 管控账号安全,包括密码设置、过期策略、双重密码等
- 监控与调整用户权限,适配业务场景变化
MySQL 权限系统基础
核心作用
- 控制用户对数据库的操作范围,避免越权访问
- 区分管理员与普通用户权限,降低误操作风险
- 保障数据完整性,防止未授权的数据修改或泄露
- 支持多场景访问控制,适配本地 / 远程、应用 / 人工等不同连接需求
身份认证与授权流程
- 身份认证(连接阶段):验证用户 “用户名 + 主机 + 密码 / 认证信息” 的合法性,认证失败直接拒绝连接
- 授权校验(查询阶段):对已认证用户的每个操作,校验是否具备对应权限,无权限则拒绝执行
用户账号与角色管理
账号命名规则
- 完整格式:
'username'@'hostname',用户名和主机名共同唯一标识一个账号 - 用户名限制:最长 32 字符,含特殊字符(如短横线)需用单引号包裹
- 主机名格式(支持多种匹配方式):
- 具体主机名:
server1、server2.example.com - IP 地址:
192.168.9.78 - IP 网段:
10.0.0.0/255.255.255.0 - 通配符:
%(匹配任意多个字符)、_(匹配单个字符),例:'%.example.com'(匹配该域名下所有主机)、'192.168._.7' - 默认值:创建账号时未指定主机名,默认为
%(允许从任意主机连接)
- 具体主机名:
账号创建与修改
创建账号
-
基础语法:
CREATE USER 'username'@'hostname' IDENTIFIED BY 'password'; -
示例:创建本地连接的 web 用户,密码为 Abc123
1CREATE USER webuser@localhost IDENTIFIED BY 'Abc123'; -
安全注意事项:
- 禁止创建无密码账号
- 避免匿名账号(如
''@localhost,无用户名) - 主机名尽量不使用通配符
%,限制连接来源
账号重命名
- 语法:
RENAME USER 'old_user'@'old_host' TO 'new_user'@'new_host'; - 示例:
RENAME USER consultant@laptop3 TO james@laptop3;
账号删除
- 语法:
DROP USER 'username'@'hostname'; - 作用:删除账号及其所有权限,同时从所有授权表中移除该账号记录
- 示例:
DROP USER james@laptop3;
角色管理(权限集合)
角色的核心特性
- 本质:一组权限的集合,可批量授予用户或其他角色
- 存储:与用户账号一样存储在
mysql.user表中,但不能用于登录 - 命名格式:同用户账号(
'rolename'@'hostname'),省略主机名默认为%
角色创建与删除
-
创建角色:
1CREATE ROLE 'rolename'@'hostname' [, ...];-
示例:创建管理员角色和开发角色
1CREATE ROLE r_admin, r_dev@localhost;
-
-
删除角色:
1DROP ROLE 'rolename'@'hostname' [, ...];- 作用:删除角色的同时,回收所有被授予该角色的用户 / 角色的相关权限
密码与账号安全管理
密码设置与修改
设置密码(创建 / 修改时)
- 创建账号时指定密码:
CREATE USER 'user'@'host' IDENTIFIED BY 'newpassword'; - 修改已有账号密码:
- 语法 1:
ALTER USER 'user'@'host' IDENTIFIED BY 'newpassword'; - 语法 2:
SET PASSWORD FOR 'user'@'host' = 'newpassword';
- 语法 1:
- 修改当前登录用户密码:
ALTER USER USER() IDENTIFIED BY 'newpassword';SET PASSWORD = 'newpassword';- 命令行方式:
mysqladmin -u username -p password 'newpassword'(执行时需输入旧密码)
双重密码支持(MySQL 8.0.14+)
-
作用:密码变更时保留旧密码(次要密码),避免多系统 / 应用同步更新时出现中断
-
设置方法:
1ALTER USER USER() IDENTIFIED BY 'new_password' RETAIN CURRENT PASSWORD;- 新密码成为主密码,原密码变为次要密码
-
移除次要密码:
ALTER USER USER() DISCARD OLD PASSWORD;
密码过期管理
手动设置密码过期
- 创建账号时直接过期:
CREATE USER 'erika'@'localhost' IDENTIFIED BY 'first#Pass' PASSWORD EXPIRE; - 手动过期已有账号:
ALTER USER 'erika'@'localhost' PASSWORD EXPIRE; - 效果:用户可登录,但必须先修改密码才能执行其他操作
自动过期配置
-
全局默认策略:通过
default_password_lifetime变量设置(默认 0,永不过期) -
账号级配置(优先级高于全局):
-
设置 30 天过期:
CREATE USER 'consultant'@'laptop3' IDENTIFIED BY 'change_me' PASSWORD EXPIRE INTERVAL 30 DAY; -
沿用全局默认:
ALTER USER 'consultant'@'laptop3' PASSWORD EXPIRE DEFAULT; -
禁用自动过期:
ALTER USER 'consultant'@'laptop3' PASSWORD EXPIRE NEVER;
-
身份认证插件
核心认证插件(默认支持)
| 插件名称 | 特性 | 适用场景 |
|---|---|---|
| caching_sha2_password | MySQL 8.0 默认,SHA-256 加密,服务器端缓存 | 绝大多数生产环境 |
| mysql_native_password | 传统哈希方式,兼容性好 | 旧版本客户端连接 |
| sha256_password | SHA-256 加密,无缓存 | 兼容旧版企业级场景(已废弃) |
特殊认证插件
明文客户端认证插件(mysql_clear_password)
- 作用:客户端直接发送明文密码到服务器(需配合加密连接)
- 启用方式:
- 环境变量:
LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1 - 命令行参数:
mysql --enable-cleartext-plugin -u user -p - C API 函数:
mysql_options()指定MYSQL_ENABLE_CLEARTEXT_PLUGIN
- 环境变量:
可加载认证插件
- auth_socket:仅允许与系统用户名相同的 MySQL 用户通过 Unix socket 连接(无需密码)
- mysql_no_login:禁止任何客户端连接使用该插件的账号(适用于仅执行存储程序的账号)
- test_plugin_server:用于测试和开发,支持原生和旧密码认证
企业级认证插件(仅企业版)
- PAM 认证(authentication_pam):对接系统 PAM 服务(如 Linux 密码、LDAP),支持 Linux/macOS
- Windows 认证(authentication_windows):使用 Windows 原生服务认证客户端
- LDAP 认证(authentication_ldap_sasl/simple):通过 LDAP 目录服务获取用户信息并认证
PAM 认证配置示例
-
创建 PAM 服务配置文件
/etc/pam.d/mysql-pam,内容:1 2auth include password-auth account include password-auth -
创建 PAM 认证的 MySQL 用户:
1CREATE USER bob@localhost IDENTIFIED WITH authentication_pam AS 'mysql-pam'; -
创建 PAM 代理用户(映射系统组到 MySQL 用户):
1CREATE USER ''@'' IDENTIFIED WITH authentication_pam AS 'mysql-pam,www=webuser,root=root'; -
授权代理权限:
1GRANT PROXY ON webuser@localhost TO ''@''; -
登录方式:
mysql --enable-cleartext-plugin -u bob -p(输入系统密码)
权限分配与回收
权限范围(从大到小)
- 全局权限:作用于所有数据库,语法
ON *.*(例:GRANT SELECT ON *.* TO user@host;) - 数据库权限:作用于指定数据库,语法
ON db_name.* - 表权限:作用于指定表,语法
ON db_name.table_name - 列权限:作用于表中指定列,需在权限后指定列名
- 存储例程权限:作用于存储过程 / 函数,语法
ON db_name.routine_name
常用权限类型
- 数据操作:
SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除) - 结构操作:
CREATE(创建)、ALTER(修改)、DROP(删除)、CREATE VIEW(创建视图) - 管理权限:
SHUTDOWN(关闭服务器)、PROCESS(查看进程)、RELOAD(刷新权限 / 日志)、SUPER(超级权限) - 特殊权限:
ALL PRIVILEGES(所有权限,不含授权他人权限)、USAGE(仅连接权限,默认新账号权限)、GRANT OPTION(授权他人权限的权限)
权限操作语法
授予权限
-
基础语法:
GRANT 权限1,权限2 ON 范围 TO '用户/角色'@'主机' [WITH GRANT OPTION]; -
列级授权示例:授予查询
mysql.user表的user和host列权限1GRANT SELECT (user, host) ON mysql.user TO kari@localhost; -
授予角色示例:将
r_viewer角色授予用户GRANT r_viewer TO kari@localhost WITH ADMIN OPTION;(
WITH ADMIN OPTION允许用户将该角色授予他人)
回收权限
- 基础语法:
REVOKE 权限1,权限2 ON 范围 FROM '用户/角色'@'主机'; - 回收角色示例:
REVOKE r_updater FROM kari@localhost; - 回收所有权限:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'sasha'@'host';
部分回收(MySQL 8.0.16+)
-
作用:全局授予某权限后,排除特定数据库的权限
-
启用条件:
SET GLOBAL partial_revokes = ON;(默认关闭) -
示例:授予全局查询权限,但禁止查询
mysql库1 2 3CREATE USER u1 IDENTIFIED BY 'Pssw0rd'; GRANT SELECT ON *.* TO u1; REVOKE SELECT ON mysql.* FROM u1;
查看权限
- 查看当前用户权限:
SHOW GRANTS;(等同于SHOW GRANTS FOR CURRENT_USER();) - 查看其他用户权限:
SHOW GRANTS FOR 'kari'@'localhost'; - 查看角色权限:
SHOW GRANTS FOR 'r_updater'@'%'; - 查看角色展开后的用户权限:
SHOW GRANTS FOR 'kari'@'localhost' USING r_viewer, r_updater;
角色激活与强制角色
角色激活级别(优先级:会话级 > 用户级 > 服务器级)
服务器级激活
-
配置变量:
activate_all_roles_on_login(默认 OFF) -
作用:所有用户登录时自动激活所有已授予的角色
1SET PERSIST activate_all_roles_on_login = ON;(持久化,重启生效)
用户级激活(默认角色)
-
语法:
SET DEFAULT ROLE 角色1,角色2 TO 'user'@'host'; -
示例:设置用户登录时默认激活
r_viewer和r_updater1SET DEFAULT ROLE r_viewer, r_updater TO kari@localhost; -
简化设置:
SET DEFAULT ROLE ALL TO kari@localhost;(激活所有授予的角色)
会话级激活(临时生效)
- 语法:
SET ROLE 角色1,角色2; - 常用参数:
SET ROLE ALL;(激活所有授予的角色)SET ROLE NONE;(禁用所有角色)SET ROLE DEFAULT;(激活用户级默认角色)
- 查看当前激活角色:
SELECT CURRENT_ROLE();
强制角色(所有用户必激活)
- 作用:无需手动授予,自动对所有用户激活的角色(不可回收)
- 配置语法:
SET PERSIST mandatory_roles = 'role1, role2@localhost'; - 特性:不能通过
REVOKE或DROP ROLE删除,重启后仍生效
授权表与权限生效机制
核心授权表(存储在 mysql 库中)
| 表名 | 存储内容 |
|---|---|
| user | 用户账号、角色及全局权限 |
| global_grants | 动态全局权限 |
| db | 数据库级权限 |
| tables_priv | 表级权限 |
| columns_priv | 列级权限 |
| role_edges | 角色与用户 / 角色的授予关系 |
| default_roles | 用户的默认激活角色 |
| password_history | 用户密码修改历史 |
权限生效规则
-
全局权限 / 密码变更:仅对后续新连接生效
-
数据库级权限变更:客户端执行
USE db_name后生效 -
角色、表、列、存储例程权限变更:立即生效
-
直接修改授权表后:需执行
FLUSH PRIVILEGES重新加载内存副本 -
注意:禁止使用
INSERT/UPDATE/DELETE直接修改授权表,避免系统异常
最佳实践
- 遵循 “最小权限原则”:普通用户仅授予必要权限(如只读用户仅给
SELECT),管理员避免滥用SUPER权限 - 角色分类管理:按业务场景创建角色(如
r_readonly、r_admin),批量分配给用户,简化权限维护 - 密码安全策略:设置自动过期(如 90 天)、强制复杂密码,使用双重密码应对系统升级
- 限制连接来源:创建账号时指定具体主机或 IP 网段,避免
%通配符 - 定期审计权限:通过
SHOW GRANTS检查冗余权限,及时回收离职用户或过期角色的权限
MySQL 用户管理常用命令速查表
用户账号操作
创建用户
| 功能 | 命令 | 说明 |
|---|---|---|
| 基础创建 | CREATE USER 'username'@'hostname' IDENTIFIED BY 'password'; |
例:CREATE USER webuser@localhost IDENTIFIED BY 'Abc123';,hostname省略默认%(任意主机) |
| 创建并设置密码过期 | CREATE USER 'username'@'hostname' IDENTIFIED BY 'password' PASSWORD EXPIRE; |
用户登录后需先改密码才能操作 |
| 创建 PAM 认证用户(企业版) | CREATE USER 'username'@'hostname' IDENTIFIED WITH authentication_pam AS 'pam-service-name'; |
例:CREATE USER bob@localhost IDENTIFIED WITH authentication_pam AS 'mysql-pam'; |
修改用户
| 功能 | 命令 | 说明 |
|---|---|---|
| 重命名用户 | RENAME USER 'old_user'@'old_host' TO 'new_user'@'new_host'; |
例:RENAME USER consultant@laptop3 TO james@laptop3; |
| 锁定 / 解锁用户 | ALTER USER 'username'@'hostname' ACCOUNT LOCK/UNLOCK; |
锁定后用户无法登录 |
| 修改用户认证插件 | ALTER USER 'username'@'hostname' IDENTIFIED WITH caching_sha2_password BY 'new_password'; |
切换插件时需重新设置密码 |
删除用户
| 功能 | 命令 | 说明 |
|---|---|---|
| 删除用户及所有权限 | DROP USER 'username'@'hostname'; |
例:DROP USER james@laptop3;,同时清除授权表中该用户记录 |
密码管理
设置 / 修改密码
| 功能 | 命令 | 说明 |
|---|---|---|
| 修改指定用户密码 | ALTER USER 'username'@'hostname' IDENTIFIED BY 'new_password'; |
例:ALTER USER webuser1@localhost IDENTIFIED BY 'n3W&P4$$w0rd'; |
| 修改当前用户密码 | ALTER USER USER() IDENTIFIED BY 'new_password'; 或 SET PASSWORD = 'new_password'; |
登录状态下直接执行,无需指定用户名 |
| 命令行修改密码 | mysqladmin -u username -p password 'new_password'; |
执行时需输入旧密码,适用于脚本自动化 |
| 设置双重密码 | ALTER USER USER() IDENTIFIED BY 'new_password' RETAIN CURRENT PASSWORD; |
新密码为主密码,原密码为次要密码(MySQL 8.0.14+) |
| 移除次要密码 | ALTER USER USER() DISCARD OLD PASSWORD; |
仅保留主密码 |
密码过期配置
| 功能 | 命令 | 说明 |
|---|---|---|
| 手动设置密码过期 | ALTER USER 'username'@'hostname' PASSWORD EXPIRE; |
例:ALTER USER erika@localhost PASSWORD EXPIRE; |
| 配置账号自动过期 | ALTER USER 'username'@'hostname' PASSWORD EXPIRE INTERVAL N DAY; |
例:ALTER USER consultant@laptop3 PASSWORD EXPIRE INTERVAL 30 DAY;(30 天过期) |
| 禁用账号自动过期 | ALTER USER 'username'@'hostname' PASSWORD EXPIRE NEVER; |
优先级高于全局默认策略 |
角色操作
角色创建 / 删除
| 功能 | 命令 | 说明 |
|---|---|---|
| 创建角色 | CREATE ROLE 'rolename'@'hostname' [, 'rolename2'@'hostname2']; |
例:CREATE ROLE r_admin, r_dev@localhost;,省略主机名默认% |
| 删除角色 | DROP ROLE 'rolename'@'hostname' [, 'rolename2'@'hostname2']; |
例:DROP ROLE r_super, r_dev@localhost;,同时回收所有用户的该角色权限 |
角色授权与激活
| 功能 | 命令 | 说明 |
|---|---|---|
| 授予角色给用户 | GRANT 'rolename'@'hostname' [, ...] TO 'username'@'hostname' [WITH ADMIN OPTION]; |
例:GRANT r_viewer, r_updater TO kari@localhost WITH ADMIN OPTION;,WITH ADMIN OPTION允许用户转授角色 |
| 设置用户默认角色 | SET DEFAULT ROLE 'rolename1'[, 'rolename2'] TO 'username'@'hostname'; |
例:SET DEFAULT ROLE r_viewer, r_updater TO kari@localhost;,用户登录自动激活 |
| 会话级激活角色 | SET ROLE 'rolename1'[, 'rolename2']; 或 SET ROLE ALL; |
例:SET ROLE r_viewer;(激活指定角色)、SET ROLE NONE;(禁用所有角色) |
| 查看当前激活角色 | SELECT CURRENT_ROLE(); |
输出当前会话中生效的角色 |
| 配置强制角色(全局) | SET PERSIST mandatory_roles = 'rolename1, rolename2@localhost'; |
所有用户自动激活,不可回收 |
权限操作
授予权限
| 功能 | 命令 | 说明 |
|---|---|---|
| 全局权限授予 | GRANT 权限1[, 权限2] ON *.* TO 'user/role'@'hostname' [WITH GRANT OPTION]; |
例:GRANT SELECT, INSERT ON *.* TO admin@localhost;,*.*表示所有数据库 |
| 数据库权限授予 | GRANT 权限1[, 权限2] ON db_name.* TO 'user/role'@'hostname'; |
例:GRANT CREATE, ALTER ON world.* TO dev@localhost;,仅作用于world库 |
| 表权限授予 | GRANT 权限1[, 权限2] ON db_name.table_name TO 'user/role'@'hostname'; |
例:GRANT SELECT, UPDATE ON world.city TO reader@localhost; |
| 列权限授予 | GRANT 权限(列1, 列2) ON db_name.table_name TO 'user/role'@'hostname'; |
例:GRANT SELECT (user, host) ON mysql.user TO kari@localhost;,仅允许操作指定列 |
| 授予所有权限 | GRANT ALL PRIVILEGES ON 范围 TO 'user/role'@'hostname' [WITH GRANT OPTION]; |
ALL PRIVILEGES不含转授权限,需加WITH GRANT OPTION才允许转授 |
回收权限
| 功能 | 命令 | 说明 |
|---|---|---|
| 回收指定权限 | REVOKE 权限1[, 权限2] ON 范围 FROM 'user/role'@'hostname'; |
例:REVOKE DELETE, INSERT ON world.* FROM Amon@localhost; |
| 回收角色 | REVOKE 'rolename'@'hostname' FROM 'username'@'hostname'; |
例:REVOKE r_updater FROM kari@localhost; |
| 回收所有权限 | REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'username'@'hostname'; |
清除用户所有权限及转授权限 |
| 部分回收(全局排除特定库) | REVOKE 权限 ON exclude_db.* FROM 'username'@'hostname'; |
需先开启SET GLOBAL partial_revokes = ON;,例:REVOKE SELECT ON mysql.* FROM u1; |
查看权限
| 功能 | 命令 | 说明 |
|---|---|---|
| 查看当前用户权限 | SHOW GRANTS; 或 SHOW GRANTS FOR CURRENT_USER(); |
输出当前登录账号的所有权限与角色 |
| 查看指定用户权限 | SHOW GRANTS FOR 'username'@'hostname'; |
例:SHOW GRANTS FOR kari@localhost; |
| 查看角色权限 | SHOW GRANTS FOR 'rolename'@'hostname'; |
例:SHOW GRANTS FOR r_updater@'%'; |
| 查看角色展开后的用户权限 | SHOW GRANTS FOR 'username'@'hostname' USING 'rolename1'[, 'rolename2']; |
输出角色包含的具体权限,例:SHOW GRANTS FOR kari@localhost USING r_viewer; |
辅助操作
| 功能 | 命令 | 说明 |
|---|---|---|
| 查看所有用户 / 角色 | SELECT user, host, authentication_string FROM mysql.user; |
从授权表mysql.user中查询账号信息 |
| 刷新权限(直接修改授权表后) | FLUSH PRIVILEGES; |
重新加载授权表到内存,使手动修改生效 |
| 查看 PAM 代理用户映射 | SELECT USER(), CURRENT_USER(); |
例:代理用户 anne 登录后,输出anne@localhost(实际用户)和webuser@localhost(映射用户) |
| 命令行登录 MySQL | 本地:mysql -u username -p password;远程:mysql -u username -p password -h server_ip |
-p与密码间无空格,若加空格需后续手动输入密码 |
| 启用明文认证登录(PAM 等场景) | mysql --enable-cleartext-plugin -u username -p |
客户端发送明文密码,需配合加密连接使用 |