13-MySQL用户管理
💬 :如果你在阅读过程中有任何疑问或想要进一步探讨的内容,欢迎在评论区畅所欲言!我们一起学习、共同成长~!
👍 :如果你觉得这篇文章还不错,不妨顺手点个赞、加入收藏,并分享给更多的朋友噢~!
1. 引言
在 MySQL 使用中,直接使用root用户存在严重安全隐患 ——root拥有所有数据库的操作权限,若被滥用或泄露,可能导致数据丢失、篡改等风险。例如,假如张三只能操纵mytest库,李四只能操纵msg库,若给他们root账户,两人可操作所有库,风险极高。因此,MySQL 用户管理(创建用户、分配权限、密码维护等)是 C++ 面试 / 笔试的高频基础考点。C++ 开发中连接 MySQL 时,需创建仅含必要权限的用户,而非直接使用root。
2. MySQL 用户核心操作
2.1 查看用户信息
- 面试高频基础题:“MySQL 用户信息存在哪里?”
答:MySQL 的所有用户信息均存储在系统数据库mysql的user表中。 - 本章所有操作在mysql库中进行。
 
-- 1. 切换到mysql系统数据库
use mysql;-- 2. 查询关键字段
select host, user, authentication_string from user;
-- desc user;查看user表完整结构


| 关键字段 | 含义 | 
|---|---|
host | 用户允许登录的主机或IP 。localhost表示仅本机登录,%表示任意主机登录。 | 
user | 用户名 | 
authentication_string | 用户加密密码(通过password()函数加密后的字符串) | 
..._priv | 用户权限(如Select_priv表示查询权限,Create_priv表示创建权限) | 
2.2 用户创建
2.2.1 创建语法与实战案例
create user '用户名'@'允许登录的主机/IP' identified by '密码';- 面试必考题:“如何创建一个仅能在本机登录的 MySQL 用户?”
 
案例如下:

查询结果中新增一行:| lyl1 | localhost | *84AAC12F54AB666ECFC2A83C676908C8BBC381B1 |,表示用户创建成功,可使用用户名或密码在本机登录。
2.2.2 密码策略问题与注意事项
创建用户时常见问题是出现这样的报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
这是 MySQL 默认密码策略导致的,面试可能问 “如何解决密码不满足策略的问题?”
(1)查看密码策略:show variables like 'validate_password%';(无需深研,了解即可)
(2)按策略要求设置复杂密码。
- 核心注意事项:禁止随意创建
host为%的用户(%表示任意主机可登录,极大增加安全风险),C++ 开发中需根据程序部署位置指定固定主机。 
2.3 密码修改
2.3.1 自我修改与 root 代改
密码修改分两种场景,面试需区分清楚:
用户自我修改密码(当前登录用户修改自己的密码):
set password = password('新密码');root 用户修改其他用户密码(需指定目标用户的
host):set password for '用户名'@'允许登录的主机/IP'=password('新密码');案例:root修改'lyl1'@'localhost'的密码为'87654321'
set password for 'lyl1'@'localhost'=password('87654321');-- 验证密码已更新(authentication_string字段值变化) select host,user,authentication_string from user;
注意:password()函数用于加密密码,确保存储在user表中的是密文(安全考点)。
2.4 用户删除
2.4.1 常见错误操作与正确操作
删除用户的面试高频易错点:必须指定host(允许登录的主机/IP),否则 MySQL 默认按'用户名'@'%'查找,若不存在该用户则报错。
错误操作:仅写用户名,未指定host
drop user lyl1;正确操作:明确指定host(与创建时的host一致)
drop user 'lyl1'@'localhost';-- 验证删除结果
select user,host,authentication_string from user;3. MySQL 权限管理
新创建的用户默认无任何权限,需通过 “授权” 赋予操作能力;若权限过度,需 “回收”。权限管理是 C++ 开发的核心(如 C++ 程序若仅需查询test库,就只给select权限)。
3.1 常用权限与场景
| 权限 | 作用场景 | 适用上下文(库 / 表) | 
|---|---|---|
select | 查询表数据(如 C++ 程序读取 MySQL 数据) | 数据库、表 | 
insert | 插入数据(如 C++ 程序写入数据到表) | 表 | 
| update | 修改表数据(如 C++ 程序更新用户信息) | 表 | 
| delete | 删除表数据(如 C++ 程序删除过期记录) | 表 | 
create | 创建数据库 / 表(如初始化程序创建表) | 数据库、表 | 
| drop | 删除数据库 / 表(谨慎赋予) | 数据库、表 | 
all privileges | 所有权限(非root慎用) | 数据库、表 | 
3.2 授权操作
3.2.1 授权语法与案例验证
授权核心语法(面试必背):
grant 权限列表 on 库.对象名 to '用户名'@'登录位置' [identified by '密码'];
权限列表:多个权限用逗号分隔(如select,insert),或用all表示所有权限;库.对象名:*.*表示所有库所有表,test.*表示test库所有表(常用),test.account表示test库的account表;identified by(可选):若用户已存在,可同时修改密码;若用户不存在,相当于 “创建用户 + 授权”。
实战案例(给lyl2赋予test3库的select权限):
(1)在当前root用户登录的终端创建用户lyl2:

(2)Win+R进入cmd打开新终端,通过mysql -u lyl2 -p登录lyl2用户,然后查看未授权前lyl2的权限:

(3)root 用户终端授权:

(4)lyl2用户终端查看授权后lyl2的权限并验证:

执行未授权的权限会报错:

3.2.2 查看用户权限
查看用户已拥有的权限(面试常用操作):
show grants for '用户名'@'登录的主机/IP';查看root权限(root拥有所有权限):
show grants for 'root'@'登录的主机/IP';
ALL PRIVILEGES :所有操作权限。
PROXY :代理权限,即可以代操作其他用户权限。
3.3 权限回收
3.3.1 回收语法与生效验证
若用户权限过大,需回收多余权限,核心语法(与授权对应):
revoke 权限列表 on 库.对象名 from '用户名'@'登录位置';
实战案例(回收lyl2的test3库所有权限):
(1)root 用户终端回收权限:

(2)lyl2用户终端验证:

面试考点:权限赋完没生效怎么办?
答:执行flush privileges;刷新权限。
4. 面试高频考点总结
结合 C++ 开发场景,MySQL 用户管理的面试核心考点如下,需完全掌握:
- 用户信息存储:用户信息存在
mysql库的user表中,关键字段host(登录主机)、user(用户名)、authentication_string(加密密码)。 - 创建用户的
host含义:localhost仅本机登录,%任意主机(禁止随意使用),固定 IP(如192.168.1.100)适合 C++ 程序部署场景。 - 删除用户的坑:必须指定
host,否则默认按'用户名'@'%'查找,导致报错。 - 授权通配符:
*.*所有库表,库.*指定库所有表(C++ 开发常用)。 - 权限不生效解决方案:执行
flush privileges;刷新权限。 - 密码策略问题:简单密码报错(ERROR 1819),可通过
SHOW VARIABLES LIKE 'validate_password%';查看策略。 - C++ 开发安全原则:禁止用
root连接 MySQL,需创建仅含必要权限的用户(如仅select+insert权限)。 



