mysql日志redo log 和binlog

在上一篇中我们说到了mysql的基础架构,通常一个查询操作只会涉及到基础架构中的那几部分;

首先连接数据库,分析器进行语义、语法分析,优化器生成执行计划和索引选择、执行器执行对应的语句、存储引擎查看内存中是否有对应的数据,有的话直接返回,没有的话从磁盘查找(不考虑查询缓存);但是对于更新操作的话还需要用到日志来辅助

日志的作用:1、数据恢复需要用到binlog

      2、数据库重启后需要redo log来保证数据的可靠,会出现数据还没写入磁盘服务器异常重启的情况

一、redo log(重做log)

由于直接更新磁盘响应较慢,所以引入了redo log,除了解决这个问题外它还能保证crash-safe

redo log 是InnoDB特有的,他可以保证crash-safe(即数据库发生异常重启,之前提交的数据都不会丢失),因为提交记录都被保存在redo log中,重启之后仍然会将redo log中的提交记录刷新到磁盘

redo log大小是固定的,更新操作时并不会先直接更新磁盘中的数据,而是先将更新操作记录在redo log中,然后再更新内存中的数据,当数据库空闲时再将redo log中的记录刷新到数据库,如果数据库一直不空闲当redo log日志满了后数据库会先暂停其他的操作,先将redo log中的记录刷新到磁盘,这时会出现查询缓慢的情况(sql抖动)

二、binlog(归档日志)

binlog时mysql自带的,作用于service层,binlog的大小是可设置的,他的大小跟数据备份的周期相关,因为数据恢复需要用到上一次的数据库备份与备份时间到误操作前时间的binlog,除了数据恢复外扩容也需要用到binlog日志

Binlog有两种模式,statement 模式的话是记sql语句, row模式会记录行的内容,记两条,更新前和更新后都有

两者的不同:

一、redo log是InnoDB特有的 binlog是mysql自带的,任何存储引擎都可以使用

二、redo log记录的是修改操作,binlog记录的是逻辑

三、数据库会自动对redo log做处理,会将里面的记录同步到磁盘,而binlog不会被自动处理

为了保证redo log和binlog的数据一致采用了两阶段提交,两阶段提交的流程:

用update table1 set c=c+1 where id =1来看

1、执行器先请求存储引擎id=1的c字段的值,如果内存中存在c的值则直接返回,否则存储引擎会去读磁盘

2、执行器将age的值加1,请求存储引擎将设置c的值

3、存储引擎将该操作记录到redo log 文件中,将redo log的状态设置为prepare状态,然后告知执行器施行完成

4、执行器收到消息后将该操作写入binlog日志中,并将binlog写入磁盘

5、执行器调用存储引擎的提交事务接口,存储引擎将redo log的状态设置为commit状态,更新完成

深色为执行器的操作,浅色为存储引擎的操作

一些问题:

一、为什么需要保证两个日志的一致性

因为如果两个日志不一致的话只能说明某些操作被误记录或者没被记录,那数据恢复时数据肯定就会有问题,数据库扩容也会有问题。

需要考虑的问题,本篇只解释了部分问题

1. redo log为什么会存在.

3. redo log 为什么可以保证crash safe机制.
4. binlog的概念是什么, 起到什么作用, 可以做crash safe吗? 
5. binlog和redolog的不同点有哪些?

7. 执行器和innoDB在执行update语句时候的流程是什么样的?
8. 如果数据库误操作, 如何执行数据恢复?
9. 什么是两阶段提交, 为什么需要两阶段提交, 两阶段提交怎么保证数据库中两份日志间的逻辑一致性(什么叫逻辑一致性)?
10. 如果不是两阶段提交, 先写redo log和先写bin log两种情况各会遇到什么问题?

原文地址:https://www.cnblogs.com/zhaolei1996/p/12222402.html

时间: 2024-10-01 07:33:14

mysql日志redo log 和binlog的相关文章

MYSQL INNODB的REDO LOG与BINLOG的区别

MYSQL INNDODB的REDO LOG与BINLOG从表面上看来是非常相似的.然而本质上有很大的区别: 第一:REDO LOG是在INNODB存储引擎层产生,而BINLOG是MYSQL数据库的上层产生的,并且二进制日志不仅仅针对INNODB存储引擎,MYSQL数据库中的任何存储引擎对于数据库的更改都会产生二进制日志. 第二:两种日志记录的内容形式不同.MYSQL的BINLOG是逻辑日志,其记录是对应的SQL语句.而INNODB存储引擎层面的重做日志是物理日志. 第三:两种日志与记录写入磁盘

MySQL的redo log结构和SQL Server的log结构对比

MySQL的redo log结构和SQL Server的log结构对比 innodb 存储引擎 mysql技术内幕 f 1 f 2 f 3 f 4 f 5 f 6 f 7 f sqlserver http://www.cnblogs.com/CareySon/p/3308926.html 事务对数据库中每次修改都会分解成多个多个原子层级的条目被记录到持久存储中,这些条目就是所谓的日志记录(Log Record),我们可以通过fn_dblog来查看这些条目.如图2所示. 图2.Fn_dblog 每

mysql物理日志redo log和逻辑日志 binlog

1.redo log(InnoDB引擎特有的日志)1.1.有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe.具体来说,当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log里面,并更新内存,这个时候更新就算完成了.同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做1.2.innodb_flush_log_at_trx_commit

MySQL的日志(二):事务日志(redo log和undo log)

本文目录:1.redo log 1.1 redo log和二进制日志的区别 1.2 redo log的基本概念 1.3 日志块(log block) 1.4 log group和redo log file 1.5 redo log的格式 1.6 日志刷盘的规则 1.7 数据页刷盘的规则及checkpoint 1.8 LSN超详细分析 1.9 InnoDB的恢复行为 1.10 和redo log相关的变量2.undo log 2.1 undo log的基本概念 2.2 undo log的存储方式

MySQL-重做日志 redo log -原理

[redo log buffer][redo log file]-原理 目录: 1.重做日志写入过程图 2.相关知识点汇总图 3.redo_log_buffer 原理 4.redo_log_file 原理 1. 重做日志写入过程: 2. 相关知识点汇总: 3. redo log buffer 原理 重做日志缓冲(redo log buffer)是Innodb存储引擎的内存区域中的一部分. [重做日志信息--(1)-->redo log buffer--(2)-->重做日志文件] 在(2)中涉及

MySQL InnoDB redo Log 浅析

MySQL的InnoDB存储引引擎的物理文件存储体系中,除了实际的数据文件(ibd, ibdata)之外,还有两个非常重要的日志系统,分别是redo日志和undo日志. 跟Oracle类似, redo log记录了对实际数据文件的物理变更(数据文件的什么位置数据做了如何的变更).InnoDB也是采用了WAL(日志优先落盘),也就是说在实际数据文件的修改落盘之前redo日志已经落盘,从而来保证事务的持久性.Undo日志用来保证事务的原子性和MVCC,所有的undo操作产身的数据文件的变更也会记录到

MySQL 中Redo与Binlog顺序一致性问题 【转】

首先,我们知道在MySQL中,二进制日志是server层的,主要用来做主从复制和即时点恢复时使用的.而事务日志(redo log)是InnoDB存储引擎层的,用来保证事务安全的.现在我们来讨论一下MySQL主从复制过程中的一些细节问题,有关于主从复制可以看具体的章节. 在了解了以上基础的内容后,我们可以带着以下的几个问题去学习复制到底是怎样工作的. 为什么MySQL有binlog,还有redo log? 事务是如何提交的?事务提交先写binlog还是redo log?如何保证这两部分的日志做到顺

MySQL 中Redo与Binlog顺序一致性问题

首先,我们知道在MySQL中,二进制日志是server层的,主要用来做主从复制和即时点恢复时使用的.而事务日志(redo log)是InnoDB存储引擎层的,用来保证事务安全的.现在我们来讨论一下MySQL主从复制过程中的一些细节问题,有关于主从复制可以看具体的章节. 在了解了以上基础的内容后,我们可以带着以下的几个问题去学习复制到底是怎样工作的. 为什么MySQL有binlog,还有redo log? 事务是如何提交的?事务提交先写binlog还是redo log?如何保证这两部分的日志做到顺

mysql中redo和binlog的区别

影响MySQL中redo的配置参数: innodb_log_file_size:指定每个redo日志大小,默认值48MB innodb_log_files_in_group:指定日志文件组中redo日志文件数量,默认为2 innodb_log_group_home_dir:指定日志文件组所在路劲,默认值./,指mysql的数据目录datadir 查看innodb配置: mysql> show variables like 'innodb%log%'; +---------------------