MySQL 用户管理涉及创建用户、授予权限、修改密码、撤销权限 等操作,是数据库安全管理的重要组成部分。MySQL 的用户信息存储在 mysql.user 系统表中。
一、用户管理
| 概念 | 说明 |
|---|---|
| 用户名 | 登录 MySQL 时使用的账号名 |
| 主机名 | 允许用户从哪个主机登录(localhost、%、192.168.1.%) |
| 密码 | 用户身份验证的凭证 |
| 权限 | 用户对数据库/表/列的操作权限 |
| 角色 | 一组权限的集合(MySQL 8.0+) |
二、查看用户
查看所有用户
-- 查看用户列表
SELECT User, Host, authentication_string FROM mysql.user;
-- 查看当前用户
SELECT CURRENT_USER();
-- 查看当前会话的用户
SELECT USER();
三、创建用户
1. 基本创建语法
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
2. 示例
-- 创建本地用户
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'SecurePass123!';
-- 创建远程用户(允许任意主机)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'SecurePass123!';
-- 创建指定网段的用户
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'SecurePass123!';
-- 创建无密码用户(不推荐)
CREATE USER 'guest'@'localhost';
-- 创建时指定加密插件(MySQL 8.0+)
CREATE USER 'app_user'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'SecurePass123!';
-- 创建多个用户
CREATE USER
'user1'@'localhost' IDENTIFIED BY 'pass1',
'user2'@'%' IDENTIFIED BY 'pass2';
四、修改用户
1. 修改密码
-- 方法1:使用 ALTER USER(推荐,MySQL 5.7.6+)
ALTER USER 'app_user'@'localhost' IDENTIFIED BY 'NewPass456!';
-- 方法2:使用 SET PASSWORD(旧方式)
SET PASSWORD FOR 'app_user'@'localhost' = 'NewPass456!';
-- 方法3:修改当前用户密码
ALTER USER USER() IDENTIFIED BY 'NewPass456!';
2. 修改用户名或主机
-- 重命名用户
RENAME USER 'old_name'@'localhost' TO 'new_name'@'localhost';
-- 修改主机
RENAME USER 'app_user'@'%' TO 'app_user'@'192.168.1.%';
3. 锁定/解锁用户
-- 锁定用户(禁止登录)
ALTER USER 'app_user'@'localhost' ACCOUNT LOCK;
-- 解锁用户
ALTER USER 'app_user'@'localhost' ACCOUNT UNLOCK;
4. 修改密码过期策略
-- 设置密码永不过期
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE NEVER;
-- 设置密码立即过期
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE;
-- 设置密码90天后过期
ALTER USER 'app_user'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
五、授予权限(GRANT)
1. 基本语法
GRANT 权限列表 ON 对象 TO '用户'@'主机' [WITH GRANT OPTION];
2. 权限类型
常用权限
-- 数据操作权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'localhost';
-- 所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'localhost';
-- 创建相关权限
GRANT CREATE, ALTER, DROP, INDEX ON mydb.* TO 'app_user'@'localhost';
-- 数据库管理权限
GRANT CREATE USER, RELOAD, PROCESS ON *.* TO 'admin'@'localhost';
权限对象
| 对象 | 语法 | 说明 |
|---|---|---|
| 全局 | *.* |
所有数据库的所有表 |
| 数据库级 | mydb.* |
指定数据库的所有表 |
| 表级 | mydb.users |
指定表 |
| 列级 | mydb.users(name, email) |
指定列 |
3. 示例
-- 创建应用用户
CREATE USER 'app'@'localhost' IDENTIFIED BY 'AppPass123!';
-- 授予应用用户对 mydb 的完整操作权限
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON mydb.* TO 'app'@'localhost';
-- 授予只读用户
CREATE USER 'readonly'@'%' IDENTIFIED BY 'ReadOnly123!';
GRANT SELECT ON mydb.* TO 'readonly'@'%';
-- 授予管理员用户全部权限
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'AdminPass123!';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
-- 授予列级权限
GRANT SELECT(name, email) ON mydb.users TO 'app'@'localhost';
-- 授予存储过程执行权限
GRANT EXECUTE ON PROCEDURE mydb.sp_cleanup TO 'app'@'localhost';
六、查看权限(SHOW GRANTS)
-- 查看当前用户权限
SHOW GRANTS;
-- 查看指定用户权限
SHOW GRANTS FOR 'app_user'@'localhost';
-- 查看所有用户的权限(需查询系统表)
SELECT * FROM mysql.user\G;
七、撤销权限(REVOKE)
-- 撤销指定权限
REVOKE INSERT, UPDATE ON mydb.* FROM 'app_user'@'localhost';
-- 撤销所有权限
REVOKE ALL PRIVILEGES ON mydb.* FROM 'app_user'@'localhost';
-- 撤销所有全局权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app_user'@'localhost';
八、删除用户
-- 删除用户
DROP USER 'app_user'@'localhost';
-- 删除多个用户
DROP USER 'user1'@'localhost', 'user2'@'%';
九、刷新权限
修改权限后,需要刷新权限才能生效:
FLUSH PRIVILEGES;
十、主机名(Host)的写法
| 写法 | 含义 |
|---|---|
localhost |
只允许本机连接 |
127.0.0.1 |
只允许本机连接(通过 IPv4) |
% |
允许任意主机连接 |
192.168.1.% |
允许 192.168.1.x 网段 |
192.168.1.100 |
只允许指定 IP 连接 |
*.example.com |
允许 example.com 域的主机 |
十一、角色管理(MySQL 8.0+)
角色是权限的集合,可以方便地管理多个用户的权限。
-- 创建角色
CREATE ROLE 'app_role', 'readonly_role';
-- 授予角色权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_role';
GRANT SELECT ON mydb.* TO 'readonly_role';
-- 授予角色给用户
GRANT 'app_role' TO 'app_user'@'localhost';
GRANT 'readonly_role' TO 'readonly_user'@'%';
-- 查看用户拥有的角色
SELECT * FROM mysql.role_edges;