MySQL【用户管理】

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

在数据库的实际应用中,如果所有人都使用root超级管理员账号,会存在巨大的安全隐患。想象一下,你的数据库里有多个库,比如mytestmsg,你希望张三只能操作mytest,李四只能操作msg

如果给他们root账户,他们就能看到并操作所有的数据库,这显然是不安全的。因此,MySQL提供了完善的用户管理 机制,允许我们创建不同的用户,并为他们分配特定的权限。


一、用户

1.1 用户信息

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

复制代码
-- 切换到系统数据库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/123456admin/admin 等弱密码,一旦破解就能完全控制数据库;
  • 弱口令检测:哪怕你设置了普通复杂度的密码(如 123456a),也可能被算力强的攻击者破解。✅ 后果:数据库被篡改、删除,核心数据(用户信息、交易记录)被盗取,甚至被植入勒索病毒。

2. 未授权访问 / 漏洞利用

  • 若 MySQL 配置不当(比如开启 skip-grant-tables、权限设置过宽),攻击者可直接无密码登录;
  • 公网暴露会让 MySQL 的已知漏洞(如缓冲区溢出、权限绕过)被精准利用,哪怕你没及时升级补丁,攻击者也能快速找到并入侵。

3. 数据传输风险

默认情况下,MySQL 的数据传输是明文的(除非开启 SSL/TLS),公网传输时,攻击者可通过抓包获取:

  • 登录的账号密码;
  • 查询的敏感数据(如手机号、银行卡号、订单信息)。

1.3 删除用户

1.4 修改用户密码

密码是被加密后才被保存在数据库中!!!

  • 自己改自己密码

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

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


查询结果的字段会变成新的加密串,说明密码修改成功,此时 ZS 用户需使用新密码 123321登录。

二、数据库的权限

2.1 给用户授权

新创建的用户是没有任何权限的,他们甚至无法查看数据库列表**。我们需要使用GRANT命令给他们授权。**

  • 权限列表 : 可以是SELECTINSERTALL等,多个权限用逗号隔开。

  • 数据库名.对象名

    • *.*: 表示所有数据库中的所有对象。

    • 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 '用户名'@'登陆位置';
相关推荐
2501_945423542 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
2401_846341652 小时前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
2401_831824962 小时前
编写一个Python脚本自动下载壁纸
jvm·数据库·python
2401_857918292 小时前
Python在2024年的主要趋势与发展方向
jvm·数据库·python
IvorySQL2 小时前
PostgreSQL 19 重磅新语法终于补齐这个缺口
数据库·postgresql·开源
IvorySQL3 小时前
PostgreSQL 技术日报 (3月23日)|使用 rdtsc 减少 EXPLAIN ANALYZE 的计时开销
数据库·postgresql·开源
yhole3 小时前
SQL中的REGEXP正则表达式使用指南
数据库·sql·正则表达式
IvorySQL3 小时前
PostgreSQL 技术日报 (3月21日)|这些机制,可能并非 “ 理所当然 ”
数据库·postgresql·开源
m0_518019483 小时前
使用Seaborn绘制统计图形:更美更简单
jvm·数据库·python