首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql为什么不用redo做恢复

MySQL数据库在恢复过程中不使用redo日志(Redo Log)的原因主要是因为它采用了不同的恢复机制,即基于WAL(Write-Ahead Logging)的恢复策略。WAL是一种保证事务原子性和持久性的技术,它要求所有对数据的修改在提交之前必须先写入日志。

基础概念

  • Redo Log(重做日志):记录了对数据页的修改,用于在数据库崩溃后恢复数据到最新的状态。
  • WAL(Write-Ahead Logging):是一种数据库事务处理机制,要求所有的修改在提交之前必须先写入日志。

MySQL的恢复机制

MySQL主要使用以下两种日志来进行恢复:

  1. Binary Log(二进制日志):记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间。主要用于复制和数据恢复。
  2. Undo Log(回滚日志):记录了事务发生前的数据状态,用于事务回滚和多版本并发控制(MVCC)。

为什么MySQL不用Redo Log做恢复

MySQL实际上使用了类似Redo Log的概念,但它的实现和恢复机制与传统的Redo Log有所不同:

  1. InnoDB存储引擎:MySQL的InnoDB存储引擎使用了一种称为“redo log”的日志来确保事务的持久性。但是,InnoDB的恢复过程不仅仅依赖于redo log,还需要结合undo log和binary log。
  2. 恢复过程
    • 崩溃恢复:InnoDB使用redo log来重做(redo)未提交的事务,确保数据的一致性。
    • 实例恢复:结合undo log和redo log来恢复数据到一致状态。
    • 备份恢复:使用binary log来进行点时间恢复(Point-In-Time Recovery)。

应用场景

  • 事务处理:InnoDB的redo log确保了事务的原子性和持久性。
  • 崩溃恢复:在数据库崩溃后,InnoDB可以使用redo log和undo log来恢复数据到一致状态。
  • 备份和恢复:结合binary log,可以实现数据的备份和点时间恢复。

遇到的问题及解决方法

如果MySQL在恢复过程中出现问题,可能是由于以下原因:

  1. 日志损坏:redo log或binary log损坏可能导致恢复失败。
    • 解决方法:定期备份日志文件,并使用mysqlbinlog工具检查和修复日志文件。
  • 配置问题:日志配置不当可能导致恢复失败。
    • 解决方法:检查并调整MySQL的日志配置,确保日志文件的路径、大小和保留策略正确。

示例代码

代码语言:txt
复制
-- 检查二进制日志状态
SHOW VARIABLES LIKE 'log_bin';

-- 检查InnoDB redo log状态
SHOW ENGINE INNODB STATUS;

参考链接

通过以上机制和配置,MySQL能够有效地进行数据恢复,确保数据的完整性和一致性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL崩溃恢复功臣—Redo Log

Redo log文件是InnoDB用于崩溃恢复(crash recovery)以及组提交(group commit)策略的重要文件,存在于磁盘上。...下面大致讲解下Redo log是怎么做到崩溃恢复以及组提交的。 崩溃恢复 崩溃恢复能力是指InnoDB可以保证数据库在异常崩溃重启后的状态和使用binlog文件恢复出来的数据库状态保持一致。...redo log是怎么做的 先上一张图,是InnoDB更新数据时update语句的执行流程(摘自极客时间《MySQL实战45讲》,自己重新绘制),橙色的流程在InnoDB内部执行,蓝色的部分在MySQL...下面我们从上图4个可能发生异常关闭的时间点来分析InnoDB如何在MySQL启动时做崩溃恢复。...组提交 上面关于崩溃恢复部分只是讲了写redo log和binlog的步骤,那么一定很疑惑数据是何时被写入到磁盘文件中的呢,这里就要说下InnoDB通过redo log实现的组提交的策略了。

11.4K101

MySQL 为什么需要 redo log?

我们知道,MySQL 架构整体上分为两层:Server 层和存储引擎层,如下图: 前面松哥文章+视频跟大家聊的 binlog,是 MySQL 自己提供的 binlog,而 redo log 则不是 MySQL...buffer pool 或者 change buffer,这样,即使系统突然崩了,将来也可以通过 redo log 恢复数据。...MySQL 关闭时,将 redo log buffer 写入磁盘成为 redo log file。 那如果 redo log buffer 中的数据还没有磁盘,MySQL 就挂了该怎么办?...挂了,将来 MySQL 重启恢复了,数据也是可以被恢复的。...具体的恢复逻辑,就涉及到两阶段提交了,这个松哥在后面的文章中再和大家详细介绍。 4.2 redo log 落盘 还有一个需要大家注意的问题就是 redo log 落盘,落盘的数据从哪里来?

72220
  • 基于Redo Log和Undo Log的MySQL崩溃恢复流程

    MySQL 奔溃恢复 这个过程看似没啥问题,实则不讲武德。假设我们修改Buffer Pool中的数据成功,但是还没来得及将数据刷入磁盘MySQL就挂了怎么办?...那不完犊子吗,连数据持久化的保证、事务回滚都做不到还谈什么崩溃恢复? Redo Log & Undo Log 而通过MySQL能够实现崩溃恢复的事实来看,MySQL必定实现了某些骚操作。...实现日志后的更新流程 有了Redo Log和Undo Log,我们再将上面的那张图给完善一下。 MySQL 崩溃恢复 首先,更新数据还是会判断数据是否存在于Buffer Pool中,不存在则加载。...redo-log-buffer 那为什么Undo Log不也搞一个Undo Log Buffer,也给Undo Log提提速,雨露均沾?...Redo Log恢复到Buffer Pool中的某行的A字段是3,但是任何监听其Binlog的数据库读取出来的数据确是2。

    1.2K10

    阿里为什么不用 ZK 做服务发现?

    Why You Shouldn’t Use ZooKeeper for Service Discovery 那坚定的阐述一样,为什么你不应该用 ZooKeeper 做服务发现! 吾道不孤矣。...的应用服务 svcB 是不可以新部署,重新启动,扩容或者缩容的,但是站在网络和服务调用的角度看,机房3的 svcA 虽然无法调用机房1和机房2的 svcB,但是与机房3的svcB之间的网络明明是 OK 的啊,为什么不让我调用本机房的服务...但是为什么又说需要呢,因为一个完整的生产可用的注册中心,除了服务的实时地址列表以及实时的健康状态之外,还会存储一些服务的元数据信息,例如服务的版本,分组,所在的数据中心,权重,鉴权策略信息,service...ConnectionLossException 事件 Disconnected 事件 简单来说,这是个可以在同一个 ZooKeeper Session 恢复的异常(Recoverable), 但是应用开发者需要负责将应用恢复到正确的状态...中恢复应用状态,必须要重新建立新Session,老Session关联的临时节点也可能已经失效,拥有的锁可能已经失效。

    89820

    mysql存储手机号为什么不用bigint?

    因此,为什么不使用bigint存储手机号呢? 手机号一般是要加索引的吧。。bigint你用了like索引就失效了 1.首先,手机号的本质是字符串而不是数字,只是恰巧长得像数字而已。...,依然不够,第二位从0到9分库分表,还剩下9位,这对于int来说,能够存储了; 我一直认为对于数字的处理,交给数字类型比较好,所有才会有这样的想法,int对比varchar总该有性能提升吧;当然这样做,...那int实现的扩展性将是致命的; 分析下来,int或许有些许性能优势,但其带来的复杂度和扩展上的劣势让我根本都不必动手,就打消了念头了;唉,也许这就是为什么大多数公司选择varchar存储手机号的原因吧

    3.5K20

    MySQL 中为什么使用 timestamp 可以不用关心时区.

    之前一直有过疑惑为什么MySQL数据库存timestamp可以无视时区问题. 在业务中也是一直使用Laravel框架,内置的Migration也是使用的timestamp类型字段, 也没太关心....开始 查看当前数据库时区 mysql> show variables like "%time_zone%"; +------------------+--------+ | Variable_name...CST | | time_zone | +08:00 | +------------------+--------+ 2 rows in set (0.30 sec) 查看表结构 mysql...隐式的帮我们转换了, 让我们不用关心时区的问题 就是数据库实际上会保存 UTC 时间戳,写入的时候先按 Session 时区转成 UTC 时间,读出的时候再按 Session 时区转成当前时区的时间,...,并且把当前连接的时区设置为+00:00,再去查数据库这条记录,查到的数据是:2020-12-09 00:00:00, 正好对应零时区的时间,这样子我们就不用考虑时区的问题

    22410

    ElasticSearch(7.2.2)-为什么不⽤mysql做全⽂搜索

    本文链接:https://blog.csdn.net/weixin_42528266/article/details/102785018 简介:为什么要⽤全⽂搜索引擎,⽽不⽤mysql做全⽂搜索呢...前⾔ 有⼈可能会问,为什么⼀定要⽤搜索引擎呢?...⽽且 Mysql,Oracle,SQL Server 等数据库⾥不是也能提供查询搜索功能,直接通过数据库查询不就可以了吗?...那为什么还要全⽂搜索引擎呢?我们从⼏个⻆度来说 数据类型 全⽂索引搜索很好的⽀持⾮结构化数据的搜索,可以更好地快速搜索⼤量存在的任何单词⾮结构化⽂本。...搜索性能 如果使⽤mysql做搜索,⽐如有个player表,这个表有user_name这个字段,我们要查找出user_name以james开头的球员,和含有James的球员。我们⼀般怎么做?

    66020

    MySQL日志15连问

    发生数据库服务器宕机、或者脏页未写入磁盘,可以通过redo log恢复。 它是Innodb存储引擎独有的 为什么需要 redo log?...redo log主要用于MySQL异常重启后的一种数据恢复手段,确保了数据的一致性。 其实是为了配合MySQL的WAL机制。...MySQL执行更新操作后,在真正把数据写入到磁盘前,先记录日志。 好处是不用每一次操作都实时把数据写盘,就算crash后也可以通过redo log恢复,所以能够实现快速响应SQL语句。...但是bin log不可以做crash safe,因为crash之前,bin log可能没有写入完全MySQL就挂了。所以需要配合redo log才可以进行crash safe。...什么是MySQL两阶段提交, 为什么需要两阶段提交? 其实所谓的两阶段就是把一个事务分成两个阶段来提交。

    89431

    MySQL为什么用B+树,而不用B树?

    面试题1: MySQL为什么用B+树,而不用B树?...本地分析一般是在宿主机上安装代理,执行分析命令,上报到服务器 面试题3:Mysql主从的延迟怎么解决呢,有什么好的思路吗?...3.服务的基础架构在业务和mysql之间加入memcache或者redis的cache层。降低mysql的读压力。 4.不同业务的mysql物理上放在不同机器,分散压力。...然后我们再降低主库的压力,比如读写分离 面试题4:mysql隐式转换不走索引怎么办? 当操作符左右两边的数据类型不一致时,会发生隐式转换。...面试题6:我们也在用RocketMQ,之前的架构比较简单,公司准备做微服务化,现在让我负责这一块,感觉微服务就是拆分,想象不出有啥问题,心理有些没底,想问下都需要注意哪些点?

    1K20

    腾讯二面:MySQL 三大日志,介绍一下?

    最近行情越来越卷了,给大家整理了互联网大厂15道经典MySQL日志面试题,希望大家都能找到理想的offer redo log是什么? 为什么需要redo log?....如果数据库误操作, 如何执行数据恢复? 说说binlog日志三种格式 什么是MySQL两阶段提交, 为什么需要两阶段提交?...发生数据库服务器宕机、或者脏页未写入磁盘,可以通过redo log恢复。 它是Innodb存储引擎独有的 为什么需要 redo log?...MySQL执行更新操作后,在真正把数据写入到磁盘前,先记录日志。 好处是不用每一次操作都实时把数据写盘,就算crash后也可以通过redo log恢复,所以能够实现快速响应SQL语句。...但是binlog不可以做crash safe,因为crash之前,bin log可能没有写入完全MySQL就挂了。所以需要配合redo log才可以进行crash safe。

    29111

    MySQL日志15连问

    金九银十已经来了,整理了15道经典MySQL日志面试题,希望对大家有帮助。 1. redo log是什么? 为什么需要redo log? redo log 是什么呢?...它是Innodb存储引擎独有的 为什么需要 redo log? redo log主要用于MySQL异常重启后的一种数据恢复手段,确保了数据的一致性。 其实是为了配合MySQL的WAL机制。...MySQL执行更新操作后,在真正把数据写入到磁盘前,先记录日志。 好处是不用每一次操作都实时把数据写盘,就算crash后也可以通过redo log恢复,所以能够实现快速响应SQL语句。...但是bin log不可以做crash safe,因为crash之前,bin log可能没有写入完全MySQL就挂了。所以需要配合redo log才可以进行crash safe。...什么是MySQL两阶段提交, 为什么需要两阶段提交? 其实所谓的两阶段就是把一个事务分成两个阶段来提交。

    1.5K40

    一文看懂MySQL执行update更新语句的流程

    (粉板)里面,并更新内存,更新就算完成了 InnoDB在适当时,将操作记录更新到磁盘,而这个更新往往是在系统比较空闲的时候做,这就像打烊以后掌柜做的事。...为什么需要两份日志? 最开始MySQL并无InnoDB,自带的是MyISAM,没有crash-safe的能力,binlog只能用于归档。...两阶段提交 为什么必须有“两阶段提交”? 为了让两份日志之间的逻辑一致。 思考怎样让数据库恢复到半个月内任意一秒的状态? binlog会记录所有的逻辑操作,并且采用“追加写”。...如果DBA承诺说半个月内可以恢复,那么备份系统中一定会保存最近半个月的所有binlog,同时系统会定期做整库备份。 “定期”取决于系统的重要性,可以是一天一备,也可以是一周一备。...为什么需要“两阶段提交” 由于redo log和binlog是两个独立的逻辑,如果不用两阶段提交,要么就是先写完redo log再写binlog,或者反序。

    3.6K10

    MySQL面试常问:一条语句提交后,数据库都做了什么?

    执行器 MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。...redo log 用于回滚,binlog 用于恢复。 如果将 MySQL 恢复到某一天的某一秒 要做到这一点有个前提,就是要对 MySQL 数据库定期做整库备份。...当需要恢复到指定的某一秒时,比如某天下午两点发现中午十二点有一次误删表,需要找回数据,那你可以这么做: 首先,找到最近的一次全量备份,如果你运气好,可能就是昨天晚上的一个备份,从这个备份恢复到临时库;...你可能会问,处于 prepare 阶段的 redo log 加上完整 binlog,重启就能恢复,MySQL 为什么要这么设计?...还有一个问题,就是为什么不让 redo log 也承担 binlog 的功能?

    93420

    MySQL基础篇2 mysql的日志系统

    mysql如何做到恢复半月内任意一秒的数据呢?...为什么会有两份日志呢?...如果你的 DBA 承诺说半个月内可以恢复,那么备份系统中一定会保存最近半个月的所有 binlog,同时系统会定期做整库备份。...这里的“定期”取决于系统的重要性,可以是一天一备,也可以是一周一备 当需要恢复到指定的某一秒时,比如某天下午两点发现中午十二点有一次误删表,需要找回数据,那你可以这么做: 首先,找到最近的一次全量备份...用反证法证明为什么需要两阶段提交 由于 redo log 和 binlog 是两个独立的逻辑,如果不用两阶段提交,要么就是先写完 redo log 再写 binlog,或者采用反过来的顺序。

    44640

    数据日志系统解决了好多大问题!

    (注:如果不这么做,假如一个日志提交成功的时候,另一个日志提交之前发生了数据库发生了崩溃,但是crash-safe恢复或者误删库恢复的时候可能造成二者数据不统一出现问题。)...这个参数我也建议你设置成 1,这样可以保证 MySQL 误删除操作(删除表数据,删除库数据) 通过binlog 仍可恢复。...如何查看这两种日志 关于日志系统的一些误区和疑问 大家会不会想有了redo日志就可以了,为什么还要出现binlog日志呢? 解答: redo日志是只要InnoDB引擎才提供的一个内容。...写入redo日志也是io操作,数据更新直接写入磁盘也是io操作,为什么说写入redo日志效率高节省io成本呢?...解答:redo日志的写入是顺序写入的,不用去“找位置”,而直接更新数据到磁盘的话,需要到磁盘中找到位置再写入,肯定前者的效率高。

    97310
    领券