拿到数据库运维考试的考纲,很多人第一反应是翻书。翻完一遍,合上,脑子里只剩下“事务隔离级别”和“索引失效”几个词在飘。这考试邪门的地方在于,知识点你都见过,但题目换个马甲,你就认不出来了。我见过干了三年DBA的老手,栽在一条“如何查看慢查询日志”的选择题上——不是不会,是选项里那个“mysqldumpslow”和“pt-query-digest”他一时恍惚,选错了。所以别指望靠“熟悉感”蒙混过关,这考试考的是你在压力下能不能精准调用记忆,跟跑百米差不多,起跑慢半拍,后面全乱。

先说最让人头疼的备份恢复。别一上来就背“全量备份、增量备份、差异备份”的定义,没用。你得在脑子里搭一个场景:某天凌晨两点,业务库磁盘满了,主从延迟飙到十秒,老板在群里发了个“?”——这时候你手边有上周日的全量备份,有周一和周二的增量日志,请问你恢复数据要几步?答案不是“先恢复全量再应用日志”这么简单,你得知道恢复完要不要重启,要不要校验表结构,binlog点位从哪里开始找。考试就爱考这种“看似简单,实则连环坑”的题。我建议你把官方文档里备份章节的流程图抄一遍,然后自己画个时间轴,标清楚每个备份文件覆盖的时间范围。画完你就明白,为什么很多人栽在“恢复后数据不一致”上——他们忘了日志里还有未提交的事务,恢复时要先回滚。
索引这块,别被“最左前缀”四个字骗了。考试不会直接问你“联合索引(a,b,c)查询b=1能用索引吗”,它会把条件改写成“where b=1 and a=2”,让你判断顺序调换有没有影响。或者更阴险一点,给你一条带函数的上线查询,问你会不会索引失效。这时候你光背“函数会导致索引失效”不够,你得理解为什么——因为索引是按原始值排序的,你套个UPPER()函数,排序规则就变了,优化器没法用B+树的顺序查找,只能全扫。理解了这个底层逻辑,哪怕题目改成“对日期字段用DATEFORMAT查询”,你也能推断出来大概率走不了索引。另外注意,覆盖索引是高频考点,它跟普通索引的区别在于叶子节点存了所有需要的字段,不用回表。考题喜欢让你比较“select *”和“select id”在相同索引下的性能差异,本质就是考你知不知道回表多了一次磁盘IO。
事务隔离级别这块,最容易混淆的是“不可重复读”和“幻读”。我教你个土办法:不可重复读是同一行数据,你读两次,值变了;幻读是你读一个范围,第一次出3行,第二次出4行,多出来那行像幻觉。REPEATABLE READ在MySQL里通过MVCC解决了不可重复读,但没完全解决幻读——除非你用间隙锁。考试题目经常给你一个场景:事务A查询id>10的记录,事务B插入一条id=11的记录,问A再查一次会不会看到新记录。答案是“在RR隔离级别下,如果A的查询走了索引且加了间隙锁,B会被阻塞;如果没锁,A看不到,因为MVCC的快照是第一次查询时生成的”。这个“快照生成时机”是另一个坑,很多人以为RR下每次查询都生成新快照,其实是第一次查询时定死的。
主从复制和读写分离,考的是你对延迟的敏感度。题目会给你一个主库写、从库读的架构,然后问“刚插入的数据为什么查不到”。答案无外乎两种:要么复制延迟,要么你的连接走了主库但查询走了从库。考试不考你怎么解决,它考你“排查思路”——先看SecondsBehind_Master,再看binlog和relay log的position差多少。这里有个容易忽略的点:半同步复制和异步复制的区别。半同步要等从库确认收到binlog才提交,所以主库写入会慢一点,但数据更安全。考题喜欢让你权衡“在一致性要求高的场景选哪种”,答案是半同步,但你要写清楚代价是吞吐量下降。
性能调优这块,别只盯着慢查询日志。考试会给你一个“CPU飙高、IO不高”的场景,问你先查什么。有经验的人会先看processlist,看有没有长时间运行的SELECT或LOCK WAIT。但新手容易直接上EXPLAIN看执行计划——这也没错,但顺序不对。你得先确认是“查询慢”还是“锁等待”,后者跟SQL本身没关系,是并发控制的问题。另外,缓冲池命中率这个指标,考试喜欢让你算:读请求次数是1000,从内存读的次数是950,命中率就是95%。低于95%就要考虑调大buffer pool,或者检查是不是有全表扫描把数据页都刷出去了。顺便提醒,别忽略临时表——排序和去重操作如果数据量大,会落盘到临时表,导致磁盘IO飙升,这个考点在“filesort”和“using temporary”两个词上反复出现。
考试前一周怎么复习?别刷题海,把近三年的真题按知识点分类,标出自己错得最多的三类,针对性地看官方文档对应章节。然后每天花半小时,把每个核心考点用“如果我是面试官,我会怎么出题”的角度复述一遍。比如备份恢复,你就问自己:如果我要考别人,我会考“binlog三种格式的区别”还是“mysqldump的一致性快照原理”?前者是死记硬背,后者需要理解——考试现在越来越偏后者。另外,机考环境里有些命令是模拟的,比如mysql>提示符下敲不了真实命令,但你可以用help命令查语法,这不算作弊,考试系统允许。别小看这个,很多人输错一条命令,整个场景题就废了。
说到底,数据库运维考试不是考你背了多少参数,是考你在故障现场能不能稳住。我见过一个考生,碰到“主从延迟”的题,先写了“检查网络”,再写“检查从库负载”,才想起看relay log——顺序全反了。正确思路是先确认延迟量级,再查从库有没有在跑大查询,才看网络。这个排查顺序,比背一百个参数都值钱。你把每个考点的“故障→排查→解决”链条理清楚,考试就是走流程,不会慌。离考试还有几天的话,别贪多,把备份恢复、索引优化、事务隔离、主从复制这四个模块的排查链路各写一张卡片,睡前过一遍。考场上你会有种感觉:题目虽然换了皮,但骨子里都是你练过的那几套动作。


