数据库面试高频:容灾备份 + 索引分类 & 使用场景
一、数据库容灾备份(MySQL 为主,面试必背)
(一)备份分类
1. 按备份数据内容
(1)全量备份
整库所有数据完整导出,恢复简单,但耗 IO、耗时间,适合低峰期定期做。
(2)增量备份
仅备份上次全量 / 增量后变化的数据,体积小、速度快;恢复必须依赖全量 + 所有增量,链条断裂无法恢复。
(3)差异备份
备份上次全量之后所有变更,恢复只需要「一份全量 + 一份最新差异」,平衡速度与恢复复杂度。
2. 按备份实现方式
(1)物理备份(冷备 / 热备)
直接复制底层数据文件、日志文件,速度快,适合大数据量。
l 冷备:停机锁库复制文件,一致性高,业务中断;
l 热备:在线备份(MySQL:xtrabackup),无需停库,生产主流。
(2)逻辑备份
导出 SQL 语句(mysqldump、mysqldumpp),跨版本、跨库迁移友好;大数据量慢,恢复耗时。
3. 按日志(二进制日志 binlog)
binlog 属于增量日志备份,记录所有 DML/DDL 操作,可实现时间点恢复 (PITR)。
l 作用:数据误删找回、主从同步、审计。
(二)容灾等级(RTO/RPO 面试必问)
l RPO(恢复点目标):故障丢失数据最多容忍多久
RPO=0:零数据丢失(同步复制);RPO 越大丢数据越多
l RTO(恢复时间目标):故障后业务恢复时长
RTO 越小,停机时间越短
三层容灾架构
1.本地单机房(本地备份)
定时全量 + binlog,应对误删、表损坏;机房火灾、断电会整体失效。
2.同城双活 / 主从
同城市两个机房,主库故障自动切换备库,RTO 秒级;同城自然灾害会一起故障。
3.异地多活 / 异地灾备
跨城市机房,同步 / 异步复制,城市级灾难兜底;成本高、同步延迟。
(三)MySQL 主从容灾模式
1.异步复制(默认)
主库写完直接返回客户端,binlog 异步发给从库;主宕机,已提交但未同步的数据丢失,RPO>0。
2.半同步复制(semi-sync)
主库写完,等待至少一台从库接收 binlog 后再返回;大幅降低丢数据概率,性能轻微损耗。
3.同步复制(MGR / 双活)
主从同时落盘成功才返回,RPO=0,无数据丢失,性能开销大。
(四)故障恢复流程(面试口述标准答案)
1.确认故障类型:误删表 / 磁盘损坏 / 主机宕机 / 机房故障
2.若主机宕机:切换备库(MGR、MHA 自动切换),恢复业务 RTO
3.若误删数据:
1)用全量备份恢复临时实例;
2)截取对应时间段 binlog;
3)重放 binlog 到删除前时间点;
4)导出丢失数据回灌线上库(PITR 时间点恢复)
(五)MHA / MGR 容灾方案简答
l MHA:单机中间件,监控主从,主宕机自动选最优从库提升为主,适合传统一主多从;有切换延时。
l MGR(MySQL 组复制):集群多主架构,原生高可用,故障自动剔除节点,支持多节点写入,数据强一致。
二、索引的意义
索引是存储引擎用于快速找到数据记录的一种数据结构
(一)索引的优点
1. 极大地加快数据的检索速度
这是建立索引最核心的原因。通过索引,数据库可以跳过绝大多数无关数据,直接精准定位,将原本需要数秒甚至数分钟的查询缩短至毫秒级。
2. 显著加速表与表之间的连接(JOIN)
在多表关联查询时,MySQL 会使用驱动表的数据去匹配被驱动表。如果连接字段(如 order.user_id 和 user.id)上有索引,数据库就能通过索引快速匹配,避免执行恐怖的笛卡尔积计算。
3. 减少排序和分组的时间(ORDER BY / GROUP BY)
索引在存储时本身就是排好序的(特别是 B+ 树索引)。当你的查询包含 ORDER BY 或 GROUP BY 时,数据库可以直接利用索引的顺序返回结果,避免了在内存中进行昂贵的外部排序(Filesort),从而节省了大量的 CPU 资源。
4. 保证数据的唯一性(唯一索引)
通过创建唯一索引(Unique Index)或主键索引,数据库会在底层自动校验数据的唯一性,从数据库层面筑起一道防线,防止业务代码并发时产生脏数据。
(二)索引的缺点
索引并不是越多越好,盲目建索引会带来以下副作用:
1. 隐形的时间成本:降低增删改(DML)的效率
虽然索引让 SELECT 变快了,但它会让 INSERT、UPDATE、DELETE 变慢。
因为每次数据发生变动,数据库不仅要修改底层的数据行,还要实时维护所有的索引树(比如 B+ 树的节点分裂、合并、平衡旋转)。如果一张表建了 5、6 个索引,每次写操作的开销会成倍增加。
2. 显的空间成本:占用大量的磁盘空间
索引也是一种数据,需要持久化到磁盘上。
对于高频更新或者大字段的表,索引占用的空间甚至可能超过数据本身的大小。这不仅增加了存储成本,还会挤占数据库的内存缓冲池(Buffer Pool),间接影响整体性能。
3. 索引并不是万能的,存在索引失效场景
违背最左前缀原则、字段使用函数、隐式类型转换、not in、!=、%前缀模糊 等会导致索引失效,依旧走全表扫描; 当数据筛选后返回大部分数据(比如超过表 30% 数据),优化器会放弃索引选择全表扫描。
三、索引分类 & 使用场景(MySQL InnoDB 核心面试)
1. 按存储结构(底层物理分类,必考)
(1)B + 树索引(默认主键 / 普通索引)
结构:叶子节点存完整行数据(主键索引)/ 主键值(二级索引),有序链表,范围查询极强。
适用场景:绝大多数业务场景
l 等值查询 where id=100
l 范围查询 where age>18 and age<30
l 排序 order by create_time
l 分组 group by status
不适合:大量重复低基数字段(性别、状态只有 2 个值)
(2)哈希索引(Memory 引擎,InnoDB 自适应哈希 AHI)
结构:哈希表,等值匹配 O (1),无序。
适用场景:纯等值匹配
where phone='138xxxx'
缺点:不支持范围、排序、模糊查询;哈希冲突;InnoDB 不手动创建 hash 索引。
(3)全文索引 fulltext
场景:文本模糊检索,like % 关键词 % 不走普通索引
例如文章标题、内容模糊搜索:match(title) against('大数据')
限制:只支持 char/varchar/text,中文需分词插件。
(4)空间索引 SPATIAL
存储地理位置坐标(point、多边形),用于地理距离查询、范围圈选(外卖、地图业务)。
2. 按索引字段数量
单列索引
单个字段建立,简单等值、筛选查询。
联合索引(复合索引)
多个字段组合,遵循最左匹配原则
例:索引 (a,b,c)
有效:where a=? /where a=? and b=? /a=? and b=? and c=?
失效:where b=? /where c=? /where b=? and c=?
使用场景:业务多条件联合筛选,减少回表,覆盖索引优化。
3. 按索引功能(逻辑分类,面试高频)
1)主键索引 primary
唯一、非空,一张表只能一个;
InnoDB 聚集索引,叶子存整行数据;
场景:唯一标识行,关联外键、主从同步。
2)唯一索引 unique
字段值全局唯一,允许一个 null;
场景:手机号、身份证、用户账号,防止重复数据。
3)普通索引 INDEX
无唯一性约束,允许重复、null;
场景:普通筛选条件(创建时间、状态、商品分类)。
4)覆盖索引
查询字段全部包含在索引里,不需要回表,性能极高
示例:select name,price from goods where id=10
索引 (id,name,price)
场景:高频列表查询,减少 IO,千万级表优化必备。
5)前缀索引
长字符串只截取前 N 位建立索引,节约存储空间
create index idx_name on user(name(10));
场景:长邮箱、长名字,区分度足够即可使用;
缺点:不能 order by、无法用作覆盖索引完整查询。
6)自适应哈希索引 AHI(InnoDB 内置)
MySQL 自动为热点 B + 树页建立哈希缓存,加速等值查询,无需手动创建。
4. 特殊索引区分 & 使用禁忌
1.聚集索引 vs 非聚集(二级索引)
l InnoDB 主键 = 聚集索引,数据按主键排序存储;
l 二级索引叶子只存主键,查询到数据需要回表拿完整行。
2.什么情况不建索引?
l 数据量少(几百行全表扫描更快);
l 字段基数极低(性别 0/1);
l 频繁更新字段(索引维护成本高,锁开销大);
l 模糊查询 % xxx 开头无索引。
面试简答汇总(直接背诵)
索引使用场景一句话版
1. B + 树索引:等值、范围、排序、分组,通用首选;
2. 联合索引:多条件查询,利用最左前缀;
3. 唯一索引:手机号、身份证等唯一性字段;
4. 覆盖索引:列表查询,避免回表优化;
5. 全文索引:文本关键词检索;
6. 哈希索引:仅纯等值匹配;
7. 前缀索引:超长字符串节省空间;
8. 空间索引:地理位置业务。
容灾备份面试高频问题预判
1. 全量、增量、差异备份区别?恢复流程差异?
2. RPO/RTO 含义,双活、异地灾备如何平衡两者?
3. binlog 作用,如何实现误删数据时间点恢复?
4. MHA 和 MGR 高可用区别,适用业务场景?
5. 物理备份和逻辑备份优缺点?什么场景选 xtrabackup/mysqldump?
容灾备份 5 道高频面试题标准答案(可直接背诵)
1. 全量、增量、差异备份区别?恢复流程差异?
三者定义区别
1.全量备份
完整拷贝库内所有数据、索引、日志,备份完整副本。
优点:恢复最简单;缺点:占用空间大、备份耗时长、IO 压力高。
2.增量备份
只备份上一次任意备份(全量 / 增量) 之后新增 / 修改的数据。
优点:备份速度快、体积小;缺点:备份链条长,任一增量文件损坏整体无法恢复。
3.差异备份
只备份上一次全量备份之后所有变更数据,不受中间增量影响。
优点:恢复文件少、容错性比增量高;缺点:随时间推移备份包会越来越大。
恢复流程对比
1.全量备份恢复:仅导入一份全量文件即可恢复完整数据。
2.增量备份恢复:全量备份 + 按时间顺序依次导入所有增量备份,顺序不能乱。
3.差异备份恢复:一份全量备份 + 最新一份差异备份,无需中间增量。
生产常用组合
每周一次全量 + 每日差异备份,兼顾备份速度与恢复效率。
2. RPO/RTO 含义,双活、异地灾备如何平衡两者?
RPO、RTO 概念
l RPO(恢复点目标):灾难发生后,最多允许丢失多少数据,单位分钟 / 秒。
RPO=0:零数据丢失;数值越大,丢失数据越多。
l RTO(恢复时间目标):故障后业务恢复正常运行的时长。
数值越小,停机时间越短,可用性越高。
同城双活对 RPO/RTO 的平衡
1.数据同步复制,RPO≈0,几乎不丢数据;
2.主节点故障自动切换,RTO 秒级;
3.短板:同一城市,地震、洪水、城市断电会双机房同时故障,无法抵御城市级灾难。
适用:金融、支付核心业务,追求低丢失、快速恢复。
异地灾备对 RPO/RTO 的平衡
1.跨城市机房,网络距离远,一般采用异步 / 半同步复制,存在数据延迟,RPO>0,会丢失少量增量数据;
2.异地切换流程复杂,需要人工 / 复杂调度,RTO 分钟~小时级;
3.优势:城市级灾难兜底,数据不会全部损毁。
适用:政企、电商兜底容灾,做长期数据兜底。
整体平衡思路
同城双活承载线上流量,保证日常故障 RPO、RTO 双低;异地机房作为兜底灾备,应对极端城市灾难,牺牲少量数据一致性换取全局数据安全。
3. binlog 作用,如何实现误删数据时间点恢复(PITR)
binlog 三大核心作用
1.主从同步:主库把 DML/DDL 写入 binlog,同步给从库保证数据一致;
2.数据恢复(PITR 时间点恢复):记录所有修改操作,误删、误更新可找回数据;
3.数据审计:记录所有数据库变更,用于操作追溯、合规核查。
误删数据时间点完整恢复步骤
1. 找到故障前最近一次全量备份,单独搭建一台临时恢复实例;
2. 在 binlog 日志中定位误删 SQL 对应的起止时间点;
3. 截取两段 binlog:全量备份结束时间 → 删除操作之前的 binlog;
4. 将截取后的 binlog 重放至临时实例,此时数据恢复到删除前状态;
5. 导出丢失 / 被删除的数据;
6. 将导出数据回灌线上生产库,业务正常运行。
补充:不能直接在线重放 binlog,会覆盖现有正常数据,必须用临时实例隔离操作。
4. MHA 和 MGR 高可用区别,适用业务场景
1)MHA(Master High Availability)
架构:独立中间件管理一主多从原生 MySQL 复制。
特点
1. 仅单主写入,从库只读;
2. 主库宕机后 MHA 自动对比所有从库 binlog,选择数据最全的从库提升新主;
3. 切换存在 10~30 秒真空期,期间无法写入;
4. 无数据强一致保障,异步复制场景会丢少量数据;
5. 部署简单、兼容低版本 MySQL、成本低。
适用场景
中小业务、传统一主多从架构、预算有限、可接受短暂写入中断的项目。
2)MGR(MySQL Group Replication,组复制)
架构:MySQL 原生集群,分布式一致性协议 Paxos。
特点
1. 支持单主模式、多主写入模式;
2. 集群内部数据强一致,多数节点确认才提交,RPO=0;
3. 节点故障自动剔除,切换秒级,无长时间中断;
4. 自带冲突检测,多主写入自动处理事务冲突;
5. 性能开销高于 MHA,对网络稳定性要求高。
适用场景
金融支付、高并发核心交易、要求零数据丢失、高可用要求极高的大型业务。
核心对比总结
l 追求低成本、简单运维、现有主从改造 → MHA
l 核心交易、零丢数据、秒级故障转移 → MGR
5.物理备份和逻辑备份优缺点?什么场景选 xtrabackup/mysqldump?
一、物理备份(代表工具:XtraBackup)
直接拷贝磁盘上的数据文件、redo、undo、ibd、binlog 底层物理文件。
优点
1. 备份、恢复速度极快,大数据量优势明显;
2. 直接拷贝物理页,对数据库 CPU 消耗低;
3. 支持增量、差异热备,无需锁表,不阻塞线上业务。
缺点
1. 跨操作系统、跨数据库版本兼容性差;
2. 只能备份 InnoDB/MyISAM,不能单独导出单张表结构;
3. 备份文件体积大,无法直接查看 SQL。
二、逻辑备份(代表工具:mysqldump)
查询数据库,生成 INSERT、CREATE 等 SQL 语句保存。
优点
1. 跨平台、跨 MySQL 版本迁移友好;
2. 可灵活单库、单表备份,能直接编辑 SQL 文件;
3. 无需底层文件权限,部署简单。
缺点
1. 大数据量备份恢复极慢,全表读取消耗大量 CPU;
2. 备份期间会锁表 / 锁事务,高并发业务易阻塞;
3. 不支持增量备份,只能全量导出。
场景选型
选用 XtraBackup
l 几十 G / 百 GB 大库日常定时备份;
l 生产在线热备,不能停机、不能阻塞业务;
l 需要增量、差异定期备份 + 时间点恢复;
l 机房整体迁移、整库快速克隆。
选用 mysqldump
l 小库、测试环境、单表导出;
l 跨版本、跨服务器数据迁移;
l 临时导出少量数据做分析、核对;
l 快速导出建表语句、初始化脚本。
MySQL 面试知识点总结
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法