【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权限(仅能登录,无实际操作权限),需手动授予具体权限。


相关推荐
YOU OU4 小时前
Redis基础常识与命令
数据库·redis·缓存
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
Database_Cool_6 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
爱写代码的阿森6 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
Database_Cool_7 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql