后端一个疑问

我感觉binlog也可以用来故障恢复啊,那为什么还需要redolog勒有大佬能给我解答一下吗#牛客AI配图神器#
全部评论
也可以做,但是binlog保存的是全量的数据。他不知道哪些页属于脏页(写入物理页但没写回磁盘),使用binlog恢复我的理解是需要使用所有binlog数据恢复。而redolog记录了哪些页为脏页。重做的时候只需要重做这些数据就行。效率会高很多
11 回复 分享
发布于 2025-08-26 18:07 广东
binlog是记录的是sql级别的日志,redolog是物理级别的日志,重做肯定是redolog快
5 回复 分享
发布于 2025-08-26 16:06 贵州
redolog和undolog是事务中的,redolog用来回滚,存的是逻辑数据,undolog用来事务判断读已提交和可重复读这两个隔离级别。而binlog是全量数据,可以用来监听数据库变化和恢复。总之记住,binlog是server层的,redolog和undolog是事务中的,所以是存储引擎层的,server层和存储引擎层完全是两套东西
点赞 回复 分享
发布于 2025-09-19 11:10 北京
首先,需要明确 MySQL 中这两种 log 存放的是什么数据。 binlog 是 MySQL 自己的日志,它里面存放的是二进制格式的 SQL 语句 或 变化的每行 SQL 信息。(具体要看 binlog_format 是 STATEMENT 还是 ROW)为了简化讨论,就把它当作存放了一堆 SQL 的二进制文件。 redo log 是 InnoDB 的日志,InnoDB 是 MySQL 的一种可选引擎。redo log 里面存放的是对 InnoDB 数据页面的「修改动作」,可以抽象成把某个字节从 X 改成 Y。由于它只记录操作,所以 redo log 并不清楚这些操作在逻辑上对应什么。 (数据页面也简单解释下,可以想象成把表里的数据,一行接一行的排列到一个大的文件中。修改数据页面的动作,实际上就是在修改行内的数据。) 基本概念对齐以后,我们来考虑没有 redo log 会怎么样。我们要知道 binlog 和 磁盘上的数据页 从物理上没办法保证同时写入完成,总归会有先后。那么我们写入 binlog 后,数据页面刷到一半,机器断电了,我们如何把数据页从茫茫字节中,恢复到之前的内容呢?(这里还涉及一个 doublewrite buffer 的概念,但为了聚焦问题,先假设一次性刷写能完整刷写一个页面) 可以简单认为,MySQL 决定一个事务是否成功提交,取决于 binlog。假设 binlog 是完整的,存储引擎无论如何都得把这条 binlog 对应的记录还原回来,否则事务就丢失了。同时 MySQL 主备复制也是依赖 binlog,也就是 binlog 具有 “一票否决权”。而 redo log 是 InnoDB 指导自己如何恢复数据的。 从我的表述来看,redo log 和 binlog 必须保证一致。要么都有,要么都没有。这点从物理上无法保证,但是从逻辑上可以。redo log 先写入本次操作,并记录 “type” 为 prepare;这时写入 binlog,再写入一条 redo log commit 记录。 假设1:只有 redo log prepare,没有 binlog。说明事务没有提交,我需要根据 redo log prepare 的操作指导,保证数据页的正确性。 假设2:有 binlog,没有 redo log commit。说明事务是正确提交的,只是 redo commit 没来得及写入,我需要根据 redo log prepare 的操作指导,进行页面数据恢复。 其实,当你觉得一个东西不需要的时候,想象一下把它去掉,这个系统是否可以保证正确。
7 回复 分享
发布于 2025-08-28 13:10 上海
假设脏页落盘到一半挂了,重启之后用row模式binlog法解决这种情况,因为根本不知道哪些数据落盘成功哪些失败,而redolog是基于物理页的,可以判断哪些成功落盘,还可以解决页撕裂的问题。state模式的binlog是记录的数据被改成了什么样子,直觉上这个好像有潜力可以用来做故障恢复
点赞 回复 分享
发布于 2025-09-26 22:29 黑龙江
我认为是redo log更可靠,特别是对断电这种突然中断的情况: 1. binlog是在事务提交好刷盘,redolog是在事物提交前刷盘 2. redo log划分的更细,每个SQL语句可能针对多个数据页的数据进行修改,对于每个数据页修改划分为一个最小单位(mini-Transaction),对于事务执行期间服务器崩溃时的状态都可以恢复。
1 回复 分享
发布于 2025-09-14 02:23 河南
评论区还没有说清楚的一点是,mysql 的redo log是一个环形缓存的,大小一般为5g,写满了会从投开始写。而binlog没有上限。 当然数据库并不是一定要求记录逻辑日志binlog,很多分布式数据库已经实现了以物理日志来同步,将物理日志空间不设为环形,进而大大提高性能
1 回复 分享
发布于 2025-08-31 18:41 上海
binlog是一条一条的增删改的记录,redolog记录的是物理页面的修改。如果使用binlog的话,需要一条一条执行sql,redolog的话基于物理页要快一些。你也可以拓展一下,就好像redis中两个持久化机制,一个rdb一个aof,rdb一般记录的是全量的物理数据,aof记录的一条一条的增删改,redis里面使用rdb恢复或者是备份也是很快的。
1 回复 分享
发布于 2025-08-27 21:08 英国
binlog不能给脏页刷盘
点赞 回复 分享
发布于 2025-08-27 20:17 辽宁
binlog并不是一个原子的操作,一条binlog可能对应多条redo log,如果只使用binlog,那么需要先落盘binlog,再落盘数据,如果此时数据只落盘了一部分就挂了,恢复时无法通过binlog进行重做。
点赞 回复 分享
发布于 2025-08-27 10:30 香港
但是主从不也是用的binlog吗
点赞 回复 分享
发布于 2025-08-27 09:32 重庆
用binlog也行,满足两个前提,1,MySQL一开始使用的时候就开启binlog,且中途无异常,2,先把数据库中的数据清空
1 回复 分享
发布于 2025-08-26 19:42 浙江
个人理解,binlog慢
点赞 回复 分享
发布于 2025-08-26 11:22 江苏
redo log:解决事务持久性 & crash recovery(快,物理级别)。 binlog:用于主从复制、备份恢复(逻辑级别,跨存储引擎)。 再了解一下两阶段提交你就懂了
点赞 回复 分享
发布于 2025-08-25 22:02 重庆

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
7
39
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4463次浏览 78人参与
# 找AI工作可以去哪些公司? #
10165次浏览 319人参与
# 厦门银行科技岗值不值得投 #
8260次浏览 188人参与
# 你的实习产出是真实的还是包装的? #
20890次浏览 346人参与
# 从事AI岗需要掌握哪些技术栈? #
9863次浏览 393人参与
# 春招至今,你的战绩如何? #
68050次浏览 600人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15764次浏览 229人参与
# AI面会问哪些问题? #
29194次浏览 634人参与
# 你做过最难的笔试是哪家公司 #
36092次浏览 316人参与
# 中国电信笔试 #
32407次浏览 302人参与
# 金三银四,你的春招进行到哪个阶段了? #
22587次浏览 284人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
341255次浏览 2176人参与
# 同bg的你秋招战况如何? #
212267次浏览 1121人参与
# 哪些公司真双非友好? #
69835次浏览 289人参与
# 如何准备秋招 #
78326次浏览 868人参与
# 阿里笔试 #
179479次浏览 1324人参与
# 应届生被毁约被毁意向了怎么办 #
63363次浏览 305人参与
# 机械人避雷的岗位/公司 #
62728次浏览 393人参与
# 小马智行求职进展汇总 #
25151次浏览 80人参与
# 第一份工作一定要去大厂吗 #
15236次浏览 124人参与
# 担心入职之后被发现很菜怎么办 #
291436次浏览 1210人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26333次浏览 310人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务