MySQL: MySQL用户管理与权限控制

最后更新:2026-08-26

权限控制是数据库安全的基础——不同用户只能访问被授权的数据。

本课讲解用户和权限管理。

100%
graph TB
    A[MySQL 权限层级] --> B[全局权限<br/>*.*]
    A --> C[数据库权限<br/>mydb.*]
    A --> D[表权限<br/>mydb.users]
    A --> E[列权限<br/>mydb.users col]
    B --> B1[ALL/CREATE/RELOAD...]
    C --> C1[SELECT/INSERT/UPDATE/DELETE]
    D --> D1[SELECT/ALTER/INDEX...]
    E --> E1[SELECT col1, col2]

1. 你将学到


2. 一个真实的故事

(1) 痛点:root 账号误操作酿成大祸

开发团队一直用 root 账号连接生产数据库,方便是方便,直到那天——一个开发人员误执行了 DROP TABLE users,300 万用户数据瞬间消失。备份恢复花了 4 小时,期间服务完全中断,直接损失超百万。

(2) 权限系统的解法

用最小权限原则:每个角色只授予必要的权限。开发只读+读写开发库、运维有特定库的管理权限、root 仅限 DBA 在堡垒机使用。

维度 全部用 root 最小权限原则
误操作风险 极高(可 DROP 任何表) 极低(权限受限)
事故恢复 难(影响范围大) 易(影响范围小)
审计追踪 无法区分操作者 按用户追溯
安全等级

3. 用户管理

▶ 示例:创建用户

SQL
-- 创建本地用户
CREATE USER 'dev_user'@'localhost' IDENTIFIED BY 'DevPass123!';

-- 创建允许远程连接的用户
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'RemotePass123!';

-- 创建允许特定IP连接的用户
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'AppPass123!';
▶ 试一试

▶ 示例:修改和删除用户

SQL
-- 修改密码
ALTER USER 'dev_user'@'localhost' IDENTIFIED BY 'NewPass123!';

-- 删除用户
DROP USER 'dev_user'@'localhost';

-- 查看所有用户
SELECT user, host FROM mysql.user;
▶ 试一试

4. GRANT 授权

▶ 示例:权限管理

SQL
-- 授予所有权限(管理员)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';

-- 授予特定数据库权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'dev_user'@'localhost';

-- 授予特定表权限
GRANT SELECT ON mydb.users TO 'readonly'@'localhost';

-- 授予特定列权限
GRANT SELECT (username, email) ON mydb.users TO 'limited'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;
▶ 试一试

5. 权限级别

级别 语法 说明
全局 *.* 所有数据库所有表
数据库 mydb.* 特定数据库所有表
mydb.users 特定表
mydb.users(email) 特定列

6. REVOKE 撤销权限

SQL
-- 撤销所有权限
REVOKE ALL PRIVILEGES ON *.* FROM 'dev_user'@'localhost';

-- 撤销特定权限
REVOKE INSERT, DELETE ON mydb.* FROM 'dev_user'@'localhost';

FLUSH PRIVILEGES;

7. 查看权限

SQL
-- 查看当前用户权限
SHOW GRANTS;

-- 查看指定用户权限
SHOW GRANTS FOR 'dev_user'@'localhost';

8. 角色管理(MySQL 8.0+)

SQL
-- 创建角色
CREATE ROLE 'app_read', 'app_write';

-- 给角色授权
GRANT SELECT ON mydb.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON mydb.* TO 'app_write';

-- 给用户分配角色
GRANT 'app_read', 'app_write' TO 'dev_user'@'localhost';

-- 激活角色
SET DEFAULT ROLE ALL TO 'dev_user'@'localhost';

❓ 常见问题

Q 'user'@'localhost''user'@'%' 有什么区别?
A localhost 只允许本地连接,% 允许任意主机连接。
Q GRANT 后需要 FLUSH PRIVILEGES?
A 直接 GRANT 不需要。直接修改 mysql.user 表才需要。
Q 忘记 root 密码怎么办?
A 跳过权限验证启动,修改密码后重启。
Q WITH GRANT OPTION 是什么?
A 允许用户把自己的权限授予别人。授予此权限需谨慎,避免权限扩散。
Q 角色和用户区别?
A 角色是权限集合,不能直接登录;用户登录后用 SET ROLE 激活角色。

📖 小节


📝 作业

  1. 基础题(难度⭐):创建只读用户,只能查询 mydb 数据库。

  2. 进阶题(难度⭐⭐):创建角色并分配给用户。

  3. 挑战题(难度⭐⭐⭐):设计权限方案:开发人员读写、运营只读、管理员全权。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏