MySQL【用户管理】

前言:为什么需要用户管理?

在数据库的实际应用中,如果所有人都使用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
解决方法:

  1. 先查看当前 MySQL 的密码策略要求:

    复制代码
    SHOW VARIABLES LIKE 'validate_password%';

    执行后会展示密码的长度要求、复杂度要求(是否包含数字 / 字母 / 特殊字符)等;

  2. 可根据需求修改密码策略(或直接设置符合要求的复杂密码),具体修改方法可参考 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 '用户名'@'登陆位置';
相关推荐
CCIE-Yasuo1 小时前
网络安全-学习数据库-Mysql-2
数据库·学习·mysql
这个DBA有点耶1 小时前
内核级AI与多模融合:AI数据库在海外场景的落地要点
数据库·人工智能·架构
涛思数据(TDengine)1 小时前
从工业本体到 AI 原生:TDengine 出席 2026 QCon 分享工业数据基础设施路径
大数据·数据库·人工智能·tdengine·工业
Jesse_EC1 小时前
换乘次数最少的路径 SQL 查询详解与实战经验——从 WITH RECURSIVE 到 pgRouting
数据库·postgresql
工控丫丫1 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
这个DBA有点耶2 小时前
云数据库半夜卡顿,CPU才30%?深挖云盘IOPS突发限制与内核挂起机制
数据库·mysql·云原生
无言听风雨丶4 小时前
Redis 运维实战与排错
运维·数据库·redis
小天源5 小时前
智叟云集系统 · 架构与职责分层
服务器·前端·数据库
herinspace6 小时前
管家婆实用贴-SQL 2008如何修改成混合模式
服务器·数据库·sql·管家婆软件·财务软件·合肥管家婆软件
打螺丝的小李6 小时前
制造企业质量管理系统的三类产品形态:分别解决什么问题
数据库·制造