【MySQL 数据库】用户管理与权限控制

在 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 登录(最安全)
  • user:用户名
  • authentication_string:密码加密后的值(MySQL 不存储明文密码)
  • *_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 库、可查询表数据
    • 执行删除 / 插入会报错:权限不足
  5. 回收权限

    sql

    复制代码
    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 用户权限维护,远离删库跑路风险。

相关推荐
Tsuki_tl2 分钟前
【总结】Redis五大数据类型应用场景及基本命令
数据库·redis·后端·缓存·缓存中间件·redis命令·redis 五大数据类型
Gauss松鼠会3 分钟前
GaussDB 整体架构解析
运维·服务器·网络·数据库·sql·架构·gaussdb
系统集成-鹰翔8 分钟前
ERP对接升级提示数据库迁移失败:SQLite逐版本事务到底回滚到哪一步
javascript·数据库·经验分享·后端
西瓜拿铁好喝9 分钟前
开源和闭源 AI 办公工具,分别适合谁
java·前端·数据库
一技安身10 分钟前
MySQL 8.4.13 LTS 通用二进制包(Linux免安装版)完整教程
linux·mysql·adb
代码派19 分钟前
业务不停机迁移 MySQL 到 TiDB,NineData 数据增量同步实操演示
数据库·mysql·tidb·ninedata·无停机迁移·增量迁移·全量迁移
Gauss松鼠会23 分钟前
GaussDB 中 gsql 与 DBeaver(JDBC)客户端工具查询时间不一致:原因、排查与处理
运维·服务器·数据库·sql·gaussdb·经验总结
Elastic 中国社区官方博客28 分钟前
基于 Jina OCR v1 与 Elasticsearch 的 PDF 智能混合检索与 RAG 系统实战指南
大数据·数据库·elasticsearch·搜索引擎·ocr·jina
我不会起名字32235 分钟前
MySQL 8.0 迁移后 SQL 变慢:执行计划里 3 类被忽略的成本差异
mysql·explain·执行计划·索引下推·成本模型
楚识科技35 分钟前
信创环境下 OCR 部署实践:从麒麟系统到达梦数据库的全栈适配
数据库·ocr