MySQL第7-9章 核心备考知识点
11520
画布
|大纲
内容详情
第7章 用户与权限(数据库安全)
7.1 用户与权限概述
- 核心概念
- 身份认证基础
- 基于「用户@主机」双维度验证身份
- 用户名:标识访问者身份
- 主机地址:限制允许访问的来源
- 基于「用户@主机」双维度验证身份
- 权限体系层级(从上到下,优先级匹配从粗到细)
- 全局级(
- 数据库级(db_name.*):影响指定数据库
- 表级(db_name.tbl_name):影响指定数据库的单张表
- 列级:影响指定表的特定列
- 存储过程/函数级:影响指定的存储对象
- 身份认证基础
- 权限存储与检查逻辑
- 权限存储位置
- mysql系统库的专用权限表
- user表:存全局权限、用户基础信息
- db表:存数据库级权限
- tables_priv:存表级权限
- columns_priv:存列级权限
- procs_priv:存存储过程/函数级权限
- mysql系统库的专用权限表
- 权限检查逻辑
- 登录时:验证user表中「用户@主机」匹配 + 全局权限/密码
- 后续操作:从全局级→数据库级→…逐层级检查更细粒度权限,命中则停止(优先满足细权限限制更安全)
- 权限存储位置
7.2 用户管理
- 创建用户
- 基础语法
- CREATE USER '用户名'@'主机地址' IDENTIFIED BY '密码';
- 关键细节
- 主机地址支持类型
- localhost:仅允许本地套接字连接
- 127.0.0.1:仅允许本地TCP/IP连接
- %:任意主机(生产环境慎用)
- 192.168.1.%:指定IP段
- 具体IP/域名:仅单一来源
- 支持批量创建:用逗号分隔多组「'用户'@'主机' IDENTIFIED BY '密码'」
- 可配合GRANT直接赋予初始权限
- 主机地址支持类型
- 基础语法
- 修改用户
- 密码修改
- 推荐语法:ALTER USER '用户'@'主机' IDENTIFIED BY '新密码';
- 兼容旧版语法:SET PASSWORD FOR '用户'@'主机' = PASSWORD('新密码');
- 身份信息修改
- RENAME USER '旧用户'@'旧主机' TO '新用户'@'新主机';
- 生效注意
- 非GRANT/REVOKE方式(直接改表)需FLUSH PRIVILEGES或用户重登
- 密码修改
- 删除用户
- 语法
- DROP USER '用户'@'主机地址';
- 关键机制
- 同步回收该用户的所有权限,避免残留权限隐患
- 语法
7.3 权限管理
- 授予权限(GRANT)
- 语法结构
- GRANT 权限列表 ON 权限范围 TO '用户'@'主机' [WITH GRANT OPTION];
- 常见权限分类
- 数据操作类(DML):SELECT/INSERT/UPDATE/DELETE
- 结构操作类(DDL):CREATE/ALTER/DROP/INDEX
- 管理类:GRANT OPTION(授权传递)/SUPER(全局管理,改配置杀进程)/FILE(读写服务器文件)
- WITH GRANT OPTION注意
- 允许被授权用户将自身权限转授他人
- 仅对已授予的
- 语法结构
- 查看权限
- 快速查看命令
- 查看当前用户:SHOW GRANTS;
- 查看指定用户:SHOW GRANTS FOR '用户'@'主机';
- 底层验证查询
- 查询mysql.user/db等系统表获取细粒度权限配置
- 快速查看命令
- 回收权限(REVOKE)
- 语法结构
- REVOKE 权限列表 ON 权限范围 FROM '用户'@'主机';
- 关键细节
- 仅移除对应访问权限,不删除用户
- 回收GRANT OPTION需单独执行:REVOKE GRANT OPTION ON ... FROM ...
- 语法结构
- 刷新权限(FLUSH PRIVILEGES)
- 触发场景
- 直接修改mysql系统权限表(而非GRANT/REVOKE/ALTER USER等官方命令)后
- 说明
- GRANT/REVOKE/ALTER USER/RENAME USER/DROP USER会自动刷新内存中的权限缓存,无需手动操作
- 触发场景
第8章 视图(虚拟表管理)
8.1 初识视图
- 视图定义
- 基于SELECT查询结果构建的
- 核心作用
- 简化复杂查询:封装多表JOIN/子查询等复杂逻辑,用户直接用SELECT查视图
- 数据安全:隐藏敏感列(如薪资、身份证号)或行(通过WHERE过滤)
- 逻辑独立性:基表结构小幅度调整(如非核心列改名)时,修改视图定义即可,不影响上层应用
- 视图与基表的区别
- 物理存储:视图无,基表有
- 依赖关系:视图依赖基表,基表删除则视图失效
- 数据操作:视图受限制,基表无(需合规)
8.2 视图管理
- 创建视图
- 基础语法
- CREATE VIEW 视图名 [(自定义列名1,自定义列名2,...)] AS SELECT子句 [WITH CHECK OPTION];
- 关键细节
- WITH CHECK OPTION:通过视图增删改数据时,必须符合SELECT子句的WHERE过滤条件
- 基础语法
- 查看视图
- 快速命令
- 查看视图结构:DESCRIBE/DESC 视图名;
- 查看视图定义:SHOW CREATE VIEW 视图名;
- 底层验证查询
- 查询information_schema.views系统表获取所有视图信息
- 快速命令
- 修改视图
- 基础语法
- ALTER VIEW 视图名 [(自定义列名1,...)] AS SELECT子句 [WITH CHECK OPTION];
- 限制
- 与CREATE VIEW语法一致,相当于覆盖原视图定义
- 基础语法
- 删除视图
- 语法
- DROP VIEW [IF EXISTS] 视图名1,视图名2,...;
- 影响
- 仅删除视图定义,对基表无任何影响
- 语法
8.3 视图数据操作(增删改)
- 可更新视图的核心条件
- 单表视图(无JOIN/UNION)
- 无聚合函数(SUM/COUNT/MAX等)
- 无DISTINCT/GROUP BY/HAVING/ORDER BY(部分排序无聚集可能允许,需视情况)
- 视图列需包含基表的所有非空且无默认值的列(INSERT要求)
- 常见操作说明
- INSERT INTO 视图名:需满足基表约束+可更新条件+WITH CHECK OPTION(若有)
- UPDATE 视图名:需满足可更新条件+WITH CHECK OPTION(若有)
- DELETE FROM 视图名:需满足可更新条件(单表视图通常允许)
第9章 事务(数据一致性保障)
9.1 事务的核心概念
- 事务定义
- 一组
- ACID特性(必考)
- 原子性(Atomicity)
- 操作不可分割,事务中所有SQL要么全执行,要么全不执行
- 一致性(Consistency)
- 事务前后,数据库必须从一个
- 隔离性(Isolation)
- 多个并发事务执行时,互不干扰,各自的中间状态对其他事务不可见
- 持久性(Durability)
- 事务一旦提交,对数据的修改是
- 原子性(Atomicity)
9.2 事务处理
- 基本操作
- 开启事务
- 显式开启:START TRANSACTION; / BEGIN;
- 提交事务
- COMMIT;:永久保存事务中所有修改
- 回滚事务
- ROLLBACK;:撤销事务中所有未提交的修改
- 开启事务
- 事务保存点
- 作用
- 允许部分回滚,而非全部撤销
- 语法
- 创建保存点:SAVEPOINT 保存点名称;
- 回滚到指定点:ROLLBACK TO SAVEPOINT 保存点名称;
- 删除保存点:RELEASE SAVEPOINT 保存点名称;
- 作用
- 自动提交模式
- autocommit变量
- 默认值:1(ON),即每条单SQL语句自动作为一个独立事务提交
- 关闭方式:SET autocommit = 0; / SET autocommit = OFF;
- 关闭场景
- 需要执行多SQL组成的显式事务时(配合START TRANSACTION也可临时关闭)
- autocommit变量
9.3 事务日志(ACID的底层支撑)
- redo日志(重做日志)
- 作用
- 实现
- 采用
- 作用
- undo日志(回滚日志)
- 作用
- 实现
- 实现
- 作用
9.4 事务的隔离级别(高频考点)
- 并发事务可能引发的问题
- 脏读
- 定义:事务A读取了事务B
- 不可重复读
- 定义:同一事务A内,两次读取同一行数据,结果不同(因事务B在中间提交了修改)
- 幻读
- 定义:同一事务A内,两次执行同一范围查询,结果行数不同(因事务B在中间插入/删除了符合条件的行)
- 脏读
- 4种隔离级别(从低到高,性能递减,隔离性递增)
- READ UNCOMMITTED(读未提交)
- 问题:允许脏读、不可重复读、幻读
- 应用场景:几乎无生产应用
- READ COMMITTED(读已提交)
- 解决:脏读
- 问题:允许不可重复读、幻读
- 应用场景:Oracle/PostgreSQL默认级别
- REPEATABLE READ(可重复读)
- 解决:脏读、不可重复读
- 问题:理论存在幻读,MySQL InnoDB引擎通过
- 应用场景:MySQL InnoDB默认级别
- SERIALIZABLE(串行化)
- 解决:所有并发问题
- 实现:强制事务串行执行(每个事务加表级读锁)
- 应用场景:对数据一致性要求极高,并发量极低的场景
- READ UNCOMMITTED(读未提交)
- 隔离级别设置与查询
- 设置语法
- 设置当前会话:SET SESSION TRANSACTION ISOLATION LEVEL 级别;
- 设置全局:SET GLOBAL TRANSACTION ISOLATION LEVEL 级别;
- 查询语法
- 查询当前会话:SELECT @@tx_isolation; / SELECT @@transaction_isolation;(MySQL 8.0+)
- 查询全局:SELECT @@global.tx_isolation; / SELECT @@global.transaction_isolation;(MySQL 8.0+)
- 设置语法
