15--MySQL用户管理
一.为什么要有用户管理
如果我们只能使用root账户,那么就会存在很大的安全隐患,这时候就需要MySQL的用户管理
二.用户账号
结构
MySQL 用户账户由用户名和主机名两部分组成,格式为 'username'@'hostname'
用户名:识别用户的名称
主机名:指定用户可以从哪个主机连接
特别强调:用户账号必须包含这两部分,缺一不可,表示哪个用户,从哪个机器连接
补充
- 可以使用
%
作为通配符表示任意主机 localhost
表示本地连接- 特定 IP 地址或域名
一般情况不要使用'%',因为这就导致任何主机都可以访问我们的数据库,风险十分大
localhost和127.0.0.1虽然都是本地主机,但是二者有本质区别,不能认为都是本机连接
localhost 通过 Unix 域套接字(Socket) 连接(Linux/macOS)或命名管道(Windows)
MySQL 视为本地专用连接
127.0.0.1 通过 TCP/IP 协议 连接本地回环地址
MySQL 视为远程连接(即使 IP 是本地)
三.用户信息
这是MySQL自动创建的database

字段介绍
因为用户密码不能明文保存,只能加密后存起来
可以看到不管密码长度是多少,生成的字符串长度都是一样的,同时我们在命令行中查询历史命令时时不会出现password命令的,原因是涉及到密码的都不会保存历史命令
四.常见用户管理操作
创建用户
语法
create user '用户名'@'登陆主机/ip' identified by '密码';
--创建可以从任意主机连接的用户
CREATE USER 'user_name'@'%' IDENTIFIED BY 'secure_password';
补充
如果我们之前使用了--skip-grant-tables模式,也就是MySQL跳过密码验证登录,那么就无法创建用户和修改密码等操作,这时我们就要先退出MySQL,找到MySQL的配置表并且将--skip-grant-tables注释掉
声明:如果我们在之前一直是免密码登录,那么先不要着急修改配置表,先设置root用户的密码
USE mysql;
UPDATE user SET authentication_string=PASSWORD('新密码') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES; --刷新权限缓存
最后一行是刷新操作,我们在用户管理这块会经常用到这个操作
设置好root密码之后再进行修改配置表操作
vim /etc/my.cnf
光标指的这一行前加# 即可
当修改了配置文件后,一定要重启MySQL服务才会生效
sudo systemctl restart mysqld
最后介绍一下这个模式,前面我们使用这个模式用来跳过用户操作,这不是这个模式的正确用法
--skip-grant-tables
是MySQL的特殊启动模式,用于:
- 紧急维护(如修复损坏的权限表)
- 忘记root密码时重置密码
- 此时所有用户管理操作都会被禁止
可以看到我们在user表中添加了我们新建用户的信息,我们就可以使用这个用户登录MySQL了
--备注:可能实际在设置密码的时候,因为mysql本身的认证等级比较高,一些简单的密码无法设置,会爆出如下报错:
-- ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
-- 解决方案:Your password does not satisfy the current policy requirements-CSDN博客
--查看密码设置相关要求:SHOW VARIABLES LIKE 'validate_password%';
修改用户密码
1.root用户修改其他用户的密码
set password for '用户名'@'主机名'=password('新的密码');
2.自己修改自己的密码
set password=password('新的密码');
3.root用户忘记密码
按照上面讲的修改配置文件,将--skip-grant-tables恢复免密码登录,再重新启动MySQL,接着就是修改root用户的密码
--更改配置文件
vim /etc/my.cnf
--重新启动MySQL
sudo systemctl restart mysqld
--修改root账户密码
USE mysql;
UPDATE user SET authentication_string=PASSWORD('新密码') WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES; --刷新权限缓存
--退出重新登录即可
删除用户
语法
DROP USER '用户名'@'主机';
用户权限
MySQL权限列表
给用户授权
新创建的用户是没有权限的,需要给用户授权
语法
GRANT 权限类型 ON 数据库.表 TO '用户名'@'主机' [identifiedby'密码'];
这里的对象指的是表,视图,存储过程等
ALL PRIVILEGES
:所有权限。SELECT, INSERT, UPDATE, DELETE
:数据操作。CREATE, ALTER, DROP
:结构修改。GRANT OPTION
:允许用户授权给其他用户。
这样该用户就有了MySQL中所有表的所有权限
补充
权限列表,多个权限用' , '隔开,如select,update,create
授权后如果权限没有生效,可以刷新一下权限列表
flush privileges;
回收权限
语法
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
查看用户权限
SHOW GRANTS FOR '用户名'@'主机';