《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》
🎬 艾莉丝的简介:


1 ~> MySQL 用户管理
1.1 用户信息存储
1.1.1 底层原理
MySQL 的所有用户账号、密码、权限信息均存储在mysql 系统数据库的 user 表中。用户管理的本质,就是对该系统表进行增删改查操作,官方 SQL 语句是对底层表操作的封装。
1.1.2 user 表核心字段
| 字段名 | 作用说明 |
|---|---|
host | 允许用户登录的主机地址:localhost表示仅本地登录,指定 IP 表示仅该地址可登录,%为通配符表示任意主机 |
user | 用户名 |
authentication_string | 哈希加密后的用户密码,无明文存储 |
*_priv系列字段 | 对应各项权限,Y表示拥有权限,N表示无权限 |
password_expired | 密码是否过期 |
account_locked | 账号是否被锁定 |
1.1.3 用户查询语句
-- 切换至mysql系统库
USE mysql;
-- 查询用户核心信息
SELECT host, user, authentication_string FROM user;
-- 查看user表完整结构
DESC user;
1.2 创建用户
1.2.1 标准语法(唯一推荐方式)
CREATE USER '用户名'@'登录主机' IDENTIFIED BY '密码';
- 密码以明文输入,MySQL 自动通过哈希算法加密后存入系统表,不会明文存储
- 用户名与主机地址为一个整体,同一用户名对应不同主机视为不同账号
1.2.2 本地用户创建
仅允许从数据库所在服务器本机登录,安全性最高
-- 创建用户whb,仅本地登录,密码为12345678
CREATE USER 'whb'@'localhost' IDENTIFIED BY '12345678';
1.2.3 远程用户创建
允许从外部主机登录
-- 允许任意主机登录(生产环境禁用)
CREATE USER 'whb'@'%' IDENTIFIED BY '123321';
-- 允许指定IP登录(生产环境推荐)
CREATE USER 'whb'@'192.168.1.100' IDENTIFIED BY '123456';
注意: 公网访问场景下,MySQL 识别的是客户端出口公网 IP,而非客户端内网私有 IP,直接填写私有 IP 无法生效。
1.2.4 新建用户默认权限
新建用户默认仅拥有USAGE权限,即仅可登录数据库,无法查看业务库、无法执行数据操作,仅能访问information_schema等系统库。
1.3 删除用户
1.3.1 标准语法
DROP USER '用户名'@'登录主机';
- 必须完整指定用户名 + 主机,仅写用户名时 MySQL 默认匹配
@'%',会导致删除对应主机的用户失败。
1.3.2 示例
-- 删除本地登录的whb用户
DROP USER 'whb'@'localhost';
-- 删除允许任意主机登录的whb用户
DROP USER 'whb'@'%';
1.4 修改用户密码
1.4.1 管理员修改指定用户密码
-- MySQL 5.7 标准语法
SET PASSWORD FOR 'whb'@'%' = PASSWORD('1234abcd');
-- MySQL 8.0 标准语法(PASSWORD函数已废弃)
ALTER USER 'whb'@'%' IDENTIFIED BY '1234abcd';
1.4.2 用户修改自身密码
-- MySQL 5.7 语法
SET PASSWORD = PASSWORD('新密码');
-- MySQL 8.0 语法
ALTER USER USER() IDENTIFIED BY '新密码';
1.5 权限刷新机制
1.5.1 语法
FLUSH PRIVILEGES;
1.5.2 生效逻辑
- MySQL 的权限校验基于内存中的权限数据,而非直接读取磁盘系统表
- 必须执行的场景:直接通过 DML 语句修改 mysql 系统表后,需手动刷新将磁盘数据加载到内存
- 无需执行的场景:使用官方 DDL 语句(CREATE USER、GRANT 等)操作时,MySQL 自动同步内存权限
2 ~> MySQL 权限管理
2.1 权限体系
2.1.1 权限粒度(作用范围)
按作用域从大到小分为 4 个层级,校验时按层级逐级匹配:
- 全局级(
*.*):作用于 MySQL 实例下所有数据库的所有对象 - 库级(
库名.*):作用于指定数据库内的所有表、视图等对象 - 表级(
库名.表名):作用于指定库的指定数据表 - 列级:作用于表内指定字段(需单独授权)
2.1.2 核心权限清单
| 权限名称 | 对应系统表字段 | 权限说明 |
|---|---|---|
| SELECT | Select_priv | 查询表数据 |
| INSERT | Insert_priv | 插入表数据 |
| UPDATE | Update_priv | 更新表数据 |
| DELETE | Delete_priv | 删除表数据 |
| CREATE | Create_priv | 创建数据库、表、索引 |
| DROP | Drop_priv | 删除数据库、表、视图 |
| ALTER | Alter_priv | 修改表结构 |
| INDEX | Index_priv | 创建、删除索引 |
| GRANT OPTION | Grant_priv | 将自身拥有的权限授予其他用户 |
| CREATE VIEW | Create_view_priv | 创建视图 |
| SHOW VIEW | Show_view_priv | 查看视图定义 |
| EXECUTE | Execute_priv | 执行存储过程与函数 |
| FILE | File_priv | 读写服务器主机上的文件 |
| CREATE USER | Create_user_priv | 创建、删除、修改用户 |
| SHOW DATABASES | Show_db_priv | 查看所有数据库列表 |
| SUPER | Super_priv | 超级管理员权限,可执行各类管理操作 |
| USAGE | - | 基础登录权限,无其他操作权限,新建用户默认拥有 |
2.2 权限授予(GRANT)
2.2.1 标准语法
GRANT 权限1, 权限2, ... ON 库名.对象名 TO '用户名'@'登录主机';
- 多个权限用逗号分隔,
ALL PRIVILEGES表示授予指定对象上的所有权限 - MySQL 5.7 支持通过
IDENTIFIED BY子句在授权时隐式创建用户,MySQL 8.0 已废弃该用法
2.2.2 实操示例
-- 授予zhangsan在rootDB.user表上的所有权限
GRANT ALL PRIVILEGES ON rootDB.user TO 'zhangsan'@'%';
-- 授予zhangsan在rootDB库所有表上的只读权限
GRANT SELECT ON rootDB.* TO 'zhangsan'@'%';
-- 授予查询、修改、删除三项权限
GRANT SELECT, UPDATE, DELETE ON rootDB.user TO 'zhangsan'@'%';
2.3 权限回收(REVOKE)
2.3.1 标准语法
REVOKE 权限1, 权限2, ... ON 库名.对象名 FROM '用户名'@'登录主机';
2.3.2 实操示例
-- 回收zhangsan在rootDB.user表的INSERT权限
REVOKE INSERT ON rootDB.user FROM 'zhangsan'@'%';
-- 回收zhangsan在rootDB库下的所有权限
REVOKE ALL PRIVILEGES ON rootDB.* FROM 'zhangsan'@'%';
2.4 权限查看
-- 查看指定用户的全部权限
SHOW GRANTS FOR 'zhangsan'@'%';
-- 查看当前登录用户的自身权限
SHOW GRANTS;
2.5 权限生效规则
- 权限变更后,仅对后续新建的数据库连接生效
- 已建立的连接不会自动更新权限,需用户退出重连后生效
- 直接修改系统表的权限变更,必须执行
FLUSH PRIVILEGES后才会被校验逻辑读取
3 ~> 安全最佳实践
- 最小权限原则:日常操作禁止使用 root 账号,为业务人员分配仅满足工作需求的最小权限
- 严格限定登录地址:禁止使用
%通配符开放任意主机登录,生产环境必须指定可信 IP - 端口防护:禁止将 MySQL 端口直接暴露在公网,数据库服务应仅在内网环境访问
- 密码强度:设置高复杂度密码,定期更换,禁止弱口令
- 禁止直接操作系统表:所有用户与权限操作必须使用官方标准 SQL 语句
结尾
uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!
|
结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!
往期回顾:
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2401_89899187/article/details/163281396





