## 为什么需要权限管理
MySQL默认的root账户权限太大,线上环境直接用它等于裸奔。我见过有人把root密码写在代码配置文件里,被拖库的。权限管理不是为了折腾自己,是为了出事的时候能精准定位谁干的、能控制损失范围。
## 用户管理三板斧
### 创建用户
-- 创建用户,指定可以从哪些主机登录
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPass123!';
CREATE USER 'dev_user'@'192.168.1.%' IDENTIFIED BY 'DevPass456!';
CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'ReadOnly789!';
`@`后面是允许登录的主机。`%`表示任意IP,生产环境别这么干。`localhost`只允许本机连接,适合跑在同一台机器上的应用。`192.168.1.%`限制内网段。
### 修改密码
-- MySQL 5.7及之后
ALTER USER 'app_user'@'localhost' IDENTIFIED BY 'NewPass123!';
-- 或者直接更新mysql.user表(不推荐,容易出问题)
### 删除用户
DROP USER 'dev_user'@'192.168.1.%';
## 权限分配:给多少给多少
### 基本权限类型
– `SELECT` – 查
– `INSERT` – 增
– `UPDATE` – 改
– `DELETE` – 删
– `CREATE` – 建表建库
– `DROP` – 删表删库
– `ALTER` – 改表结构
– `INDEX` – 索引操作
– `EXECUTE` – 执行存储过程
### 按粒度分配
-- 1. 全局权限(整个MySQL实例)
GRANT SELECT ON *.* TO 'readonly_user'@'%';
-- 2. 数据库级权限
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp_db.* TO 'app_user'@'localhost';
-- 3. 表级权限
GRANT SELECT, INSERT ON myapp_db.orders TO 'order_service'@'10.0.0.%';
-- 4. 列级权限(很少用,但有时需要)
GRANT SELECT (id, name, email) ON myapp_db.users TO 'analyst'@'localhost';
原则:给最小必要权限。一个只读报表用户,只给SELECT就够了。一个订单服务,只给操作orders表的权限,别给DROP。
### 回收权限
REVOKE DELETE ON myapp_db.* FROM 'app_user'@'localhost';
REVOKE ALL PRIVILEGES ON *.* FROM 'old_user'@'%';
## 实践中的坑
### 权限不生效
改完权限记得刷新:
FLUSH PRIVILEGES;
或者用`GRANT`时自动刷新,但手动`FLUSH`更保险。
### 查看权限
-- 看当前用户的权限
SHOW GRANTS;
-- 看指定用户的权限
SHOW GRANTS FOR 'app_user'@'localhost';
### 权限冲突
如果一个用户同时有数据库级和表级权限,MySQL会取并集。比如`app_user`对`myapp_db`有SELECT权限,对`myapp_db.orders`有INSERT权限,那么他可以对orders表做INSERT,但其他表只能SELECT。
### 远程连接问题
用户创建时指定了`localhost`,想从其他机器连肯定报错。检查三件事:用户主机限制、MySQL绑定地址(`bind-address`)、防火墙。
-- 查看MySQL绑定地址
SHOW VARIABLES LIKE 'bind_address';
如果bind_address是127.0.0.1,只能本机连。改成0.0.0.0允许所有IP,或者具体IP。
## 生产环境推荐配置
我在雨云服务器上部署MySQL时的习惯做法:
-- 应用账号,只连本机
CREATE USER 'app'@'localhost' IDENTIFIED BY 'xxx';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app'@'localhost';
-- 备份账号,只读
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'xxx';
GRANT SELECT, LOCK TABLES, SHOW VIEW ON myapp.* TO 'backup'@'localhost';
-- 管理账号,只允许内网访问
CREATE USER 'admin'@'10.0.0.%' IDENTIFIED BY 'xxx';
GRANT ALL PRIVILEGES ON myapp.* TO 'admin'@'10.0.0.%';
雨云这台服务器性价比挺高,稳定用了两年没出过权限相关的问题,主要还是配置习惯好。
## 一句话总结
`CREATE USER` + `GRANT` + `FLUSH PRIVILEGES`,记住最小权限原则,别偷懒用root。出事了再改权限,黄花菜都凉了。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容