
文章目录
- 一、用户管理
-
- [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 及以上版本修改密码的正确方式
- root 用户修改自己的密码
sql
-- 方式1:使用 ALTER USER(推荐)
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
-- 方式2:如果当前已登录 root,可简化为
ALTER USER CURRENT_USER() IDENTIFIED BY '新密码';
- root 用户修改指定用户的密码
sql
-- 语法:ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';
ALTER USER 'testuser'@'localhost' IDENTIFIED BY 'new_password123';
关键说明
-
主机名的重要性 :
MySQL 用户是由
用户名
+主机名
共同标识的(例如'root'@'localhost'
表示只能从本地登录的 root,'root'@'%'
表示可从任意主机登录的 root)。修改时需明确用户对应的主机名(可通过SELECT user, host FROM mysql.user;
查看)。 -
认证插件兼容问题 :
如果旧版本用户使用
mysql_native_password
插件,修改密码时可指定插件(可选):sqlALTER USER 'testuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
-
生效方式 :
修改后通常立即生效,若未生效可执行
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用户
一开始登录授权前:
- 第一次查询结果(初始状态)
sql
+-----------------------------------+
| Grants for Lihua@% |
+-----------------------------------+
| GRANT USAGE ON *.* TO `Lihua`@`%` |
+-----------------------------------+
GRANT USAGE ON *.*
:USAGE
是 MySQL 中的一种"默认空权限",表示该用户可以登录 MySQL 服务器,但没有任何实际操作权限(不能查询、创建、修改任何数据库/表)。ON *.*
:*.*
表示"所有数据库.所有表",但结合USAGE
来看,这里仅表示"权限范围覆盖所有库表",但实际没有权限。
- 第二次查询结果(授权后)
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
表、插入数据、修改表结构等),但对其他数据库(如db1
、test1
等)仍无权限。
此时用 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'@'%'; |
显示用户拥有的所有权限及范围 |
五、常见错误及原因
-
ERROR 1064
(语法错误) :如
REVOKE INSERT rootData.user ...
缺少ON
关键字,正确应为REVOKE INSERT ON rootData.user ...
。 -
ERROR 1147
(无对应权限定义) :撤销的范围与授予时不一致(如授予的是
rootData.*
,却试图撤销rootData.user
),需保证范围完全匹配。 -
ERROR 1142
(权限不足) :普通用户(如Lihua)试图执行
GRANT
或REVOKE
,此类操作需root或拥有GRANT OPTION
权限的用户执行。 -
USAGE
权限 :新用户默认仅有
USAGE
权限(仅能登录,无实际操作权限),需手动授予具体权限。
