前言:为什么需要用户管理?
在数据库的实际应用中,如果所有人都使用root超级管理员账号,会存在巨大的安全隐患。想象一下,你的数据库里有多个库,比如mytest和msg,你希望张三只能操作mytest,李四只能操作msg。
如果给他们root账户,他们就能看到并操作所有的数据库,这显然是不安全的。因此,MySQL提供了完善的用户管理 机制,允许我们创建不同的用户,并为他们分配特定的权限。


一、用户
1.1 用户信息
MySQL 中所有的用户信息,都统一存储在系统数据库 mysql 的user 表中,这个表包含了用户名、登录主机、加密密码、用户权限等核心信息。



-- 切换到系统数据库mysql,该库存储了MySQL的所有系统配置、用户信息
use mysql;
-- 执行结果:Database changed (表示切换数据库成功)
-- 查询user表中的登录主机、用户名、加密密码字段
select host,user,authentication_string from user;

USE mysql;: 切换到名为mysql的系统数据库,这里面存放着MySQL的元数据。
SELECT host, user, authentication_string FROM user;: 从user表中查询三个关键字段。
host: 允许用户从哪台主机登录。localhost表示只能从数据库服务器本机登录;%表示可以从任何主机登录(生产环境需谨慎)。
user: 用户名。
authentication_string: 经过password函数加密后的密码字符串。
1.2 创建用户
创建用户是权限管理的第一步。使用CREATE USER语句。

登录的主机名字/ip 不可以省略 !!!!!!!!!!



此时便可以使用新账号新密码进行登陆啦
创建用户时,如果设置的密码过于简单(比如 123456),会触发 MySQL 的密码策略校验,抛出如下报错:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
解决方法:
-
先查看当前 MySQL 的密码策略要求:
SHOW VARIABLES LIKE 'validate_password%';执行后会展示密码的长度要求、复杂度要求(是否包含数字 / 字母 / 特殊字符)等;
-
可根据需求修改密码策略(或直接设置符合要求的复杂密码),具体修改方法可参考 MySQL 官方文档或密码策略配置教程。
重要注意事项
不要轻易创建@'%'的用户(即允许从任意主机登录的用户),会极大增加账号泄露的风险,生产环境中建议指定具体的登录 IP / 主机。

不要把MySQL端口号暴露在公网
1. 暴力破解攻击(最常见)
公网上的黑客 / 扫描器会全天候扫描 3306 端口,对暴露的 MySQL 服务发起:
- 密码爆破:用字典库尝试
root/123456、admin/admin等弱密码,一旦破解就能完全控制数据库;- 弱口令检测:哪怕你设置了普通复杂度的密码(如
123456a),也可能被算力强的攻击者破解。✅ 后果:数据库被篡改、删除,核心数据(用户信息、交易记录)被盗取,甚至被植入勒索病毒。2. 未授权访问 / 漏洞利用
- 若 MySQL 配置不当(比如开启
skip-grant-tables、权限设置过宽),攻击者可直接无密码登录;- 公网暴露会让 MySQL 的已知漏洞(如缓冲区溢出、权限绕过)被精准利用,哪怕你没及时升级补丁,攻击者也能快速找到并入侵。
3. 数据传输风险
默认情况下,MySQL 的数据传输是明文的(除非开启 SSL/TLS),公网传输时,攻击者可通过抓包获取:
- 登录的账号密码;
- 查询的敏感数据(如手机号、银行卡号、订单信息)。
1.3 删除用户


1.4 修改用户密码
密码是被加密后才被保存在数据库中!!!

- 自己改自己密码
无需指定用户名,登录对应用户后直接执行,password('新密码')会自动对新密码进行加密。

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


查询结果的字段会变成新的加密串,说明密码修改成功,此时 ZS 用户需使用新密码 123321登录。
二、数据库的权限
2.1 给用户授权
新创建的用户是没有任何权限的,他们甚至无法查看数据库列表**。我们需要使用GRANT命令给他们授权。**

权限列表 : 可以是
SELECT、INSERT、ALL等,多个权限用逗号隔开。数据库名.对象名:
*.*: 表示所有数据库中的所有对象。
test.*: 表示test数据库中的所有对象(表、视图等)。
test.account: 表示test数据库中的account表。

| 权限 | 适用上下文(操作对象) | 核心作用 |
|---|---|---|
| SELECT | 数据库、表 | 查询表 / 库中的数据 |
| INSERT | 数据库、表 | 向表中插入数据 |
| UPDATE | 数据库、表 | 修改表中的数据 |
| DELETE | 数据库、表 | 删除表中的数据 |
| CREATE | 数据库、表、索引 | 创建数据库 / 表 / 索引 |
| DROP | 数据库、表 | 删除数据库 / 表 |
| ALTER | 表 | 修改表结构(如添加 / 删除字段) |
| CREATE VIEW | 视图 | 创建视图 |
| SHOW VIEW | 视图 | 查看视图 |
| ALL PRIVILEGES | 所有对象 | 拥有指定对象的全部操作权限 |
| FILE | 服务器主机文件 | 访问服务器主机上的文件 |
| SHUTDOWN | 服务器管理 | 关闭 MySQL 服务器 |
权限的分配遵循最小权限原则------ 即只给用户分配完成工作所需的最少权限,避免权限过大导致的安全风险。


lisi 用户被创建了 , 但是并没有授权 , 所以有一些库就根本看不到:

授权后 , 可以对库和表进行相应的操作:

查询用户具备的权限 :


如果想确认某个用户拥有哪些权限,使用如下语法:
show grants for '用户名'@'主机名';
-- 查看zs@%的权限(示例)
show grants for 'zs'@'%';
-- 执行结果:
-- GRANT USAGE ON *.* TO 'zs'@'%' (USAGE表示无基础权限)
-- GRANT ALL PRIVILEGES ON `test`.* TO 'zs'@'%' (拥有test库的全部权限)
-- 查看root@%的权限(root超级用户)
show grants for 'root'@'%';
-- 执行结果:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION
-- WITH GRANT OPTION:表示root用户可以给其他用户分配权限
2.2 权限不生效的解决方法
如果执行授权命令后,用户的权限没有立即生效,执行如下刷新权限的命令即可:
flush privileges;
执行后 MySQL 会重新加载权限配置,授权立即生效。
2.3 回收权限
当用户不再需要某部分权限时,需要及时回收,避免权限滥用。
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
