InnoDB 锁、事务隔离与复制拓扑

共 33 题
#

1. InnoDB 死锁的检测与回滚?

A 死锁检测与锁类型无关
B InnoDB 无法检测死锁,只能等待超时
C 死锁发生时回滚所有相关事务
D InnoDB 通过等待图检测循环等待,回滚代价最小的事务,并用锁等待超时兜底 ✓ 正确答案
#

2. InnoDB 自增锁(AUTO-INC Lock)的模式,传统、连续、交叉?

A 自增锁模式与并发无关
B 三种模式都对所有 INSERT 加表级锁
C 模式 0 并发度最高
D 模式 2(交叉)并发度最高但自增值可能不连续有间隙;模式 1(连续,默认)对简单 INSERT 不锁表、批量 INSERT 加锁以保连续 ✓ 正确答案
#

3. InnoDB 行锁的算法,Record Lock、Gap Lock、Next-Key Lock?

A Next-Key Lock 是记录锁 + 间隙锁的组合,在 RR 下用于范围加锁防止幻读;RC 下只使用 Record Lock ✓ 正确答案
B Gap Lock 锁住记录本身,不锁区间
C Record Lock 锁住整个表
D 三种锁都只加在主键上,与索引无关
#

4. InnoDB 锁类型,共享锁(S)、排他锁(X)、意向锁(IS、IX)?

A 意向锁是行级锁
B S 锁与 X 锁不兼容,X 锁互斥;意向锁(IS/IX)是表级锁,用于避免加表锁时逐行检查行锁 ✓ 正确答案
C S 锁与 X 锁完全兼容
D X 锁允许其他事务加 S 锁
#

5. InnoDB MVCC 如何通过 undo log 版本链 + Read View 实现多版本读(沿 roll pointer 回溯,按 trx_id 与活跃事务列表比较判定可见性)?

A 通过 roll pointer 形成 undo 版本链,Read View 记录活跃事务列表,按 trx_id 与活跃事务比较判定某版本是否可见 ✓ 正确答案
B MVCC 需要加锁才能读取历史版本
C 版本链只保留最新版本,不支持历史读取
D Read View 与事务 id 无关
#

6. 当前读(SELECT ... FOR UPDATE/LOCK IN SHARE MODE、UPDATE、DELETE)与快照读在加锁行为上有何区别?RR 下如何用 Next-Key Lock 配合快照读共同防止幻读?

A 快照读不加锁、基于 MVCC 读历史版本;当前读加锁读最新版本,RR 下当前读靠 Next-Key Lock 防幻读 ✓ 正确答案
B 两种读都加锁
C 快照读也读取最新版本并加锁
D RR 下当前读不防幻读
#

7. RC 下 UPDATE 遇到被锁定的行为何要读取最新版本(当前读)并重新评估 WHERE(semi-consistent read)?这与 RR 的行为有何不同?

A 该优化只在 RR 下生效
B 该优化与会话冲突
C semi-consistent read 会读取未提交的数据
D RC 下 UPDATE 遇锁定时读取最新已提交版本重新评估 WHERE,不满足则跳过减少锁等待;RR 下不会使用该优化 ✓ 正确答案
#

8. MySQL 主从复制(Master-Slave)的搭建步骤?

A 复制无需 binlog
B 主库配置 server-id 并开启 binlog、创建复制账号;从库配置 server-id、初始化数据后执行 CHANGE MASTER TO 与 START SLAVE ✓ 正确答案
C 只需从库配置,主库无需任何配置
D CHANGE MASTER 只指定主库 IP,无需 binlog 位置
#

9. 主从延迟(Replication Lag)的成因与监控,Seconds_Behind_Master?

A 主从延迟无法缓解
B Seconds_Behind_Master 永远精确反映延迟
C 成因包括大事务、从库单线程执行慢等;Seconds_Behind_Master 有局限,可用 GTID 差集或心跳表更精确监控 ✓ 正确答案
D 主从延迟只发生在异步复制,半同步无延迟
#

10. 并行复制(Multi-Threaded Slave)的演进,DATABASE、WRITESET、LOGICAL_CLOCK?

A DATABASE 模式并行度最高
B 演进为 DATABASE(按库)→ LOGICAL_CLOCK(按提交时间划分并行组)→ WRITESET(按写集合冲突精确判断),并行度依次提高 ✓ 正确答案
C WRITESET 模式按数据库并行
D 并行复制只能并行不同库的事务
#

11. 过滤复制(replicate-do-db、replicate-ignore-db)的应用?

A 过滤复制不影响从库数据完整性
B 过滤复制在 GTID 模式下无任何风险
C replicate-do-db 只复制表,不复制库
D 通过 replicate-do-db/replicate-ignore-db 等参数只复制指定库/表,但易造成数据不完整,需谨慎使用 ✓ 正确答案
#

12. 多源复制(Multi-Source Replication)的应用?

A 多源复制无需配置 channel
B 多源复制只能从一个主库复制
C 一个从库通过多个 channel 同时从多个主库复制,常用于数据汇聚与分库汇总 ✓ 正确答案
D 多源复制不能用于数据汇聚
#

13. writeset-based 并行复制的依赖追踪?

A writeset 模式不需要 binlog
B writeset 与事务修改的行无关
C writeset 模式判断任意两个事务都冲突
D 通过比较事务写集合是否有交集判断是否可并行,无交集则无冲突可并行,需 ROW 格式且比 LOGICAL_CLOCK 更精确 ✓ 正确答案
#

14. MySQL 半同步复制的原理与取舍,ack 时机(AFTER_COMMIT/AFTER_SYNC)对数据安全与延迟的影响,退化降级为异步复制的条件如何设置?

A 半同步复制永不降级为异步
B AFTER_COMMIT 比 AFTER_SYNC 更安全
C 半同步复制不等待从库确认
D AFTER_SYNC 先写/fsync binlog 再等从库 ack 后提交,数据更安全;超时(rpl_semi_sync_master_timeout)会临时降级为异步 ✓ 正确答案
#

15. Percona Xtrabackup 物理备份的原理(拷贝数据文件的同时持续追记 redo 变化,--prepare 阶段前滚 redo 达到一致)是什么?为什么结束阶段仍需短暂加全局锁?

A 备份时拷贝数据文件并持续追记 redo,--prepare 阶段前滚 redo 使数据一致;结束阶段短暂加全局锁以获取一致 binlog 位置 ✓ 正确答案
B --prepare 阶段丢弃 redo 变化
C 备份结束无需加锁也能获取 binlog 位置
D Xtrabackup 只记录 redo 不拷贝数据文件
#

16. Xtrabackup 增量备份如何基于 --incremental-lsn 只拷贝 LSN 之后变化的页?恢复时如何把多个增量依次合并(apply)到全量?

A 增量备份可独立恢复,无需全量
B 增量备份每次都拷贝全部数据
C 增量备份基于 --incremental-lsn 只拷贝 LSN 之后变化的页;恢复时用 --apply-log-only 依次把增量前滚合并到全量 ✓ 正确答案
D 恢复时合并增量的顺序可以任意
#

17. binlog 闪回工具(binlog2sql、MyFlash)如何从 ROW 格式 binlog 生成反向 SQL(DELETE↔INSERT、UPDATE 前后镜像互换)实现误删恢复?前提条件(binlog_format=ROW、binlog_row_image=FULL)是什么?

A 闪回工具直接修改 binlog 文件
B 靠解析 ROW 格式 binlog 的 before/after 镜像生成反向 SQL(DELETE↔INSERT、UPDATE 镜像互换),前提是 binlog_format=ROW 且 binlog_row_image=FULL ✓ 正确答案
C binlog_row_image=MINIMAL 也能提供完整镜像
D 闪回只需 STATEMENT 格式 binlog
#

18. MySQL PITR 的完整流程(还原全量备份 → 用 mysqlbinlog 按 --stop-datetime/--stop-position 重放到误删前一刻)是怎样的?如何跳过引发故障的事务?

A --stop-datetime 不能指定位置
B PITR 只需重放 binlog,无需还原全量备份
C 流程是还原全量备份后用 mysqlbinlog 按 --stop-datetime/--stop-position 重放到误删前,通过定位故障事务位置跳过该事务 ✓ 正确答案
D PITR 无法跳过引发故障的事务
#

19. mysqldump 的 --source-data/--master-data 与 --set-gtid-purged 如何记录备份点坐标/GTID 集合?它们在搭建从库与增量衔接中的作用是什么?

A --master-data 只记录表结构,不记录位置
B 这两个参数与复制无关
C --set-gtid-purged 记录 binlog 位置
D --source-data/--master-data 记录 binlog 文件名与位置,--set-gtid-purged 记录 GTID 集合,用于从备份点继续复制与增量衔接 ✓ 正确答案
#

20. 并行备份恢复工具(mydumper/myloader、mysqlpump)如何按表/按块提升效率?在一致性保证与线程数上有哪些取舍?

A 线程数越多永远越好,无副作用
B mydumper/myloader 按表/按块多线程并行导出/导入,配合 --single-transaction 保证一致性;线程数需在速度与线上负载间权衡 ✓ 正确答案
C 并行工具无法保证一致性
D mydumper 只能单线程备份
#

21. 如何验证备份可用性(恢复到沙箱实例、pt-table-checksum 与生产比对、关键表行数与校验和)?

A 沙箱恢复不能验证数据完整性
B 备份生成后无需验证,必定可用
C 验证只需看备份文件大小
D 通过恢复到沙箱实例、pt-table-checksum 比对、关键表行数与校验和比对来验证备份可恢复,并应定期演练 ✓ 正确答案
#

22. 物理备份有哪些版本兼容性限制(Xtrabackup 版本需匹配 MySQL 版本、不能跨大版本或降级恢复)?

A Xtrabackup 版本与 MySQL 版本无关
B 物理备份可跨任意大版本恢复
C Xtrabackup 版本需匹配 MySQL 版本,物理备份不能跨大版本或降级恢复,跨版本通常改用逻辑备份 ✓ 正确答案
D 物理备份可以降级恢复
#

23. MHA vs Orchestrator 的取舍?

A Orchestrator 比 MHA 更简单
B MHA 轻量简单、脚本驱动、切换较慢;Orchestrator 功能强、有拓扑管理与 Web UI、支持 Raft 集群化、切换更快 ✓ 正确答案
C MHA 自带可视化管理界面
D 两者功能完全相同
#

24. MHA(Master High Availability)的选主与切换流程?

A 检测主库故障后,选择数据最完整、最接近主库的从库作为新主,补 binlog 后提升并让其他从库指向新主 ✓ 正确答案
B MHA 随机选择任意从库做新主
C MHA 切换不需要补 binlog
D MHA 切换后原从库不再作为从库
#

25. Orchestrator(GitHub)的工作原理与拓扑管理?

A Orchestrator 无法持久化拓扑信息
B 它自动发现并持久化 MySQL 复制拓扑,提供 Web UI 与自动故障切换,自身基于 Raft 实现集群高可用 ✓ 正确答案
C Orchestrator 不提供故障切换
D Orchestrator 只能管理单主拓扑
#

26. ProxySQL 的应用,读写分离、查询路由?

A ProxySQL 不提供连接池
B ProxySQL 只能做负载均衡,不能路由
C ProxySQL 会修改 SQL 语句
D 通过 hostgroup 分组主从库,用 query rules 按 SQL 特征把写路由到主库、读路由到从库,实现读写分离 ✓ 正确答案
#

27. MHA Orchestrator ProxySQL 的协同架构?

A ProxySQL 自己完成主从切换,无需 HA 工具
B MHA 负责读写分离,ProxySQL 负责复制
C ProxySQL 负责读写分离与路由,MHA/Orchestrator 负责故障切换,切换后需让 ProxySQL 感知新主库并更新路由 ✓ 正确答案
D 三者功能完全重叠
#

28. innodb_buffer_pool_size 的设置原则,物理内存的 50%-80%?

A 通常取物理内存的 50%-80%,需为操作系统、连接、线程等预留内存,过大可能 OOM、过小命中率低 ✓ 正确答案
B 应设为物理内存的 100%,充分利用内存
C Buffer Pool 大小与内存无关
D Buffer Pool 越大越好,无需预留
#

29. innodb_flush_log_at_trx_commit 的语义,0、1、2?

A 该参数越大越安全
B 0 是默认且最安全
C 2 每次提交都立即 fsync
D 1 每次提交 fsync 刷盘最安全,0 每秒刷盘最快但可能丢最多数据,2 写 OS 缓存每秒刷盘折中 ✓ 正确答案
#

30. innodb_log_file_size、innodb_log_files_in_group 的设置?

A redo 总容量等于两者乘积,过小会频繁触发 checkpoint 刷脏增加 IO,过大则占用磁盘与恢复时间越长 ✓ 正确答案
B 两者乘积与 redo 容量无关
C redo log 越小,性能越好
D 这两个参数只影响 binlog
#

31. sync_binlog 的语义,0、1、N?

A 0 是最安全配置
B N 每次提交都 fsync
C 1 每次提交 fsync 最安全,0 由 OS 决定刷盘最快但可能丢 binlog,N 每 N 次提交刷盘一次折中 ✓ 正确答案
D sync_binlog 控制 redo log 刷盘
#

32. after_sync 模式下从库确认后主库才提交,主库故障时为何不丢已确认事务?

A after_sync 确认时 binlog 尚未落盘
B after_sync 先提交再等 ack,所以更安全
C 因为 after_sync 先写 binlog 并 fsync、等从库 ack 后才提交,确认时事务 binlog 已持久化且从库已持有,故障时可由从库补回 ✓ 正确答案
D after_sync 下从库不保存 binlog
#

33. MySQL 参数的全局与会话设置?

A 全局变量影响整个实例、新连接生效,会话变量只影响当前连接;SET GLOBAL/SET SESSION 分别设置,会话默认继承全局值 ✓ 正确答案
B 所有变量都只能全局设置
C 会话变量影响所有连接
D 全局变量只能查看不能修改