📌 今日关键词:权限分配、安全边界、角色管理
大家好呀!我是数据库小学妹👋
前面我们学会了各种数据库操作,但有个问题我一直隐隐担心:
我现在一直用
root账号连接数据库,什么都能删、什么都能改。万一哪天猫踩键盘把生产数据清空了怎么办?或者同事需要查数据,我该不该把 root 密码告诉他?
数据库早就想到了这个问题——它提供了用户权限管理,就像给不同的人配不同的钥匙:有人只能开门(查数据),有人能开保险柜(删数据),有人只能进仓库(连某个库)。
如果说昨天我们学的备份是“事后补救”,那今天要学的权限管理就是“事前防御”!接下来我就把自己学会的用户权限管理分享出来,让你也能把好数据库的大门。
一、为什么必须学会权限管理?
1️⃣ 明确边界,防止“乱入”
- 保护敏感数据: 比如用户密码、财务信息等,不能随便让人看。
- 避免误操作: 限制普通用户的权限,防止“手滑”删表、改数据。
- 职责分离: 开发、测试、运维各司其职,不同角色权限不同,减少风险。
2️⃣ 权限 = 数据库的“门禁卡”
通过精细化的权限分配,我们可以决定:
- 谁(用户/角色)能访问数据库。
- 能访问哪些数据库或表。
- 能做什么(查询、插入、修改、删除等操作)。
🛠️ 新手必会:权限管理实操(MySQL命令)
权限管理核心命令只有几个,但组合起来非常灵活!就像给数据库“发门禁卡” 🆔。
二、用户管理:创建、修改、删除
1. 查看当前所有用户
SELECT user, host FROM mysql.user;
host 表示允许从哪个IP连接:localhost 只能本机,% 表示任意IP。
2. 创建用户
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';
示例:
-- 允许本地连接
CREATE USER 'xiaomei'@'localhost' IDENTIFIED BY '123456';
-- 允许任意IP连接(生产环境慎用)
CREATE USER 'xiaomei'@'%' IDENTIFIED BY '123456';
-- 允许指定IP段
CREATE USER 'xiaomei'@'192.168.1.%' IDENTIFIED BY '123456';
3. 修改密码
-- 方法1:用 ALTER USER(推荐)
ALTER USER 'xiaomei'@'localhost' IDENTIFIED BY 'newpass';
-- 方法2:用 SET PASSWORD(老语法)
SET PASSWORD FOR 'xiaomei'@'localhost' = 'newpass';
4. 删除用户
DROP USER 'xiaomei'@'localhost';
三、权限管理:授予、查看、回收
1. 授予权限(GRANT)
GRANT 权限列表 ON 数据库.表 TO '用户名'@'主机';
常见权限:
| 权限 | 作用 |
|---|---|
ALL PRIVILEGES |
所有权限(除GRANT OPTION外) |
SELECT |
查询数据 |
INSERT |
插入数据 |
UPDATE |
更新数据 |
DELETE |
删除数据 |
CREATE |
创建表/库 |
DROP |
删除表/库 |
INDEX |
创建/删除索引 |
EXECUTE |
执行存储过程 |
实战示例:
-- 让 xiaomei 只能查 mydb 库里的所有表
GRANT SELECT ON mydb.* TO 'xiaomei'@'localhost';
-- 让 xiaoming 可以查和插入 mydb 里的 orders 表
GRANT SELECT, INSERT ON mydb.orders TO 'xiaoming'@'localhost';
-- 让 xiaoli 拥有 mydb 库的所有权限(但不能给别人授权)
GRANT ALL PRIVILEGES ON mydb.* TO 'xiaoli'@'localhost';
2. 刷新权限(重要!)
修改权限后,执行以下命令让权限立即生效:
FLUSH PRIVILEGES;
3. 查看用户权限
-- 查看当前用户的权限
SHOW GRANTS;
-- 查看指定用户的权限
SHOW GRANTS FOR 'xiaomei'@'localhost';
4. 回收权限(REVOKE)
-- 回收 xiaomei 的 INSERT 权限
REVOKE INSERT ON mydb.* FROM 'xiaomei'@'localhost';
-- 回收所有权限
REVOKE ALL PRIVILEGES ON mydb.* FROM 'xiaomei'@'localhost';
四、权限的生效级别(由粗到细)
| 级别 | 写法 | 说明 |
|---|---|---|
| 全局 | *.* |
所有数据库的所有表 |
| 数据库级 | mydb.* |
指定数据库的所有表 |
| 表级 | mydb.orders |
指定数据库的指定表 |
| 列级 | mydb.orders (name, price) |
只允许操作某些列(较少用) |
💡 新手建议:
- 优先用数据库级权限,平衡安全性和灵活性。
- `.
**\** 代表所有库所有表,慎用!例如GRANT ALL ON*.*TO ...` 是超级权限(类似 root)。- 生产环境建议最小权限原则:“给需要的,而不是给所有的”。
五、实战:创建三个不同权限的用户
假设我们有一个电商数据库 shop,包含 users、orders、products 三张表。
| 用户 | 职责 | 需要的权限 |
|---|---|---|
| reader | 数据分析师 | 只读所有表 |
| writer | 订单录入员 | 对 orders 表 INSERT、UPDATE |
| admin | 数据库管理员 | 对 shop 库的所有权限 |
-- 1. 创建只读用户
CREATE USER 'reader'@'localhost' IDENTIFIED BY 'read123';
GRANT SELECT ON shop.* TO 'reader'@'localhost';
-- 2. 创建订单写入用户
CREATE USER 'writer'@'localhost' IDENTIFIED BY 'write123';
GRANT SELECT, INSERT, UPDATE ON shop.orders TO 'writer'@'localhost';
-- 3. 创建管理员用户(但不能给别人授权)
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin123';
GRANT ALL PRIVILEGES ON shop.* TO 'admin'@'localhost';
FLUSH PRIVILEGES;
之后,每个人用自己的账号登录,就只能做权限范围内的事。
六、新手避坑指南(血泪总结)
| 常见错误 | 正确做法 |
|---|---|
创建用户时没指定host,导致只能从%连接 |
明确指定'user'@'localhost'或'user'@'192.168.%' |
授权后忘记FLUSH PRIVILEGES |
必须刷新,否则权限不生效 |
给用户授予了ALL PRIVILEGES但没有GRANT OPTION |
用户无法给自己或其他用户授权,这是安全的 |
| 删用户时没指定 host,可能删错 | 先SHOW GRANTS确认,再用DROP USER 'user'@'host' |
生产环境用'user'@'%'允许任意IP连接 |
只开放必要IP,如'user'@'192.168.1.100' |
七、今日学习心得
今天的内容总结成三句话:
- 永远不要用root做日常操作,创建专用用户并只给最小权限
- GRANT 和 REVOKE 是权限管理的核心,学会数据库级和表级授权
- FLUSH PRIVILEGES 一定要记得,不然改了等于没改
👋 我是数据库小学妹一个用设计师思维学数据库的转行人。我们一起,把复杂的技术变得简单有趣!💕
本文为个人学习总结,所有命令均在MySQL 8.0环境下验证。权限管理是生产环境的第一道防线,一定要重视。