前面章节的操作都是通过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 语句为用户授予权限和回收权限。