第 16 章 备份与恢复
备份是 DBA 的底线,也是业务出问题时最后一根救命稻草——没有备份的数据库等于在裸奔。本篇假设你已经会登录 MySQL、会建库建表、了解 binlog 的存在。学完之后,你将能熟练使用 mysqldump 做逻辑备份、说清逻辑备份与物理备份的取舍、按流程做数据恢复,并搭一套定时备份方案。本示例基于 MySQL 8.0。
来自一线开发者的实践、思考与复盘。
备份是 DBA 的底线,也是业务出问题时最后一根救命稻草——没有备份的数据库等于在裸奔。本篇假设你已经会登录 MySQL、会建库建表、了解 binlog 的存在。学完之后,你将能熟练使用 mysqldump 做逻辑备份、说清逻辑备份与物理备份的取舍、按流程做数据恢复,并搭一套定时备份方案。本示例基于 MySQL 8.0。
MySQL 是一个多用户数据库系统,谁能连进来、能看哪些库、能改哪些表,全靠用户与权限体系控制。本篇假设你已经能用 root 登录 MySQL、会写基本 DDL/DML。学完之后,你将能按业务需要创建最小权限账号、用 GRANT/REVOKE 精确授权、回收权限,并说出生产环境有哪些安全红线。本示例基于 MySQL 8.0。
事务(Transaction)是 MySQL 区别于普通脚本文件系统的核心能力,也是面试与生产事故中出现频率最高的主题之一。本篇假设你已经会建库建表、写基本的 INSERT/UPDATE/SELECT,能看懂单表 CRUD。学完之后,你将能写出要么全成功、要么全回滚的业务 SQL,理解脏读、不可重复读、幻读三大并发问题,并能根据业务场景正确选择四种隔离级别。本示例基于 MySQL 8.0(InnoDB 引擎)。
存储过程要手动 `CALL` 才执行,本篇讲两种"自动触发"的数据库对象——触发器(Trigger)在表发生增删改时自动运行,事件调度(Event)按时间计划自动运行。学完后你能实现"下单自动写日志""每天凌晨清理过期数据"这类自动化逻辑。本示例基于 MySQL 8.0 语法。
前面我们都是一条一条地写 SQL,本篇进入"封装"的世界——把常用查询封装成视图、把一段业务逻辑封装成存储过程,重复调用、统一口径。本篇讲视图的创建修改、存储过程的参数与流程控制、以及游标的基本用法。学完后你能把复杂查询模块化,避免到处复制粘贴 SQL。本示例基于 MySQL 8.0 语法。
索引是数据库性能优化的第一课,也是性价比最高的优化手段——一张大表没索引时查一条数据可能要扫全表几秒钟,建好索引后毫秒返回。本篇从"为什么需要索引"出发,讲清楚 InnoDB 默认的 B+Tree 索引结构,以及唯一索引、复合索引、全文索引的创建与查看方式,并引入覆盖索引这个关键概念。学完后你能为业务表合理设计索引。本示例基于 MySQL 8.0 语法。
上一篇我们认识了 IF、IFNULL 这些简单的流程控制函数,但只要分支超过两层,它们就会变得难读难维护。本篇专门讲 SQL 里最强大的条件表达工具 `CASE WHEN`,以及它与聚合函数结合后完成"行转列"报表的经典套路。学完后你能写出多分支分类、动态排序、交叉报表等复杂查询。本示例基于 MySQL 8.0 语法。
函数是 MySQL 把原始数据加工成业务结果的"工具箱",几乎每条稍复杂的 SELECT 都会用到它。本篇在前面章节学完增删改查、连接、子查询的基础上,系统梳理字符串、日期时间、数值、流程控制与加密哈希五大类常用函数。学完后你能独立完成数据清洗、格式化输出、时间差计算、空值兜底等日常开发任务。本示例基于 MySQL 8.0 语法。
子查询(subquery)就是"查询里套查询",是 SQL 表达复杂业务逻辑的利器。本篇讲标量子查询、`IN`/`NOT IN`、`EXISTS`、`ANY`/`ALL`、关联子查询,以及 `FROM` 子句里的派生表(derived table)。我们会对比子查询与 JOIN 的优劣、讲清楚 `NOT IN` 遇到 NULL 全灭的经典坑,最后给出 MySQL 8.0 中优化器对子查询的处理。学完你能写出"查成绩高于本系平均的学生"这类业务 SQL。本示例基于 MySQL 8.0,所有 SQL 均按该版本语法书写。
真实业务里数据是分散在多张表里的——学生表、课程表、成绩表、院系表。要把它们"拼"在一起查,就靠 `JOIN`。本篇讲最常用的 INNER JOIN、LEFT JOIN、RIGHT JOIN、CROSS JOIN,以及自连接、多表连接,重点区分 ON 与 WHERE 的差异、LEFT JOIN 后加 WHERE 会变 INNER 的经典坑。学完你能写出后台 80% 的列表查询 SQL。本示例基于 MySQL 8.0,所有 SQL 均按该版本语法书写。