MySQL 用户与权限

前面章节的操作都是通过root(超级管理员)登录数据库进行相关操作。在实际工作环境中,为了保证数据库的安全,数据库管理员需要对操作数据库的人员分配用户、密码以及可操作的权限范围

  • 区分登录账号:不同人用不同账号登录数据库

  • 分配操作权限:谁能查、谁能改、谁能删、谁只能看

在安装MySQL时,系统会自动安装一个名为mysql的数据库,该数据库主要用于维护数据库的用户以及权限控制和管理。MySQL中所有用户信息都保存在mysql.user数据表里。

复制代码
desc mysql.user;

查看用户信息:

复制代码
select * from mysql.user;

这个表存储了所有全局级别的权限、加密后的密码以及用户标识.在 MySQL 中,用户确实就是数据

  • 用户管理本质上就是在user表里做增加删除修改

  • 在mysql内部给用户开账号,就是把用户的用户名,允许从哪里登录,以及用户的密码信息放在mysql中的user表里。

  • 但是我们不使用insert语句来修改user表,直接操作user表会面临加密、同步方面的问题

创建用户

由于MySQL中所有用户信息全保存在mysql.user表中 ,因此创建用户可以直接利用root用户登录MySQL服务器后,向user表中插入记录。利用MySQL提供的create user和grant语句创建用户,其中grant语句在创建用户时还可以完成权限的设置。

使用create user语句每创建一个新用户,都会在mysql.user表中添加一条记录,同时服务器会自动修改相应的授权表;但是该语句创建的新用户默认没有任何权限,需要使用grant进行授权。

复制代码
CREATE USER '用户名'@'主机ip' IDENTIFIED BY '密码';
  • 账户名是由"用户名@主机地址"构成的

  • 主机地址:限制用户从哪里登录,localhost表示数据库本机登录,%表示任意远程主机

  • 密码:设置用户密码,会被哈希加密保存到user表中

创建一个允许远程访问的开发账号:

复制代码
create user 'app_user'@'%' identified by 'AppPassword@2026';

创建用户后需要刷新权限:

复制代码
flush privileges;

指定密码加密方式:

复制代码
CREATE USER 'legacy_user'@'%' 
IDENTIFIED WITH mysql_native_password BY 'password123';
  • 用户名和主机名两边的单引号' ' 在标准 SQL 中是必须的

  • 虽然 SQL 关键字不分大小写,但在某些操作系统下,MySQL 的用户名是区分大小写的

  • 有时候弱密码会报错,说明你的密码太简单了,需要加特殊符号、数字和大小写字母

设置密码

在MySQL中对用户进行管理时,除了创建用户的同时设置密码外,还可以为没有密码的用户设置密码、密码过期的用户或指定用户修改密码。

修改指定账户的密码(需要管理员权限):

复制代码
ALTER USER 'username'@'localhost' IDENTIFIED BY '新密码';

修改当前用户的密码:

若当前通过客户端连接MySQL服务器的用户是非匿名用户,则可以使用user()函数更改自己的密码(user()函数获取的是客户端提供的用户和主机地址

复制代码
ALTER USER USER() IDENTIFIED BY '新密码';

管理员模式可以使用:

复制代码
SET PASSWORD FOR '用户名'@'%' = '新密码';

用户自己修改自己的密码:

复制代码
SET PASSWORD = '新密码';

删除用户

复制代码
DROP USER [if exists]'用户名'@'主机名';

如果不添加if exists关键字,当删除了一个不存在的用户时,该语句会发生错误;在删除用户时,如果省略主机地址,则默认为%。

值得一提的是,当drop user删除当前正在打开的用户时,该用户的会话不会被自动关闭,只有在该用户会话关闭后,删除操作才生效。

数据库权限

MySQL中的权限信息根据其作用范围,分别存储在mysql数据库的不同数据表中,当MySQL启动时会自动加载这些权限信息,并将这些权限信息读取到内存中。

  • user:保存用户的全局权限

  • db:保存用户的数据库权限

  • tables_priv:保存用户的表权限

  • columns_priv:保存用户的列权限

  • procs_priv:保存用户的存储过程权限

MySQL提供的常见权限:

权限大类 权限名称 核心作用 权限级别
基础数据操作权限 SELECT 读取 / 查询数据库中的数据 全局、数据库、表、列
INSERT 向数据表中插入 / 新增数据 全局、数据库、表、列
UPDATE 修改 / 更新数据表中已有的数据 全局、数据库、表、列
DELETE 删除数据表中的数据 全局、数据库、表
库表结构管理权限 CREATE 创建新的数据库、数据表、视图等对象 全局、数据库、表
ALTER 修改已有数据表的结构(新增 / 修改字段、调整索引等) 全局、数据库、表
DROP 删除数据库、数据表、视图等对象 全局、数据库、表
INDEX 创建、修改、删除数据表的索引 全局、数据库、表
CREATE VIEW 创建 / 删除视图 全局、数据库、表
高级系统管理权限 ALL PRIVILEGES 拥有 MySQL 的所有权限(最高权限) 全局、数据库、表、列
GRANT OPTION 将自己拥有的权限,授权给其他用户 全局、数据库、表、列、存储过程、代理
PROCESS 查看 MySQL 服务器的所有进程、执行中的 SQL 语句 全局
SHUTDOWN 关闭 MySQL 服务器 全局
RELOAD 刷新 MySQL 的权限、配置、缓存等flush操作 全局

权限级别就是权限可以被应用在哪些数据库的内容中,例如select权限可以被授予到全局(任意数据库下的任意内容)、数据库(指定数据库下的任意内容)、表(指定数据库下的指定表)、列(指定数据库下的指定数据表中的指定字段)

给用户授权

想要使用grant语句为用户授权,必须要拥有grant option权限。

复制代码
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';

权限列表:多个权限用逗号分隔

复制代码
GRANT INSERT, UPDATE ON goods.services TO 'op_user'@'%';

用户op_user对goods数据库中的services表有插入、修改的权限。

  • *.*:全局权限

  • dbname.*:数据库级权限

  • dbname.tablename:表级权限

更新权限:

复制代码
FLUSH PRIVILEGES;

查看用户权限:

复制代码
show grants for 'op_user'@'%'

回收权限

在MySQL中,为了保证数据库的安全,需要将用户不必要的权限回收。MySQL专门提供revoke语句用于回收指定用户的权限

复制代码
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

回收单个权限:

复制代码
revoke insert(name,price) on shop.goods from 'test1'@'%'

一次性回收所有权限:

复制代码
REVOKE ALL PRIVILEGES ON goods.* FROM 'dev_user'@'%';

总结

  • 用户管理:MySQL 通过 user 表管理用户信息。

  • 创建用户:使用 create user 语句创建用户。

  • 删除用户:使用 drop user 语句删除用户。

  • 修改密码:使用 set password 语句修改用户密码。

  • 权限管理:使用 grant 和 revoke 语句为用户授予权限和回收权限。

相关推荐
無限進步D4 小时前
MySQL 排序与分页
数据库·mysql
大G的笔记本5 小时前
Redis 分布式锁自动续期机制
数据库·redis·分布式
Solis程序员5 小时前
跳出 CRUD:深入剖析 Redis 管道 Pipeline 底层通信机制
数据库·redis·缓存
夏贰四5 小时前
数据转换分哪些应用类型?数据转换如何做好规范管控?
大数据·数据库·数据转换
我科绝伦(Huanhuan Zhou)5 小时前
KingbaseES 数据库智能巡检工具
数据库
这个DBA有点耶6 小时前
2026下半年数据库趋势:多模、云原生、AI融合
数据库·人工智能·云原生
唐青枫6 小时前
别只会写 IF:MySQL CASE WHEN 条件判断实战详解
sql·mysql
l1t6 小时前
DeepSeek总结的从 Crunchy PGO 迁移到使用 CloudNativePG 管理的 PostgreSQL 18
数据库·postgresql
夜雪闻竹6 小时前
Claude Code 对话自动导入完全指南
数据库·数据挖掘·copilot