刷到一个挺有意思的话题,结合自己之前的经验,整理了一下核心要点。
在 MySQL 数据库的日常用与运维中,用户管理与权限控制是保障数据安全的核心环节。如果所有操作都用 root 超级用户,一旦账号泄露,整个数据库将面临毁灭性风险。本文将从零开始,详细讲解 MySQL 用户的创建、删除、密码修改,以及权限的授予、回收、查看等全套操作,帮各位快速掌握安全合规的用户权限管理方法。
一、为什么要做 MySQL 用户管理?
在生产环境或多人协作场景中,绝对不能所有人都用 root 账号。root 拥有数据库的所有权限,可删库、可改表、可访问所有数据,风险极高。
正确的做法是:按业务分工创建专用用户,分配最小必要权限。
- 张三只负责 mytest 库,就只给 mytest 库的操作权限
- 李四只负责 msg 库,就只给 msg 库的操作权限
- 普通开发只给查询权限,运维才授予部分管理权限
二、MySQL 用户信息存哪里?
MySQL 的所有用户信息,都存储在系统库 mysql 的 user 表中。
1. 查看用户信息
sql
-- 切换到系统库
use mysql;
-- 查看关键用户信息
select host, user, authentication_string from user;
2. 关键字段解释
- host:允许登录的主机地址
localhost:仅允许本机登录
%:允许所有 IP 登录(生产环境慎用)- 具体 IP:仅允许该 IP 登录(最安全)
*_priv:各类权限字段,标记用户拥有的权限
三、用户管理核心操作
1. 创建用户
语法
sql
create user '用户名'@'登录主机' identified by '密码';
示例
sql
-- 创建仅本机登录的用户 whb,密码 12345678
create user 'whb'@'localhost' identified by '12345678';
常见问题:密码强度不足
报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
解决方法:
sql
-- 查看密码策略
SHOW VARIABLES LIKE 'validate_password%';
-- 临时降低密码策略(测试环境)
set global validate_password_policy=0;
set global validate_password_length=4;
安全提醒:不要创建 % 允许所有主机登录的用户,除非业务必需。
2. 删除用户
语法
sql
drop user '用户名'@'登录主机';
错误示范
sql
-- 错误:默认匹配 %,找不到用户
drop user whb;
正确示例
sql
-- 删除本机登录的 whb 用户
drop user 'whb'@'localhost';
3. 修改用户密码
① 用户修改自己的密码
sql
set password=password('新密码');
② root 修改其他用户密码
sql
set password for 'whb'@'localhost'=password('87654321');
四、MySQL 权限体系
MySQL 内置了完整的权限列表,覆盖库、表、视图、存储过程、服务器管理等维度。
常用权限速查
表格
权限作用作用范围SELECT查询数据表 / 视图INSERT插入数据表UPDATE更新数据表DELETE删除数据表CREATE创建库 / 表 / 索引库 / 表DROP删除库 / 表库 / 表ALTER修改表结构表INDEX创建索引表ALL PRIVILEGES所有权限任意对象
五、权限控制核心操作
1. 给用户授权
新创建的用户默认无任何权限,务必手动授权。
语法
sql
grant 权限列表 on 库.对象 to '用户名'@'登录主机' [identified by '密码'];
权限写法说明
- 单个权限:
grant select on ... - 多个权限:
grant select, insert, update on ... - 所有权限:
grant all privileges on ...
授权范围
*.*:所有库的所有对象库名.*:指定库下所有表 / 对象库名.表名:指定库的指定表
示例
sql
-- 给 whb 授予 test 库所有表的查询权限
grant select on test.* to 'whb'@'localhost';
-- 给 whb 授予 test 库所有权限
grant all privileges on test.* to 'whb'@'localhost';
2. 查看用户权限
sql
-- 查看指定用户权限
show grants for 'whb'@'localhost';
3. 权限不生效?刷新权限
授权后若未立即生效,执行:
sql
flush privileges;
4. 回收权限
语法
sql
revoke 权限列表 on 库.对象 from '用户名'@'登录主机';
示例
sql
-- 回收 whb 在 test 库的所有权限
revoke all on test.* from 'whb'@'localhost';
六、完整实操流程(一步一验)
1. root 登录,创建用户 sql
create user 'whb'@'localhost' identified by '12345678';
2. 授权 sql
grant select on test.* to 'whb'@'localhost';
flush privileges;
3. 新开终端,用 whb 登录 bash 运行
mysql -uwhb -p
4. 验证权限
- 可查看 test 库、可查询表数据
- 执行删除 / 插入会报错:权限不足
revoke all on test.* from 'whb'@'localhost';
6. 再次验证:test 库消失,无法访问
七、安全最佳实践
1. 禁止用 root 账号日常开发
2. host 尽量用具体 IP/localhost,不用 %
3. 权限最小化:能给查询就不给修改,能给单库就不给全库
4. 密码麻烦度要高,定期更换
5. 定期清理无用用户,回收闲置权限
6. 生产环境禁止随意 grant all
总结
MySQL 用户管理与权限控制是数据库安全的第一道防线。核心就三件事:
1. 创建专用用户,限定登录主机
2. 授予最小权限,按需分配
3. 及时回收 / 清理,保持权限合规
掌握本文所有命令,各位就能独立完成企业级 MySQL 用户权限维护,远离删库跑路风险。
就写这么多吧,内容比较基础,适合入门回顾。有补充的地方欢迎留言一起完善。
评论 (0)
暂无评论