news 2026/5/11 8:58:15

华为OD技术面真题 - Mysql相关 - 4

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD技术面真题 - Mysql相关 - 4

文章目录

  • 简单介绍一下Mysql中BinLog、RedoLog和UndoLog
    • RedoLog
    • BinLog
    • UndoLog
  • Mysql中事务为什么需要两阶段提交
  • 简单介绍一下两阶段提交的流程
  • 什么是读写分离
  • 怎样实现读写分离
  • 说说Mysql主从复制流程
  • 怎么避免主从延迟

简单介绍一下Mysql中BinLog、RedoLog和UndoLog

RedoLog

重做日志是 InnoDB 存储引擎独有的,它让 MySQL 拥有了崩溃恢复能力。在MySQL 实例挂了或宕机了,重启时,InnoDB 存储引擎会使用 Redolog 恢复数据,保证数据的持久性与完整性。

redo log 它是物理日志,记录内容是“在某个数据页上做了什么修改”,属于 InnoDB 存储引擎独有。

BinLog

Binlog 是逻辑日志,记录内容是语句的原始逻辑,类似于“给 ID=2 这一行的 c 字段加 1”,属于MySQL Server层。不管用什么存储引擎,只要发生了表数据更新,都会产生 binlog 日志。

MySQL 数据库的数据备份、主备、主主、主从都离不开 binlog,需要依靠 binlog 来同步数据,保证数据一致性。

binlog记录日hi有三种格式,通过binlog_format参数指定

  • statement:记录的内容是SQL语句原文。对于这类SQL语句update T set update_time=now() where id=1now()函数直接执行会导致与原库的数据不一致。
  • row: 记录的内容不再是简单的SQL语句了,还包含操作的具体数据。不只记录SQL语句同时记录具体数据。缺点:需要更多容量来记录。
  • mixed: MySQL 会判断这条SQL语句是否可能引起数据不一致,如果是,就用row格式,否则就用statement格式。

UndoLog

每一个事务对数据的修改都会被记录到 undolog ,当执行事务过程中出现错误或者需要执行回滚操作的话,MySQL 可以利用 undo log 将数据恢复到事务开始之前的状态。

undo log 属于逻辑日志,记录的是 SQL 语句,比如说事务执行一条 DELETE 语句,那 undo log 就会记录一条相对应的 INSERT 语句。同时,undo log 的信息也会被记录到 redo log 中,因为 undo log 也要实现持久性保护。undo-log 本身是会被删除清理的.

Mysql中事务为什么需要两阶段提交

在未开启两阶段提交时,可能出现 redo log 写入成功但 binlog 写入失败(或者反之),导致主从库数据不同步。两阶段提交通过将 Redo log 状态标记为 Prepare,充当了协调者,确保了崩溃恢复(Crash-Safe)时可以一致地提交或回滚事务。

简单介绍一下两阶段提交的流程

  • 准备阶段:
    • 执行SQL修改数据,将修改记录写入 redo log,并将该条 redo log 标记为prepare状态。
    • 将该事务的 XID(内部事务ID)写入 redo log,并持久化到磁盘。
  • 提交阶段:
    • 将该事务的 SQL 语句写入 binlog,并将 binlog 持久化到磁盘
    • 将 redo log 中的事务状态修改为commit状态,标志事务提交成功

什么是读写分离

读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。这样的话,就能够小幅提升写性能,大幅提升读性能。

一般情况下,我们都会选择一主多从,也就是一台主数据库负责写,其他的从数据库负责读。主库和从库之间会进行数据同步,以保证从库中数据的准确性。这样的架构实现起来比较简单,并且也符合系统的写少读多的特点。

怎样实现读写分离

实现读写分离一般包含以下几步:

  1. 部署多台数据库,选择其中的一台作为主数据库,其他的一台或者多台作为从数据库。
  2. 保证主数据库和从数据库之间的数据是实时同步的,这个过程也就是我们常说的主从复制
  3. 系统将写请求交给主数据库处理,读请求交给从数据库处理。

常见实现方案:

  1. 代理方式:应用和数据中间加了一个代理层。应用程序所有的数据请求都交给代理层处理,代理层负责分离读写请求,将它们路由到对应的数据库中。可使用中间件MyCatMysql Router等。
  2. 组件实现:通过引入第三方组件来帮助我们读写请求。例如sharding-jdbc.

说说Mysql主从复制流程

主要涉及三个线程: binlog 线程、I/O 线程和 SQL 线程。

  • binlog 线程: 负责将主服务器上的数据更改写入二进制日志中。
  • I/O 线程: 负责从主服务器上读取二进制日志,并写入从服务器的中继日志中。
  • SQL 线程: 负责读取中继日志并重放其中的 SQL 语句

主从复制流程基本流程:

  • 主库将数据库中数据的变化写入到 binlog
  • 从库连接主库
  • 从库会创建一个 I/O 线程向主库请求更新的 binlog
  • 主库会创建一个 binlog dump 线程来发送 binlog ,从库中的 I/O 线程负责接收
  • 从库的 I/O 线程将接收的 binlog 写入到 relay log 中。
  • 从库的 SQL 线程读取 relay log 同步数据到本地。

主从复制分为全同步复制和半同步复制,不同之处:

  • 全同步复制:主库写入binlog后强制同步日志到从库,所有的从库都执行完成后才返回给客户端。这种方式严重影响性能
  • 半同步复制:从库写入日志成功后返回ACK确认给主库,主库收到至少一个从库的确认就认为写操作完成。

怎么避免主从延迟

读写分离对于提升数据库的并发非常有效,但是,同时也会引来一个问题:主库和从库的数据存在延迟,比如你写完主库之后,主库的数据同步到从库是需要时间的,这个时间差就导致了主库和从库的数据不一致性问题。这也就是我们经常说的主从同步延迟

因为存在主从延迟问题,为了改善主从延迟造成读取过期数据主要有以下两种方案:

  • 对于强实时性业务场景,可强制读取主库,避免读取过期树。
  • 对于一些对数据比较敏感的场景,你可以在完成写请求之后,避免立即进行请求操作,延迟进行读取。这个需要考虑到业务场景,同时延迟多少也是一个值得商榷的问题。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 14:17:00

一维(1D)CNN模型下轴承故障诊断(Python,TensorFlow框架下,很容易改为其它模型,解压缩后可以直接运行,无需修改任何目录)

1.数据集使用凯斯西储大学轴承数据集,一共有4种负载下采集的数据,每种负载下有10种 故障状态:三种不同尺寸下的内圈故障、三种不同尺寸下的外圈故障、三种不同尺寸下的滚动体故障和一种正常状态。2.模型(1DCNN)使用数据…

作者头像 李华
网站建设 2026/5/11 8:56:51

RAG上下文构建完全指南:从召回策略到最佳实践,一篇搞定!建议收藏

文章探讨了RAG系统中构建上下文的关键问题,特别是当语义召回的多个chunk来自不同段落时如何选择上下文内容。分析了直接使用召回chunk与召回完整段落两种方案的优缺点,指出应根据文档长度、场景需求选择折中方案。有时为减少token消耗并提升模型准确性&a…

作者头像 李华
网站建设 2026/5/10 15:16:31

AI产品经理深度转型指南!

🔥AI产品经理,最近的市场又开始变得火热了起来。💡大部分公司已经开始从原来的巨量投入,变成盈利的状态了。另外算力成本、数据采集和标注成本也在不断下降📉!AI行业已经开始迎来了新的拐点📈&a…

作者头像 李华
网站建设 2026/5/10 0:45:45

大数据连接池配置:结构化数据访问优化

大数据连接池配置:结构化数据访问的“资源平衡术” 一、引入:大数据场景的“连接之痛” 去年双11零点,某电商的实时销售分析系统突然陷入瘫痪: 运营同学要查看“5分钟内TOP10热销商品”,点击查询后等待了18秒才加载…

作者头像 李华
网站建设 2026/5/11 2:13:53

大数据毕设项目:基于django+大数据平台的短视频推荐系统设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/5/7 6:39:48

从文本到可视化:Java企业数据查询的智能进化之路

在数字化转型的浪潮中,数据已经成为企业的核心资产。对于以Java技术栈为核心的企业而言,如何高效挖掘私有数据的价值,让数据从“沉睡的数字”转变为“决策的依据”,是亟待解决的关键问题。传统的数据查询模式中,业务人…

作者头像 李华