【MYSQL】用户管理--详解

引言:

用户管理

一.用户

1.用户信息

MySQL中的用户,都存储在系统数据库mysql的user表中

可以通过desc user初步查看一下表结构

字段解释:

host : 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆

user: 用户名

authentication_string: 用户密码通过password函数加密后的

*_priv: 用户拥有的权限


2.创建用户

语法:

sql 复制代码
create user '用户名'@'登陆主机/ip' identified by '密码';

会发现新增用户hjq

此时便可以使用新账号新密码进行登陆啦

  • 备注:可能实际在设置密码的时候,因为mysql本身的认证等级比较高,一些简单的密码无法设置,会爆出如下报错:
  • ERROR 1819 (HY000): Your password does not satisfy the current policy****requirements

解决方法:先刷新一下权限表,然后再试一次:

flush privileges;


解决MySQL安装后因密码策略导致的自定义密码设置失败问题,通过调整密码强度等级及长度,实现简单密码设置。这个博客供大家学习

https://blog.csdn.net/zhanaolu4821/article/details/93622812


查看密码设置相关要求:SHOW VARIABLES LIKE 'validate_password%';
这个大家下来自己玩玩

关于新增用户这里,需要大家注意,不要轻易添加一个可以从任意地方登陆的user。(注意安全问题的发生)


3.删除用户

语法:

sql 复制代码
drop user '用户名'@'主机名'

4.修改用户密码

语法:

  • 自己改自己密码
sql 复制代码
set password=password('新的密码');

这个是mysql8.0的结果

原因:

这个错误是因为 MySQL 8.0 已经移除了 PASSWORD() 函数 ,并且 SET PASSWORD 的语法也发生了变化。

  • MySQL 5.7 及更早 :支持 SET PASSWORD = PASSWORD('123456');

  • MySQL 8.0 :移除了 PASSWORD() 函数,必须使用新语法

解决方案(MySQL 8.0)

方法1:使用 ALTER USER

sql 复制代码
-- 修改当前用户的密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

-- 或者指定完整用户(如果 root 可以从任意主机连接)
ALTER USER 'root'@'%' IDENTIFIED BY '123456';

方法2:使用 SET PASSWORD 新语法

sql 复制代码
-- MySQL 8.0 的正确写法(不推荐,但可用)
SET PASSWORD FOR 'root'@'localhost' = '123456';

-- 或者修改当前用户
SET PASSWORD = '123456';

试试mysql5.7的结果,这个可以跑通


  • root用户修改指定用户的密码
sql 复制代码
mysql8.0的方法
-- 不需要 PASSWORD() 函数,直接写字符串
SET PASSWORD FOR 'hjq'@'localhost' = '87654321';

mysql5.7的使用方法
set password for '用户名'@'主机名'=password('新的密码');

注意:关于有关密码的命令行,MySQL 不会记录下来,因此上下翻找不到。

核心原因:安全防护

这是 MySQL 客户端一个刻意设计的安全特性,而不是 Bug。

当你在 mysql 命令行中输入 IDENTIFIED BY '密码'PASSWORD('密码') 时,MySQL 客户端会检测到这些是敏感信息。为了避免密码泄露(例如其他用户查看历史记录、系统日志记录、屏幕录像等),客户端会跳过 将这些行写入历史文件(如 ~/.mysql_history)。

二.数据库的权限

MySQL数据库提供的权限列表:

1. 给用户授权

  • 刚创建的用户没有任何权限。需要给用户授权。

语法:

sql 复制代码
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']

说明:

  1. 权限列表,多个权限用逗号分开
  • grant select on ...
  • grant select, delete, create on ....
  • grant all privileges on ... -- 表示赋予该用户在该对象上的所有权限

2.*.* : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)

3.库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)

4.identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户

这个错误是因为 MySQL 8.0 中 GRANT 命令不能再隐式创建用户

错误原因

在 MySQL 8.0 之前,如果 GRANT 指定的用户不存在,MySQL 会自动创建该用户。但 MySQL 8.0 移除了这个特性,必须先显式创建用户,再授予权限。

解决方案

方法1:先创建用户,再授权

sql 复制代码
-- 第一步:创建用户
CREATE USER 'zhangsan'@'%' IDENTIFIED BY '你的密码';

-- 第二步:授予权限
GRANT ALL ON rootDB.user TO 'zhangsan'@'%';

-- 第三步:刷新权限(可选)
FLUSH PRIVILEGES;

方法2:一条语句创建并授权(MySQL 8.0.20+)

sql 复制代码
-- 使用 CREATE USER 并同时授权(需要密码)
CREATE USER 'zhangsan'@'%' IDENTIFIED BY 'password'
WITH GRANT OPTION;
GRANT ALL ON rootDB.user TO 'zhangsan'@'%';

完整操作示例

sql 复制代码
-- 1. 创建用户(假设密码设为 '123456')
CREATE USER 'zhangsan'@'%' IDENTIFIED BY '123456';

-- 2. 授予 rootDB.user 表的所有权限
GRANT ALL ON rootDB.user TO 'zhangsan'@'%';

-- 3. 验证权限
SHOW GRANTS FOR 'zhangsan'@'%';

-- 4. 测试连接(另开终端)
-- mysql -u zhangsan -p -h 你的服务器IP

终端A:(使用root账号)

在mysql5.7上直接输入结果如下:


终端B:(使用zhangsan账号)


在 MySQL 8.0 中,root 用户默认只有 'root'@'localhost',没有 'root'@'%'(允许任何主机连接的 root 用户)。

注意:如果发现赋权限后,没有生效,执行如下指令:

flush privileges;(刷新权限)


2.回收权限

语法:

sql 复制代码
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
  • 终端A(root)
  • 终端B(zhangsan)

这里的插入权限没有了,不能插入

3.补充:

localhost 的区别在于:允许从什么地方连接到 MySQL 服务器

核心区别

主机名 允许连接的位置 典型场景
localhost 只能本机连接 服务器上的程序、本机命令行
% 任何地方都能连接 你的笔记本电脑、其他服务器、远程应用

理解记忆:

把 MySQL 服务器想象成一栋大楼:

  • localhost = 只能从大楼内部的员工通道进入

  • % = 从大楼外部的任何门都能进(北京、上海、纽约...)

sql 复制代码
用户 'zhangsan'@'localhost'
  可以连接(在服务器本机上)
mysql -u zhangsan -p -h 127.0.0.1
mysql -u zhangsan -p -h localhost

  不能连接(在你的笔记本电脑上)
mysql -u zhangsan -p -h 122.51.13.82
用户 'zhangsan'@'%'​​​​​​​
 可以连接(任何地方)
mysql -u zhangsan -p -h 127.0.0.1        # 本机
mysql -u zhangsan -p -h 122.51.13.82     # 远程
mysql -u zhangsan -p -h 你的公网IP        # 其他网络
复制代码
为什么要有两个?

原因安全考虑

用户 安全风险 适用场景
'root'@'localhost' 低(只能本机连) 管理员维护
'root'@'%' 高(全世界都能试密码) 强烈不推荐
'app'@'localhost' 服务器上的本地程序
'app'@'192.168.1.%' 只允许内网连接
'app'@'%' 中高 需要远程访问的应用
相关推荐
倔强的石头1061 小时前
《Kingbase护城河》——跨平台环境下的数据库联调实战
数据库
曹牧9 小时前
Oracle:前缀匹配之REGEXP_LIKE
数据库·oracle
暴躁小师兄数据学院11 小时前
【AI大数据工程师特训笔记】第05讲:关联查询
数据库·sql·oracle
倔强的石头_12 小时前
《Kingbase护城河》——跨平台环境下的数据库联调实战
数据库
lzhdim12 小时前
SQL 入门 17:MySQL 数据类型:从字符串到 JSON 的全面解析
数据库·sql·mysql·json
骄马之死12 小时前
MySQL-InnoDB 核心原理
mysql
杨云龙UP12 小时前
Oracle RAC / ODA 生产环境指定 PDB 启动 SOP
linux·运维·数据库·oracle
kingwebo'sZone12 小时前
在Cent上安装Mysql 8.0的遇到的问题和解决办法
数据库·mysql·adb
幽络源小助理12 小时前
最新知识付费系统网站源码 PC+H5双端 附安装教程 – 幽络源源码网
大数据·数据库