MySQL用户权限管理 #
一、用户管理概述 #
1.1 MySQL权限系统 #
text
┌─────────────────────────────────────┐
│ MySQL权限系统 │
├─────────────────────────────────────┤
│ 用户账户 │
│ ├── 用户名 │
│ └── 主机名 │
│ 权限级别 │
│ ├── 全局级别 │
│ ├── 数据库级别 │
│ ├── 表级别 │
│ └── 列级别 │
└─────────────────────────────────────┘
1.2 权限类型 #
| 权限 | 说明 |
|---|---|
| ALL | 所有权限 |
| SELECT | 查询权限 |
| INSERT | 插入权限 |
| UPDATE | 更新权限 |
| DELETE | 删除权限 |
| CREATE | 创建权限 |
| DROP | 删除权限 |
| ALTER | 修改权限 |
| INDEX | 索引权限 |
| EXECUTE | 执行存储过程权限 |
二、用户操作 #
2.1 创建用户 #
sql
-- 创建用户
CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password123';
-- 创建用户并指定认证插件
CREATE USER 'user2'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'password123';
-- 创建允许远程访问的用户
CREATE USER 'user3'@'%' IDENTIFIED BY 'password123';
-- 创建用户并授予权限
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin123';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
2.2 查看用户 #
sql
-- 查看所有用户
SELECT user, host FROM mysql.user;
-- 查看当前用户
SELECT USER(), CURRENT_USER();
-- 查看用户详细信息
SELECT
user,
host,
authentication_string,
password_expired,
account_locked
FROM mysql.user
WHERE user = 'user1';
2.3 修改用户密码 #
sql
-- 修改当前用户密码
ALTER USER USER() IDENTIFIED BY 'new_password';
-- 修改指定用户密码
ALTER USER 'user1'@'localhost' IDENTIFIED BY 'new_password';
-- 使用SET PASSWORD
SET PASSWORD FOR 'user1'@'localhost' = 'new_password';
-- MySQL 5.7
SET PASSWORD FOR 'user1'@'localhost' = PASSWORD('new_password');
2.4 重命名用户 #
sql
-- 重命名用户
RENAME USER 'user1'@'localhost' TO 'newuser'@'localhost';
-- 同时修改主机
RENAME USER 'user1'@'localhost' TO 'user1'@'%';
2.5 删除用户 #
sql
-- 删除用户
DROP USER 'user1'@'localhost';
-- 删除多个用户
DROP USER 'user1'@'localhost', 'user2'@'localhost';
2.6 锁定和解锁用户 #
sql
-- 锁定用户
ALTER USER 'user1'@'localhost' ACCOUNT LOCK;
-- 解锁用户
ALTER USER 'user1'@'localhost' ACCOUNT UNLOCK;
-- 查看锁定状态
SELECT user, host, account_locked FROM mysql.user;
三、权限管理 #
3.1 授予权限 #
sql
-- 授予全局权限
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
-- 授予数据库权限
GRANT ALL PRIVILEGES ON mydb.* TO 'user1'@'localhost';
-- 授予表权限
GRANT SELECT, INSERT, UPDATE ON mydb.users TO 'user1'@'localhost';
-- 授予列权限
GRANT SELECT(id, name), UPDATE(name) ON mydb.users TO 'user1'@'localhost';
-- 授予存储过程权限
GRANT EXECUTE ON PROCEDURE mydb.my_procedure TO 'user1'@'localhost';
-- 授予代理权限
GRANT PROXY ON 'admin'@'localhost' TO 'user1'@'localhost';
-- 授予GRANT OPTION(允许用户授权给其他用户)
GRANT SELECT ON mydb.* TO 'user1'@'localhost' WITH GRANT OPTION;
3.2 查看权限 #
sql
-- 查看当前用户权限
SHOW GRANTS;
-- 查看指定用户权限
SHOW GRANTS FOR 'user1'@'localhost';
-- 查看用户全局权限
SELECT * FROM mysql.user WHERE user = 'user1';
-- 查看用户数据库权限
SELECT * FROM mysql.db WHERE user = 'user1';
-- 查看用户表权限
SELECT * FROM mysql.tables_priv WHERE user = 'user1';
3.3 撤销权限 #
sql
-- 撤销全局权限
REVOKE ALL PRIVILEGES ON *.* FROM 'admin'@'localhost';
-- 撤销数据库权限
REVOKE ALL PRIVILEGES ON mydb.* FROM 'user1'@'localhost';
-- 撤销表权限
REVOKE SELECT, INSERT ON mydb.users FROM 'user1'@'localhost';
-- 撤销GRANT OPTION
REVOKE GRANT OPTION ON mydb.* FROM 'user1'@'localhost';
-- 撤销所有权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user1'@'localhost';
3.4 刷新权限 #
sql
-- 刷新权限(使权限立即生效)
FLUSH PRIVILEGES;
四、权限级别 #
4.1 全局权限 #
sql
-- 全局权限适用于所有数据库
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
-- 常用全局权限
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'user'@'localhost';
GRANT CREATE, DROP, ALTER ON *.* TO 'user'@'localhost';
GRANT RELOAD, SHUTDOWN ON *.* TO 'admin'@'localhost';
4.2 数据库权限 #
sql
-- 数据库权限适用于指定数据库的所有对象
GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'localhost';
-- 常用数据库权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'user'@'localhost';
GRANT CREATE, DROP, ALTER ON mydb.* TO 'user'@'localhost';
4.3 表权限 #
sql
-- 表权限适用于指定表
GRANT SELECT, INSERT, UPDATE ON mydb.users TO 'user'@'localhost';
-- 常用表权限
GRANT SELECT ON mydb.users TO 'readonly'@'localhost';
GRANT SELECT, INSERT ON mydb.logs TO 'app'@'localhost';
4.4 列权限 #
sql
-- 列权限适用于指定列
GRANT SELECT(id, name), UPDATE(name) ON mydb.users TO 'user'@'localhost';
五、角色管理(MySQL 8.0+) #
5.1 创建角色 #
sql
-- 创建角色
CREATE ROLE 'app_read', 'app_write', 'app_admin';
-- 查看角色
SELECT user, host FROM mysql.user WHERE user LIKE 'app_%';
5.2 授予角色权限 #
sql
-- 授予角色权限
GRANT SELECT ON mydb.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON mydb.* TO 'app_write';
GRANT ALL PRIVILEGES ON mydb.* TO 'app_admin';
5.3 将角色授予用户 #
sql
-- 将角色授予用户
GRANT 'app_read' TO 'user1'@'localhost';
GRANT 'app_read', 'app_write' TO 'user2'@'localhost';
GRANT 'app_admin' TO 'admin'@'localhost';
5.4 激活角色 #
sql
-- 激活角色
SET ROLE 'app_read';
-- 激活所有授予的角色
SET ROLE ALL;
-- 查看当前激活的角色
SELECT CURRENT_ROLE();
-- 设置默认角色
ALTER USER 'user1'@'localhost' DEFAULT ROLE 'app_read';
5.5 撤销和删除角色 #
sql
-- 撤销用户的角色
REVOKE 'app_read' FROM 'user1'@'localhost';
-- 撤销角色的权限
REVOKE SELECT ON mydb.* FROM 'app_read';
-- 删除角色
DROP ROLE 'app_read';
六、常见场景 #
6.1 创建只读用户 #
sql
-- 创建只读用户
CREATE USER 'readonly'@'%' IDENTIFIED BY 'password123';
GRANT SELECT ON mydb.* TO 'readonly'@'%';
FLUSH PRIVILEGES;
6.2 创建应用用户 #
sql
-- 创建应用用户(增删改查权限)
CREATE USER 'app'@'%' IDENTIFIED BY 'password123';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app'@'%';
FLUSH PRIVILEGES;
6.3 创建管理员用户 #
sql
-- 创建管理员用户
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin123';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
6.4 创建备份用户 #
sql
-- 创建备份用户
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'backup123';
GRANT SELECT, LOCK TABLES, SHOW VIEW, RELOAD ON *.* TO 'backup'@'localhost';
FLUSH PRIVILEGES;
七、安全最佳实践 #
7.1 密码策略 #
sql
-- 查看密码策略
SHOW VARIABLES LIKE 'validate_password%';
-- 设置密码策略
SET GLOBAL validate_password_length = 8;
SET GLOBAL validate_password_policy = MEDIUM;
-- 密码过期
ALTER USER 'user1'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
-- 立即过期
ALTER USER 'user1'@'localhost' PASSWORD EXPIRE;
7.2 限制访问 #
sql
-- 限制用户只能从特定IP访问
CREATE USER 'user'@'192.168.1.100' IDENTIFIED BY 'password';
-- 限制用户只能从特定网段访问
CREATE USER 'user'@'192.168.1.%' IDENTIFIED BY 'password';
-- 限制最大连接数
ALTER USER 'user'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 100;
7.3 审计日志 #
sql
-- 开启审计日志
SET GLOBAL audit_log = ON;
-- 查看审计日志
SHOW VARIABLES LIKE 'audit_log%';
八、总结 #
用户权限管理要点:
| 操作 | 语法 |
|---|---|
| 创建用户 | CREATE USER ‘user’@‘host’ IDENTIFIED BY ‘password’ |
| 授予权限 | GRANT privileges ON db.table TO ‘user’@‘host’ |
| 查看权限 | SHOW GRANTS FOR ‘user’@‘host’ |
| 撤销权限 | REVOKE privileges ON db.table FROM ‘user’@‘host’ |
| 删除用户 | DROP USER ‘user’@‘host’ |
最佳实践:
- 遵循最小权限原则
- 使用强密码
- 定期审查用户权限
- 限制用户访问来源
- 使用角色管理权限
下一步,让我们学习备份与恢复!
最后更新:2026-03-26