数据库运维机考通关,这套高频试题与答案你掌握了吗?说实话,我接触过的运维同行里,十个人有八个在机考面前翻过车。不是技术不行,是考试太刁钻。比如你平时改个参数顺手敲个命令,但机考偏偏问你“这个命令的完整语法结构是什么”,或者“异常情况下回滚的步骤有哪几步”。这些细节平时压根没人记,但考试偏偏就爱考。所以今天我把这几年收集的高频题整理出来,没准你下次就用得上。

先说一个最基础的,但也是最容易错的:如何查看数据库的当前连接数?很多人第一反应是“show processlist”,没错,这确实能看。但机考喜欢挖坑,它会问“如何查看当前活跃连接数?”这时候你得用“show status like 'Threadsrunning'”,光记住“Threadsconnected”是不够的,因为那只是总连接数,不包含空闲连接。我见过一个小伙子在机考里直接写了“show full processlist”,结果被扣分,因为题目明确要求只显示活跃连接。这种细节,差一个字就是零分。
再来看备份恢复,这是机考的必考题。常见的问法是“如何用mysqldump备份整个数据库,并指定字符集?”标准答案是“mysqldump -u root -p --default-character-set=utf8 databasename > backup.sql”。但考官往往会加一个条件:“如果备份过程中遇到锁表怎么办?”这时候你得知道加“--single-transaction”参数,这个参数能在不锁表的情况下做一致性备份。我有个朋友就因为不知道这个参数,在机考里写了个“lock tables read”,结果被判定为操作不当,直接扣了一半分。备份恢复这块,考官最喜欢玩的就是“参数组合”游戏,比如“既要压缩又要排除某些表”,那你就得写“mysqldump -u root -p --single-transaction --compress --ignore-table=databasename.table1 databasename | gzip > backup.sql.gz”。少一个参数,答案就不完整。
索引优化也是个重灾区。机考里常出现这类题:“有一张订单表,包含orderid、userid、createtime三个字段,请设计索引以优化按用户查询最近订单的SQL。”很多人会直接建复合索引“index(userid, createtime)”,但考官会追问:“如果查询条件里还有orderid呢?”这时候你得考虑覆盖索引,把orderid也加进去,变成“index(userid, createtime, orderid)”。但问题又来了,如果orderid是主键,那它本身就存在于每个索引的叶子节点里,再加就是冗余。所以机考里最讨厌的就是这种“看似简单,实则陷阱”的题。我建议你平时多练练“explain”,看执行计划比死记硬背命令靠谱得多。
权限管理这块,机考题的套路也很固定。比如“创建一个用户,只允许从192.168.1.%网段登录,并且只能对mydb库的select权限”。标准答案是“create user 'test'@'192.168.1.%' identified by 'password'; grant select on mydb. to 'test'@'192.168.1.%';”。但考官会问:“如果这个用户还需要能执行存储过程呢?”这时候你得加“execute”权限。更狠的是,有的机考题会要求“回收所有权限后再重新赋予”,那你就得先“revoke all privileges on mydb. from 'test'@'192.168.1.%';”,然后再“grant”。很多人在这一步容易漏掉“flush privileges”,虽然理论上grant后会自动刷新,但机考系统如果严格的话,没写就是扣分项。
慢查询日志的配置也是高频考点。题目通常会问“如何开启慢查询日志并设置阈值?”答案很简单:“set global slowquerylog=1; set global longquerytime=2;”。但考官会接着问:“如何查看慢查询日志文件的位置?”答案是“show variables like 'slowquerylogfile';”。如果题目再深入一点,问“如何分析慢查询日志?”那就得用“mysqldumpslow”工具,比如“mysqldumpslow -s t -t 10 /var/log/mysql/slow.log”,这个命令能按时间排序输出前10条最慢的查询。我见过有人把“-s t”写成“-s time”,结果报错,因为参数缩写是严格区分大小写的。这种低级错误,在机考里一犯就白搭。
事务与锁机制这块,机考题喜欢出场景题。比如“两个事务同时更新同一行数据,问会发生什么?”答案是“死锁”或者“锁等待”。但考官会要求你写出如何查看当前锁等待情况。标准命令是“show engine innodb statusG”,然后看“LATEST DETECTED DEADLOCK”部分。如果题目更进一步,问“如何设置事务隔离级别以避免脏读?”那就得写“set session transaction isolation level read committed;”。很多人会写成“read uncommitted”,那脏读更严重了。还有一点要注意,机考里如果问“如何查看当前事务”,那得用“select from informationschema.innodbtrx;”,这个表里记录了事务ID、状态、开始时间等信息。光靠“show processlist”是看不全的,因为有些事务处于休眠状态不会显示。
说说日常运维中最容易忽视的——监控与报警。机考题会问“如何设置数据库连接数达到80%时自动报警?”答案不是写个脚本那么简单,考官要的是“show variables like 'maxconnections';”和“show status like 'Maxusedconnections';”这两个值对比。然后写个shell脚本,比如“maxconn=$(mysql -e 'show variables like 'maxconnections'' awk '{print $2}'); if [ $usedconn -gt $((max_conn 80 / 100)) ]; then echo '报警'; fi”。很多人觉得这太基础,但机考就是考察你把这些基础命令拼起来用的能力。如果你连“awk”和“grep”都记不清,这道题基本就凉了。
说了这么多,其实机考考的不是你会不会背命令,而是你面对真实场景时能不能快速组织出正确答案。数据库运维这行,命令记不全不可怕,可怕的是脑子里没有解决问题的逻辑链。你平时多练练“show status”、“show variables”、“explain”这些命令的变体,多想想“如果条件变了,参数该怎么调整”。下次再碰到机考,哪怕题目变了,你也能从这些高频考点里找到套路。记住,机考不考天才,只考细心。你把这些题过一遍,至少能拿个及格分,再结合自己的实战经验,通关就是时间问题。


