【MySQL 数据库】MySQL用户管理

文章目录

  • 一、用户管理
    • [1.1 关于用户](#1.1 关于用户)
    • [1.2 创建用户](#1.2 创建用户)
    • [1.3 修改密码](#1.3 修改密码)
    • [1.4 删除用户](#1.4 删除用户)
  • 二、数据库权限
    • [2.1 关于权限](#2.1 关于权限)
    • [2.2 给用户权限](#2.2 给用户权限)
    • [2.3 移除用户权限](#2.3 移除用户权限)
  • 🚩总结

一、用户管理

如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。

1.1 关于用户

如果我们只能使用 root 用户,这样存在安全隐患。这时,就需要使用 MySQL 的用户管理 ------ 通过创建不同权限的普通用户,分配对应操作范围,既能满足业务需求,又能避免 root 权限泄露导致的风险。

MYSQL的账号管理以表形式构建管理,刚安装的时候,会默认创建一些库,这里面这个库叫mysql

库中的一个表叫user表

该表存储的是MySQL的用户相关信息

  • 用户名:用于身份识别,如 "Lihua""zhs";
  • 主机名:限制用户的登录来源,常见取值及含义如下:
  • localhost:仅允许从 MySQL 所在服务器本地登录(比如通过服务器终端登录);

%:允许从任意主机登录(包括本地和远程,适合需要远程连接的场景,如开发机连接服务器 MySQL);

具体 IP(如192.168.1.100):仅允许从指定 IP 地址登录(安全性最高,适合固定设备访问)。

1.2 创建用户

创建用户必须通过 root 用户 执行(普通用户无创建权限),完整步骤如下:

步骤 1:登录 root 用户

打开服务器终端或 MySQL 客户端,输入以下指令登录 root(需输入 root 密码):

cpp 复制代码
mysql -u root -p

若登录成功,会进入 MySQL 交互界面(显示 mysql> 提示符)。

步骤 2:执行创建用户指令

cpp 复制代码
CREATE USER '用户名'@'主机名' IDENTIFIED BY '用户密码';

步骤 3:验证用户是否创建成功

切换到 MySQL 系统数据库(存储用户信息的核心库),查询user表确认:

cpp 复制代码
-- 切换到mysql系统库
USE mysql;
-- 查询指定用户的信息(用户名和主机名需加引号)
SELECT user, host FROM user WHERE user = 'Lihua' AND host = '%';


1.3 修改密码

自己改自己密码

python 复制代码
set password=password('新的密码');

root用户修改指定用户的密码

python 复制代码
set password for '用户名'@'主机名'=password('新的密码');

是的,在 MySQL 8.0 及之后的版本中,PASSWORD() 函数已被正式移除,且不再推荐使用旧的密码设置方式。这是因为 MySQL 8.0 引入了更安全的默认认证插件(caching_sha2_password),同时对用户密码管理进行了规范化,推荐使用 ALTER USER 语句来修改密码。

MySQL 8.0 及以上版本修改密码的正确方式

  1. root 用户修改自己的密码
sql 复制代码
-- 方式1:使用 ALTER USER(推荐)
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

-- 方式2:如果当前已登录 root,可简化为
ALTER USER CURRENT_USER() IDENTIFIED BY '新密码';
  1. root 用户修改指定用户的密码
sql 复制代码
-- 语法:ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';
ALTER USER 'testuser'@'localhost' IDENTIFIED BY 'new_password123';

关键说明

  1. 主机名的重要性

    MySQL 用户是由 用户名 + 主机名 共同标识的(例如 'root'@'localhost' 表示只能从本地登录的 root,'root'@'%' 表示可从任意主机登录的 root)。修改时需明确用户对应的主机名(可通过 SELECT user, host FROM mysql.user; 查看)。

  2. 认证插件兼容问题

    如果旧版本用户使用 mysql_native_password 插件,修改密码时可指定插件(可选):

    sql 复制代码
    ALTER USER 'testuser'@'localhost' 
    IDENTIFIED WITH mysql_native_password BY 'new_password';
  3. 生效方式

    修改后通常立即生效,若未生效可执行 FLUSH PRIVILEGES; 刷新权限。

为什么移除 PASSWORD() 函数?

  • PASSWORD() 函数生成的密码哈希算法较旧(基于 SHA1),安全性较低。
  • MySQL 8.0 主推更安全的 caching_sha2_password 插件,其密码哈希生成逻辑不依赖 PASSWORD() 函数,因此移除该函数以强制使用更规范的 ALTER USER 语句管理密码。

1.4 删除用户


二、数据库权限

2.1 关于权限

权限 上下文
CREATE Create_priv 数据库、表或索引
DROP Drop_priv 数据库或表
GRANT OPTION Grant_priv 数据库、表或保存的程序
REFERENCES References_priv 数据库或表
ALTER Alter_priv
DELETE Delete_priv
INDEX Index_priv
INSERT Insert_priv
SELECT Select_priv
UPDATE Update_priv
CREATE VIEW Create_view_priv 视图
SHOW VIEW Show_view_priv 视图
ALTER ROUTINE Alter_routine_priv 保存的程序
CREATE ROUTINE Create_routine_priv 保存的程序
EXECUTE Execute_priv 保存的程序
FILE File_priv 服务器主机上的文件访问
CREATE TEMPORARY TABLES Create_tmp_table_priv 服务器管理
LOCK TABLES Lock_tables_priv 服务器管理
CREATE USER Create_user_priv 服务器管理
PROCESS Process_priv 服务器管理
RELOAD Reload_priv 服务器管理
REPLICATION CLIENT Repl_client_priv 服务器管理
REPLICATION SLAVE Repl_slave_priv 服务器管理
SHOW DATABASES Show_db_priv 服务器管理
SHUTDOWN Shutdown_priv 服务器管理
SUPER Super_priv 服务器管理

2.2 给用户权限

语法:

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

说明:

权限列表,多个权限用逗号分开

cpp 复制代码
 grant select on ...
 grant select, delete, create on ....
 grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限
  • *.*:代表本系统中的所有数据库的所有对象((表,视图,存储过程等)
  • 库.*:表示某个数据库中的所有数据对象(表,视图,存储过程等)
  • identified by可选。如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户

在root用户下创建用户Lihua:

然后,在root用户下创建一个库,插入一些数据:

python 复制代码
mysql> create database rootData;
Query OK, 1 row affected (0.02 sec)

mysql> use rootData;
Database changed
mysql> create table user(
    -> id int primary key,
    -> name varchar(20) not null
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> insert into user values(1, '张三');
Query OK, 1 row affected (0.03 sec)

mysql> insert into user values(2, '李四');
Query OK, 1 row affected (0.00 sec)

插入数据后,然后我们给Lihua权限

这时我们登录Lihua用户

一开始登录授权前:

  1. 第一次查询结果(初始状态)
sql 复制代码
+-----------------------------------+
| Grants for Lihua@%                |
+-----------------------------------+
| GRANT USAGE ON *.* TO `Lihua`@`%` |
+-----------------------------------+
  • GRANT USAGE ON *.*USAGE 是 MySQL 中的一种"默认空权限",表示该用户可以登录 MySQL 服务器,但没有任何实际操作权限(不能查询、创建、修改任何数据库/表)。
  • ON *.**.* 表示"所有数据库.所有表",但结合 USAGE 来看,这里仅表示"权限范围覆盖所有库表",但实际没有权限。
  1. 第二次查询结果(授权后)
sql 复制代码
+-----------------------------------------------------+
| Grants for Lihua@%                                  |
+-----------------------------------------------------+
| GRANT USAGE ON *.* TO `Lihua`@`%`                   |
| GRANT ALL PRIVILEGES ON `rootData`.* TO `Lihua`@`%` |
+-----------------------------------------------------+
  • 新增了一行 GRANT ALL PRIVILEGES ON rootData.* TO Lihua@%`:
    • ALL PRIVILEGES:表示授予所有可用权限(包括 SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、ALTER 等)。
    • ON rootData.*:权限范围限定在 rootData 数据库下的所有表(rootData.* 表示"rootData 数据库中的所有表")。

总结

  • 授权前,Lihua 只能登录 MySQL,但看不到 rootData 数据库,也不能对任何数据进行操作。
  • 授权后,Lihua 除了能登录外,还可以对 rootData 数据库执行所有操作(例如查询 user 表、插入数据、修改表结构等),但对其他数据库(如 db1test1 等)仍无权限。

此时用 Lihua 登录后,执行 show databases; 会看到 rootData 数据库,且能正常操作其中的表。

2.3 移除用户权限

语法:

cpp 复制代码
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';


cpp 复制代码
mysql> REVOKE ALL PRIVILEGES ON rootData.* FROM 'Lihua'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> 

🚩总结

一、用户管理指令

操作 语法 示例 说明
创建用户 CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; CREATE USER 'Lihua'@'%' IDENTIFIED BY '123456'; %表示允许从任意主机登录,localhost仅允许本地登录
删除用户 DROP USER '用户名'@'主机名'; DROP USER 'zhs'@'%'; 删除指定用户(需root权限)
查看所有用户信息 USE mysql; SELECT user, host, authentication_string FROM user; - 需先切换到mysql系统数据库,查看用户、主机和密码哈希

二、权限授予指令
基本语法GRANT 权限 ON 范围 TO '用户名'@'主机名';

(需root权限执行,授予后建议执行FLUSH PRIVILEGES;刷新权限)

权限范围 示例指令 说明
全局权限(所有库表) GRANT ALL PRIVILEGES ON *.* TO 'Lihua'@'%'; 授予对所有数据库、所有表的全部权限
数据库级权限 GRANT ALL PRIVILEGES ON rootData.* TO 'Lihua'@'%'; 授予对rootData数据库所有表的全部权限
表级权限 GRANT INSERT, SELECT ON rootData.user TO 'Lihua'@'%'; 仅授予对rootData.user表的插入和查询权限
单个权限(如查看数据库) GRANT SHOW DATABASES ON *.* TO 'Lihua'@'%'; 允许用户执行show databases;

三、权限撤销指令
基本语法REVOKE 权限 ON 范围 FROM '用户名'@'主机名';

(核心注意:撤销的范围必须与授予时完全一致,否则会报错)

场景 示例指令 说明
撤销数据库级全部权限 REVOKE ALL PRIVILEGES ON rootData.* FROM 'Lihua'@'%'; 对应之前授予的rootData.*权限
撤销数据库级单个权限(如插入) REVOKE INSERT ON rootData.* FROM 'Lihua'@'%'; 撤销对rootData数据库所有表的插入权限
撤销表级权限 REVOKE ALL PRIVILEGES ON rootData.user FROM 'Lihua'@'%'; 需先单独授予过rootData.user表级权限,否则报错

四、权限查看指令

操作 语法 示例 说明
查看用户当前权限 SHOW GRANTS FOR '用户名'@'主机名'; SHOW GRANTS FOR 'Lihua'@'%'; 显示用户拥有的所有权限及范围

五、常见错误及原因

  1. ERROR 1064(语法错误)

    REVOKE INSERT rootData.user ...缺少ON关键字,正确应为REVOKE INSERT ON rootData.user ...

  2. ERROR 1147(无对应权限定义)

    撤销的范围与授予时不一致(如授予的是rootData.*,却试图撤销rootData.user),需保证范围完全匹配。

  3. ERROR 1142(权限不足)

    普通用户(如Lihua)试图执行GRANTREVOKE,此类操作需root或拥有GRANT OPTION权限的用户执行。

  4. USAGE权限

    新用户默认仅有USAGE权限(仅能登录,无实际操作权限),需手动授予具体权限。


相关推荐
代码不停4 小时前
JavaEE初级 多线程案例(单例模式、阻塞队列、线程池、定时器)
java·开发语言·单例模式·java-ee
小莞尔4 小时前
【51单片机】【protues仿真】基于51单片机火灾报警控制系统
c语言·单片机·嵌入式硬件·物联网·51单片机
kkkkk0211064 小时前
Redis八股
数据库·redis·缓存
黄毛火烧雪下4 小时前
(二)Flutter插件之Android插件开发
android·flutter
2501_916007475 小时前
iOS 上架技术支持全流程解析,从签名配置到使用 开心上架 的实战经验分享
android·macos·ios·小程序·uni-app·cocoa·iphone
Yeats_Liao5 小时前
Go Web 编程快速入门 01 - 环境准备与第一个 Web 应用
开发语言·前端·golang
卓码软件测评5 小时前
第三方CMA软件测试机构:页面JavaScript动态渲染生成内容对网站SEO的影响
开发语言·前端·javascript·ecmascript
*才华有限公司*5 小时前
《爬虫进阶之路:从模拟浏览器到破解动态加载的实战指南》
开发语言·python
Liu1bo5 小时前
【MySQL】表的约束
linux·数据库·mysql