跳到正文
Weiyao Docs
← 面试资料 最后更新:2026-09-22
  • MySQL面试总结

    归纳整理人: 魏姚

    邮箱: qluogxbd@gmail.com

    个人博客: https://www.zhihu.com/column/c_1876380493982867456

    更新时间2026.1.18

    更新日志: 添加目录模式,方便查看

    题库总数量: 454


    目录

    MySQL面试总结目录基础面试题1.1.1 MySQL 安装方式有哪些,你们公司用的哪个方式,为什么?1.1.2 关系型数据库与非关系型数据库的区别?1.1.3 MySQL 5.6,5.7/8.0 版本安装过程有什么区别?1.1.4 MySQL 5.7,8.0 在用户管理功能上有什么区别,请举例说明1.1.5 请描述 MySQL 的授权表有哪些,都有什么作用?1.1.6 简述你在工作中使用 MySQL 连接的方式?1.1.7 MySQL 的配置文件标签有哪些?(my.cnf1.1.8 MySQL 忘记root 用户密码怎么办?1.1.9 在公司中一般给开发,运维,管理员授予什么权限1.1.10 请列举 MySQL 配置文件的读取顺序?1.1.11 请列举 MySQL 启动和关闭方式?1.1.12 你们公司使用多实例环境吗?在什么地方用的?1.1.13 如何查看数据库当前连接情况1.1.14 简述数据库启动不了,如何排查?1.1.15 数据库连接不上如何排查?1.1.16 MySQL常用数据类型有哪些1.1.17 MySQL 约束有哪些?1.1.18 MySQL 列的属性设置有哪些?1.1.19 MySQL 如何设置自增列 自增列是否可以自定义起始值1.1.20 MySQL 自增列的范围?1.1.21 MySQL服务模式有哪些常用参数,什么时候会用到?1.1.22 MySQL 查询表中数据中文字体乱码,原因可能是什么?如何修改?1.1.23 什么是实例1.1.24 简述 MySQL 程序结构?1.1.25 简述一条 select 语句的执行过程?1.1.26 请简述 MySQL 逻辑结构和宏观物理结构?1.1.27 请简述段、区、页的构成1.1.28 你们公司用的 MySQL 版本,为什么选择?1.1.29 数据库文件损坏最大原因?1.1.30 MySQL 用户安全规范1.1.31 授权权限 3 条红线1.1.32 inplace 升级至 5.78.0,升级方式上有什么区别?8.0 要注意什么 ?1.1.33 MySQL 中 TEXT 类型最大可以存储多长的文本1.1.34 MySQL 中 AUTO_INCREMENT 列达到最大值时会发生什么?1.1.35 MySQL 中 EXISTS 和 IN 的区别是什么?1.1.36 MySQL数据库的优缺点?1.1.37 什么是隐式转换?1.1.38 MySQL 怎么查看系统资源(内存,CPU)?1.1.39 数据库启动时间与哪些因素有关?1.1.40 有一个 8核心 16g 服务器,活动会话数达到多少个会不正常?1.1.41 MySQL 如何管理用户连接的?1.1.42 MySQL 5.7 和 MySQL 8.0 有哪些区别?1.1.43 MySQL 5.6 和MySQL 5.7 有什么区别?1.1.44 MySQL 从5.6 升级到5.7 是不是大版本升级?1.1.45 MySQL 数据库升级,你常用的是哪个数据库版本的升级?1.1.46 idb 和 frm 文件是用来干什么?1.1.47 ibdata 和 ib_log_file 放的什么?1.1.48 你们一台物理机是部署一个MySQL还是多套?因为是多实例的,有遇到过实例之间的影响案例吗?1.1.49 哪些不是活跃连接?用什么语句看?1.1.50 MySQL 碎片信息怎么看?1.1.51 mysql结构体系和工作原理?1.1.52 mysql 8.0 新特性SQL 1.2.1 请简述select语句的各个子句的执行顺序?1.2.2 请列举 SQL 语句的种类和代表命令?1.2.3 请简述SQL_MODE的作用?ONLY_FULL_GROUP_BY是干什么用的?1.2.4 SQL_MODE 的常用参数,什么使用应用这些参数?1.2.5 请简述MySQL utf8和utf8mb4区别?1.2.6 请简述tinyint、int、bigint 如何计算的存储位数?1.2.7 请简述 CHAR(10)VARCHAR(10) 区别,生产如何选择?并阐述为什么?1.2.8 请简述 DATETIMETIMESTAMP 区别?1.2.9 什么是数据库的视图?1.2.10 请简述你们数据库开发过程,选择数据类型的规范是什么?1.2.12 请简述你们公司在 Schema 设计过程中有哪些开发规范?1.2.13 请简述 DROP TABLETRUNCATE TABLEDELETE FROM TABLE 的区别?1.2.14 请简述如何利用 UPDATE 替换 DELETE 语句实现伪删除?1.2.15 如果要你规划一个 10 亿的大表,你有什么好的方案?1.2.16 如果这张10亿单表已经存在了,想要删除1000W数据如何处理?1.2.17 生产中使用过分区表吗?你们使用的是什么分表策略?分区表有什么优势和劣势?1.2.18 请简述 GROUP BY 语句的执行原理?1.2.19 WHEREHAVING 语句的区别?1.2.20 生产中进行数据库资产统计,都统计什么?如何统计?1.2.21 请介绍你常用的聚合函数及其作用1.2.22 简述多表连接的方式1.2.25 什么是笛卡尔乘积?1.2.26 你们公司 Online DDL 如何处理的?1.2.27 5.65.78.0 在 Online DDL 的改变?1.2.28 简述 pt-osc 或者 gh-ost 第三方工具在处理 DDL 时的原理?1.2.29 为什么在MySQL 中不推荐使用多表 Join ?1.2.30 MySQL中count(*) count(1) count (字段名) 的区别是什么?1.2.31 MySQL 中 int(11) 的 11 表示什么?1.2.32 MySQL 中 varchar 和 char 有什么区别?1.2.33 MySQL 中如何进行 SQL 调优?1.2.34 select * select 所有字段区别?1.2.35 select * 一定会全表遍历吗?1.2.36 连表查询怎么看哪个是驱动表,哪个是被驱动表?1.2.37 嵌套连结和hash join原理 ?1.2.38 update一条语句的流程?索引1.3.1 请列举 MySQL 索引的类型1.3.2 MySQL 索引算法演变:二叉树,二叉平衡树,红黑树,B -Tree, B+Tree1.3.3 索引树高度影响因素有哪些?1.3.4 详细说一说B+树在磁盘IO方面的优势1.3.5 MySQL 8.0 索引的新特性1.3.6 创建索引时应当注意什么(什么时候适合创建索引)?1.3.7 什么时候不适合创建索引1.3.8 什么情况会造成索引失效?1.3.9 如何获取执行计划?如何理解分析执行计划的输出?1.3.10 什么是回表查询?如何减少回表1.3.11 聚簇索引和非聚簇索引有什么区别?1.3.12 描述 MySQL 的 B+ 树中查询数据的全过程1.3.13 唯一索引与普通索引的区别?1.3.14 详细说说最左前缀匹配1.3.15 能说说什么是索引下推吗?1.3.16 执行计划中你一般关注哪些点?1.3.17 MySQL为什么选择 B+tree 查找算法?1.3.18 一条select语句平常查询时很快,一天突然变慢了的原因?1.3.18 聚簇索引构建条件 聚簇索引是如何构建的?1.3.19 索引有哪些自优化能力?1.3.20 如何建立索引才能加快查询?1.3.21 建立索引后还会出现慢查询后如何解决及原因?1.3.22 MySQL 中的数据排序是怎么实现的?1.3.23 MRR多范围读取优化?1.3.24 MySQL 中的索引数量是否越多越好?为什么?1.3.25 联合索引与单列索引的区别?1.3.26 你能看到你查询时间?查询速度?1.3.27 ⽐如说我查询的表结构是string类型,然后我⽤varchar类型的会⾛索引吗?1.3.28 varchar类型的不是要加单引号吗,然后你不加单引号直接查⼀个数字能查出了吗?(⽐如说;varchar类型是123456,查id=123456能查出来吗?不加单引号)?1.3.29 explain查执⾏计划,ID列的执⾏顺序是怎么样的?1.3.30 B+tree构建过程1.3.31 MySQL 中使用索引一定有效吗?如何排查索引效果?1.3.32 MySQL 的覆盖索引是什么?1.3.33 索引下推如何开启?1.3.34 如何使用 MySQL 的 EXPLAIN 语句进行查询分析?存储引擎1.4.1 MySQL 中 InnoDB 存储引擎与 MyISAM 存储引擎的区别是什么?1.4.2 MySQL 有哪些存储引擎?1.4.3 TokuDB 等存储引擎相较于 InnoDB 有什么优势?在什么场景应用?1.4.4 MySQL 的碎片是如何产生的?你是如何处理的?1.4.5 简述 InnoDB 物理存储结构1.4.6 简述 InnoDB 内存结构?1.4.7 InnoDB 的共享表空间在不同版本有什么变化?1.4.8 简述表空间迁移的过程1.4.10 共享表空间如何扩容?1.4.11 如何独立 Undo 表空间?1.4.12 MySQL 的 Doublewrite Buffer 是什么?它有什么作用?1.4.13 从 MySQL 获取数据,是从磁盘读取的吗?(buffer pool)1.4.14 MySQL 中的 Log Buffer 是什么?它有什么作用?1.4.15 MySQL 中如何解决深度分页的问题?1.4.16 什么是 Write-Ahead Logging (WAL) 技术?它的优点是什么?MySQL 中是否用到了 WAL?1.4.17 MySQL 的查询优化器如何选择执行计划?1.4.18 MySQL 三层 B+ 树能存多少数据?1.4.19 什么是数据库的逻辑删除?数据库的物理删除和逻辑删除有什么区别?1.4.20 表空间迁移的背景?1.4.21 独立表空间迁移中 5.7 版本的数据库如何迁到 8.0 版本的数据库?N1.4.22 如何调整buffer pool区域大小, 建议设置多大比较合理?1.4.23 如何调整Change buffer区域大小,建议设置多大比较合理?1.4.24 Innodb 页的结构有哪些部分,都有什么作用?1.4.25 Innodb 存储引擎中的buffer pool 能介绍一下吗?1.4.26 链表和数组相比,链表和数组适用于的什么访问?1.4.27 SQL语句扫描行太多,回表次数太多如何解决?1.4.28 在执行器中是怎么生成的执行计划?1.4.29 MySQL的存储机制和MySQL的索引的存储机制?(mysql的表数据存在哪?索引数据在哪⾥?落到磁盘展现形式)1.4.30 缓冲池机制?1.4.31 缓冲池为了加快查询或写⼊速度,⼀般先写⼊缓冲池。那么缓冲池和磁盘之间的数据差异,通过什么样的机制去保证数据的⼀致性?1.4.32 你们⼀般将缓冲池设置成多少?你们的机器规格是多⼤?1.4.33 MySQL 的 Change Buffer 是什么?它有什么作用?1.4.35 索引树的高度多少合适?1.4.36 innodb的核心特性?日志1.5.1 如何配置开启通用日志,二进制日志,错误日志,慢查询日志?1.5.2 如何查看二进制日志1.5.3 binlog二进制日志有哪些格式?有什么区别?你们公司用什么格式?1.5.4 二进制日志如何切割1.5.5 二进制日志如何清理1.5.6 二进制日志相关配置有哪些?1.5.7 什么是双一配置?1.5.8 你是如何截取二进制日志的?与GTID 有什么不同点?1.5.9 如何配置慢查询?1.5.10 慢日志如何处理?慢日志在什么时候使用,如何用?1.5.11 数据库优化流程?1.5.12 慢日志的配置参数?1.5.13 SBR(statement-based replication)与RBR(Row-Based Replication)记录的优缺点分析 ?数据备份与恢复1.6.1 你在备份这块都做过什么具体工作?/你公司的备份策略?1.6.2 你们公司使用什么工具备份 / 备份策略?1.6.3 请介绍 mysqldump 核心参数:--master-data--single-transaction 的功能?1.6.4 请简述 mysqldump 备份原理1.6.5 mysqldump 是否属于热备份?1.6.6 mysqldump 是否需要锁表?1.6.7 请介绍 xtrabackup 工具的备份原理1.6.8 晚上 23:00 开始备份 mysqldumpxtrabackup 两个工具理论上能将数据恢复至几点?1.6.8 xtrabackup 的增量备份是如何实现的?1.6.9 xtrabackup 增量备份恢复要注意什么?1.6.10 mysqldumpxtrabackup 备份如何实现基于时间点的恢复?1.6.11 请列举数据库数据损坏场景,然后针对性地提出最佳的恢复方案(假设具有多种类型备份)?1.6.12 如何实现分库分表,备份数据库中的表?1.6.13 数据库宕机没有全量备份,但有物理文件,如何恢复数据?1.6.14 delete 了数据库中一个表,如何恢复?1.6.15 备份方案中保存 3-7 天和 7-15 天的原因,依赖什么依据这么保存的?1.6.15 mysqldump 全备时如何保证数据的不丢失?mysqldump 全备时会对业务造成影响吗?1.6.16 (单表恢复)8:00全备了一张表,9:00误删除了一张小表,但有binlog,怎么恢复?1.6.17 生产中备份的文件50G数据库,误删除了一张 t1 表,10M大小,有什么思路可以快速恢复?1.6.18 进行独立表空间迁移时遇到没有提前保存表结构信息怎么办?1.6.19 进行独立表空间迁移时遇到数据库中有多张表如何批量进行迁移 (有多个库多个表)?1.6.20 为什么mysqldump 为什么不在第一次执行 flush tables 操作的时候加上锁呢?1.6.21 线上备份是怎么实现的?加什么参数?1.6.22 xtrabackup 备份过程中怎么确保数据一致性?在备份过程中有新增加的数据怎么办?新增加的数据有没有必要进进⾏备份?1.6.23 mysqldump 进行数据补偿后,新增加的数据怎么办?1.6.24 mysql的备份⽅式?备份⼯具?是否锁表?1.6.25 你们是怎么做数据恢复的?流程?⽤什么⼯具?(业务说⼏⼗万条数据删错了,你是怎么把它恢复回来)1.6.26 mysql运⾏到⼀半,遭遇断电宕机,在做恢复的时候怎么保障mysql缓冲池中的数据落盘或者不落盘的?可能缓冲池和磁盘数据不⼀致嘛?1.6.27 你这500G数据用什么工具备份,花费多长时间,恢复要多久?1.6.28 一张表使用mysqldump备份,用什么参数保证这三张表在同一时间备份数据?1.6.29 flush table 命令有什么作用?1.6.30 MySQL CR 恢复机制,是怎样恢复数据数据的 redo log 和 DoubleWrite buffer 是如何配合的?1.6.31 数据恢复方案?1.6.32 周日做的备份,昨天删除了drop了一张表,如何恢复,不知什么时间删除的?1.6.33 数据损坏了怎么恢复(断电了,误删了)?事务和锁1.7.1 MySQL 是如何实现事务的?1.7.2 什么是事务的 ACID?ACID 是如何保证的?1.7.3 MySQL 中长事务可能会导致哪些问题?1.7.4 MySQL 中的 MVCC 是什么?1.7.5 如果 MySQL 中没有 MVCC,会有什么影响?1.7.6 MySQL 中的事务隔离级别有哪些?1.7.7 MySQL 默认的事务隔离级别是什么?为什么选择这个级别?1.7.8 数据库的脏读、不可重复读和幻读分别是什么?1.7.9 什么是死锁?1.7.10 什么是快照读,什么是当前读?1.7.11 read-view 是如何判断当前事务的看见性的?1.7.12 幻读是怎样产生的,会造成什么问题?1.7.13 InnoDB是怎样在可重复读隔离级别下解决幻读的?1.7.14 简述 MySQL 中锁的种类及作用?1.7.15 MySQL 的乐观锁和悲观锁是什么?1.7.16 MySQL 中如果发生死锁应该如何解决,如何检测死锁?1.7.17 lock in share mode、for update、update、insert、delete分别上什么锁?1.7.18 MySQL的加锁原则能介绍一下嘛1.7.19 next-key lock加锁的过程是怎样的?1.7.20 MySQL 插入一条 SQL 语句,redo log 记录的是什么?1.7.21 MySQL 事务的二阶段提交是什么?1.7.22 redo log 重做日志作用 ?1.7.23 undo log 回滚日志作用 ?1.7.24 RC 和 RR 在构建 mvcc 的 read view 时有什么区别?1.7.25 Innodb 支持事务的原因?1.7.26 MVCC 中是如何判断其他事务是否可见?1.7.27 事务的持久性是如何实现的?主要参数是什么?1.7.28 为什么需要两阶段提交,那么如果没有两阶段提交,会发生什么呢?1.7.29 MySQL 如何监控长事务,避免长事务?1.7.30 如何解决幻读?1.7.31 MVCC 解决幻读了吗?1.7.32 MySQL为什么会需要redo日志,redo日志的特点和好处?1.7.33 如何理解undo日志?1.7.34 MVCC机制、事务隔离级别、undo、redo之间的相互作用?1.7.35 从数据操作角度锁分为哪几种?从数据粒度来划分,锁分为哪几种?1.7.36 死锁你是怎么监控?其他还有遇到过锁的?元数据锁?1.7.37 事务没有提交?事务的堵塞情况?事务运⾏多久?1.7.38 redo log占⽤磁盘太多是什么导致的?(⽐如说500G的实例,这个⽇志就占200G)1.7.39 单机的redo log是做什么的?集群1.7.40 什么时候redo log进⾏数据落盘?1.7.41 redo 和undo与双写⽂件之间的关系?1.7.42 mysql读视图概念1.7.43 间隙锁和意向锁?1.7.44 redo log和binlog⽂件写⼊顺序1.7.45 mysql DDL操作哪些方式不会锁表?1.7.46 直接先写完 redo log,再写 binlog,崩溃恢复后直接判断两个日志数据是否完整不就好了? 为什么还要分二阶段?1.7.48 MySQL 插入一条 SQL 语句,redo log 记录的是什么?1.7.49 插入操作 redo log 具体执行流程?1.7.50 死锁情况避免方法?1.7.51 插入操作 redo log 具体执行流程1.7.52 什么是事务?1.7.53 MySQL 死锁可以通过哪些视图检测到,如何手动Kill 死锁线程?主从复制与架构1.8.1 简述主从复制原理1.8.2 如何为运行了 2 年的数据库,构建一个从库(主从构建步骤)?请说明步骤?是否需要停主库?1.8.3 如何监控主从复制?请说明监控要点?1.8.4 请简述你遇到过的主从复制故障?分析、规避、处理?1.8.5 传统的主从复制是异步还是同步?会不会出现主从不一致?出现有什么好的方法解决或预防?1.8.6 延时从库的实现原理?主要可以解决什么问题?1.8.7 半同步复制实现原理?作用(解决主从数据最终一致性问题)1.8.8 请简述 MGR 的工作原理?Paxos 协议工作原理?1.8.9 如何处理 MySQL 的主从同步延迟?1.8.10 请介绍一下你们公司的数据库架构或什么是 MySQL 集群?1.8.11 请介绍你熟悉的高可用解决方案?1.8.12 请简述 MHA 的搭建过程?1.8.13 请介绍 MHA 重要的脚本及作用?1.8.14 请简述 MHA 高可用架构原理?1.8.15 MHA 如何选主?1.8.16 MHA 优缺点?1.8.17 请介绍你在维护公司 MHA 架构时主要做了哪些工作或遇到的问题?1.8.18 是否使用过分布式数据库架构?请说明你是如何设计的?1.8.19 简述 PXC(Percona XtraDB Cluster)高可用集群的工作原理1.8.20 简述 ProxySQL 读写分离操作步骤1.8.21 普通半同步与增强性半同步分别在哪个阶段返回 ACK?1.8.22 在配置读写分离架构中,下单了一件商品,查询订单时发现没有查寻到结果,说明主从同步还没有写入从库,怎么解决这种问题?1.8.23 构建多主 mysql 架构,多主同时写,用什么架构搭建?1.8.24 什么是双写(架构)?1.8.25 在跨版本搭建主从架构的时候,你遇到过哪些问题,如何解决?1.8.26 MHA 的探测机制?如何判断主库存活?如何判断MySQL库是否异常?1.8.27 克隆同步用过吗?克隆同步用来干什么的?1.8.28 克隆同步的原理?1.8.29主从同步中 如何实现同步过滤?1.8.30 同步过滤用过吗?有什么作用?1.8.31 主从中断,数据如何恢复?1.8.32 延迟从库有什么好处?1.8.33 如果主库宕机后,HA发⽣切换,这个HA是怎么做的判断?这个没有的⼼跳的机制解决⽹络层⾯或主机层⾯的问题?1.8.34 什么是GTID,在架构中主库宕机,从库当新主的时候。毕竟主的GTID比从要高,那么从库如何确保GTID?1.8.35 主库宕机了,哪个从库更接近主库,怎么判断?1.8.36 新主和从库数据不一致,怎么解决?1.8.37 主从复制是用GTID实现的吗?原理是什么?GTID起到什么作用?1.8.38 GTID复制的优点?⽐如说表⾥⾯没有主键怎么处理的?1.8.39 GTID出来以后为什么推崇使⽤GTID⽅式做复制1.8.40 ProxySQL读写分离是怎么配置?1.8.41 半同步什么时候会退化成异步?1.8.42 MHA哪个配置参数是不做候选主节点?1.8.43 ProxySQL能做到一主几从有限制吗?从库能做到负载均衡吗?1.8.44 如何让使用人员只能连接主库防止连接错误?1.8.45 延迟从库是怎么实现?有什么好处?1.8.46 MHA 哪个参数手动指定默认选主1.8.47 如何利用延时从库恢复数据?1.8.48 半同步要关注哪些参数?1.8.49 MHA 是如何检查主从数据不一致的1.8.50 proxy sql原理1.8.51 mha切换遇到过什么问题,manager在哪个节点,切换原理1.8.52 如何MHA 脑裂会产生什么影响?如何防止MHA脑裂?1.8.53 分库分表带来了哪些问题?1.8.54 半同步复制技术与传统主从复制技术不同之处?1.8.55 主从同步中哪些线程是多线程?1.8.56 SQL 相关参数有哪些,怎么修改SQL 线程数量?1.8.57 描述增强半同步复制和普通半同步复制的区别?1.8.58 MHA是怎么预防数据丢失的?1.8.59 MySQL 8.0 对死锁的优化?1.8.60 MySQL 如何实现读写分离?1.8.61 什么是读写分离1.8.62 mysql一个表上亿条的数据怎么保证同步过去,如何解决延时?1.8.63 使用延时同步恢复数据,比如延时5分钟,怎么保证你停止slave后,新的数据不会丢失1.8.64 MySqL 并行复制都有哪些 具体说说?1.8.66 MySQL 8.0 死锁检测视图有哪些?监控1.9.1 MySQL zabbix 你都监控哪些指标?1.9.2 现在有⼀个MySQL有很多慢查询,现在要通过监控,主要观察哪些指标?1.9.3 shell 脚本都监控那些指标?1.9.4 日常工作需要监控 MySQL 哪些指标?1.9.5 数据库集群监控信息?1.9.6 你平常如何监控锁状态的?1.9.7 数据库主从监控有哪些方式?数据库设计1.10.1 数据库范式有哪些?1.10.2 数据库的三大范式是什么?1.10.3 为什么要分库分表1.10.4 什么是分库分表?分库分表有哪些类型(或策略)?1.10.5 大厂数据库架构1.10.6 对数据库进行分库分表可能会引发哪些问题?优化1.11.1 CPU load 和 CPU使用率有了解吗?1.11.2 集群的稳定性的优化都有哪些方法?1.11.3 MySQL 的碎片是怎么优化的?1.11.4 你观察到⼀个表/库性能下降,现在的引擎已经是innoDB引擎了如何做优化?(你们当时是在什么规格的数据库上,有多少条数据,然后导致性能下降)1.11.5 在mysql出现性能问题的时候,你是怎么处理的?性能优化案例1.11.6 MySQL的CPU使⽤率100%,你会怎么处理?1.11.7 某⼀个库导致性能慢,你怎么处理?1.11.8 SQL语句的优化你是怎么优化的?有遇到没有⾛索引的情况?1.11.9 对于大表你们以前是怎么做优化?1.11.10 单表多大合适?1.11.11 怎么测试mysql的性能?1.11.12 怎么提升mysql的性能?1.11.13 MySQL中SQL语句执行慢的排查过程?以及对应怎么进行处理?1.11.14 MySQL会做哪些性能优化设置?1.11.15 为什么创建视图可以提升性能?1.11.16 MySQL8.0 中默认连接数是多少?除了调整连接数 如何优化连接数?1.11.18 MySQL数据库负载高如何处理?1.11.19 numa 是什么? 为什么要关闭?1.11.20 THP 是什么? 为什么要关闭1.11.21 一张很大的表,现在要对这个表结构进行更改,你要怎么做 PT1.11.22 一条语句执行有问题了,怎么看出来的?数据库升级与迁移1.12.1 你们的升级是怎么升级的?遇到过哪些故障?1.12.2 你做过异构数据库之间的数据迁移吗?(我操作的Redis-mysql)迁移过程中字符集有影响吗?1.12.3 如何实现数据库的不停服迁移?1.12.4 MySQL 如何进行数据迁移?1.12.6 数据库中有张表,怎么移出这张表?故障排错1.13.1 你最近遇到哪些案例 说一下 你工作中印象最深的一个故障案例 ?1.13.2 你有没有遇到过MySQL本身有问题?比如写法有问题,你遇到过吗?1.13.3 在工作中,你是如何发现bug的,什么样算bug,你们是怎么处理的?1.13.4 在日常维护高可用架构的时候,你发现过哪些问题?1.13.5 工作中遇到哪些主从延时问题,你是怎么解决的?1.13.6 主从架构你遇到过什么问题?1.13.7 主从同步中 slave_IO 出现错的代码你都见过哪些,都是什么问题,你是怎么处理的?1.13.8 mysql的逻辑和物理备份 哪个流程你更清楚?请具体说一个备份方式的流程?1.13.9 客户说11.30 分的时候我删除了一张表,你怎么给他恢复?1.13.10 遇到的问题,以及解决方法?1.13.11 你遇到过mysql进程突然没了或突然重启了?如何排查1.13.12 oom了解吗?(内存溢出)1.13.13 使用pt工具遇到过哪些故障?1.13.14 数据库内存飙高如何处理?1.13.15 有没有遇到内核上的问题无法解决的?1.13.16 mysql 引起cpu很高的原因?1.13.17 从库出现 slave 延时你是如何处理的?(魏)1.13.18 安装部署时遇到过什么故障?1.13.19 数据库版本升级时遇到过什么故障?1.13.20 数据库连接不上,可能原因是什么,如何排查?1.13.21 连接数设置不生效,最多为214,是什么原因?1.13.22 http 409错误,达到连接数上限。可能是什么原因导致?1.13.23 在做DDL操作时,数据库夯住了,原因是什么?1.13.24 一条SQL语句,昨天执行很快,突然变慢可能是什么原因?1.13.25 Ibdata1共享表空间文件损坏,导致数据库无法启动,备份也失效,有什么好的解决思路1.13.26 基于binlog+gtid方式截取的日志无法正常恢复,是什么原因导致?怎么解决?1.13.27 使用mysqldump方式构建主从,添加了-- set-gtid-purged =off导致主从构建失败?1.13.28 由于宕机,导致主从数据不一致,如何解决?1.13.29 Zabbix监控2000+台主机,监控显示缓慢,每隔三四个月重新搭建,存储空间经常被占满1.13.30 有规律的一段时间,会产生性能低谷1.13.31 过度条带化导致的性能问题1.13.32 MySQL 连接长时间(7200和1200秒)无法释放1.13.33 开启QC ,导致性能降低。 QPS ,TPS降低 是为什么?安全1.14.1 MySQL 安全方面你是如何优化的?Linux 与 Shell1.15.1 看内存⽤什么命令?看磁盘⽤什么命令?1.15.2 shell脚本都监控那些指标?1.15.3 grep命令1.15.4 awk命令1.15.5 sed命令NOSQL1.16.1 你们公司Redis的是什么架构?1.16.2 Redis的故障案例?1.16.3 Redis 集群(哨兵)的原理?如何搭建哨兵集群?1.16.4 Redis 怎么搭建主从?主从搭建的过程?怎么产生主从关系?1.16.5 Redis 集群执行slaveof以后,发生了什么?1.16.6 Redis你们⽤来⼲什么?⽤做过分布式锁?1.16.7 Redis你们平常都会监控什么指标?1.16.8 Redis的内存是怎么监控的?1.16.9 redis 用的什么版本 rdb和aof的优缺点?1.16.10 Redis持久化方式有哪些?有什么区别?1.16.11 redis存储原理?1.16.12 在Redis缓存服务中,常用的数据类型有哪些?1.16.13 MongoDB中oplog的作用是什么? 写满后会怎样?1.16.14 redis 淘汰策略有哪些?1.16.15 请简述redis数据类型及应用场景?1.16.16 请简述redis事务和MySQL事务的区别?1.16.17 请简述redis主从原理1.16.18 请简述redis sentinel(哨兵)高可用实现原理?1.16.19 请简述redis cluster分布式集群实现原理1.6.20 redis 集群用的什么协议??1.6.21 redis 的数据类型,业务用到了哪些,怎么做的?云数据库1.17.1 阿里云或者AWS的RDS使用过程中遇到的问题?1.17.2 你对阿⾥云的RDS有了解过或者使⽤过吗1.17.3 阿里云的DTS 你有使用和了解过吗?容器1.18.1Docker,部署MySQL,会遇到什么问题(在⽣产中)?1.18.2 实现docker持久化,通过什么实现?其他数据库1.19.1 Oracle加⼀个字段就很快,MySQL却很慢?(同样是千万⾏的表)1.19.2 分布式数据库ob架构?1.19.3 OB是怎么将数据分布式存储的?工作经验1.20.1 个人及家庭状况1.20.2 现处城市1.20.3 未来发展规划1.20.4 公司规模1.20.5 业务架构与规模1.20.6 你们的一套MySQL的qps是多少?(几百)1.20.7 你们一台物理机是部署一个MySQL还是多套?因为是多实例的,有遇到过实例之间的影响案例吗?1.20.8 数据规模?(单台实例数据量大小)1.20.9 MySQL使用的版本和规模?5.7.26 8.0.22?1.20.10 工作中运维的数据库集群是什么类型的?1.20.11 mysql 流量你怎么用监控软件监控的?1.20.12 用户部署了套新架构,你怎么给用户做监控,监控哪些指标?1.20.13 mysql数据库升级,你常用的是哪个数据库版本的升级?1.20.14 你们负责数据的ddl和dml的数据发布吗?1.20.15 DBA应该有哪些品质?如何当好DBA?1.20.16 你做的好的地方有哪些?1.20.17 你用过Oracle吗?1.20.18 DBA 工作职责是什么?1.20.19 DBA 工作内容1.20.20 公司几个dba怎么分工1.20.21 mysql你遇到⽐较严重的问题,收到什么告警,怎么解决的?1.20.22 binglog 被运维删了,你怎么办?1.20.23 在不影响业务的情况下怎么进行delete操作,使用的是什么?1.20.24 你们公司mysql灾难恢复 机制是怎样的1.20.25 公司用的什么服务器,配置什么样1.20.26 接手一个新的项目,怎么很快的开展工作?1.20.27 数据库规模有多大,存储量情况,QPS数值 TPS数值?真实面试题腾讯一面工作中运维的数据库集群是什么类型的MySQL使用的版本和规模?5.7.26 8.0.22MySQL 5.7 和 8.0 的区别?索引的优化?MySQL 的索引用的那种?B+ TREE 和 B TREE 的区别 B+TREE 有什么好处?链表和数组相比,链表和数组适用于的什么访问?MySQL 存储引擎有哪些?Innodb 和 MyISAM 有什么区别?Innodb 支持事务的原因?Innodb 的MVCC 原理?MVCC 中是如何判断其他事务是否可见?MVCC 是判断哪些版本可以访问?idb 和 frm 文件是什么?如何从 frm 中提取表结构?ibdata 和 ib_log_file 放的什么?工作中遇到哪些主从延时问题,你是怎么解决的?某外包二面你们公司生产环境中,什么样的情况算bug,bug是怎样发现怎么处理的,你又是如何收到这些bug的?如何形成闭环?在日常维护高可用架构的时候,你发现过哪些问题?你用过Oracle吗?你在公司中使用的什么版本的mysql?你在工作中主从架构遇到过哪些问题?英姿舞动(上海)之前在别的城市为什么来上海?MHA 的流程 和 探测机制?mysql的逻辑和物理备份 哪个流程你更清楚?请具体说一个备份方式的流程?xtrabackup 备份原理和流程你说一下?acid 是什么?事务的隔离级别有哪几个?客户说11.30 分的时候我删除了一张表,你怎么给他恢复?mysql数据库升级,你常用的是哪个数据库版本的升级?mysql从5.6 升级到5.7 是不是大版本升级?你做的好的地方有哪些?redo 和 undo 的区别?用户部署了套新架构,你怎么给用户做监控,监控哪些指标?mysql 流量你怎么用监控软件监控的?双照科技一面(银行外包)公司是甲方还是乙方?有没有驻场经验?有没有做过数据迁移?是从哪里迁移 mysql迁移到mysql 还是别的数据库迁移到另一个数据库?迁移是怎么做的?shell 和 python 的开发技能怎么样?如果运维数据库中,有客户反应sql很慢?很卡 你排查的思路?实际中遇到的慢查询的经典案例?部署主从的必要条件?主从用途是什么?你有没有部署过主从?主从部署的时候主库要做什么操作配置从库要做什么配置?mysql千万级的大表怎么优化?之前有做过这个方面的经验吗?过多的索引有什么问题?我创建了索引但是不走索引可能有哪些原因?如何理解死锁,如何避免死锁?如何检测死锁?上海某公司一面(外包 到金融服务,证券公司)你之前在公司使用的数据库架构是怎样的MHA 了解过吗?MHA的探测机制?如何判断主库存活,如何判断MySQL库是否异常?MHA 会去检查 MySQL 进程正常吗?(主动去查询,和插入数据去探测)MGR有了解过吗?复制原理能说一下吗?慢查询的思路?如何有个客户说CPU比较高,你是怎么定位到是哪个SQL? 造成的 top mysql - 线程mysql 执行计划你是怎么看的?mysql 隔离级别,你能说一下吗?什么是RR 级别?主从同步的流程?如何搭建的?如何使用主从同步延时恢复数据?你在项目中怎么使用的?你常用的mysql备份是怎么做的?xtrabackup 备份流程是怎样的?是否了解过 oceanbase TIDB openguass;上海某公司一面面试公司黑名单面试技巧回答文本尽量全面熟悉的技术问题,不要一次性所有相关知识都说清楚,保留一部分让面试官去问面试回答问题最好结合业务去回答,可以举一些例子


     

    基础面试题

    1.1.1 MySQL 安装方式有哪些,你们公司用的哪个方式,为什么?

    安装方式速度能否定制能否解决依赖复杂度
    Yum不能最简单
    rpm不能复杂
    二进制较快简单定制简单 
    源码最慢完全定制最复杂 

    1.1.2 关系型数据库与非关系型数据库的区别?

    1.1.3 MySQL 5.6,5.7/8.0 版本安装过程有什么区别?

    1. 初始化命令路径,命令区别

      • 5.6:/usr/local/mysql/scripts/mysql_install_db

      • 5.7及其以上:/usr/local/mysql/bin/mysqld

    2. 不同的初始化参数

      • 5.6 无初始化参数

      • 5.7 及其以后:

        • --initialize 生成随机密码放在MySQL日志文件中 默认安装的话在 /var/log/mysql/目录中

        • --initalize-insecure 密码为空

    1.1.4 MySQL 5.7,8.0 在用户管理功能上有什么区别,请举例说明

    1.1.5 请描述 MySQL 的授权表有哪些,都有什么作用?

    1. mysql.user 存储全局权限 (用户全局权限,创建用户,管理服务)

    2. mysql.db 记录数据库级别权限,控制用户对特定数据库的操作权限(如 SELECT INSERT)

    3. mysql.tables_priv 存储表级权限(如对某张表的增删改查权限)

    4. mysql.colums_priv 记录列级权限(如仅允许用户修改某表的特定列)

    5. mysql.procs_priv 管理存储过程和函数的权限(如执行或修改存储过程的权限)

    6. mysql.proxies_priv 控制代理用户权限(允许用户以其他用户的身份执行操作)

    7. mysql.global_grants 存储动态全局权限(如角色管理、审计相关权限)

    1.1.6 简述你在工作中使用 MySQL 连接的方式?

    1. 本地连接

      • 利用套接字文件连接 (客户端加载socket文件 =(路径/名称)= 服务端创建socket文件)

    2. 远程连接 (利用TCP/IP协议)

      1. 利用客户端命令进行连接

        • mysql 登录访问服务端命令

        • mysqladmin登录管理服务端命令 (密码 运行状态)

        • mysqldump 登录保存服务端数据

      2. 利用客户端工具进行连接

      • MySQL workbench

      • Navicat

    1.1.7 MySQL 的配置文件标签有哪些?(my.cnf

    1. 客户端标签:影响客户端连接命令,可以省略命令参数信息 (加载客户端标签信息 不用重新启动服务)

      • 全局标签:[client] 局部标签:[mysql] [mysqladmin] [mysqldump]

    2. 服务端标签:影响数据库服务功能(使配置生效需要重启服务)

      • 全局标签:[server] 局部标签:[mysqld] [mysqlserver] [mysqld_safe]

    1.1.8 MySQL 忘记root 用户密码怎么办?

    1. 关闭数据库服务 (需提前联系通知用户和相关业务部分)

      • /etc/init.d/mysqld stop

    2. 采用安全模式启动数据库 (跳过授权表,停止网络连接)

      • mysqld --skip-grant-tables --skip-networking &

    3. 重置密码信息

      1. flush privileges; -- 重新将磁盘授权表加载到内存中

      2. `alter user root@'localhost' identified by '012012';

    4. 重新正常启动

      1. pkill mysql

      2. /etc/init.d/mysqld start mysql -uroot -p012012

    1.1.9 在公司中一般给开发,运维,管理员授予什么权限

    1.1.10 请列举 MySQL 配置文件的读取顺序?

    1.1.11 请列举 MySQL 启动和关闭方式?

    1.1.12 你们公司使用多实例环境吗?在什么地方用的?

    1.1.13 如何查看数据库当前连接情况

    1.1.14 简述数据库启动不了,如何排查?

    1. 错误日志排查log_error=对应路径/主机名

    2. 手工启动检查mysqld --defaults-file=/etc/my.cnf

    3. 初始化数据库(不推荐轻易操作)

    1.1.15 数据库连接不上如何排查?

    1. 确认网络连通性

      • 数据库端口检查 (telnet,nc,nmap

    2. 确认网络硬件设备

      • 路由器,交换机,防火墙

    3. 确认服务端配置

      1. 检查是否创建了用户信息和密码

      2. 检查用户登录白名单

    4. 确认客户端配置

      1. 检查输入用户信息

      2. 检查输入密码喜喜

      3. 检查密码加密方式(旧版本客户端加密使用mysql_native_password

    1.1.16 MySQL常用数据类型有哪些

    1.1.17 MySQL 约束有哪些?

    1.1.18 MySQL 列的属性设置有哪些?

    1.1.19 MySQL 如何设置自增列 自增列是否可以自定义起始值

    1.1.20 MySQL 自增列的范围?

    1.1.21 MySQL服务模式有哪些常用参数,什么时候会用到?

    参数:

    应用场景:

    1.1.22 MySQL 查询表中数据中文字体乱码,原因可能是什么?如何修改?

    原因:

    修改方法:

    1. 查看字符集 SHOW VARIABLES LIKE 'character_set%';

    2. 修改字符集/etc/my.cnf 中修改服务端和客户端配置

    1.1.23 什么是实例

    1.1.24 简述 MySQL 程序结构?

    1.1.25 简述一条 select 语句的执行过程?

    1.1.26 请简述 MySQL 逻辑结构和宏观物理结构?

    逻辑结构:

    1. 实例

    2. :库名/库属性(字符集,校对规则)

    3. :列(列名 + 列属性)+ 行(元数据 + 数据)+ 表属性 + 表名

    宏观物理结构:系统上库对应数据库库名及目录

    1.1.27 请简述段、区、页的构成

    1.1.28 你们公司用的 MySQL 版本,为什么选择?

    1.1.29 数据库文件损坏最大原因?

    1. kill -9 强制关闭数据库引起数据丢失损坏

    2. 突然断电

    3. 磁盘坏道

    1.1.30 MySQL 用户安全规范

    1. 主机域范围尽量小,最好细化到单一 IP,本机用 localhost

    2. 禁止使用 % 模糊匹配授权

    3. 用户名应有实际意义,一目了然

    4. 删除无用用户

    5. 密码复杂性

    6. 为每个项目设置一个对应用户,禁止使用 root 用户作为项目用户

    1.1.31 授权权限 3 条红线

    1. 授权一定不用 all,而是 select, insert, update, delete 权限

    2. 库表不用 *.*,而用 oldboy.* 格式具体到库

    3. 主机域不要用 %,而应用内网的 IP 网段,如 172.16.1.%

    1.1.32 inplace 升级至 5.78.0,升级方式上有什么区别?8.0要注意什么 ?

    5.6升级5.7

    1. 本地升级 (Inplace) 必须进行业务中断 需要提前告知用户中断时间

    2. 创建MySQL 5.6 版本实例 (安装部署)

    3. 创建测试数据

    4. 下载部署5.7数据库程序

    5. 提前部署新版本5.7 数据库多实例

    6. 进行原有5.6 数据库数据备份(mysqldump xbp 克隆本地)mysqldump 和 xbp 恢复速度太慢了 建议选择 克隆备份

    7. 重新编写配置文件,实现数据库升级(挂库升级 让)basedir5.6 和basedir5.7 数据目录上进行关联

    8. 进入mysql.5.7 的配置文件 修改 datadir 修改启动端口为56实例的端口

    9. 以安全模式启动数据库服务(5.7)mysqld --default-files=/data/3357/my.cnf --skip-grant-tables --skip-networking 避免无法正常启动

    10. 启动成功时会出现报错(表结构错误)但是不用管,可以正常进入数据库

    11. usr/local/mysq57/bin/mysql_upgrade -S /tmp/mysql3357.sock /tmp/mysql3357.sock --force

    12. 重新启动mysql5.7

    13. 进行升级后数据库备份 (mysqldump)

    异地升级(Merging)不停止业务进行数据库升级

    1. 需要在新的数据库节点安装mysql5.6 程序 (实现主从同步)( 5.6 直接和5.7 简历主从会出现数据无法正常加载)

    2. 在从节点安装部署新版本5.7 数据库服务

    3. 在从节点上实现 5.6 到5.7 的挂库升级

    4. 重新启动5.7 数据库程序,和主库进行数据同步(此时再同步就是业务库信息)

    5. 利用MHA高可用服务,实现手工切换主节点

    6. 可以再将其他节点依次进行升级

    5.7升级8.0

    注意事项

    5.7.30 -- 8.0.36

    1.1.33 MySQL 中 TEXT 类型最大可以存储多长的文本

    1.1.34 MySQL 中 AUTO_INCREMENT 列达到最大值时会发生什么?

    1.1.35 MySQL 中 EXISTS 和 IN 的区别是什么?

    在执行机制和性能上有区别

    1.1.36 MySQL数据库的优缺点?

    优点:

    缺点:

    1.1.37 什么是隐式转换?

    1.1.38 MySQL 怎么查看系统资源(内存,CPU)?

    1.1.39 数据库启动时间与哪些因素有关?

    1.1.40 有一个 8核心 16g 服务器,活动会话数达到多少个会不正常?

    1.1.41 MySQL 如何管理用户连接的?

    查看用户连接

    1.1.42 MySQL 5.7 和 MySQL 8.0 有哪些区别?

    1.1.43 MySQL 5.6 和MySQL 5.7 有什么区别?

    1.1.44 MySQL 从5.6 升级到5.7 是不是大版本升级?

    1.1.45 MySQL 数据库升级,你常用的是哪个数据库版本的升级?

    1.1.46 idb 和 frm 文件是用来干什么?

    1.1.47 ibdata 和 ib_log_file 放的什么?

    ibdata

    ib_log_file 是 redo 日志文件的一部分

    1.1.48 你们一台物理机是部署一个MySQL还是多套?因为是多实例的,有遇到过实例之间的影响案例吗?

    1.1.49 哪些不是活跃连接?用什么语句看?

    1.1.50 MySQL 碎片信息怎么看?

    1.1.51 mysql结构体系和工作原理?

    1.1.52 mysql 8.0 新特性

     


     

    SQL

    1.2.1 请简述select语句的各个子句的执行顺序?

    1.2.2 请列举 SQL 语句的种类和代表命令?

    1.2.3 请简述SQL_MODE的作用?ONLY_FULL_GROUP_BY是干什么用的?

    1.2.4 SQL_MODE 的常用参数,什么使用应用这些参数?

    参数

    1. only_full_group_by 禁止一行信息对于多行信息显示输出(在表进行分组处理时)

    2. strict_trans_tables 录入的数据信息,超过数据类型的限制后,会自动录入失败

    3. no_zero_indate,no_zero_date 录入的日期,不可能出现 0000-00-00

    4. error_for_division_by_zero 当出现数值运算的,不能出现除数为0

    应用

    1.2.5 请简述MySQL utf8和utf8mb4区别?

    1.2.6 请简述tinyint、int、bigint 如何计算的存储位数?

    列类型存储容量说明
    TINYINT1 byte最大 3 位数
    INT4 bytes最大 10 位数
    BIGINT8 bytes最大 20 位数

    1.2.7 请简述 CHAR(10)VARCHAR(10) 区别,生产如何选择?并阐述为什么?

    1.2.8 请简述 DATETIMETIMESTAMP 区别?

    1.2.9 什么是数据库的视图?

    1.2.10 请简述你们数据库开发过程,选择数据类型的规范是什么?

    1. PRIMARY KEY (PK)

      • 设置在主键列,非空且唯一,用于必填且不能重复。

    2. NOT NULL

      • 表示列的内容是否非空,空列不利于数据库优化。

    3. UNIQUE KEY (UK)

      • 表示列的内容唯一(例如:手机号)。

    4. FOREIGN KEY (FK)

      • 表示表的外键,用于多个表之间的关联。

    5. CHARSET_NAME

      • 指定表的字符集,默认是 utf8mb4

    1.2.12 请简述你们公司在 Schema 设计过程中有哪些开发规范?

    库的 DDL 规范:

    1. 禁止线上业务系统出现 DROP 操作。

    2. 显示设置字符集。

    3. 库名不能大写字母,不能是关键字,不能以数字开头,一般与业务有关。

    表的 DDL 操作规范:

    1. 列名要与业务有关。

    2. 列的数据类型讲究:完整、简洁、合适、精度不高浮点数,n 放大 n 倍。

    3. 每列要有注释。

    4. 更改数据库需要在数据库低谷时间点进行。如果紧急,使用 pt-oscgh-ost

    1.2.13 请简述 DROP TABLETRUNCATE TABLEDELETE FROM TABLE 的区别?

    序号操作命令解释说明
    01Delete用于删除行数据,但保留表结构和相关的对象;
    02Truncate只删除数据,不会删除表结构和索引等其他结构;
    03Drop用于完全删除数据库表,包括数据和结构;

    本质上这个删除其实就是给数据行打个标记,并不实时删除,因此delete之后,空间的大小不会变化。

    而且delete操作会生成binlog、redolog 和 undolog,所以如果删除全表使用delete的话,性能会比较差! 但是它可以回滚.

    在InnoDB中,每张表数据内容和索引都存储在一个以,ibd 后缀的文件中,drop 就是直接把这个文件给删除了;

    还有一个.frm后缀的文件也会被删除,这个文件包含表的元数据和结构定义。

    文件都删了,所以这个操作无法回滚,表空间会被回收,但是如果表存在系统共享表空间,则不会回收空间。

    默认创建的表会有独立表空间,把 innodb_file_per_table的值改为 OFF 后,就会被放到共享表空间中,即统一的ibdata1文件中。

    Truncate会对整张表的数据进行删除,且不会记录回滚等日志,所以它无法被回滚。

    并且主键

    1.2.14 请简述如何利用 UPDATE 替换 DELETE 语句实现伪删除?

    1. 添加 state 状态字段,默认为 1

    2. 查询数据时使用:

    3. 伪删除,将要删除的行 state 改为 0

    4. 查询时实际上并没有删除:

    1.2.15 如果要你规划一个 10 亿的大表,你有什么好的方案?

    1.2.16 如果这张10亿单表已经存在了,想要删除1000W数据如何处理?

    1.2.17 生产中使用过分区表吗?你们使用的是什么分表策略?分区表有什么优势和劣势?

    1.2.18 请简述 GROUP BY 语句的执行原理?

    1.2.19 WHEREHAVING 语句的区别?

    1.2.20 生产中进行数据库资产统计,都统计什么?如何统计?

    1. 统计数据库的库表等元数据信息:

      • 使用 information_schema.tablesinformation_schema.columns

    2. 业务上:

      • 定时分析 binlog

    1.2.21 请介绍你常用的聚合函数及其作用

    1.2.22 简述多表连接的方式

    1.2.25 什么是笛卡尔乘积?

    1.2.26 你们公司 Online DDL 如何处理的?

    1. 评估需求:

      • 在执行任何Online DDL之前,首先评估DDL操作的必要性,确保它对业务的正面影响超过可能带来的风险。

    2. 选择合适的工具:

      • 利用MySQL内置的Online DDL功能,如INPLACE和COPY算法,或者第三方工具如pt-osc、gh-ost或NineData等,这些工具提供了更高级的在线变更能力,尤其是对于不支持原生Online DDL的操作。

    3. 测试与验证:

      • 在生产环境部署前,先在测试环境中模拟相同的DDL操作,确保不会对现有数据造成意外影响,并验证性能影响。

    4. 最小化影响:

      • 选择在业务低峰期执行DDL,减少对用户的影响。

    5. 监控与备份:

      • 在执行前确保有完整的数据库备份,同时开启详细的监控,以便在操作过程中或之后快速响应任何异常。

    6. 使用自适应工具:

      • 如NineData SQL开发专业版和企业版,它们提供了自适应Online DDL能力,自动选择最适合当前操作的执行方法,减少人工判断的复杂度。

    7. 实施Rollback计划:

      • 准备好回滚策略,一旦出现错误,能够迅速恢复到操作前的状态。

    8. 并发控制:

      • 确保在执行DDL时,通过锁定机制或工具的内置机制来管理并发,避免数据不一致。

    9. 文档与沟通:

      • 记录整个过程,包括决策依据、执行步骤和结果,同时与团队成员保持沟通,确保每个人都了解变更的细节和时间表。

    10. 持续学习与优化:

      • 根据每次操作的经验,不断调整策略,优化未来Online DDL的执行流程

    1.2.27 5.65.78.0 在 Online DDL 的改变?

    MySQL 5.6

    MySQL 5.7

    MySQL 8.0

     

    1.2.28 简述 pt-osc 或者 gh-ost 第三方工具在处理 DDL 时的原理?

    pt-online-schema-change (pt-osc)

    原理步骤

    1. 创建影子表:

      • 创建一个与原始表结构相同的影子表(例如_original_table_new)

    2. 应用DDL操作:

      • 在影子表上执行指定的DDL操作(如添加、修改或删除字段)

    3. 创建触发器:

      • 在原始表上创建三个触发器(分别用于INSERT、UPDATE和DELETE操作),将这些操作的应用也同步到影子表中。这样可以保证在数据迁移的过程中,对原始表的所有DML操作都被正确反映到影子表中。

    1. 全量数据复制:

      • 执行批量COPY操作,将原始表中的数据逐步复制到影子表中。这个过程可能涉及分批次读取和写入,以减轻对数据库的压力。

    1. Cut-over 切换:

      • 最终阶段,当所有数据都已成功复制并且触发器捕获了所有增量变化后,通过原子性操作交换两张表的角色。具体做法是在极短的时间窗口内禁用触发器并对原始表加锁,然后重命名原始表为备份名称(例如 _original_table_old),并将影子表重命名为原始表的名称。

    1. 清理工作:

      • 移除不再需要的临时对象,包括触发器、备份表和其他辅助表。

    特点

    gh-ost

    原理步骤

    1. 创建影子表:

      • 创建一个与原始表结构相同的影子表(例如_original_table_ghost)。

    2. 应用DDL操作:

      • 在影子表上执行指定的DDL操作。

    3. BinLog Streaming:

      • 设置一个二进制日志流监听器(类似于从库的行为),实时读取并解析原始表上的binlog事件,将这些变更应用到影子表中。这种方式消除了对触发器的需求,减少了潜在的性能瓶颈。

    1. 全量数据复制:

      • 使用高效的算法将原始表中的全部数据复制到影子表中。这个过程尽量减少对数据库的影响,确保尽可能小的停机时间。

    1. Cut-over 切换:

      • 在完成数据复制并通过一系列检查确认一切正常后,执行最终的切换单元操作。这部分操作非常迅速且几乎不影响正在进行的其他活动。

    1. 清理工作:

      • 清理不再需要的对象,包括备份表和其他中间产物。

    特点

    1.2.29 为什么在MySQL 中不推荐使用多表 Join ?

    MySQL 不推荐使用多表 JOIN 的核心原因可归结为 性能、扩展性、维护性 三大问题,具体分析如下:

    一、性能瓶颈

    1. 查询复杂度激增

    2. 锁竞争与并发限制

    3. 优化器局限性

    二、扩展性缺陷

    1. 分库分表困境

    2. 水平扩容困难

    三、维护成本高

    1. 耦合性强

    2. 缓存利用率低

    1.2.30 MySQL中count(*) count(1) count (字段名) 的区别是什么?

    表达式统计规则是否包含 NULL 值
    COUNT(*)统计所有行数,与具体字段无关。包含 NULL 行
    COUNT(1)统计所有行数,1 是常量表达式,与具体字段无关。包含 NULL 行
    COUNT(字段名)统计指定字段的非空值数量。不包含 NULL 行
    COUNT(DISTINCT 字段名)统计去重后的非空值数量。不包含 NULL 行

    1.2.31 MySQL 中 int(11) 的 11 表示什么?

    1.2.32 MySQL 中 varchar 和 char 有什么区别?

    存储方式

    最大长度

    存储空间

    性能对比

    本质区别

    使用场景

    排序性能影响

    1.2.33 MySQL 中如何进行 SQL 调优?

    平时进行SQL调优,主要是通过观察SQL,然后利用explain分析查询语句的执行计划,识别性能瓶颈,优化查询语句:

    1.2.34 select *select 所有字段区别?

    1.2.35 select *一定会全表遍历吗?

    本质是索引失效问题* 可以回答索引失效的点

    1.2.36 连表查询怎么看哪个是驱动表,哪个是被驱动表?

    观察 SQL 语句

    1.2.37 嵌套连结和hash join原理 ?

    1.2.38 update一条语句的流程?

    update t1 set name=xiaoB where 条件;

    1. 调取数据过程 ( select name from t1 where 条件 )

      • 经过数据库server层进行处理,获取数据存储位置点(连接器 分析器 优化器 执行器);

      • 经过数据库engine层进行处理,会加载索引页信息(辅助索引-回表过程-聚簇索引)

      • 经过异常数据库服务层和引擎层处理,会将磁盘中的数据加载到内存区域(buffer pool

    2. 修改数据过程(存储过程

      • 创建新信息事务信息,会将内存中的数据页进行修改;

      • 会将数据页修改前的信息,保存到 undo日志中,会将数据页修改后的信息,保存到redo日志中;(只是完成事务第一阶段操作 prepar )

      • 会将修改数据SQL语句信息保存到 binlog文件中,确认事务完成提交(完成事务第二个阶段操作 binlog redo-commit

      • 最后会将 buffer pool脏页数据信息进行落盘操作

        • 会先将数据页16kb信息保存到双写缓冲区,利用双写缓冲区将信息保存到双写文件中;

        • 会再将数据页16KB信息保存到磁盘文件中(t1.ibd)

     


    索引

    1.3.1 请列举 MySQL 索引的类型

    依据功能分类:

    1. 隐藏索引(8.0 开始支持)隐藏索引不会被优化器使用。

    2. 降序索引(8.0 开始支持)

    3. 普通索引

    4. 唯一索引

    5. 主键索引

    6. 全文索引

    7. 空间索引

    8. 联合索引

    InnoDB B+Tree索引树角度看:

    从数据结构角度看:

    功能应用

    1.3.2 MySQL 索引算法演变:二叉树,二叉平衡树,红黑树,B -Tree, B+Tree

    1. 二叉树(Binary Tree)

      • 解决的问题:相比顺序遍历,利用二分法快速定位数据

      • 局限性:退化为链表:数据有序插入时(如递增ID),树退化为线性结构,查询复杂度由O(logN)退化为O(N)。

      • 磁盘IO问题:树高不可控,数据量较大时树层级过深,导致磁盘IO次数过多(每次查询需多次磁盘访问)

    2. 平衡二叉树(AVL树)

      • 解决的问题:避免二叉树退化为链表,强制左右子树高度差≤1,保证查询复杂度

      • 解决的问题:在平衡二叉树基础上放宽平衡要求(最长路径≤2倍最短路径),减少旋转次数,提升插入/删除效率

      • 优势:

        • 近似平衡:插入/删除最多3次旋转,复杂度稳定在O(logN)

        • 内存友好:适合内存数据结构(如Java的TreeMap)

      • 局限性:磁盘场景不适用:树高仍随数据量增长,无法解决海量数据下磁盘IO问题

    3. B-Tree(多路平衡查找树)

      • 解决的问题:针对磁盘IO优化,通过多节点存储降低树高

      • 关键优化:

        • 多路分支:每个节点存储多个键值(阶数m),子节点数=键值数+1,显著减少树高(如阶数500,百万数据仅3层)

        • 节点预读:磁盘按页(如16KB)读取,单节点存多键值,减少IO次数

      • 局限性:

        • 范围查询效率低:非叶子节点存储数据,范围查询需跨层多次遍历

        • 空间冗余:键值与数据混合存储,节点容量受限

    4. B+Tree(B-Tree优化版)

      • 解决的问题:优化B-Tree的查询效率与存储结构,适配数据库场景

      • 核心改进:

        • 非叶子节点仅存索引:不存数据,单节点容纳更多键值,进一步降低树高

        • 叶子节点链表连接:所有数据存于叶子节点,并按顺序形成双向链表,支持高效范围查询与顺序扫描

        • 聚簇索引优化:InnoDB主键索引叶子节点直接存数据行,减少回表

          优势:

      • 优势:

        • 磁盘IO更少:树高更低,百万数据仅需3次IO

        • 范围查询高效:通过叶子节点链表快速遍历区间数据

        • 全表扫描更快:叶子节点包含全部数据,避免非必要分支访问

    5. 最终选择B+Tree的原因:

      • 磁盘友好:树高可控,减少IO次数

      • 范围查询高效:叶子链表天然支持范围扫描

      • 存储利用率高:非叶子节点仅存索引,容纳更多键值

      • 与数据库设计匹配:聚簇索引、覆盖索引等特性直接依赖B+Tree结构

    1.3.3 索引树高度影响因素有哪些?

    1. 表的数据行数过多办法:表分区;定期归档(工具pt-archiver)

    2. 索引列长度过长办法:使用前缀索引

    3. 数据类型不当(char/varchar)

    1.3.4 详细说一说B+树在磁盘IO方面的优势

    1.3.5 MySQL 8.0索引的新特性

    1. 隐藏索引:8.0 开始支持隐藏索引,不可见索引不会被优化器使用,但仍需维护

    2. 降序索引:8.0 开始真正支持降序索引

    3. 隐式索引:不再对 GROUP BY 操作进行隐式排序

    4. 函数索引:支持在索引中使用函数计算后的值

    1.3.6 创建索引时应当注意什么(什么时候适合创建索引)?

    需要创建索引:

    注意事项:

    1.3.7 什么时候不适合创建索引

    1.3.8 什么情况会造成索引失效?

    1.3.9 如何获取执行计划?如何理解分析执行计划的输出?

    为什么分析执行计划?

    如何产生的执行计划:

    如何获取执行计划:

    执行计划字段解释

    1.3.10 什么是回表查询?如何减少回表

    回表查询:InnoDB中,数据以B+树的形式进行组织,聚簇索引叶子节点存的是主键所对应的行所有字段的数据,而非聚簇索引叶子结点仅存该索引所对应的主键ID。如果某条查询走了非聚簇索引但又需要返回整行数据的话,则需要进行回表操作,会损耗一定的性能(覆盖索引的情况下则无需回表)

    回表的问题:增加磁盘 IO 次数(IOPS),增加吞吐量

    减少回表的方法

    1. 建立合适的联合索引,尽可能将查询条件的数据包含在联合索引中

    2. 精细查询条件,尽量使用等值查询,符合联合索引规则,覆盖的列越多越好

    3. 索引优化器:

      • ICP(Index Condition Pushdown):索引下推优化

      • MRR(Multi-Range Read):在辅助索引阶段获取主键值后排序回表

    1.3.11 聚簇索引和非聚簇索引有什么区别?

    1.3.12 描述 MySQL 的 B+ 树中查询数据的全过程

    1. 数据从根节点找器,根据键值的大小确定左子树还是右子树,从上到下定位到叶子节点;

    2. 叶子节点中存储事务的数据行记录,但一页只有16KB大小,存储数据不止一条

    3. 叶子节点中数据行以组的形式划分,利用页的目录结构中slot,通过二分法可以定位到对应的组

    4. 定位组之后,利用链表遍历就可以找到对应的数据行

    1.3.13 唯一索引与普通索引的区别?

    区别在于更新时,需要检查更新后的值是否具备唯一性,这个在启用了 changeBuffer时影响较大,当使用唯一索引时,更新后的值无法直接存入changeBuffer,而是要做一次磁盘查询,来确定更新后的值的唯一性,因此性能相对较差,因此应当尽量使用业务来保证数据的唯一性。

    1.3.14 详细说说最左前缀匹配

    MySQL索引的最左前缀匹配原则指的是使用联合索引时

    1. 查询条件必须从索引的最左侧开始匹配数据 a* b c selech from where a=xx / a>=xx / a<=xx

    2. 创建联合索引需要将索引选择度高的列放在最左边 name-索引选择度高 gender 减少辅助索引查询数据IO消耗

    最左原则应用情况:

    1. 最左列最好是等值查询(=,>=,<=),不能范围查询 (> <)

    2. 一定条件信息包含最左列,但其他列信息可以不包含,或可以不用等值查询,因为可以借助索引下推功能,减少IO消耗查询数据

    3. 当最左列索引选择度低时,可以在查询信息时,不定义最左列信息,利用skip scan优化功能,会自动添加左列信息

    1.3.15 能说说什么是索引下推吗?

    1.3.16 执行计划中你一般关注哪些点?

    image-20250317103611952

    1.3.17 MySQL为什么选择 B+tree 查找算法?

    1.3.18 一条select语句平常查询时很快,一天突然变慢了的原因?

    原因

    解决

    1.3.18 聚簇索引构建条件 聚簇索引是如何构建的?

    1. 如果表中有主键,主键就被作为聚簇索引

    2. 没有主键,第一个不为空的唯一键作为索引

    3. 什么都没有,自动生成一个6字节的隐藏列,作为聚簇索引

    1.3.19 索引有哪些自优化能力?

    1. AHI(工作于内存中)自适应哈希索引

    2. Change buffer更新的辅助索引缓存

    3. ICP索引下推优化

    4. MRR多范围读取优化,把在辅助索引阶段获得的主键值排序然后再回表查询

    1.3.20 如何建立索引才能加快查询?

    1.3.21 建立索引后还会出现慢查询后如何解决及原因?

    1. 查询没有用到索引列或没符合联合索引使用条件

    2. 索引基数过小,结果集过大

    3. 索引失效,索引重建

    1.3.22 MySQL 中的数据排序是怎么实现的?

    1.3.23 MRR多范围读取优化?

    MRR(Multi-Range Read Optimization),即多范围读取优化,是MySQL中用来提高索引查询性能的一项重要技术。以下是对其工作的详细解释以及它所带来的优点:

    工作机制

    1. 初步扫描索引: MySQL首先仅扫描所需的索引来收集匹配记录的键值(通常是主键或其他唯一标识符)。

    2. 排序键值: 对这些键值进行排序,以便它们按照数据文件中的实际位置排列。

    3. 顺序访问数据行: 使用经过排序的键值列表按顺序从基础表中检索相应的完整数据行。

    这种方法的主要目标是从减少随机磁盘I/O转向更多的顺序I/O操作,因为后者通常比前者更快且消耗较少的资源。

    主要优势

    1. 减少随机I/O: 通过对多个非连续的位置进行一次性的顺序读取,大大降低了因多次跳跃式寻址而导致的高延迟和低吞吐量的情况发生。

    2. 提高CPU利用率: 减少了不必要的上下文切换频率,使得处理器能够在同一时间段内专注于单一任务而非频繁中断转跳不同的内存地址处加载新指令集。

    3. 增强缓存命中率: 当数据是以相对紧凑的方式存储时,相邻的数据项更容易同时存在于高速缓存之中,进而加快整体响应速度。

    4. 适用多种场景: 包括但不限于范围索引扫描、等值连接以及其他依赖于特定索引元组定位的基础表条目提取的任务均可从中受益。

    5. 批处理能力: 具备一次性接收来自不同来源的一系列独立请求的能力,并将其合并成统一的大规模输入流供底层子系统进一步加工处理。

    1.3.24 MySQL 中的索引数量是否越多越好?为什么?

    原因

    1. 增加写操作负担:

      • 每次进行INSERT、UPDATE或DELETE操作时,不仅需要修改表中的数据,还要同步更新相关的索引。这会增加写操作的时间开销,尤其是在有大量的索引的情况下

    2. 占用更多存储空间:

      • 索引本身也需要占据一定的存储空间。随着索引数量的增多,总的存储需求也会相应增大

    3. 降低维护成本:

      • 更多的索引意味着更高的维护成本,包括定期重建索引、监控索引状态等工作

    4. 影响事务性能:

      • 过多的索引可能会导致锁定争用增加,从而影响并发事务的性能

    5. 复杂化查询优化器的工作:

      • MySQL的查询优化器需要权衡不同的索引组合来生成最优的执行计划。过多的索引选项会使优化过程变得更加复杂,有时甚至可能导致选择不佳的执行路径

    1.3.25 联合索引与单列索引的区别?

    1.3.26 你能看到你查询时间?查询速度?

    1.3.27 ⽐如说我查询的表结构是string类型,然后我⽤varchar类型的会⾛索引吗?

    1.3.28 varchar类型的不是要加单引号吗,然后你不加单引号直接查⼀个数字能查出了吗?(⽐如说;varchar类型是123456,查id=123456能查出来吗?不加单引号)?

    1.3.29 explain查执⾏计划,ID列的执⾏顺序是怎么样的?

    1.3.30 B+tree构建过程

    B+树的构建过程包括以下几个步骤:

    1. 初始化树:创建一个空的B+树,包括一个根节点和初始的叶子节点

    2. 插入关键字:从根节点开始,按照B+树的插入规则,逐级向下查找适当的叶子节点。如果叶子节点已满,则进行分裂操作,将关键字插入到合适的位置,并调整指针

    3. 分裂节点:当一个叶子节点已满时,需要进行分裂操作。将节点中的关键字分成两部分,较小的一部分保留在原节点,较大的一部分移动到一个新节点中,并调整相应的指针

    4. 更新父节点:在插入过程中,如果节点发生了分裂,需要更新父节点的关键字和指针。如果父节点也满了,则进行递归的分裂和更新操作

    5. 调整根节点:如果根节点发生了分裂,则需要创建一个新的根节点,并将原来的根节点和新分裂出的节点作为其子节点

    6. 删除关键字:从根节点开始,按照B+树的删除规则,逐级向下查找要删除的关键字所在的叶子节点。将关键字删除,并进行相应的调整和合并操作

    7. 合并节点:当一个叶子节点的关键字数量过少时,可以进行合并操作。将该节点与相邻的兄弟节点合并,调整关键字和指针

    8. 更新父节点和根节点:在删除过程中,如果节点合并导致父节点的关键字数量过少,则进行递归的合并和更新操作。如果根节点的关键字数量变为0,则更新根节点

    1.3.31 MySQL 中使用索引一定有效吗?如何排查索引效果?

    1.3.32 MySQL 的覆盖索引是什么?

    不要在 select 中使用 * 尽量写全

    1.3.33 索引下推如何开启?

    optimizer_switch='index_condition_pushdown=on';

    1.3.34 如何使用 MySQL 的 EXPLAIN 语句进行查询分析?

    序号字段解释说明
    01列ID表示查询执行顺序的标识符,值越大优先级越高;
    简单查询的ID通常为1,复杂查询(子查询和union)的id会有多个
    02列select_type表示语句查询类型,sipmle表示简单(普通)查询,primary表示主键查询,subquery表示子查询;
    03列table表示语句针对的表,单表查询就是一张表,多表查询显示多张表;
    04列partitions表示匹配的分区信息
    05列type表示索引应用类型,通过类型可以判断有没有用索引,其次判断有没有更好的使用索引
    索引类型应用性能从好到差的顺序是:const>eq_ref>ref>range>index>all
    06列possible_keys表示可能使用到的索引信息,因为列信息是可以属于多个索引的
    07列key表示确认使用到的索引信息
    08列key_len表示索引覆盖长度,对联合索引是否都应用做判断
    09列ref表示当使用索引列等值查询时,与索引列进行等值匹配的对象信息
    10列rows表示查询扫描的数据行数(尽量越少越好),尽量和结果集行数匹配,从而使查询代价降低
    11列fltered表示查询的匹配度,显示查询条件过滤掉行的百分比,一个高百分比表示查询条件的选择性好。
    12列Extra***表示额外的情况或额外的信息
    using index(表示使用覆盖索引)
    using where(表示使用where条件进行过滤)
    using temporary(表示使用临时表)
    using filesort (表示需要额外的排序步骤)

    TYPE 字段

    序号类型解释说明
    01system表示查询的表只有一行(系统表)。这这是一个特殊的情况,不常见
    02const表示查询的表最多只有一行匹配结果。这通常发生在查询条件是主键或唯一索引,并且是常量比较
    03eq_ref表示对于每个来自前一张表的行,MySQL仅访问一次这个表。这通常发生在连接查询中使用主键或唯一索引的情况下。
    04refMySQL使用非唯一索引扫描来查找行。查询条件使用的索引是非唯一的(如普通索引)
    05range表示MySQL会扫描表的一部分,而不是全部行。范围扫描通常出现在使用索引的范围查询中(如BETWEEN、>,<,>=,<=)
    06index表示 MySQL扫描索引中的所有行,而不是表中的所有行。即使索引列的值覆盖查询,也需要扫描整个索引。
    07all(性能最差)表示 MVSQL 需要扫描表中的所有行,即全表扫描。通常出现在没有索引的查询条件中

     


    存储引擎

    1.4.1 MySQL 中 InnoDB 存储引擎与 MyISAM 存储引擎的区别是什么?

    MyISAM :

     

    InnoDB(MySQL默认引擎)

    1.4.2 MySQL 有哪些存储引擎?

    1.4.3 TokuDB 等存储引擎相较于 InnoDB 有什么优势?在什么场景应用?

    TokuDB 优势:

    1. 高压缩比: 压缩比可达 15 倍以上,节省存储空间

    2. 高性能:插入数据性能优于 InnoDB

    适用场景:

    1. 监控系统(如 Zabbix): 用于存储历史数据和监控数据

    2. 归档库:用于存储历史数据,减少存储成本

    1.4.4 MySQL 的碎片是如何产生的?你是如何处理的?

    产生原因:

    1. 删除操作

      • DELETE 语句删除数据后,空间未被回收,导致碎片产生

    2. 更新操作

      • 更新数据时,可能导致数据页分裂

    3. 其他原因

      • 原表长时间不更新,其他的表在插入数据后,原表又插入新数据量

    处理方法:

    1. 表优化

      • 使用 OPTIMIZE TABLE 命令整理表碎片

      • 使用 alter table table_name engine='innodb' 命令整理表碎片

    2. 表分区

      • 对大表进行分区,减少单个分区的碎片

    3. 定期归档

      • 使用工具如 pt-archiver 将旧数据归档到其他表或库

    1.4.5 简述 InnoDB 物理存储结构

    1. 日志文件

      • Redo 日志:用于记录数据页的变更,支持崩溃恢复。

      • Undo 日志:用于支持事务回滚。

    2. 临时表空间 ibtmp1

      • 可以存储临时表数据信息(排序操作 连表 子查询 -- 内存)

      • 可以保存用户连接时,查询数据信息

      • 利用临时表,可以快速恢复内存数据,减少IO消耗

    3. 用户表空间.ibd 文件:存储表数据和索引.frm 文件:存储表结构。

      • 早期:ibd文件只保存数据信息 (表.ibd 表.frm(存储表结构信息) 表名.MYI (存储索引信息)?)

      • 当前:ibd文件只保存数据信息 保存表的结构信息 保存表的索引信息

    4. 系统表空间ibdata1

      • 早期: 用于存储数据库服务所有数据信息(元数据信息 数据信息)

      • 当前:用于change buffer数据信息(存储内存区域中的数据)

    5. 缓冲池文件ib_buffer_pool

      • 将内存区域对应buffer_pool中存在的信息(热点数据信息),可以快速恢复

    6. 双写缓冲区文件ib_logfile*

      • 可以保证内存数据到磁盘中,不会出现损坏的数据,避免数据库异常宕机的数据无法加载情况;(利用CR机制)

    1.4.6 简述 InnoDB 内存结构?

    innodb-architecture-8-0

    1.4.7 InnoDB 的共享表空间在不同版本有什么变化?

    版本内容
    5.5包含:系统表、双写缓冲区、Undo 日志、变更缓冲区、临时表空间、用户数据
    5.6包含:系统表、双写缓冲区、Undo 日志、变更缓冲区、临时表空间
    5.7包含:系统表、双写缓冲区、Undo 日志、变更缓冲区
    8.0.19包含:双写缓冲区、变更缓冲区
    8.0.20包含:变更缓冲区

    1.4.8 简述表空间迁移的过程

    示例:将源端 3306/test/t100W 表迁移到目标端 3307/test/t100W

    1. 锁定源端表

    2. 目标端创建相同的库表结构

    3. 删除目标端的空表空间文件

    4. 拷贝源端的 .ibd 文件到目标端目录

    5. 设置文件权限

    6. 目标端导入表空间

    7. 解锁源端表

    1.4.10 共享表空间如何扩容?

    1.4.11 如何独立 Undo 表空间?

    1. 直接在配置文件中添加独立的 Undo 表空间配置:

    2. 重启 MySQL 服务

    1.4.12 MySQL 的 Doublewrite Buffer 是什么?它有什么作用?

    机制

    与 redo log 协作

    1.4.13 从 MySQL 获取数据,是从磁盘读取的吗?(buffer pool)

    数据读取流程

    1. 优先访问 Buffer Pool

      • 当执行 SQL 查询时,MySQL 首先检查 Buffer Pool(内存缓存区)中是否存在目标数据页。

      • 若存在(缓存命中),直接返回内存中的数据,无需磁盘 I/O

    2. 缓存未命中时触发磁盘读取

      • 若 Buffer Pool 中无目标数据页,触发磁盘 I/O:

        • 从磁盘加载 16KB 的完整数据页(包含目标数据)到 Buffer Pool 的空闲缓存页

        • 更新 Free 链表(空闲缓存页管理)和 哈希表(缓存页映射关系)

        • 返回数据给客户端,并将该页加入 LRU 链表(最近最少使用管理)的热数据区域

    1.4.14 MySQL 中的 Log Buffer 是什么?它有什么作用?

    Log Buffer

    作用

    作用说明
    减少磁盘 I/O批量合并多次事务的日志写入,避免每次提交都触发磁盘操作,提升高并发场景下的吞吐量。
    支持事务持久性确保事务提交后修改不丢失(通过参数 innodb_flush_log_at_trx_commit 控制刷盘策略)。
    加速崩溃恢复即使数据库崩溃,未刷盘的 redo log 仍可能存在于 Log Buffer,结合磁盘日志恢复数据一致性。
    优化大事务性能大型事务(如批量插入)的日志可暂存于 Log Buffer,避免频繁刷盘带来的性能抖动。

    1.4.15 MySQL 中如何解决深度分页的问题?

    MySQL 深度分页问题的本质是 大量无效数据扫描导致性能下降(如 LIMIT 100000,10 需要遍历前 10 万行再丢弃)

    解决方法

    1.优化 SQL 结构

    2.分页策略调整

    3.索引优化

    4.业务与架构优化

    5.分库分表 + 异步预加载

    1.4.16 什么是 Write-Ahead Logging (WAL) 技术?它的优点是什么?MySQL 中是否用到了 WAL?

    1.4.17 MySQL 的查询优化器如何选择执行计划?

    1.4.18 MySQL 三层 B+ 树能存多少数据?

    1.4.19 什么是数据库的逻辑删除?数据库的物理删除和逻辑删除有什么区别?

    1.4.20 表空间迁移的背景?

    1. 包含数据目录的那个文件系统已满,需要移动到拥有更大的容量的文件系统上

    2. 有助于减少单个磁盘故障造成的损坏

    1.4.21 独立表空间迁移中 5.7 版本的数据库如何迁到 8.0 版本的数据库?N

    1.4.22 如何调整buffer pool区域大小, 建议设置多大比较合理?

    关键参数介绍

    innodb_buffer_pool_size

    innodb_buffer_pool_instances

    innodb_buffer_pool_chunk_size

     

    1.4.23 如何调整Change buffer区域大小,建议设置多大比较合理?

    设置

    设置建议

     

    场景类型推荐值原因
    写多读少(如日志类)30%-40%高频DML操作可提升非唯一索引写入效率,减少磁盘IO
    读多写少默认25%或更低(如15%)避免占用过多缓冲池空间,优先保障数据页缓存
    高并发混合负载25%-35%平衡读写性能,避免单一资源过度消耗
    内存紧张/SSD存储≤25%甚至关闭(设为0)SSD低延迟可抵消部分收益,减少内存占用;关闭后强制实时加载数据页保证一致性

    1.4.24 Innodb 页的结构有哪些部分,都有什么作用?

    一个标准的 InnoDB 数据页大小通常是 16 KB,默认情况下可以通过 innodb_page_size 参数进行配置。数据页被划分为以下几个部分:

    1. File Header(文件头部)

      • 位置:位于数据页的开头

      • 大小:固定占用 38 字节

      • 作用

        • 存储关于整个文件的一般信息

        • 包含页的标识符(如页号、上一页和下一页的页号)、校验和以及其他元数据

    2. Page Header(页面头部)

      • 位置:紧跟在 File Header 之后

      • 大小:固定占用 56 字节

      • 作用

        • 记录特定于某个数据页的状态信息

        • 包括页内记录的数量、第一个记录的位置、最后一个记录的位置、页目录中槽的数量等

    3. Infimum and Supremum Record Headers(最小和最大记录头)

      • 位置:紧随 Page Header 之后

      • 大小:每个记录头固定占用 26 字节,共 52 字节

      • 作用

        • Infimum 是一个虚拟的最小记录,Supremum 是一个虚拟的最大记录

        • 它们帮助维护 B-tree 结构的有序性,简化插入和删除操作

    4. User Records(用户记录)

      • 位置:介于 Infimum 和 Supremum 之间

      • 大小:动态变化,取决于实际存储的数据量

      • 作用

        • 存储用户的实际数据记录

        • 每条记录包含记录头信息和具体的字段数据

    5. Gap Locks List(间隙锁列表)

      • 位置:跟随 User Records

      • 大小:动态变化

      • 作用

        • 支持事务隔离级别下的并发控制

        • 记录间隙锁的相关信息,防止幻读现象的发生

    6. Heap(堆区)

      • 位置:靠近数据页末尾

      • 大小:动态变化

      • 作用

        • 存储临时变量和其他内部使用的数据

        • 助力优化查询性能和内存管理

    7. Record Free Space(记录自由空间)

      • 位置:分布在 Heap 和其他区域之间的空白区域

      • 大小:动态变化

      • 作用

        • 提供可用于未来插入新记录的空间

        • 减少频繁的页分裂操作,提高效率

    8. Page Directory(页目录)

      • 位置:靠近数据页末尾

      • 大小:动态变化

      • 作用

        • 帮助快速定位记录

        • 使用数组形式存储每条记录的指针,加速搜索过程

    9. Fill Factor(填充因子)

      • 位置:隐式存在于各个组件间

      • 作用

        • 控制数据页内的紧凑程度。

        • 平衡数据分布,减少碎片化

    10. Checksum(校验和)

      • 位置:某些版本的 InnoDB 在数据页末尾添加校验和

      • 作用

        • 确认数据完整性和一致性

        • 预防数据损坏,在备份还原过程中尤为重要

    1.4.25 Innodb 存储引擎中的buffer pool 能介绍一下吗?

    1.4.26 链表和数组相比,链表和数组适用于的什么访问?

    1.4.27 SQL语句扫描行太多,回表次数太多如何解决?

    1.4.28 在执行器中是怎么生成的执行计划?

    1.4.29 MySQL的存储机制和MySQL的索引的存储机制?(mysql的表数据存在哪?索引数据在哪⾥?落到磁盘展现形式)

    1.4.30 缓冲池机制?

    1.4.31 缓冲池为了加快查询或写⼊速度,⼀般先写⼊缓冲池。那么缓冲池和磁盘之间的数据差异,通过什么样的机制去保证数据的⼀致性?

    1.4.32 你们⼀般将缓冲池设置成多少?你们的机器规格是多⼤?

    1.4.33 MySQL 的 Change Buffer 是什么?它有什么作用?

    概述

    主要作用

    需要注意的是,Change Buffer 仅对非唯一的二级索引生效,因为主键数据(聚集索引)的修改操作直接写入数据页,不经过 Change Buffer

    1.4.35 索引树的高度多少合适?

    1.4.36 innodb的核心特性?


    日志

    1.5.1 如何配置开启通用日志,二进制日志,错误日志,慢查询日志?

    1.5.2 如何查看二进制日志

    在数据库中查看

    在命令行中进行查看

    1.5.3 binlog二进制日志有哪些格式?有什么区别?你们公司用什么格式?

    选择

     

    1.5.4 二进制日志如何切割

    1.5.5 二进制日志如何清理

    1.5.6 二进制日志相关配置有哪些?

    1. 开关

      log_bin=/data/3306/log/binlog

    2. 日志刷盘

      • sync_binlog = 1 如果为1 表示每次事务提交,立即刷新日志到磁盘中(此方式更加安全)IO消耗更大。

    3. 自动清理

      • binlog_expire_logs_seconds按照秒确认日志切割时间,超过配置时间会自动清理

      • expire_log_days 按照天确认切割日志时间,超过配置时间会自动清理

    4. 日志格式

      • 默认就是ROW 无需改变

    5. 日志大小

      • max_binlog_size:设置日志文件大小,自动轮询

    1.5.7 什么是双一配置?

    sync_binlog = 1

    innodb_flush_log_at_trx_commit = 1

    1.5.8 你是如何截取二进制日志的?与GTID 有什么不同点?

    1.5.9 如何配置慢查询?

    参数配置

    1.5.10 慢日志如何处理?慢日志在什么时候使用,如何用?

     

    1.5.11 数据库优化流程?

    SQL优化

     

    1.5.12 慢日志的配置参数?

    1.5.13 SBR(statement-based replication)与RBR(Row-Based Replication)记录的优缺点分析 ?

     

    记录方式优点说明缺点说明
    SBR可读性强,日志量相对较少;数据信息可能不准确,数据一致性不足
    RBR数据信息记录更准确,数据一致性更强可读性弱,日志量相对较多,数据记录准确
    举例说明update t1 set a=10 where id<10000; 记录一条语句即可insert into 随机数函数;
    举例说明update t1 set a=10 where id<10000; 记录多条语句修改信息,生成日志insert into 随机数函数;

     

    数据备份与恢复

    1.6.1 你在备份这块都做过什么具体工作?/你公司的备份策略?

    备份策略

    1.6.2 你们公司使用什么工具备份 / 备份策略?

    1.6.3 请介绍 mysqldump 核心参数:--master-data--single-transaction 的功能?

    1.6.4 请简述 mysqldump 备份原理

    1. Flash Tables 刷新表

      • 关闭实例上所有打开表,为第二步做准备,防止因为长查询或者大事务导致表无法关闭,进而长期持有全局锁

    2. Flash Tables with Read Lock

      • 加全局读锁,关闭实例上所有打开表,阻止commit 为了获取DB 一致性状态

    3. Set Session Transaction Isolation Level Repeatable Read

      • 确保事务中任何数据都相同

      • --single-transaction参数的作用,设置事务的隔离级别为可重复读, 即REPEATABLE READ,这样能保证在一个事务中所有相同的查询读取到同样的数据, 也就大概保证了在dump期间,如果其他innodb引擎的线程修改了表的数据并提交, 对该dump线程的数据并无影响

    4. start transaction 获取当前数据库的快照

      • single-transaction 设置时生效

      • 获取当前数据库的快照,这个是由mysqldump中--single-transaction决定的。

        WITH CONSISTENT SNAPSHOT能够保证在事务开启的时候,第一次查询的结果就是

        事务开始时的数据A,即使这时其他线程将其数据修改为B,查的结果依然是A。简而言之,就是开启事务并对所有表执行了一次SELECT操作,这样可保证备份时, 在任意时间点执行select * from table得到的数据和 执行START TRANSACTION WITH CONSISTENT SNAPSHOT时的数据一致。【注意】,WITH CONSISTENT SNAPSHOT只在RR隔离级别下有效

    5. obtain Log postion

      • Master-data:获取备份实例的position信息

        • --master-data=2表示在dump过程中记录主库的binlog和pos点,并在dump文件中注释掉这一行;

        • --master-data=1表示在dump过程中记录主库的binlog和pos点,并在dump文件中不注释掉这一行,即恢复时会执行;

      • dump-slave:获取备份实例的slave的position信息

        • --dump-slave=2表示在dump过程中,在从库dump,mysqldump进程也要在从库执行, 记录当时主库的binlog和pos点,并在dump文件中注释掉这一行;

        • --dump-slave=1表示在dump过程中,在从库dump,mysqldump进程也要在从库执行, 记录当时主库的binlog和pos点,并在dump文件中不注释掉这一行;

    6. unlock tales

      • 释放全局锁

    7. 从数据库中获取数据信息

      • 利用相应数据对象的查询语句,获取数据库中的操作对象,将对应数据创建的SQL语句进行保存;

    1.6.5 mysqldump 是否属于热备份?

    1.6.6 mysqldump 是否需要锁表?

    1.6.7 请介绍 xtrabackup 工具的备份原理

    全量备份

    1. 启动 XtraBackup 进程:

    2. 创建一些临时文件来跟踪备份进度和状态。

    3. 复制 .ibd 文件 (XtraBackup 分配多个线程来并行复制 InnoDB 表空间文件(.ibd 文件))

    4. 在复制 .ibd 同时,一个单独的线程负责监视和复制 REDO 日志文件 ,记录LSN (ib_logfile0, ib_logfile1 等),以捕获备份过程中产生的所有变更

    5. 全局读锁,执行LOCK INSTANCE FOR BACKUP(8.0取代了 FLUSH TABLES WITH READ LOCK);

    6. 备份非InnoDB文件 在全局只读状态下,XtraBackup 备份 MyISAM 表、触发器、视图、存储过程等非 InnoDB 文件

    7. 获取binlog位置信息;

    8. 记录当前 REDO 日志的位置,以便将来进行增量备份或其他恢复操作

    9. 执行UNLOCK INSTANCE释放锁;

    10. 移除不再需要的临时文件

    11. 创建备份元数据文件,记录备份的重要信息,如备份时间戳、REDO 日志位置等

    12. 执行基本的完整性检查,确保备份文件无误

     

    官方原文

    https://docs.percona.com/percona-xtrabackup/8.4/how-xtrabackup-works.html

    Percona XtraBackup is based on InnoDB’s crash-recovery functionality. It copies your InnoDB data files, which results in data that is internally inconsistent; but then it performs crash recovery on the files to make them a consistent, usable database again.

    This works because InnoDB maintains a redo log, also called the transaction log. This contains a record of every change to InnoDB data. When InnoDB starts, it inspects the data files and the transaction log, and performs two steps. It applies committed transaction log entries to the data files, and it performs an undo operation on any transactions that modified data but did not commit.

    The --register-redo-log-consumer parameter is disabled by default. When enabled, this parameter lets Percona XtraBackup register as a redo log consumer at the start of the backup. The server does not remove a redo log that Percona XtraBackup (the consumer) has not yet copied. The consumer reads the redo log and manually advances the log sequence number (LSN). The server blocks the writes during the process. Based on the redo log consumption, the server determines when it can purge the log.

    Percona XtraBackup remembers the LSN when it starts, and then copies the data files. The operation takes time, and the files may change, then LSN reflects the state of the database at different points in time. Percona XtraBackup also runs a background process that watches the transaction log files, and copies any changes. Percona XtraBackup does this continually. The transaction logs are written in a round-robin fashion, and can be reused.

    Percona XtraBackup uses Backup locks where available as a lightweight alternative to FLUSH TABLES WITH READ LOCK. MySQL 8.4 allows acquiring an instance level backup lock via the LOCK INSTANCE FOR BACKUP statement.

    Locking is only done for MyISAM and other non-InnoDB tables after Percona XtraBackup finishes backing up all InnoDB/XtraDB data and logs. Percona XtraBackup uses this automatically to copy non-InnoDB data to avoid blocking DML queries that modify InnoDB tables.

    Important

    The BACKUP_ADMIN privilege is required to query the performance_schema_log_status for either LOCK INSTANCE FOR BACKUP or LOCK TABLES FOR BACKUP.

    xtrabackup tries to avoid backup locks and FLUSH TABLES WITH READ LOCK when the instance contains only InnoDB tables. In this case, xtrabackup obtains binary log coordinates from performance_schema.log_status. FLUSH TABLES WITH READ LOCK is still required in MySQL 8.4 when xtrabackup is started with the --slave-info. The log_status table in Percona Server for MySQL 8.4 is extended to include the relay log coordinates, so no locks are needed even with the --slave-info option.

    See also

    MySQL Documentation: LOCK INSTANCE FOR BACKUP

    When backup locks are supported by the server, xtrabackup first copies InnoDB data, runs the LOCK TABLES FOR BACKUP and then copies the MyISAM tables. Once this is done, the backup of the files will begin. It will backup .frm, .MRG, .MYD, .MYI, .CSM, .CSV, .sdi and .par files.

    After that xtrabackup will use LOCK BINLOG FOR BACKUP to block all operations that might change either binary log position or Exec_Source_Log_Pos or Exec_Gtid_Set (i.e. source binary log coordinates corresponding to the current SQL thread state on a replication replica) as reported by SHOW BINARY LOG STATUS or SHOW REPLICA STATUS. xtrabackup will then finish copying the REDO log files and fetch the binary log coordinates. After this is completed xtrabackup will unlock the binary log and tables.

    Finally, the binary log position will be printed to STDERR and xtrabackup will exit returning 0 if all went OK.

    Note that the STDERR of xtrabackup is not written in any file. You will have to redirect it to a file, for example, xtrabackup OPTIONS 2> backupout.log.

    It will also create the following files in the directory of the backup.

    During the prepare phase, Percona XtraBackup performs crash recovery against the copied data files, using the copied transaction log file. After this is done, the database is ready to restore and use.

    The backed-up MyISAM and InnoDB tables will be eventually consistent with each other, because after the prepare (recovery) process, InnoDB’s data is rolled forward to the point at which the backup completed, not rolled back to the point at which it started. This point in time matches where the FLUSH TABLES WITH READ LOCK was taken, so the MyISAM data and the prepared InnoDB data are in sync.

    The xtrabackup offers many features not mentioned in the preceding explanation. The functionality of each tool is explained in more detail further in this manual. In brief, though, the tools enable you to do operations such as streaming and incremental backups with various combinations of copying the data files, copying the log files, and applying the logs to the data.

    恢复原理:

    模拟了InnoDB Crash Recovery(CR)功能,LSN

    1.6.8 晚上 23:00 开始备份 mysqldumpxtrabackup 两个工具理论上能将数据恢复至几点?

    1.6.8 xtrabackup 的增量备份是如何实现的?

    增量备份原理

    1.6.9 xtrabackup 增量备份恢复要注意什么?

    1.6.10 mysqldumpxtrabackup 备份如何实现基于时间点的恢复?

    时间点恢复的缺点:

    1.6.11 请列举数据库数据损坏场景,然后针对性地提出最佳的恢复方案(假设具有多种类型备份)?

    数据损坏场景及恢复方案:

    1. 物理损坏

      • 硬件故障、断电、文件损坏或删除

      • 恢复方案

        • 使用主从复制或高可用架构,从从库恢复数据

        • 使用物理备份(如 xtrabackup)恢复数据

    2. 逻辑损坏

      • 误操作(如 DROP TABLEDELETETRUNCATE

      • 恢复方案

        • 使用延迟从库,从延迟从库恢复数据

        • 使用 binlog 恢复误操作前的数据(如使用 binlog2sql 工具)

        • 利用表空间进行数据恢复

    1.6.12 如何实现分库分表,备份数据库中的表?

    1.6.13 数据库宕机没有全量备份,但有物理文件,如何恢复数据?

    恢复条件:

    1. 有物理文件,可以找到 .frm 文件,解析出表结构语句。

    2. 有物理文件,可以找到表的 .ibd 文件。

    3. 有目录结构,可以找到库名及对应的 .ibd 文件。

    恢复步骤:

    1. 准备恢复环境

      • 创建目标数据库和表结构。

    2. 导入表结构

      • 使用 CREATE TABLE 语句创建表结构。

    3. 删除目标表的 .ibd 文件

    4. 拷贝 .ibd 文件到目标位置

    5. 更改权限

    6. 导入表空间

    7. 恢复所有库和表

      • 依次操作所有库和表,恢复完整数据库

    8. 根据 Binlog 恢复增量数据

      • 使用 binlog 恢复备份后到宕机前的增量数据

    9. 启动数据库并检查数据

      • 启动 MySQL 服务,检查数据完整性

    1.6.14 delete 了数据库中一个表,如何恢复?

    1.6.15 备份方案中保存 3-7 天和 7-15 天的原因,依赖什么依据这么保存的?

    1.6.15 mysqldump 全备时如何保证数据的不丢失?mysqldump 全备时会对业务造成影响吗?

    1.6.16 (单表恢复)8:00全备了一张表,9:00误删除了一张小表,但有binlog,怎么恢复?

    1. 找个测试库,恢复全备的表\

    2. Binlog2sql 解析全备后的单表 binlog,删除误删语句,恢复到测试库

    3. 导出表数据,恢复到正式库

    单库恢复

    1.6.17 生产中备份的文件50G数据库,误删除了一张 t1 表,10M大小,有什么思路可以快速恢复?

    1.6.18 进行独立表空间迁移时遇到没有提前保存表结构信息怎么办?

    解决方案

    方法具体操作
    通过元数据提取若原数据库仍可访问: - 使用 SHOW CREATE TABLE 直接导出建表语句 - 查询 information_schema.COLUMNS 表拼接字段定义
    解析.frm文件从原库复制.frm文件(存储表结构定义),使用工具如 mysqlfrm 解析生成建表语句(需对应MySQL版本)
    数据逆向推断当仅剩ibd文件时: - 尝试创建同名空表并丢弃表空间 - 使用 ibd2sdi 工具解析ibd文件中的元数据(需MySQL 8.0+)
    第三方工具辅助使用 Percona Toolkit 的 pt-show-create-table 或 Navicat 等GUI工具自动生成结构

    1.6.19 进行独立表空间迁移时遇到数据库中有多张表如何批量进行迁移 (有多个库多个表)?

    解决方案

    场景适用策略
    同构表批量迁移1. 通过脚本遍历所有库表生成迁移命令
    2. 示例Shell脚本逻辑:
    mysqldump -h原库 -u用户 -p密码 库名 表名 --no-data > schema.sql
    mysql -h新库 -u用户 -p密码 库名 < schema.sql>
    ALTER TABLE 表名 DISCARD TABLESPACE;
    scp 原库ibd文件 新库对应目录
    ALTER TABLE 表名 IMPORT TABLESPACE;
    异构表结构处理1. 使用Python/Java程序连接新旧库,动态对比字段差异 2. 对缺失字段自动填充默认值或忽略(参考CSDN分页迁移方案)
    跨服务器迁移结合 rsync 或 scp 批量传输ibd文件,通过 LOAD DATA INFILE 加速数据导入
    工具自动化采用 Percona XtraBackup 或 MySQL Shell Util 的 copyTables 功能实现全库/多表并行迁移

    补充痛点:数据与文件路径映射

    1.6.20 为什么mysqldump 为什么不在第一次执行 flush tables 操作的时候加上锁呢?

    1.6.21 线上备份是怎么实现的?加什么参数?

    1.6.22 xtrabackup 备份过程中怎么确保数据一致性?在备份过程中有新增加的数据怎么办?新增加的数据有没有必要进进⾏备份?

    1.6.23 mysqldump 进行数据补偿后,新增加的数据怎么办?

    1.6.24 mysql的备份⽅式?备份⼯具?是否锁表?

    1.6.25 你们是怎么做数据恢复的?流程?⽤什么⼯具?(业务说⼏⼗万条数据删错了,你是怎么把它恢复回来)

    1.6.26 mysql运⾏到⼀半,遭遇断电宕机,在做恢复的时候怎么保障mysql缓冲池中的数据落盘或者不落盘的?可能缓冲池和磁盘数据不⼀致嘛?

    1.6.27 你这500G数据用什么工具备份,花费多长时间,恢复要多久?

    1.6.28 一张表使用mysqldump备份,用什么参数保证这三张表在同一时间备份数据?

    1.6.29 flush table 命令有什么作用?

    1. 关闭所有已打开的表‌:FLUSH TABLES命令会关闭所有已打开的表文件,释放相关的内存资源。如果表中有未写入磁盘的数据(如缓冲池中的脏页),会被强制写入磁盘‌

    2. 刷新表缓存‌:该命令会刷新表的元数据(如索引、统计信息),确保最新的元数据被加载到内存中‌

    3. 影响‌:FLUSH TABLES命令会等待所有正在运行的SQL请求结束,因此会阻塞其他会话对相关表的操作,包括查询和写操作‌

    1.6.30 MySQL CR 恢复机制,是怎样恢复数据数据的 redo log 和 DoubleWrite buffer 是如何配合的?

    1.6.31 数据恢复方案?

    1.6.32 周日做的备份,昨天删除了drop了一张表,如何恢复,不知什么时间删除的?

    1.6.33 数据损坏了怎么恢复(断电了,误删了)?


     

    事务和锁

    1.7.1 MySQL 是如何实现事务的?

    MySQL 是通过ACID 四个特性完成的事务 即原子性,一致性,隔离性,持久性

    1.7.2 什么是事务的 ACID?ACID 是如何保证的?

    原子性Atomicity)(一组操作要么全部成功,要么全部失败)

    一致性 (Consistency) 事务结束后,数据库应处于一致的状态

    隔离性(Isolation) 多个并发事务相互独立,互不影响

    持久性 (Durability) 一旦事务提交,结果将永久保存

    1.7.3 MySQL 中长事务可能会导致哪些问题?

    1. 长时间的锁定资源,阻塞资源:

      • 长事务会持有锁(如行级锁或表级锁),阻止其他事务对该数据进行修改。这种锁的存在会影响数据库的并发性能,降低整体效率

    2. 增加存储空间消耗:

      • 在 MySQL 中,为了实现事务的原子性和可恢复性,会对每次更新操作生成相应的回滚信息(undo log)。当事务保持打开状态较久时,这些回滚信息也会随之累积,占用大量磁盘空间

    3. 产生死锁风险:

      • 多个长事务相互竞争相同的资源时,很容易形成循环依赖关系,进而触发死锁现象。此时,MySQL 可能会选择终止某些事务以解除 deadlock 条件,但这通常伴随着一定的业务中断和服务降质的风险

    4. 引起主从复制延迟:

      • 在具有主从复制架构的 MySQL 系统中,主节点上的长事务会在其完成后才允许从节点同步对应的变更内容。因此,若频繁发生此类情形,则会导致从节点与主节点之间的数据差异增大,进一步恶化复制滞后状况

    5. 耗尽数据库连接池资源:

      • 应用程序中的长事务如果不及时释放持有的数据库连接,将迅速占据可用连接数上限,阻碍新来的请求获得必要的数据库交互通道,最终迫使新的用户面临无响应或异常退出等问题

    6. 延长垃圾回收周期:

      • 回滚段用于存放旧版数据副本,供事务回滚至先前状态所需。然而,只要有任何活动事务引用到特定范围内的 undo 记录,这部分内存区域便不能立即被重用或清除掉。这意味着随着活跃长事务数量的增长,可用于分配给新生事物的空间逐渐缩减,间接增加了 garbage collection 的负担

    7. 影响监控指标准确性:

      • 相关统计参数如平均事务处理时间、最大等待锁的时间长度等均会被拉高,误导DBA误判实际负载水平,不利于合理规划硬件配置或是调整优化措施的方向

    8. 回滚导致时间浪费:

      • 如果长事务执行很长一段时间,中间突发状况导致报错,导致事务回滚,之前做的执行都浪费

    1.7.4 MySQL 中的 MVCC 是什么?

    概述

    特性

    1. 非阻塞读操作

      • 在传统的锁机制下,如果一个事务正在进行写操作,其他试图读取该数据的事务需要等待直到写操作完成并释放锁为止。而在 MVCC 下,读操作不需要获取任何类型的锁,可以直接访问最近提交的数据快照,极大地减少了等待时间和提高了吞吐量

    2. 支持多种隔离级别

      • 支持 RC 和 RR 两种隔离级别

    实现原理

    1. Undo 日志 (Undo Logs):

      • 用途: 当对某个数据行进行插入、更新或删除操作时,InnoDB 会将这些操作之前的旧版本数据记录到 Undo 日志中

      • 作用:

        • 回滚事务: 如果事务没有正常提交,可以通过 Undo 日志恢复到修改前的状态

        • 提供历史版本: 在读取数据时,可以根据需要访问不同版本的数据

    2. 隐藏列:

      • DB_ROW_ID: 自动递增的唯一标识符,用于区分每一行的不同版本

      • DB_ROLL_PTR: 指向对应行的上一个版本所在的 Undo 日志的位置

      • DB_TRX_ID: 记录最后一次修改该行的事务 ID

      • DB_HEAP_NO: 表示行在一个页中的相对位置

    3. Read View:

      • 定义: 当一个事务开始时,它会创建一个 Read View,表示在这个时刻可见的所有事务状态。

      • 组成:

        • min_trx_id: 最低活跃事务 ID,小于此 ID 的所有事务都已经结束

        • max_trx_id: 上界数组,下一个,也是最大值,系统应该分配的一个事务的ID值,之前提交的事务最大值+1

        • creator_trx_id_: 创建该 Read View 的事务 ID

        • mids: 事务正在进行,未提交的,活跃的事务

    写操作

    1. 插入操作:

      • 插入新行时,仅设置 DB_TRX_ID 字段为当前事务 ID,并初始化其他必要字段

      • 不涉及 Undo 日志,因为插入的新行没有任何旧版本可供撤销

    2. 更新操作:

      • 更新现有行时,首先将原行数据写入 Undo 日志,以便之后可以回滚

      • 然后更新行数据,并设置 DB_TRX_ID 字段为当前事务 ID

      • 使用 DB_ROLL_PTR 指针指向刚刚写入 Undo 日志的旧版本数据

    3. 删除操作:

      • 删除行时,同样将原行数据写入 Undo 日志

      • 标记该行为已删除(软删除),并将 DB_TRX_ID 设为当前事务 ID

      • DB_ROLL_PTR 指向刚写的 Undo 日志中的完整数据副本

    读操作

    1. 快照读 (Snapshot Reads):

      • 快照读是指按照某一时间点的视图来读取数据,适用于大多数常见的 SELECT 查询

      • 当事务启动时,会生成一个 Read View,描述了此刻可见的所有事务状态

      • 读取数据时,根据 Read View 规则判断是否能看到某一行:

        • 若行的 DB_TRX_ID < m_low_trx_id,则说明该行已被提交并且对当前事务可见

        • 若行的 DB_TRX_ID == creator_trx_id_,则是由自己创建的行,自然可见

        • 若行的 DB_TRX_ID 出现在 m_upp_trx_ids 数组中,则表示该行是由还在运行的更高优先级事务修改的,不可见

        • 否则,查看 DB_ROLL_PTR 指向的 Undo 日志,寻找合适的旧版本数据返回给调用方

    2. 当前读 (Current Reads):

      • 当前读是指实时获取最新版本的数据,主要用于满足一些特殊的需求,例如 UNIQUE 键校验、外键约束验证等

      • 当前读总是看到最新的数据,不受 Read View 影响

      • 执行当前读时,会加上必要的锁(如 S 锁或 X 锁),以确保数据的一致性和完整性

    1.7.5 如果 MySQL 中没有 MVCC,会有什么影响?

    1. 锁竞争加剧: 这种严格的锁定会导致大量的锁竞争和冲突,尤其是在高并发环境下,严重影响系统的响应速度和吞吐量

    2. 读操作阻塞: 没有 MVCC 时,读操作会被写操作阻塞,反之亦然。这种相互排斥的关系使得并发能力大打折扣

    3. 降低整体性能: 由于频繁的锁争夺和等待时间延长,整个数据库的性能会明显下滑

    4. 死锁发生概率上升: 在缺乏 MVCC 的情况下,更多的锁请求和持有的锁数量增多,容易形成循环等待的情况,进而引发死锁

    5. 难以调试和预防: 死锁的发生通常比较随机且不易预测,增加了故障排查难度

    6. 丢失更新: 如果多个事务同时读取相同的初始值然后各自做出修改,最终只有一个事务的改动会被保存下来,其余的都被覆盖掉

    7. 脏读、不可重复读等问题频出: 在较低的隔离级别下,可能出现脏读(读取到了未提交的数据)、不可重复读(多次读取得到不同的结果)等情况

    8. 大量元数据开销: 为了维护精确的锁状态,需要在内存中存储大量的锁相关信息,占用更多资源

    9. 更频繁的磁盘访问: 锁的信息也需要持久化到磁盘日志中,增加了 I/O 操作次数,进一步拖累性能

    10. 长时间等待: 用户发起的操作经常因锁竞争而陷入漫长的等待阶段,用户体验急剧下降

    1.7.6 MySQL 中的事务隔离级别有哪些?

    1.7.7 MySQL 默认的事务隔离级别是什么?为什么选择这个级别?

    原因

    1.7.8 数据库的脏读、不可重复读和幻读分别是什么?

    1.7.9 什么是死锁?

    1.7.10 什么是快照读,什么是当前读?

    快照读

    当前读

    对比

    快照读 (Snapshot Read)当前读 (Current Read) 
    是否加锁
    读取版本记录的快照版本记录的最新版本
    适用隔离级别REPEATABLE READ所有隔离级别
    典型命令SELECT ...SELECT ... FOR UPDATE, SELECT ... LOCK IN SHARE MODE, UPDATE, DELETE, INSERT
    优点高并发性能数据强一致性
    缺点可能看不到最新的更改导致一定的并发瓶颈
    应用场合仅读取数据,无需修改需要精确控制数据访问权限

    1.7.11 read-view 是如何判断当前事务的看见性的?

    1.7.12 幻读是怎样产生的,会造成什么问题?

    幻读的产生原因

    1. 并发操作:当两个或多个事务在几乎相同的时间内执行时,如果一个事务插入了新的数据行,而另一个事务在同一时间范围内执行相同的查询,但期望结果保持不变,就会发生幻读

    2. 事务隔离级别:在“可重复读”隔离级别下,事务可以多次读取同一范围的数据而不会看到其他事务的更新(除了插入的新行),这导致了幻读现象。而在“读已提交(Read Committed)”隔离级别,每次查询都会看到其他事务已经提交的最新数据,因此不会遇到传统意义上的幻读问题,但可能会遇到其他类型的并发问题

    幻读产生的问题

    1.7.13 InnoDB是怎样在可重复读隔离级别下解决幻读的?

    1.7.14 简述 MySQL 中锁的种类及作用?

    1. 行级锁(Row Lock)

      • 仅对特定的行加锁,允许其他事务并发访问不同的行,适用于高并发场景

    2. 表级锁(Table Lock)

      • 对整个表加锁,其他事务无法对该表进行任何读写操作,适用于需要保证完整的小型表

    3. 意向锁(Intention Lock)

      • 一种特殊的表锁,用于表示某个事物对某行数据加锁的意图,分为意向共享锁(IS)和意向排它锁(IX);

        主要用于行级锁与表级锁的结合

    4. 共享锁(shard Lock)

      • 允许多个事务并发读取同一资源,但不允许修改。只有在释放共享锁后,其他事务才能获得排它锁

    5. 排它锁(exclusive Lock)

      • 只允许一个事务对资源进行读写,其它事务在获得排它锁之前无法访问该资源

    6. 元数据锁(metadata Lock,MDL)

      • 用于保护数据库对象(如表和索引)的元数据,防止在进行DDL操作时,其他事务对这些对象进行修改

    7. 间隙锁(Gap Lock)

      • 针对索引中两个记录之间的间隙加锁,防止其他事务在这个间隙中插入新记录,从而避免幻读;

        间隙锁不锁定具体行,而是锁定行与行之间的空间

    8. 临键锁(Next-Key Lock)

      • 一种等待间隙的锁,用于指示事务打算在某个间隙中插入记录,允许其他事务进行共享锁,但在插入时会阻止其他的排它锁

    9. 插入意向锁(Insert Intention Lock)

      • 一种等待间隙的锁,用于指示事务打算在某个间隙中插入记录,允许其他事务进行共享锁,但在插入时会阻止其他的排它锁

    10. 自增锁(Auto Increment Lock)

      • 在插入自增列时,加锁以保证自增值的唯一性,防止并发插入导致的冲突。

        通常在插入操作时被使用,以确保生成的自增ID是唯一的

    1.7.15 MySQL 的乐观锁和悲观锁是什么?

    悲观锁(Pessimistic Locking):

    乐观锁(Optimistic Locking):

    悲观锁和乐观锁适用场景:

     

    1.7.16 MySQL 中如果发生死锁应该如何解决,如何检测死锁?

    自动检测与回滚:

    手动 kill 发生死锁的语句:

    手动Kill 死锁流程

    1. 查看事务id(trx_id)

      • SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

    2. 查看线程id (trx_mysql_thread_id)

      • SELECT trx_state, trx_started, trx_mysql_thread_id, trx_query, trx_id FROM INFORMATION_SCHEMA.INNODB_TRX WHERE trx_id = '123456';

      • trx_mysql_thread_id 与该事务关联的 MySQL 线程 ID,可以用来查找该事务的更多信息

    3. kill导致死锁的进程

      • kill + 线程id

    死锁情况避免方法:

    1.7.17 lock in share mode、for update、update、insert、delete分别上什么锁?

    1.7.18 MySQL的加锁原则能介绍一下嘛

    1.7.19 next-key lock加锁的过程是怎样的?

    1.7.20 MySQL 插入一条 SQL 语句,redo log 记录的是什么?

    1.7.21 MySQL 事务的二阶段提交是什么?

    对于MySQL Innodb存储引擎而言,每次修改后,不仅需要记录Redo log还需要记录Binlog,而且这两个操作必须保证同时成功或者同时失败,否则就会造成数据不一致。为此MySQL引入两阶段提交

    二阶段提交是MySQL 为了保证redo log 和 BinLog 写入数据一致性的一个机制

    二阶段(1)

    1.7.22 redo log 重做日志作用 ?

    1.7.23 undo log 回滚日志作用 ?

    1. 事务回滚:当事务需要回滚时,Undo log 用于撤销已执行的操作,将数据恢复到事务开始前的状态

    2. 多版本并发控制(MVCC):Undo log 支持 MVCC,允许读取操作在不加锁的情况下访问数据的历史版本,从而提高并发性能

    3. 数据一致性:在系统崩溃或事务失败时,Undo log 帮助恢复数据到一致状态,确保数据库的完整性

    4. 事务隔离:Undo log 提供事务隔离,确保一个事务的未提交修改不会影响其他事务

    5. 日志管理:Undo log 记录事务的修改操作,便于系统管理和维护事务日志

    undo_log写入过程

    1.7.24 RC 和 RR 在构建 mvcc 的 read view 时有什么区别?

    1.7.25 Innodb 支持事务的原因?

    1.7.26 MVCC 中是如何判断其他事务是否可见?

    快照读的机制

    1.7.27 事务的持久性是如何实现的?主要参数是什么?

    主要的四个参数

    1. innodb_flush_log_at_trx_commit

    2. sync_binlog

    3. sql_log_bin

    4. innodb_file_per_table

    详细说明

     

    1.7.28 为什么需要两阶段提交,那么如果没有两阶段提交,会发生什么呢?

    如果没有二阶段提交,关于这两个日志:要么就是先写完 redo log,再写 binlog 或者先写 binlog 再写 redo log

    来分析一下会产生什么后果

    先写完redolog,再写binlog

    先写完binlog,再写redolog

     

    如有有二阶段提交,MySQL 异常宕机恢复后如何保证数据一致呢?

    redo log 处于 prepare 阶段,binlog 还未写入,此时 MySQL 异常宕机

    redo log 处于 prepare 阶段,binlog 已写入,但 redo log 还未 commit,此时 MySQL 异常宕机

    1.7.29 MySQL 如何监控长事务,避免长事务?

    识别长事务

    1. 监控表 Information_schema.innodb_trx表

    2. 使用 Percona Monitoring and Management (PMM) (可以提供详细的事务统计信息,帮助快速定位长事务)

    3. 使用 Prometheus & Grafana: 结合 Prometheus 和 Grafana 构建自定义仪表盘,监控事务时间和活跃事务数量

    4. 启用 General Query Log 记录所有 SQL 请求,通过分析日志找出执行时间较长的查询

      • SET GLOBAL general_log = 'ON'; -- 开启一般查询日志

    5. 配置 Slow Query Log收集执行时间超出指定阈值的查询

    6. 编写自动化脚本来定期扫描 information_schema.innodb_trx 表,并发送警报通知管理员

    避免长事务

    1. 最小化事务范围:确保每个事务只包含必要的操作,不要将无关紧要的任务纳入同一个事务中

    2. 批量操作分解:对于大规模的数据导入导出或批处理任务,将其分割成较小的批次逐一提交 如果没有索引可以利用主键作为索引进行联合查询条件进行分批删除操作

    3. 调整隔离级别:根据业务需求选择合适的隔离级别。较低的隔离级别(如 READ COMMITTED)可以提高并发性能,但需要注意数据一致性问题

    4. 限制单个语句的最大执行时间:使用 max_execution_time 参数来控制每个 SQL 语句的最长执行时间

    5. 异步处理:将耗时的操作(如 RPC 调用、外部 API 请求)移出事务外,单独处理

    6. 消息队列:使用消息队列(如 Kafka、RabbitMQ)来调度后台任务,减轻事务负担

    7. 索引优化:确保常用字段上有适当的索引,加快查询速度

    8. 查询重构:简化复杂的查询逻辑,减少不必要的子查询和联接操作

    9. 缓存机制:利用缓存(如 Redis、Memcached)减少频繁的数据库访问

    10. 代码审核:定期审查现有代码,寻找潜在的长事务来源

    11. 性能基准测试:进行负载测试和性能基线评估,及时发现并解决问题

    12. 使用分布式事务管理器 XA 事务 和 Saga 模式

    13. 动态设置变量:根据具体情况动态调整 MySQL 的配置参数,如 innodb_rollback_segments 和 innodb_max_purge_lag_delay SET GLOBAL innodb_rollback_segments = 128;

    1.7.30 如何解决幻读?

    1.7.31 MVCC 解决幻读了吗?

    多版本并发控制(MVCC)在很大程度上缓解了幻读问题,尤其是在“可重复读(Repeatable Read)”隔离级别下,但它并不能完全解决所有类型的幻读

    1.7.32 MySQL为什么会需要redo日志,redo日志的特点和好处?

    1.7.33 如何理解undo日志?

    1.7.34 MVCC机制、事务隔离级别、undo、redo之间的相互作用?

    1.7.35 从数据操作角度锁分为哪几种?从数据粒度来划分,锁分为哪几种?

    1.7.36 死锁你是怎么监控?其他还有遇到过锁的?元数据锁?

    1.7.37 事务没有提交?事务的堵塞情况?事务运⾏多久?

    1.7.38 redo log占⽤磁盘太多是什么导致的?(⽐如说500G的实例,这个⽇志就占200G)

    1. 长时间未提交的大事务

      • 如果有持续很长时间的长事务,其对应的 Redo 日志会一直存在于 Buffer 中直到事务提交

      • 拆分大事务:尽量将大事务分解为较小的任务,缩短每个事务的持有时间

      • 监控和告警:使用监控工具检测长时间运行的事务,并及时干预

    2. 频繁的小事务

      • 大量的小事务会产生许多 Redo 日志条目,累积起来占用较多空间

      • 批处理操作:尽可能地将多个小操作合并为一个较大的批次

      • 优化 SQL 查询:确保查询高效,减少不必要的重复操作

    3. 高并发写操作

      • 水平扩展:增加服务器资源或使用集群架构来分担压力

      • 异步处理:利用消息队列或其他技术延后处理非即时性操作

    4. 配置不当

    1. 数据增长速度快

      • 如果数据库中的数据增长速度很快,相应的 Redo 日志也会随之增多

      • 使用分区表管理大数据集,提高维护效率

    2. 相关线程出现问题

      • Checkpointing:确保 Checkpoint 正常运作,标记哪些日志可以被安全删除。

      • Purge Thread:确认 Purge 线程正在正确移除不再需要的日志。

    3. 异常终止或重启

      • 描述:意外的系统崩溃或强制重启可能导致 Redo 日志未能及时清空

    1.7.39 单机的redo log是做什么的?集群

    1.7.40 什么时候redo log进⾏数据落盘?

    innodb_flush_log_at_trx_commit参数决定了 Redo Log 如何及何时被刷新到磁盘。共有三种模式:

    1.7.41 redo 和undo与双写⽂件之间的关系?

    以下是 Redo Log、Undo Log 和 DoubleWrite Buffer 之间相互配合的过程:

    1. 事务开始

      • 用户启动一个新的事务

    2. 生成 Redo 日志

      • InnoDB 为每个事务生成相应的 Redo 日志,并将其写入 Redo Log Buffer

    3. 生成 Undo 日志

      • 同时,InnoDB 也为每个事务生成 Undo 日志,并将其写入 Undo Segment

    4. 准备写入数据页

      • 修改的数据页准备好要写入磁盘

    5. 写入 DoubleWrite Buffer

      • 数据页首先被写入 DoubleWrite Buffer

      • 这一步确保了即使出现部分写入失败,也有一个可靠的副本可供恢复

    6. 写入目标数据文件

      • 数据页随后被写入最终的目标数据文件

    7. Flush Redo Log

      • 根据 innodb_flush_log_at_trx_commit 参数的不同,Redo 日志会被刷新到磁盘

        • Mode 0: 写入 Page Cache。

        • Mode 1: 写入 Page Cache 并调用 fsync() 刷新到磁盘

        • Mode 2: 写入 Page Cache。

    8. Commit 事务

      • 一旦 Redo 日志被成功刷新到磁盘,事务被视为已提交

    9. Purge Undo 日志:

      • 已经应用的 Undo 日志可以被 Purge 线程清除,释放空间

    1.7.42 mysql读视图概念

    1.7.43 间隙锁和意向锁?

    1.7.44 redo log和binlog⽂件写⼊顺序

    1.7.45 mysql DDL操作哪些方式不会锁表?

    1.7.46 直接先写完 redo log,再写 binlog,崩溃恢复后直接判断两个日志数据是否完整不就好了? 为什么还要分二阶段?

    1.7.47 如何对比 redo log 和 binlog 是一致的?

    1.7.48 MySQL 插入一条 SQL 语句,redo log 记录的是什么?

    1.7.49 插入操作 redo log 具体执行流程?

    1. 修改缓冲页(Buffer Pool):数据先写入内存中的缓冲池,而不是直接写入磁盘

    2. 生成 redo log:同时生成一条 redo log,记录插入对数据页的物理修改细节

    3. 日志先行(Write-Ahead Logging, WAL):redo log 先被写入磁盘上的 redo log 文件

    1.7.50 死锁情况避免方法?

    1.7.51 插入操作 redo log 具体执行流程

    1. 修改缓冲页(Buffer Pool):数据先写入内存中的缓冲池,而不是直接写入磁盘

    2. 生成 redo log:同时生成一条 redo log,记录插入对数据页的物理修改细节

    3. 日志先行(Write-Ahead Logging, WAL):redo log 先被写入磁盘上的 redo log 文件

    1.7.52 什么是事务?

    数据库事务(Transaction)是指作为单个逻辑工作单元执行的一系列操作,用于确保数据操作的正确性和完整性,这些操作要么全部执行,要么全部不执行

    1.7.53 MySQL 死锁可以通过哪些视图检测到,如何手动Kill 死锁线程?

    定位阻塞事务


    主从复制与架构

    1.8.1 简述主从复制原理

    1. 在从库上进行主从配置,并会将配置信息保存到master info文件中

    2. 在从库上启动主从功能,会在从库中创建两个线程

      • IO线程: 负责和主库建立连接会话/负责将主机信息保存到从库

      • SQL线程:负责读取主库同步信息/将主库同步信息进行回放

    3. IO线程出现后,会加载master info文件,向主库发送连接请求

    4. 主库确认并验证从库连接请求后,会在主库中创建mysql dump线程

      • dump线程:负责将主库binlog信息传输给从库IO线程/负责读取或监控主库binlog文件内容

    5. IO线程接收dump线程传输数据后,会保存数据信息到relay log文件,并更新master info文件位置点

    6. SQL线程会读取relay log数据内容,将数据内容进行回放,回放后会将回放的数据内容位置点记录到 relay log info文件,主从同步建立过程完毕

    1.8.2 如何为运行了 2 年的数据库,构建一个从库(主从构建步骤)?请说明步骤?是否需要停主库?

    1.8.3 如何监控主从复制?请说明监控要点?

    1.8.4 请简述你遇到过的主从复制故障?分析、规避、处理?

    IO线程故障处理

    SQL线程异常

    NO

    问题原因

    造成异常的原因

    解决SQL线程回放数据失败问题

    主从延时问题

    1.8.5 传统的主从复制是异步还是同步?会不会出现主从不一致?出现有什么好的方法解决或预防?

    1.8.6 延时从库的实现原理?主要可以解决什么问题?

    1.8.7 半同步复制实现原理?作用(解决主从数据最终一致性问题)

    1.8.8 请简述 MGR 的工作原理?Paxos 协议工作原理?

    1.8.9 如何处理 MySQL 的主从同步延迟?

    说明:主从之间必然会出现延迟情况,尽量减少主从延迟情况

    1.8.10 请介绍一下你们公司的数据库架构或什么是 MySQL 集群?

    1.8.11 请介绍你熟悉的高可用解决方案?

    1.8.12 请简述 MHA 的搭建过程?

    1. 配置基础环境,时间同步,主机名,yum仓库,EPEL仓库,IP地址

    2. 配置SSH互信

    3. 完成数据库的安装以及主从搭建

    4. 主库创建MHA 需要的管理用户

    5. 安装MHA的依赖安装MHA软件包

    6. 创建MHA配置文件夹,日志补偿文件夹

    7. 如果时二进制安装的MySQL需要对 mysql和binlog 两个命令创建软连接

    8. 配置VIP漂移脚本,邮件报警脚本

    9. 在主库的网卡上创建VIP

    10. 在日志补偿文件下启动MySQL binlog远程从主库拉取数据

    11. 配置MHA 配置文件

    12. 启动MHA 状态检查

    13. 启动MHA

    1.8.13 请介绍 MHA 重要的脚本及作用?

    1. master_ip_failover

      • 在主节点故障时,将虚拟IP(VIP)从旧主节点切换到新的主节点,确保客户端可以通过VIP无缝连接到新的主节点

    2. master_ip_online_change

      • 用于在线切换主节点的IP地址,支持在不停止数据库服务的情况下完成主节点的切换。

    3. check_relication_health.sh

      • 检查MySQL主从复制的健康状态,确保复制正常运行

    4. start_master_monitor.sh

      • 启动MHA的监控功能,用于持续监控主节点的健康状态

    5. mha_manager

      • 作为MHA的核心管理工具,负责启动、关闭和管理MHA集群

    6. mha_node

      • 部署在每个数据库节点上,用于与MHA Manager通信,在故障转移时保存二进制日志,协助完成故障切换

    7. mha_check_config

      • 用于检查MHA配置文件是否正确,验证配置文件中的参数是否符合要求,确保MHA能够正常运行

    8. apply_diff_relay_logs

      • 在故障转移过程中,将差异的中继日志(relay log)应用到其他从节点,确保所有从节点的数据与新的主节点保持一致

    9. save_binary_logs

      • 在主节点故障时,尝试从宕机的主节点上保存二进制日志,以防止数据丢失 最大程度地保证数据完整性

    1.8.14 请简述 MHA 高可用架构原理?

    1.8.15 MHA 如何选主?

    会扫描配置文件中的节点信息,然后将扫描后节点信息划分到4个数组中,并根据策略选择数组中的节点成为新主

    alive扫描节点是否存活
    latest扫描节点延迟情况
    pref扫描节点配置信息是否有(candidate_master=1) 人为定义接替主节点的从节点信息
    bad不参与选主(no_master=1/log_bin=0/数据差异量-100M)

    4个选主策略

    1. 最优策略 (根据节点编号选择 越小越优先)

      • 活着 数据量接近主节点 已经定义接替者身份 不会出现在bad数组中

    2. 次优策略 (根据节点编号选择 越小越优先)

      • 活着 数据量接近主节点 不会出现在bad数组中

    3. 再次优策略 (根据节点编号选择 越小越优先)

      • 活着 已经定义接替者身份 不会出现在bad数组中

    4. 无奈选择 (根据节点编号选择 越小越优先)

      • 活着 不会出现在bad数组中

    1.8.16 MHA 优缺点?

    MHA的优点

    1. 快速故障切换:能够在主库故障时,通常在10-30秒内自动完成主从切换,减少系统停机时间

    2. 数据一致性:在故障转移过程中,MHA会尽量保证数据的一致性,尤其是在使用半同步复制或GTID复制时

    3. 无需修改现有架构:不需要对现有的MySQL架构进行大规模修改,也不需要额外的存储引擎支持

    4. 易于部署:整体部署相对简单,适合中小型企业快速实现数据库高可用

    5. 无性能损耗:对数据库的性能几乎没有影响

    6. 灵活性高:支持多种故障转移策略和配置选项,可以根据实际需求调整

    MHA的缺点

    1. 配置复杂性:初始配置需要考虑多个参数,如复制延迟、网络延迟等,对技术人员的经验有一定要求

    2. 依赖复制延迟:如果从库的复制延迟较大,可能会导致数据丢失。

    3. 单点故障风险:MHA Manager本身可能成为单点故障,需要进行冗余设计

    4. 安全隐患:需要配置SSH免密登录,可能会带来一定的安全风险。

    5. 不支持读负载均衡:MHA主要关注主从切换,没有提供从库的读负载均衡功能,需要额外的解决方案

    6. 资源消耗:在高负载场景下,可能会消耗较多系统资源

    1.8.17 请介绍你在维护公司 MHA 架构时主要做了哪些工作或遇到的问题?

    数据库服务高可用修复--高可用故障检查

    1. 检查节点状态

    2. 检查主从关系

    3. 修复主从关系

    4. 检查虚拟地址

    5. 恢复日志同步

    6. 调整配置文件

    7. 核实互信情况

    8. 恢复启动MHA

    实现MHA高可用主节点在线切换(手工操作)

    可以在主库没有故障的情况下,利用手工方式将主库业务切换到其它的从库节点上,从而解放原有主库节点(维护性操作时应用)

    1. 关闭MHA服务程序

    2. 编写配置文件信息-手工切换也能实现vip漂移

      • 管理节点上传或者编写脚本/usr/local/bin/master_ip_online_change

      • 编写配置文件

    3. 实现主库切换

      • 管理节点执行

      4.验证

      1. 关注VIP地址是否切换

      2. 关注切换后是否进行了主从重构

      3. 关注配置文件信息是否删除

      4. 恢复mha(根据数据库维护时长决定)

    1.8.18 是否使用过分布式数据库架构?请说明你是如何设计的?

    1.8.19 简述 PXC(Percona XtraDB Cluster)高可用集群的工作原理

    1.8.20 简述 ProxySQL 读写分离操作步骤

    1.8.21 普通半同步与增强性半同步分别在哪个阶段返回 ACK?

    1.8.22 在配置读写分离架构中,下单了一件商品,查询订单时发现没有查寻到结果,说明主从同步还没有写入从库,怎么解决这种问题?

    1.8.23 构建多主 mysql 架构,多主同时写,用什么架构搭建?

    1.8.24 什么是双写(架构)?

    1.8.25 在跨版本搭建主从架构的时候,你遇到过哪些问题,如何解决?

    1.8.26 MHA 的探测机制?如何判断主库存活?如何判断MySQL库是否异常?

    MHA从0.53版本开始支持ping_type参数来设置如何检查master可用性:

    参考文章 :https://www.cnblogs.com/gaogao67/p/11359667.html

    1.8.27 克隆同步用过吗?克隆同步用来干什么的?

    1.8.28 克隆同步的原理?

    1.8.29主从同步中 如何实现同步过滤?

    1.8.30 同步过滤用过吗?有什么作用?

    1. 可以控制主从之间同步数据带宽

    2. 可以节省从库磁盘资源

    1.8.31 主从中断,数据如何恢复?

    1.8.32 延迟从库有什么好处?

    1.8.33 如果主库宕机后,HA发⽣切换,这个HA是怎么做的判断?这个没有的⼼跳的机制解决⽹络层⾯或主机层⾯的问题?

    1.8.34 什么是GTID,在架构中主库宕机,从库当新主的时候。毕竟主的GTID比从要高,那么从库如何确保GTID?

    1.8.35 主库宕机了,哪个从库更接近主库,怎么判断?

    1.8.36 新主和从库数据不一致,怎么解决?

    1.8.37 主从复制是用GTID实现的吗?原理是什么?GTID起到什么作用?

    1.8.38 GTID复制的优点?⽐如说表⾥⾯没有主键怎么处理的?

    1.8.39 GTID出来以后为什么推崇使⽤GTID⽅式做复制

    1.8.40 ProxySQL读写分离是怎么配置?

    1.8.41 半同步什么时候会退化成异步?

    1.8.42 MHA哪个配置参数是不做候选主节点?

    1.8.43 ProxySQL能做到一主几从有限制吗?从库能做到负载均衡吗?

    1.8.44 如何让使用人员只能连接主库防止连接错误?

    1.8.45 延迟从库是怎么实现?有什么好处?

    从库设置参数

    作用

    1.8.46 MHA 哪个参数手动指定默认选主

    1.8.47 如何利用延时从库恢复数据?

    1.8.48 半同步要关注哪些参数?

    主库参数

    从库参数

    1.8.49 MHA 是如何检查主从数据不一致的

    1.8.50 proxy sql原理

    1. 连接管理:ProxySQL作为中间层,接收客户端的数据库连接请求。它维护一个连接池,与后端数据库服务器建立连接,并根据配置进行连接池管理,包括连接的创建、复用和释放等操作

    2. 负载均衡:ProxySQL通过负载均衡算法将客户端请求分发到后端数据库服务器。它可以基于不同的策略(如轮询、最少连接数等)选择目标服务器,从而实现请求的均衡分配,提高整体的并发处理能力和性能

    3. 查询分析和重写:ProxySQL可以解析和分析客户端发送的SQL查询语句。通过查询规则和规范的配置,它可以对查询进行修改和重写,以优化查询性能或者实现特定的业务需求。例如,可以进行查询的缓存、路由转发等操作

    4. 高可用性和故障转移:ProxySQL可以监控后端数据库服务器的健康状态。当某个数据库节点出现故障或不可用时,它可以自动将请求重新路由到其他可用的节点,实现高可用性和故障转移。同时,它还支持自动检测并剔除故障节点,以避免将请求发送到不可用的服务器上。

    5. 查询缓存:ProxySQL提供了内置的查询缓存功能,可以缓存查询的结果

    6. 统计和监控:ProxySQL可以收集和记录关于连接、查询和服务器性能等方面的统计信息。ProxySQL还支持与监控系统集成,以实现实时监控和告警功能

    1.8.51 mha切换遇到过什么问题,manager在哪个节点,切换原理

    1. MHA手工在线切换后,vip也漂到新主库上,但在其它主机上用vip连接时,却还是连到本主机的从库

      • 解决方法:在所有从库上执行drop_vip.sh即可

    2. mha每次自动切换之后都会结束自身进程,并在日志目录如/app/mha/xxx/下生成成功或失败标记

      • (sys.failover.complete/error)

    3. 下一次要启动mha之前要把这些标记文件删除,否则mha无法正常启动,因为有了这些标记文件,mha认为已经切换结束mha手动切换要指定端口,否则只用ip会被mha认为没有存活

      • 三台物理机相同配置一口咬死防止主从延迟或者宕机后从库顶不住 例如32C核Cpu 128G内存 2T×4 Sata盘1500转 MHA Mannager可以安装一台性能一般的机器上也可以安装在任意从库, 因为安装MHA.Mannger的从库是不参与切换的,只能通过人为切换, 就说安装在一台别的机器上 由于架构方面和软件方面已经实现高可用了,所以在物理层面不用考虑数据冗余问题, 可以考虑性能最大化,比如使用raid0

       

    1.8.52 如何MHA 脑裂会产生什么影响?如何防止MHA脑裂?

    1.8.53 分库分表带来了哪些问题?

    1.8.54 半同步复制技术与传统主从复制技术不同之处?

    1.8.55 主从同步中哪些线程是多线程?

    1.8.56 SQL 相关参数有哪些,怎么修改SQL 线程数量?

    1.8.57 描述增强半同步复制和普通半同步复制的区别?

    1.8.58 MHA是怎么预防数据丢失的?

    1.8.59 MySQL 8.0 对死锁的优化?

    1.8.60 MySQL 如何实现读写分离?

    1. 代码封装

      • 就是代码层抽出一个中间层,由中间层来实现读写分离和数据库连接;

        利用个代理类,对外暴露正常的读写端口,里面封装了逻辑,将读操作指向从库的数据源,写操作指向主库的数据源

      • 优点:简单(减少架构服务部署工作量),并且可以根据业务定制化变化,随心所欲

      • 缺点:如果数据库宕机了,发生主从切换之后,就要修改配置重启;如果系统是多语言的话,需要为每个语言都实现一个中间层代码,重复开发

    2. 使用中间件

      • 中间件一般而言是独立部署的系统、客户端与这个中间件的交互是通过SQL协议;

        所以在客户端看来连接的就是一个数据库,通过SQL协议交互也可以屏蔽多语言的差异;

        缺点就是整体架构多了一个系统需要维护,并且可能成为性能瓶颈,毕竟交互都需要经过它中转;

        常见的开源数据库中间件有:mysql-router、ProxySQL、Atlas、ShardingSphere、MyCAT等;

    1.8.61 什么是读写分离

    1. 读写分离就是读操作和写操作从以前的一台服务器上剥离开来,将主库压力分担一些到从库

      主库的压力过大,单机数据库无法支撑并发读写,一般而言读的次数远高于写,因此将读操作分发到从库上,这就是常见的读写分离

    2. 读写分离还有个操作就是主库不建查询的索引,从库建查询的索引,因为索引是需要维护的

      比如:插入一条数据,不仅要在聚簇索引上面插入,对应的二级索引也要插入,修改也是一样的

      所以将读操作分到从库之后,可以在主库把查询要用的索引删除了,减少写操作对主库的影响

    1.8.62 mysql一个表上亿条的数据怎么保证同步过去,如何解决延时?

    1.8.63 使用延时同步恢复数据,比如延时5分钟,怎么保证你停止slave后,新的数据不会丢失

    1.8.64 MySqL 并行复制都有哪些 具体说说?

    MySQL 5.6 基于库级别的并行复制

    假设主库有多个数据库(如 db1和db2),在从库上,db1的事务和db2的事务可以同时执行。

    即将不同数据库上的事务分配到不同的 SQL线程中执行。

    说明:如果主库大部分事务集中在一个数据库上,这个就没啥用了。

    MySQL5.7 基于组提交(GroupCommit)事务的并行复制

    进一步细化了并行的颗粒度,从库级别细化到组提交级别。

    即MySQL会将组提交的事务视为彼此独立的事务,可以在从库并行重放。

    如果主库开启了组提交,且事务之间没有冲突。那么这些事务都可以由多线程并行执行。

    binlog中如果两个事务的1ast_comitted相同,说明这两个事务是在同一个 Group 内提交的。

    但是粒度还是不够,如果大部分事务都集中在一张表上?

    那么只有相同 1ast_committed 可以并发,即使有些数据的更改和当前事务是不冲突的,也无法并发。

     

    MySQL 5.7 基于逻辑时钟(LOGICAL CLOCK)的并行复制

    LOGICAL_CLOCK 是基于 Group commit 的并行复制,引入了时间标记的概念。

    基于所有在主库同时处于prepre阶段且未提交的事务不会存在锁冲突的情况(就是这些事务在从库执行时都可以并行执行);

    将这些事务都打上一个时间标记(实际实现用的是上个提交事务的 seguence number,即上面提到的binlog中的last_committed)。

    这样从库在识别到这些事务时,可以并行,进一步的提高并发度。

    提升主库的组提交事务数可以让从库复制的并行度更高,所以 MySQL 5.7 引入了两个参数:

     

    MySQL8.0 基于 WriteSet 的并行复制

    由于MySQL5.7中,为了提升从库的事务回放速度,需要在主库提高事务的并行度。

    主库上的事务越多线程并行提交,备库就能在更大程度上实现并行回放。

    然而,这种方式依赖于主库的并行提交情况,当主库事务是串行提交时,备库的回放效率会显著下降。

    所以MySQL8.0中, 引入了基于Writeset的并行复制,即使主库上的事务是串行提交的,只要事务之间没有冲突,备库也可以并行回放这些事务,

    提升复制效率。

    writeset是事务更新行的集合,通过哈希算法对主键或唯一索引生成标识,记录在二进制日志中

    即通过 witeset判定事务之间的冲突,如果两个事务的 Writeset没有冲突,则它们可以并行回放

    1.8.66 MySQL 8.0 死锁检测视图有哪些?

    INNODB_TRX

    INNODB_LOCK_WAITS

    INNODB_LOCKSMySQL 8.0 中已弃用

     

     

     

     


    监控

    1.9.1 MySQL zabbix 你都监控哪些指标?

    1. 物理层:cpu,内存,磁盘

    2. 传输层:端口,进程,api接口应用层:URL

    3. Mysql业务层:select,insert,update,delete执行频率和数量,吞吐量:接受和发送的字节数

    4. sql慢查询

    5. 主从复制双YES

    1.9.2 现在有⼀个MySQL有很多慢查询,现在要通过监控,主要观察哪些指标?

    1.9.3 shell 脚本都监控那些指标?

    1.9.4 日常工作需要监控 MySQL 哪些指标?

    1.9.5 数据库集群监控信息?

    1. 基础资源层

      • CPU使用率(user/system/iowait)

      • 内存利用率(包括swap使用)

      • 磁盘IOPS/吞吐量/延迟

      • 存储空间(数据目录/二进制日志/临时表空间)

    2. 连接管理

      • 当前连接数/最大连接数占比

      • 活跃连接数眠连接教

      • 连接失败率(Aborted connects)

      • 线程缓存命中率(Threads created/Connections)

    3. 查询性能

      • 慢查询数量(Slow_queries)

      • 查询吞吐量(QPS/TPS)

      • 临时表创建率(Created tmp tables)

      • 排序合并率(Sort merge_passes)

      • 全表扫描率(Select scan)

    4. 复制拓扑(主从架构)

      • 复制延迟(Seconds Behind Master)

      • IO线程/SQL线程运行状态

      • 中继日志空间使用

      • 主从数据一致性校验结果

    5. InnoDB引擎

      • 缓冲池命中率/利用率/脏页比例

      • 行锁等待/死锁数量(Innodb row lock waits)

      • 日志写入量(lnnodb os log_written)

      • 检育点年龄(Checkpoint age)

      • Undo表空间使用趋势

    6. 高可用指标

      • 集群节点健康状态

      • 故障切换次数

      • .VIP漂移状态

      • MHA/Proxy中间件状态

      • 连接池>80%、复制延迟>30s、缓冲池命中率<95%、磁盘空间<20%

    1.9.6 你平常如何监控锁状态的?

    1.9.7 数据库主从监控有哪些方式?


    数据库设计

    1.10.1 数据库范式有哪些?

    基础范式

    1. 第一范式(1NF)

      • 核心要求:字段值不可再分,每个属性都是原子数据

      • 例子:避免存储复合数据(如“地址”拆分为省、市、区)

      • 意义:确保数据存储的最小单位,为后续范式奠定基础

    2. 第二范式(2NF)

      • 核心要求:在满足1NF的基础上,所有非主属性完全依赖主键(消除部分依赖)

      • 例子:订单表中商品名称仅依赖商品ID(联合主键的一部分),需拆分为订单表和商品表

      • 意义:解决数据冗余(如重复存储商品名称)和更新异常

    3. 第三范式(3NF)

      • 核心要求:在满足2NF的基础上,非主属性之间无传递依赖

      • 例子:学生表中“学院电话”依赖“学院”,需拆分为学生表和学院表

      • 意义:消除间接依赖,避免冗余和更新异常

    高级范式

    1. 巴斯-科德范式(BCNF)

      • 核心要求:所有主属性必须直接依赖候选键,消除主属性之间的传递依赖

      • 例子:若“课程→教师”且“教师→学院”,需拆分为课程-教师表和教师-学院表

      • 意义:比3NF更严格,解决主键属性间的依赖问题

    2. 第四范式(4NF)

      • 核心要求:消除多值依赖(同一主键下存在多个独立属性组)

      • 例子:若员工有多个技能和语言,需拆分为技能表和语言表

      • 意义:解决多值数据冗余。

    3. 第五范式(5NF,完美范式)

      • 核心要求:消除连接依赖(数据关系需通过多个表联合表示)

      • 例子:供应商-产品-客户关系需拆分为三个两两关联的表

      • 意义:确保数据关系的无损失分解

    1.10.2 数据库的三大范式是什么?

    第一范式(1NF):原子性

    第二范式(2NF):完全依赖

    第三范式(3NF):消除传递依赖

    1.10.3 为什么要分库分表

    1. 是提高性能:随着数据量的增加,单个数据库或表的读写、查询性能会显著下降。分库分表可以将负载分散到多个数据库或表中,减少单点压力,提高查询响应速度和事务处理能力。

    2. 避免硬件限制:数据库的大小和性能往往受到所在服务器硬件的限制。分库分表使得数据库能够跨多个服务器扩展,突破单机硬件资源的限制。

    3. 增强可用性和容错性:将数据分布在多个数据库或表中,可以降低单点故障的风险。即使某个数据库或表发生故障,也不会影响到整个系统的可用性。

    4. 提高管理效率:对于极大的数据集,进行分库分表后,可以更方便地进行数据维护、备份和恢复等操作,因为操作可以在更小的数据集上进行,减少了处理时间和复杂度。

    5. 支持数据的地理分布:根据用户地理位置将数据分布在不同的数据库中,可以减少数据传输延迟,提高用户体验,数据本地性的逻辑

       

    1.10.4 什么是分库分表?分库分表有哪些类型(或策略)?

    分库分表常见的策略有垂直分库/分表和水平分库/分表:

    垂直拆分水平拆分,细分策略:

    1. 垂直拆分

    1. 水平拆分

    主要针对单表数据量巨大或高并发场景,将表中的数据记录拆分到多个子表中,常见方式包括:

    在水平分表中,常用的具体拆分策略有:

    1.10.5 大厂数据库架构

    image-20250316142736417

     

    1.10.6 对数据库进行分库分表可能会引发哪些问题?


     

    优化

    1.11.1 CPU load 和 CPU使用率有了解吗?

    1.11.2 集群的稳定性的优化都有哪些方法?

    1.11.3 MySQL 的碎片是怎么优化的?

    1.11.4 你观察到⼀个表/库性能下降,现在的引擎已经是innoDB引擎了如何做优化?(你们当时是在什么规格的数据库上,有多少条数据,然后导致性能下降)

    1.11.5 在mysql出现性能问题的时候,你是怎么处理的?性能优化案例

    1.11.6 MySQL的CPU使⽤率100%,你会怎么处理?

    1. 使用 top -h 定位到线程的PID号

    2. mysql中查询 performance_schema.threads 中的 thread_os_id

    1.11.7 某⼀个库导致性能慢,你怎么处理?

    1.11.8 SQL语句的优化你是怎么优化的?有遇到没有⾛索引的情况?

    1.11.9 对于大表你们以前是怎么做优化?

    1.11.10 单表多大合适?

    1.11.11 怎么测试mysql的性能?

    1.11.12 怎么提升mysql的性能?

    1. 优化数据库与索引的设计

    2. 优化SQL语句

    3. 加缓存【Memcached, Redis】

    4. 主从复制,读写分离

    5. 垂直拆分,其实就是根据你模块的耦合度,将一个包含多个字段的表分成多个小的表,将一个大的系统分为多个小的系统,也就是分布式系统

    6. 水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表

    7. 数据库与索引设计

      • 表字段避免null值出现,null值很难进行查询优化且占用额外的索引空间,推荐默认数字0代替null

      • 尽量使用INT而非BIGINT,如果非负则加上UNSIGNED(这样数值容量会扩大一倍),当然能使用TINYINT、SMALLINT、MEDIUM_INT更好

      • 使用枚举或整数代替字符串类型

      • 尽量使用TIMESTAMP而非DATETIME

      • 单表不要有太多字段,建议在20以内

      • 用整型来存IP。【可去搜索IP地址转为整型】

    8. 索引设计

      需要创建索引:

      • 频繁作为where查询的字段 (select,update,delete 的where 条件)

      • DISTINCT 字段需要创建索引

      • 经常使用GROUP BY 和 ORDER BY 的列

      注意事项:

      • 字段的数值具有唯一性限制 (业务上具有唯一特性的字段,即使是组合字段,也必须组成唯一索引)

      • 对列的类型小的创建索引 (数据类型越小查询速度越快)

      • 列值长度较长的索引列,建议使用前缀索引 (截取字符串前面的一部分建立索引(前缀索引),全文索引会占用空间和查询时间)

      • 使用散列度高的列作为索引 (但不一定 例如性别,在男性多的中查找女性,如果对女性做索引就能增加查询速度)

      • 使用最频繁的列放到联合索引的左侧

      • 多表连接时创建索引

      • 连接表的时尽量不要超过三张

      • 对于连接的字段创建索引 (JOIN ON )

      • 最好使用唯一值多的列作为索引,如果索引列重复值较多,可以考虑使用联合

      • 索引维护要避开业务繁忙期

    9. SQL优化

      • 使用limit对查询结果的记录进行限定

      • 避免使用select *,将需要查找的字段列出来

      • 使用连接(join)来代替子查询

      • 拆分大的delete或insert语句

      • 不做列运算:SELECT id WHERE age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数、计算表达式等等,查询时要尽可能将操作移至等号右边

      • sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库

      • OR改写成IN:OR的效率是O(n)级别,IN的效率是O(logn)级别,in的个数建议控制在200以内

      • 不用函数和触发器,在应用程序实现

      • 避免%xxx式查询

      • 少用JOIN

      • 使用同类型进行比较,比如用'123'和'123'比,123和123比

      • 尽量避免在WHERE子句中使用 != 或 <> 操作符,否则导致引擎放弃使用索引而进行全表扫描

      • 对于连续数值,使用between不用in:select id from t where num between 1 and 5

      • 列表数据不要拿全表,要使用LIMIT来分页,每页数量也不要太大

      • 分页,使用延时关联,和基于游标法

      • 强制走 join 连接算法

    10. 分区、分库、分表

      • 把一张表的数据分成n个区块,在逻辑上看最终只是一张表,但底层是由n个物理区块组成的,通过将不同数据按一定规则放到不同的区块中提升表的查询效率

      • 水平分表:为了解决单表数据量过大(数据量达到千万级别)问题。所以将固定的id hash之后mod,取若0~n个值,然后将数据划分到不同表中,需要在写入与查询的时候进行id的路由与统计

      • 垂直分表:为了解决表的宽度问题,同时还能分别优化每张单表的处理能力。所以将表结构根据数据的活跃度拆分成多个表,把不常用的字段单独放到一个表、把大字段单独放到一个表、把经常使用的字段放到一个表

      • 分库: 面对高并发的读写访问,当数据库无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义了。因此需对数据库进行拆分,从而提高数据库写入能力,这就是分库

    1.11.13 MySQL中SQL语句执行慢的排查过程?以及对应怎么进行处理?

    MySQL数据库在进行SQL处理过程中,主要有以下方面会造成语句处理过程慢:

    1. 数据库服务索引功能没有合理应用

      • 通常数据库服务索引没有合理应用,是数据库服务层优化器没有正确选择索引方案导致;

      • 可以利用explain查看执行计划信息,获取SQL语句的索引使用情况,从而对没有使用索引的SQL语句进行优化;

    2. 数据库服务并发连接数量设置过小

      • 数据库连接管理模块是负责管理客户端和MySQL之间的长连接;

      • 假设两者之间只有一条长连接,那么在执行SQL查询过程中,会阻塞新的查询请求;当前面查询请求结果返回后,才能继续处理新的查询请求;

      • 当出现大量并发查询请求时,那么后面的请求都需要等待前面的请求执行完成后,才能开始执行,因此导致出现SQL语句执行慢的情况

    3. 数据库服务缓存数据资源空间过小

      • 在数据库应用InnoDB存储引擎时,在内存结构部分会有一个buffer Pool区域,用于缓存磁盘加载的数据信息,从而加速查询效率

      • 当buffer pool空间越大时,存储的数据页信息会越多,因此在SQL语句查询时,越有可能命中缓存中的数据页信息,提高查询数据效率

      • 反之,当buffer pool空间设置过小时,存储的数据页信息会更少,因此在SQL语句查询时,需要从磁盘中调取数据,加载到内存中,查询效率就降低

     

    问题分析

     

    当掌握了SQL语句处理流程后,可以利用MySQL慢查询日志,获取慢查询SQL语句信息:

    在mySQL配置文件中添加或修改如下内容,开启慢查看日志功能:

    日志文件会记录哪些SQL语句是慢查询,还会记录执行的开始时间,查询时间,锁定时间,查询行数等信息:

    会使用mysqldumpslow命令工具来整理和分析慢查询日志:

     

    在慢查询日志中发现SQL语句慢的情况,主要可以利用下面方法进行相关调整和优化:

    1)数据库服务并发连接数量设置过小

    由于客户端与服务端之间的并发连接数量过小,导致大量SQL语句请求从客户端发送到服务端处理过程是串行化的,影响了后续语句处理效率;

    可以适当调整客户端和服务端之间的并发连接数;

    说明:如果出现高并发访问情况,单个数据库能够进行并发处理的能力也会到达上限(1000~5000),次数需要从架构和业务层面进行优化调整

    2)数据库服务索引功能没有合理应用

    通常对于MySQL进行SQL语句处理时,没有合理应用索引情况可以大体分为两个方面:

    通常SQL语句书写问题,包括:没有定义条件,条件没有对应索引,条件采用匹配查询,条件信息没有符合最左原则;

    通常索引信息应用异常,包括:索引创建不合理,索引应用失效,索引相关优化未配置;

    3)数据库服务缓存数据资源空间过小

    由于数据库buffer pool空间过小,会造成数据库查询过程,会经常消耗磁盘IO资源,影响数据查询效率,所以可以调整缓存大小;

    提高buffer pool空间大小,可以增加查询数据的命中率,从而提高SQL语句的查询效率,也减少磁盘的IO资源消耗;

    对于buffer pool的大小调整多少合适,以至于不会太小,影响查询效率,可以查看缓存命中率:

    利用以上状态表的信息,可以通过以下公式信息,获取buffer pool缓存命令率数值:

    (1)bufferpool=1Innodb_buffer_pool_reads÷Innodb_buffer_pool_read_requests100%

    通常buffer pool的命中率都在99%以上,如果计算得到缓存命中率低于这个数值,就需要考虑加大InnoDB buffer Pool的大小

    1.11.14 MySQL会做哪些性能优化设置?

    1. 数据库服务硬件层面优化

      • 硬件配置建议

        1. 品牌: DELL HP IBM 华为 浪潮

        2. CPU :Inter-I系列 E 系列(Xeno) 核心数多

        3. 内存:ECC 功能特性内存,提高计算机运行的稳定性和增加可靠性

        4. IO类型:SAS pci-e SSD Nvme flash

        5. Raid选型:Raid 10

        6. 网卡选型:单卡单口网卡(使用寿命较长)

        7. 云存储选型:ECS RDS PolarDB TDSQL

      • 硬件参数调配

        1. 关闭 Numa (早期SMP)

          • 在 BIOS中进行调整

          • OS GRUB 级别关闭 cat/proc/cmdline

        2. 开启CPU 高性能模式

          • minimal power---> Maximum Performance

        3. 关闭 THP (Transparent Huge Pages 透明大页内存)

          1. getconf PAGE_SIZE

        4. 网卡绑定操作 binding 技术

    2. 操作服务系统层面优化

      1. 更改文件句柄和进程数

        1. vim /etc/sysctl.conf

          • vm.swappiness = 5 使用swap 积极性 值越高使用率越高

          • vm.dirty_ratio = 20

          • vim/dirty_backgroud_ratio = 10

        2. vim /etc/security/limits.conf

          • hard nofile 63000 可打开的文件描述符的最大数,超过会报错

          • soft nofile 63000 可打开的文件描述符

          • lsof -p pid 可以查看打开文件数量

          • ulimit -a 查看 open file

        3. 防火墙和 selinux 安全设置

          • 关闭selinux 和防火墙

        4. 文件系统设置

          • 推荐使用 XFS 系统

          • 不建议使用LVM

          • 设置数据库为独立分区,使用 /data 将磁盘阵列单独挂载到 /data

        5. IO 调度优化

          • echo deadline > /sys/block/sda/queue/scheduler

           

    3. 数据库服务参数配置优化

      1. 连接层优化

      2. 服务层优化

      3. 数据库引擎层优化

    4. 数据库服务索引信息优化

      • 非唯一索引按照 'i_字段名称_字段名称[_字段名]' 进行命名

      • 是唯一索引按照 'u_字段名称_字段名称[_字段名]' 进行命名

      • 索引名称使用小写

      • 联合索引中的字段数不超过5个

      • 唯一键由3个以下字段组成,并且字段都是整型时,使用唯一键作为组合主键

      • 没有唯一键或者唯一键不符合上面的条件时,使用自增id作为主键

      • 唯一键不能和主键重复

      • 索引选择度高的列作为联合索引最左条件

      • ORDER BY、GROUP BY、DISTINCY的字段需要添加在索引的后面,构建联合索引

      • 单张表的索引数量控制在5个以内,若单张表多个字段在查询需求上都要单独用到索引,需要经过DBA评估;

        查询性能问题无法解决的,应从产品设计上进行重构

      • 使用EXPLAN判断SQL语句是否合理使用索引,尽量避免extra列出现:Using File Sort,Using Temorary;

      • UPDATE DELETE 语句需要根据where条件添加索引;

      • 对长度大于50的VARCHAR字段建立索引时,按需求恰当的使用前缀索引,或使用其他方法;

      • 下面的表增加一列url_crc32,然后对url_crc32建立索引,减少索引字段的长度,提高效率;

        合理创建联合索引(避免冗余),(a,b,c)相当于(a),(a,b),(a,b,c)

        合理利用覆盖索引,减少回表次数;

        减少冗余索引和使用率较低的索引:

    5. 数据库服务安全方面优化数据库升级与迁移

      • 使用普通nologin用户管理MySQL服务进程;

      • 合理授权用户、设置密码复杂度及最小权限,系统表保证只有管理员用户可以访问;

      • 删除数据库服务中的默认匿名用户信息;

      • 锁定数据库服务中的非活动用户信息;

      • 数据库服务尽量不要暴露到互联网中,需要在互联网中暴露数据库服务地址信息时,要明确设置好白名单信息;

        替换数据库默认端口,使用SSL远程连接数据库;

      • 对业务程序代码做好扫描检测优化,防止出现SQL注入漏洞情况;

    1.11.15 为什么创建视图可以提升性能?

    1.11.16 MySQL8.0 中默认连接数是多少?除了调整连接数 如何优化连接数?

    1.11.17 请介绍你使用过的PT工具

    1.11.18 MySQL数据库负载高如何处理?

    当 MySQL 数据库负载高时,可能会导致性能下降、查询响应慢,甚至会出现服务中断。

    对于服务器操作系统出现负载升高,大致有以下10种情况造成:

    序号情况原因分析
    01无限循环情况程序错误导致循环无法停止,从而消耗过多的处理器时间
    02后台进程情况自动任务或更新占用大量资源,大量进程会累积占用CPU资源
    03高并发情况服务器或应用无法应对大量请求,特别是在未适当扩展或优化的情况
    04资源密集型应用情况涉及视频编辑、游戏或科学模拟的应用程序,需要大量的计算能力
    05内存资源不足情况当系统内存不足时,会将磁盘存储作为虚拟内存使用
    06并发进程情况多个进程竞争CPU资源,尤其是当其中许多进程都是资源密集型进程
    07繁忙等待情况进程在不释放CPU的情况下反复检查条件是否满足
    08复杂正则和表达式匹配涉及大量回溯的正则表达式,计算成本高的查询占用大量CPU
    09恶意软件情况劫持系统资源来执行未经授权任务的恶意软件,如:病毒、蠕虫或木马等
    10IO密集型应用情况出现大量IO资源消耗请求,由于硬件磁盘性能瓶颈,无法短时间处理大量IO资源

     

    在MySQL数据库出现负载高时,需要先进行监控和诊断:

    可以使用监控工具(MySQL Enterprise Monitor、Prometheus、Grafana 或 Percona Monitoring and Management)监控MySQL服务;

    主要监控MySQL的性能指标:CPU使用率、内存占用、磁盘I/O和查询响应的时间等。

    可以借助并分析慢查询日志,识别哪些查询耗时较长;并通过 show processlist 查看当前正在执行的查询,找到高负载原因;

    在数据库服务中,也可以对有些状态指标进行查看或监控:

     

    在MySQL数据库出现负载高时,后续进行负载高的处理手段:

    优化查询

    数据库配置调优

    调整数据库参数:评估并可能修改 MySQL 的配置参数(通常在 my.cnf 文件中),例如:

    数据库架构优化

    使用缓存

    硬件优化

    定期维护

    1.11.19 numa 是什么? 为什么要关闭?

    1.11.20 THP 是什么? 为什么要关闭

    https://juejin.cn/post/7382221104503685155

    https://cloud.tencent.com/developer/article/1668633

    1.11.21 一张很大的表,现在要对这个表结构进行更改,你要怎么做 PT

    1.11.22 一条语句执行有问题了,怎么看出来的?


    数据库升级与迁移

     

    1.12.1 你们的升级是怎么升级的?遇到过哪些故障?

    1.12.2 你做过异构数据库之间的数据迁移吗?(我操作的Redis-mysql)迁移过程中字符集有影响吗?

    1.12.3 如何实现数据库的不停服迁移?

    【回答重点】

    细节,在面试中可以向面试官复述以下几点:

    双写方案:

    大部分数据库迁移都会采用双写方案,例如:自建的数据库要迁移到云上的数据库这个场景,双写就是同时写入自建的数据库和云上的数据库;

    以下是具体迁移流程:

    1)将云上数据库(新库)作为自建数据库(旧库)的从库,进行数据同步(或者可以利用云上的功能,比如阿里云的DTS);

    2)改造业务代码,数据写入修改不仅要写入旧库,同时也要写入新库,这就是所谓的双写;

    3)在业务低峰期,确保数据同步完全一致的时候(即主从不延迟,这个都是有对应的监控的),关闭同步,同时打开双写开关;

    此时业务代码读取的还是旧数据库;

    4)进行数据核对,数据量很大的场景只能抽样调查(可以利用定时任务代码进行抽样核对,一旦不一致就告警和记录)

    5)如果确认数据一致,此时可以进行灰度切流,比如 1%的用户切到读新的数据库(比如:今天访问前1%的用户或者根据用户ID或其他业务字段)

    如果发现没问题,则可以逐步增加开放的比例,比如:5%~20%~50%~100%

    6)继续保留双写,跑个几天(或者更久),确保新库确实没问题,此时关闭双写,只写新库,这时候迁移完成

     

    flink-cdc方案:

    除了主从同步,代码双写的方案,也可以采用第三方工具。例如:flink-cdc等工具来进行数据的同步;

    可以更方便的实现数据迁移,并且支持异构数据(比如: mysql数据同步到pg,oracle等等)的数据源;

     

    1.12.4 MySQL 如何进行数据迁移?

    5.6升级5.7

    1. 本地升级 (Inplace) 必须进行业务中断 需要提前告知用户中断时间

    2. 创建MySQL 5.6 版本实例 (安装部署)

    3. 创建测试数据

    4. 下载部署5.7数据库程序

    5. 提前部署新版本5.7 数据库多实例

    6. 进行原有5.6 数据库数据备份(mysqldump xbp 克隆本地)mysqldump 和 xbp 恢复速度太慢了 建议选择 克隆备份

    7. 重新编写配置文件,实现数据库升级(挂库升级 让)basedir5.6 和basedir5.7 数据目录上进行关联

    8. 进入mysql.5.7 的配置文件 修改 datadir 修改启动端口为56实例的端口

    9. 以安全模式启动数据库服务(5.7)mysqld --default-files=/data/3357/my.cnf --skip-grant-tables --skip-networking 避免无法正常启动

    10. 启动成功时会出现报错(表结构错误)但是不用管,可以正常进入数据库

    11. /usr/local/mysq57/bin/mysql_upgrade -S /tmp/mysql3357.sock /tmp/mysql3357.sock --force

    12. 重新启动mysql5.7

    13. 进行升级后数据库备份 (mysqldump)

    异地升级(Merging)不停止业务进行数据库升级

    1. 需要在新的数据库节点安装mysql5.6 程序 (实现主从同步)( 5.6 直接和5.7 简历主从会出现数据无法正常加载)

    2. 在从节点安装部署新版本5.7 数据库服务

    3. 在从节点上实现 5.6 到5.7 的挂库升级

    4. 重新启动5.7 数据库程序,和主库进行数据同步(此时再同步就是业务库信息)

    5. 利用MHA高可用服务,实现手工切换主节点

    6. 可以再将其他节点依次进行升级

    5.7升级8.0

    注意事项

    5.7.30 -- 8.0.36

    利用工具进行检测,检测成功,可以顺利升级 https://downloads.mysql.com/archives/shell/ tar xf mysql-shell-8.0.32-linux-glibc2.12-x86-64bit.tar.gz ln -s mysql-shell-8.0.32-linux-glibc2.12-x86-64bit mysqlsh

    mysqlsh root:123456@10.0.0.51:3357 -e "util.checkForServerUpgrade()" util.checkForServerUpgrade Errors: 0 -- 检测结束,确认是否有错误信息,有错误信息无法进行版本间直接升级

    mysqlcheck -uroot -p123456 -h10.0.0.51 -P3357 --all-databases --check-upgrade

    1.12.6 数据库中有张表,怎么移出这张表?

     

     


    故障排错

    1.13.1 你最近遇到哪些案例 说一下 你工作中印象最深的一个故障案例 ?

    1.13.2 你有没有遇到过MySQL本身有问题?比如写法有问题,你遇到过吗?

    1.13.3 在工作中,你是如何发现bug的,什么样算bug,你们是怎么处理的?

    1.13.4 在日常维护高可用架构的时候,你发现过哪些问题?

    1.13.5 工作中遇到哪些主从延时问题,你是怎么解决的?

    1.13.6 主从架构你遇到过什么问题?

    1.13.7 主从同步中 slave_IO 出现错的代码你都见过哪些,都是什么问题,你是怎么处理的?

    1.13.8 mysql的逻辑和物理备份 哪个流程你更清楚?请具体说一个备份方式的流程?

    1.13.9 客户说11.30 分的时候我删除了一张表,你怎么给他恢复?

    1.13.10 遇到的问题,以及解决方法?

    1.13.11 你遇到过mysql进程突然没了或突然重启了?如何排查

    1.13.12 oom了解吗?(内存溢出)

    1.13.13 使用pt工具遇到过哪些故障?

    故障

    原因

    1.13.14 数据库内存飙高如何处理?

    1. innodb_buffer_pool_size 参数设置过高导致

    2. show processlist;看正在执行的sql state列是否有sending data等消耗资源sql、或者time执行时间比较久的sql,可以先kill避免mysql oom

    3. total_memory=key_buffer_size+query_cache_size+tmp_table_size+innodb_buffer_pool_size+innodb_additional_mem_pool_size+innodb_log_buffer_size+当前连接数

    4. 多表 join、临时表、慢sql、sql返回结果集比较大等

    5. 锁 业务反馈报错,经排查有innodb 的next-key lock; 原因:该业务表没有主键,所以innodb的record lock 升级为了next-key lock,导致锁住了整个区间,导致业务报错

    1.13.15 有没有遇到内核上的问题无法解决的?

    1.13.16 mysql 引起cpu很高的原因?

    90%都是sql语句造成的锁等待超时时间 wait_timeout 时间调短一点比如 20

    1. 确定高负载的类型 htop,iostat命令看负载高是CPU还是IO 看具体是哪个用户哪个进程占用了相关系统资源,当前CPU、内存谁在使用

    2. 监控具体的sql语句,是insert update 还是 delete导致高负载,抓取mysql包分析,一般抓3306端口的数据 看出最繁忙的sql语句了,select子查询尤为常见

    3. 检查mysql日志 分析mysql慢日志,查看哪些sql语句最耗时 检查mysql配置参数是否有问题,引起大量的IO或者高CPU操作innodb_flush_log_at_trx_commit 、innodb_buffer_pool_size 、key_buffer_size 等重要参数

    4. 检查硬件问题

      1. *redo log写满了*:redo log 里的容量是有限的,如果数据库一直很忙,更新又很频繁,这个时候 redo log 很快就会被写满了,这个时候就没办法等到空闲的时候再把数据同步到磁盘的,只能暂停其他操作,全身心来把数据同步到磁盘中去的,而这个时候,就会导致我们平时正常的SQL语句突然执行的很慢,所以说,数据库在在同步数据到磁盘的时候,就有可能导致我们的SQL语句执行的很慢了

      2. *内存不够用了:*如果一次查询较多的数据,恰好碰到所查数据页不在内存中时,需要申请内存,而此时恰好内存不足的时候就需要淘汰一部分内存数据页,如果是干净页,就直接释放,如果恰好是脏页就需要刷脏页

    1.13.17 从库出现 slave 延时你是如何处理的?(魏)

    slave延迟带来的风险

    1. 异常情况下,主从HA无法切换。HA 软件需要检查数据的一致性,延迟时,主备不一致

    2. 备库复制hang会导致备份失败(flush tables with read lock会900s超时)

    3. 以 slave 为基准进行的备份,数据不是最新的,而是延迟

    如何规避 slave 延迟的问题?

    特征如下

    解决方法:

    MySQL的改进

    为了解决复制延迟的问题,MySQL也在不遗余力的解决主从复制的性能瓶颈,研发高效的复制算法

    基于组提交的并行复制

    MySQL的复制机制大致原理是:slave 通过io_thread 将主库的binlog拉到从库并写入relay log,由SQL THREAD 读出来relay log并进行重放。当主库写入并发写入压力很大,也即N:1的情形,slave 就可能会出现延迟。MySQL 5.6 版本提供并行复制功能,slave复制相关的线程由io_thread,coordinator_thread,worker构成,其中:

    分配线程是以数据库名进行分发的,当一个实例中只有一个数据库的时候,不会对性能有提高,相反,由于增加额外的操作,性能还会有一点回退。 MySQL 5.7 版本提供基于组提交的并行复制,通过设置如下参数来启用并行复制。

    slave_parallel_workers>0

    global.slave_parallel_type=’LOGICAL_CLOCK’

    即主库在ordered_commit中的第二阶段,将同一批commit的 binlog打上一个相同的last_committed标签,同一last_committed的事务在备库是可以同时执行的,因此大大简化了并行复制的逻辑,并打破了相同DB不能并行执行的限制。备库在执行时,具有同一last_committed的事务在备库可以并行的执行,互不干扰,也不需要绑定信息,后一批last_committed的事务需要等待前一批相同last_committed的事务执行完后才可以执行。这样的实现方式大大提高了slave应用relaylog的速度。

    启用并行复制之后查看processlist,系统多了四个线程Waiting for an event from Coordinator(手机用户推荐横屏查看)

    核心参数:

    1.13.18 安装部署时遇到过什么故障?

    1.13.19 数据库版本升级时遇到过什么故障?

    1.13.20 数据库连接不上,可能原因是什么,如何排查?

    1.13.21 连接数设置不生效,最多为214,是什么原因?

    1.13.22 http 409错误,达到连接数上限。可能是什么原因导致?

    1.13.23 在做DDL操作时,数据库夯住了,原因是什么?

    1.13.24 一条SQL语句,昨天执行很快,突然变慢可能是什么原因?

    1.13.25 Ibdata1共享表空间文件损坏,导致数据库无法启动,备份也失效,有什么好的解决思路

    1.13.26 基于binlog+gtid方式截取的日志无法正常恢复,是什么原因导致?怎么解决?

    1.13.27 使用mysqldump方式构建主从,添加了-- set-gtid-purged =off导致主从构建失败?

    1.13.28 由于宕机,导致主从数据不一致,如何解决?

    1.13.29 Zabbix监控2000+台主机,监控显示缓慢,每隔三四个月重新搭建,存储空间经常被占满

    1.13.30 有规律的一段时间,会产生性能低谷

    1.13.31 过度条带化导致的性能问题

    1.13.32 MySQL 连接长时间(7200和1200秒)无法释放

    1.13.33 开启QC ,导致性能降低。 QPS ,TPS降低 是为什么?


    安全

    1.14.1 MySQL 安全方面你是如何优化的?


    Linux 与 Shell

    1.15.1 看内存⽤什么命令?看磁盘⽤什么命令?

    1.15.2 shell脚本都监控那些指标?

    1.15.3 grep命令

    1.15.4 awk命令

    1.15.5 sed命令


    NOSQL

    1.16.1 你们公司Redis的是什么架构?

    1.16.2 Redis的故障案例?

    1.16.3 Redis 集群(哨兵)的原理?如何搭建哨兵集群?

    1.16.4 Redis 怎么搭建主从?主从搭建的过程?怎么产生主从关系?

    1.16.5 Redis 集群执行slaveof以后,发生了什么?

    1.16.6 Redis你们⽤来⼲什么?⽤做过分布式锁?

    1.16.7 Redis你们平常都会监控什么指标?

    1.16.8 Redis的内存是怎么监控的?

    1.16.9 redis 用的什么版本 rdb和aof的优缺点?

    1.16.10 Redis持久化方式有哪些?有什么区别?

    1.16.11 redis存储原理?

    Redis通过将数据存储在内存中、采用高效的数据结构和键值管理机制,以及支持数据持久化和缓存过期等特性

    1.16.12 在Redis缓存服务中,常用的数据类型有哪些?

    序号数据类型解释说明
    01String字符数据类型
    02Hash字典数据类型
    03List列表数据类型
    04Set集合数据类型
    05Sorted Set有序集合类型

    1.16.13 MongoDB中oplog的作用是什么? 写满后会怎样?

    在MongoDB中,oplog(操作日志)是一个特殊的集合,用于记录MongoDB的所有写操作oplog的作用是支持复制和故障恢复。

    具体来说,oplog通过记录主节点(Primary)上的所有写操作,将这些写操作传播到备份节点(Secondary),从而实现数据的复制和同步。当主节点宕机或发生故障时,备份节点可以使用oplog中的操作记录进行故障恢复,快速将自己切换为新的主节点。

    oplog的写满会导致什么情况取决于副本集的配置和版本

    在MongoDB 4.0及以上版本中,oplog采用的是固定大小(默认为5%)的循环缓冲区。当oplog写满时,最旧的操作记录将被覆盖,这意味着较旧的操作记录将不再可用。这不会影响复制和故障恢复的正常操作,因为备份节点只需要保留与主节点保持同步的最新操作记录即可。

    但是,在一些特殊情况下,如长时间主节点不可用、备份节点长时间离线等,如果备份节点无法及时同步主节点的oplog,可能会导致备份节点的oplog落后于主节点,超过了可容忍的范围,这时候备份节点可能无法正常恢复并成为主节点,需要手动进行故障恢复。

    在MongoDB 4.2及以上版本中,引入了可配置大小的oplog(永久的oplog)来解决上述问题。这样,即使备份节点离线一段时间,它仍然能够保存足够长的操作记录,以便在重新连接时进行快速同步和故障恢复。

    1.16.14 redis 淘汰策略有哪些?

    image-20250316143341022

    1.16.15 请简述redis数据类型及应用场景?

    1.16.16 请简述redis事务和MySQL事务的区别?

    1.16.17 请简述redis主从原理

    1. 从库通过slaveof+ip+端口命令连接主库,并发送SYNC给主库

    2. 主库收到SYNC后立即触发bgsave功能,并生成保存rdb快照,发送给从库

    3. 从库收到会应用保存rdb快照

    4. 此时主库会陆续将中间产生的新的快照,保存并发送给从库

    5. 到此,我们主从复制就正常工作了

    6. 再次以后,主库只要发生新的操作,都会以命令的广播方式自动发送给从库

    7. 所有复制的相关信息,在info信息中都可以查到,即使重启任何节点主从依然存在

    8. 如果主从关系发生断开,重连之后,从库会发送PSYNC给主库后进行断点续传

    1.16.18 请简述redis sentinel(哨兵)高可用实现原理?

    1. 所有哨兵节点都会检测redis节点,哨兵之间也会互相监督

    2. 自动选主,切换采用raft分布式一致性协议进行选主(数据接近住,可以和大部分节点联系,少数服从多数)

    3. 重构主从关系

    4. 应用透明(自带地址和端口)

    5. 自动处理故障节点(剔出集群,修复后重新载入)

    1.16.19 请简述redis cluster分布式集群实现原理

    1.6.20 redis 集群用的什么协议??

    1.6.21 redis 的数据类型,业务用到了哪些,怎么做的?

    云数据库

    1.17.1 阿里云或者AWS的RDS使用过程中遇到的问题?

    1.17.2 你对阿⾥云的RDS有了解过或者使⽤过吗

    1.17.3 阿里云的DTS 你有使用和了解过吗?


    容器

    1.18.1Docker,部署MySQL,会遇到什么问题(在⽣产中)?

    1.18.2 实现docker持久化,通过什么实现?


    其他数据库

    1.19.1 Oracle加⼀个字段就很快,MySQL却很慢?(同样是千万⾏的表)

    1.19.2 分布式数据库ob架构?

    1.19.3 OB是怎么将数据分布式存储的?


    工作经验

    1.20.1 个人及家庭状况

    1.20.2 现处城市

    1.20.3 未来发展规划

    1.20.4 公司规模

    1.20.5 业务架构与规模

    1.20.6 你们的一套MySQL的qps是多少?(几百)

    1.20.7 你们一台物理机是部署一个MySQL还是多套?因为是多实例的,有遇到过实例之间的影响案例吗?

    1.20.8 数据规模?(单台实例数据量大小)

    1.20.9 MySQL使用的版本和规模?5.7.26 8.0.22?

    1.20.10 工作中运维的数据库集群是什么类型的?

    1.20.11 mysql 流量你怎么用监控软件监控的?

    1.20.12 用户部署了套新架构,你怎么给用户做监控,监控哪些指标?

    1.20.13 mysql数据库升级,你常用的是哪个数据库版本的升级?

    1.20.14 你们负责数据的ddl和dml的数据发布吗?

    1.20.15 DBA应该有哪些品质?如何当好DBA?

    1.20.16 你做的好的地方有哪些?

    1.20.17 你用过Oracle吗?

    1.20.18 DBA 工作职责是什么?

    1.20.19 DBA 工作内容

    数据库安装与配置

    数据库监控和优化

    监控数据软件:如 MySQL Enterprise Monitor、Percona Monitoring and Management 等

    数据备份与恢复

    安全管理

    故障排除与故障恢复

    数据库设计与建模

    文档与报告

     

    1.20.20 公司几个dba怎么分工

    1.20.21 mysql你遇到⽐较严重的问题,收到什么告警,怎么解决的?

    1.20.22 binglog 被运维删了,你怎么办?

    1.20.23 在不影响业务的情况下怎么进行delete操作,使用的是什么?

    1.20.24 你们公司mysql灾难恢复 机制是怎样的

    MySQL灾难恢复是指在数据库遭遇意外情况或故障后,采取一系列措施来恢复数据的过程。下面是MySQL灾难恢复的基本步骤:

    1. 确定灾难类型:首先要确定灾难的类型,例如硬件故障、软件故障、人为错误等。这有助于决定接下来的恢复策略。

    2. 停止数据库服务:在开始恢复之前,停止数据库服务以防止进一步的数据损坏

    3. 数据备份:如果有可用的数据备份,将备份数据还原到服务器上。这可以通过使用MySQL的备份工具(如mysqldump)或使用文件系统级别的备份来完成

    4. 日志文件恢复:如果无法使用备份数据或备份数据不完整,可以尝试使用MySQL的二进制日志文件进行恢复。这涉及到将二进制日志文件应用到最新的可用数据点

    5. 修复和恢复损坏的表:如果在灾难中有数据表损坏或丢失,可以尝试使用MySQL提供的工具(如myisamchk和innodb recovery)来修复和恢复这些表

    6. 数据库重建:在极端情况下,如果没有可用的备份数据和有效的日志文件,可能需要重建数据库。这涉及到重新创建数据库架构和重新导入数据

    7. 测试和验证:在完成灾难恢复后,对数据库进行测试和验证以确保数据的完整性和一致性

    8. 监控和预防:确保在灾难恢复后,对数据库进行定期备份,并实施适当的监控和预防措施,以最大程度地减少未来灾难的风险

    1.20.25 公司用的什么服务器,配置什么样

    DELL R730 40C 128G 10台、SAS(两组raid10各包含4块磁盘, 2块热备)+512G的SSD放日志

    网卡 4块网卡 bonding 做的主备模式真实面试题

    1.20.26 接手一个新的项目,怎么很快的开展工作?

    1. 了解项目背景

      • 阅读文档:审查项目的所有相关文档,包括需求文档、设计文档、技术文档和使用手册等

      • 了解技术:熟悉项目所使用的技术栈(编程语言、框架、数据库、服务程序等)

    2. 与团队沟通

      • 召开项目启动会:与项目团队成员、利益相关者召开会议,明确项目的目标、范围、进度和角色分配

      • 一对一进行交流:与项目的关键成员进行一对一的交流,了解他们的工作内容、挑战和看法

    3. 环境搭建

      • 设置开发环境:根据项目的技术栈,搭建本地开发环境,确保能顺利进行开发和测试

      • 获取访问权限:确保能访问相关的代码库、服务器、项目管理工具和文档平台

    4. 制定工作计划

      • 明确优先级:理解项目的当前紧急需求和长远目标,制定合理的工作计划

      • 划分任务组:将整体工作拆分成小任务,并根据优先级分配给自己和团队成员

    5. 学习与提升

      • 确定学习资源:如果项目中使用了不熟悉的技术或工具,尽快找到学习资源(如在线课程、书籍、社区等)

      • 主动请教专家:向团队和相关专业人士请教,迅速解决工作中遇到的问题

    6. 建立沟通渠道

      • 定期会议交流:建立定期的团队会议(如站立会、进度汇报会),保持团队之间的沟通

      • 使用管理工具:利用项目管理工具(如 Jira、Trello、Asana)跟踪任务和进度,提高团队协调的效率

    7. 文档与知识分享

      • 建立文档:在工作过程中记录重要的信息和决策,为后续团队成员提供参考

      • 分享经验:在团队中分享你的经验和知识,促进团队的学习和成长

    1.20.27 数据库规模有多大,存储量情况,QPS数值 TPS数值?

    在电商网站的数据库架构中,采用一主三从的配置是较为常见的(3~5套),特别是在高并发和高可用性要求的场景下。

    关于QPS(Queries Per Second)、TPS(Transactions Per Second)、存储数据量和每天数据增长量的问题,

    这些参数会因具体的业务情况而有所不同。下面是一些可能的估算和分析

    01 QPS(每秒查询数)

    序号网站规模数值参考
    01小型电商网站几十到几百QPS
    02中型电商网站几百到几千QPS
    03大型电商网站几千到上万QPS

    影响因素:

     

    02 TPS(每秒事务数)

    序号网站规模数值参考
    01小型电商网站几十到几百TPS
    02中型电商网站几百到几千TPS
    03大型电商网站几千到上万TPS

    影响因素:

     

    03 存储数据量

    序号网站规模数值参考
    01小型电商网站10GB到100GB
    02中型电商网站几百GB到几TB
    03大型电商网站数TB到数十TB

    影响因素:

     

    04 数据每天增长量

    序号网站规模数值参考
    01小型电商网站几MB到几GB
    02中型电商网站几GB到十几GB
    03大型电商网站十几GB到几百GB

    影响因素:

     

    推荐面试话术:(假设运行的是一个中型电商网站)

    三套一主三从数据库MySQL架构:

     


    真实面试题

     

    腾讯一面

    工作中运维的数据库集群是什么类型的

    MySQL使用的版本和规模?5.7.26 8.0.22

    MySQL 5.7 和 8.0 的区别?

    索引的优化?MySQL 的索引用的那种?

    B+ TREE 和 B TREE 的区别 B+TREE 有什么好处?

    链表和数组相比,链表和数组适用于的什么访问?

    MySQL 存储引擎有哪些?

    Innodb 和 MyISAM 有什么区别?

    Innodb 支持事务的原因?

    Innodb 的MVCC 原理?

    MVCC 中是如何判断其他事务是否可见?

    MVCC 是判断哪些版本可以访问?

    idb 和 frm 文件是什么?

    如何从 frm 中提取表结构?

    ibdata 和 ib_log_file 放的什么?

    工作中遇到哪些主从延时问题,你是怎么解决的?


    某外包二面

    你们公司生产环境中,什么样的情况算bug,bug是怎样发现怎么处理的,你又是如何收到这些bug的?如何形成闭环?

    在日常维护高可用架构的时候,你发现过哪些问题?

    你用过Oracle吗?

    你在公司中使用的什么版本的mysql?

    你在工作中主从架构遇到过哪些问题?


     

    英姿舞动(上海)

    之前在别的城市为什么来上海?

    MHA 的流程 和 探测机制?

    mysql的逻辑和物理备份 哪个流程你更清楚?请具体说一个备份方式的流程?

    xtrabackup 备份原理和流程你说一下?

    acid 是什么?

    事务的隔离级别有哪几个?

    客户说11.30 分的时候我删除了一张表,你怎么给他恢复?

    mysql数据库升级,你常用的是哪个数据库版本的升级?

    mysql从5.6 升级到5.7 是不是大版本升级?

    你做的好的地方有哪些?

    redo 和 undo 的区别?

    用户部署了套新架构,你怎么给用户做监控,监控哪些指标?

    mysql 流量你怎么用监控软件监控的?

     


    双照科技一面(银行外包)

    公司是甲方还是乙方?有没有驻场经验?

    有没有做过数据迁移?

    是从哪里迁移 mysql迁移到mysql 还是别的数据库迁移到另一个数据库?

    迁移是怎么做的?

    shell 和 python 的开发技能怎么样?

    如果运维数据库中,有客户反应sql很慢?很卡 你排查的思路?

    实际中遇到的慢查询的经典案例?

    部署主从的必要条件?

    主从用途是什么?

    你有没有部署过主从?主从部署的时候主库要做什么操作配置从库要做什么配置?

    mysql千万级的大表怎么优化?之前有做过这个方面的经验吗?

    过多的索引有什么问题?

    我创建了索引但是不走索引可能有哪些原因?

    如何理解死锁,如何避免死锁?如何检测死锁?


     

    上海某公司一面(外包 到金融服务,证券公司)

    你之前在公司使用的数据库架构是怎样的

    MHA 了解过吗?MHA的探测机制?如何判断主库存活,如何判断MySQL库是否异常?

    MHA 会去检查 MySQL 进程正常吗?(主动去查询,和插入数据去探测)

    MGR有了解过吗?复制原理能说一下吗?

    慢查询的思路?

    如何有个客户说CPU比较高,你是怎么定位到是哪个SQL? 造成的 top mysql - 线程

    mysql 执行计划你是怎么看的?

    mysql 隔离级别,你能说一下吗?

    什么是RR 级别?

    主从同步的流程?如何搭建的?

    如何使用主从同步延时恢复数据?你在项目中怎么使用的?

    你常用的mysql备份是怎么做的?

    xtrabackup 备份流程是怎样的?

    是否了解过 oceanbase TIDB openguass;


    上海某公司一面

    MySQL 的内存结构包括哪些块?

    MySQL 你维护的版本?

    你运维的mysql架构是什么样的?

    读写分离,是云上的还是自己建立的?

    读写分离是怎么实现的?

    MySQL 数据规模,最大的数据库实例是多大?

    备份是用什么备份的,什么备份策略?

    xtrabackup 备份的时候,你的查询语句会影响你的备份吗?


    grep sed awk?

    锁的级别种类?

    MVCC

    主从延时

    SQL 性能抖动

    死锁视图

    死锁检查算法,和底层原理

    join 连接原理

    从什么维度去找到问题SQL 时间?

    使用的mysql 版本

    版本升级考虑因素

    5.7 和 8.0 的对比

     


     

    面试公司黑名单

    1. 实壹科技公司(上海)

      • 35岁年龄歧视

    2. 上海子矛公司

      • 面试骗操作


     

    面试技巧

    回答文本尽量全面

    熟悉的技术问题,不要一次性所有相关知识都说清楚,保留一部分让面试官去问

    面试回答问题最好结合业务去回答,可以举一些例子