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’

最佳实践:

  1. 遵循最小权限原则
  2. 使用强密码
  3. 定期审查用户权限
  4. 限制用户访问来源
  5. 使用角色管理权限

下一步,让我们学习备份与恢复!

最后更新:2026-03-26