MySQL重做日志相关

Ⅰ、事务的实现

这里我们先抛出答案,通过答案再展开分析

特性 实现
A(原子性) redo
C(一致性) undo
I(隔离性) lock
D(持久性) redo/undo

本节针对redo展开分析

Ⅱ、redo详解

2.1 redo log buffer

  • redo就是我们常说的重做日志,用来实现持久性
  • mysql目录下两个ib_logfile文件,就是重做日志文件,在ssd场景下至少设置为4G
  • redo log里面记录的是每个page修改操作的物理逻辑日志(不是完全的二进制的差异值,比如一个sql修改了一千万行,一千万个page被修改了,那记录的是1000w page的变化,而不是sql语句)

redo由redo log buffer和redo log file组成,重做日志先写入一块内存,再定期刷新到磁盘

先看下redo log buffer

它由很多个log block组成,每个log block 512个字节,不需要doublewrite

innodb_log_buffer_size    8M即可,不需要太大,一秒钟写满8M不太可能

redo log刷盘的条件

①master thread    每秒从内存刷到磁盘
  5.6版本后,增加innodb_flush_log_at_timeout参数,可以设置刷新间隔,默认为1,调大一点可减少io,提升性能,但不建议

②redo log buffer  使用大于1/2也会刷

③事务提交时进行刷新,即使上面两个条件不满足(事务持久性的要求)
  innodb_flush_log_at_trx_commit={0|1|2},默认为1,事务提交时将redo log buffer写到磁盘(即使上面两个条件不满足,这样crash了就还可以通过redo恢复),只有是1的时候innodb才能真正达到持久性的标准
  事务对page做了修改,提交的时候并不需要保证赃页刷到磁盘,只需要保证将对应修改的日志刷过去就可以了
  0表示交给master thread每秒刷新,事务提交不将redo log buffer刷到磁盘,最多会丢失1s的事务
  2表示事务提交时仅将redo log buffer写到操作系统缓存,所以mysql重启,只要操作系统没重启,那数据还是在的额

2.2 redo log file

先弄个图看看redo buffer刷盘吧

每个ib_logfile都分为很多个512bits的块,最前头2k是留出来写checkpoint的,通过对比两个cp可知哪个是最新的,cp1和cp2轮询写确保cp不会坏掉,一个坏了也没事,即使用小的cp顶多就是恢复的时候多一点时间,没有oracle的归档

优点: 这样做的好处是不需要归档,少了IO操作
缺点: 如果redo_log_file太小则可能需要等待,因为当要覆盖log_file中的log_block时,如果该log_block中的脏页还没有进行刷新的话,则需要等待这个脏页进行刷新
所以需要把redo log file设置的尽可能的大

redo日志分类

物理日志:记录整个page的变化(diff)

逻辑日志:Like SQL语句

物理逻辑日志:根据page进行记录,内容逻辑

redo log file与redo log buffer内容一致

+---------------+----------+---------+---------------+
| redo_log_type | space no | page no | redo log body |
+---------------+----------+---------+---------------+
#  redo log 类型  表空间号     页号    redo log 内容
MLOG_REC_INSERT
+------+--------+------+---------+------------+-------+---------+-----------+----------+
| type | space  | page | cur_rec | len &      | info  | origin  | mis_match | rec body |
|      |   no   |  no  | _offset | extra_info | _bits | _offset | _index    |          |
+------+--------+------+---------+------------+-------+---------+-----------+----------+
MLOG_REC_DELETE
+------+----------+---------+--------+
| type | space no | page no | offset |
+------+----------+---------+--------+

rec body根据page的变化来记录,而不是根据操作SQL来记录,所以偏物理日志
因为还记录了redo log body,一个具体操作,所以又叫逻辑

每种不同类型的redo log的内在格式可能长得不一样

相关参数

innodb_log_file_size 单个redo文件大小(推荐8G,官方推荐等于bp)
  之前不建议调大因为有bug,如果调大,恢复速度会很慢O(N^2)
  5.5版本的redo文件总大小(num * size)最大只能4G
  5.6之后限制未512G,调大后唯一的问题就是恢复的内容变多了
  5.6之后,正常关闭MySQL,然后调整该值,会自动调整文件大小
innodb_log_files_in_group
innodb_log_group_home_dir 和数据文件分开,选择更快的磁盘

分类: MySQL

原文地址:https://www.cnblogs.com/DataArt/p/10236644.html

时间: 2024-10-14 11:56:05

MySQL重做日志相关的相关文章

Mysql 重做日志及与二进制日志的区别

Mysql 重做日志及与二进制日志的区别(转http://blog.uouo123.com/post/623.html) Mysql默认情况下会有两个文件:ib_logfile0和ib_logfile1,这两个文件就是重做日志文件,或者事务日志. 重做日志的目的:万一实例或者介质失败,重做日志文件就能派上用场. 每个InnoDB存储引擎至少有一个重做日志文件组,每个文件组下至少有2个重做日志文件,如默认的ib_logfile0.ib_logfile1.InnoDB存储引擎先写重做日志文件1,当达

MySQL 重做日志文件

一.innodb log的基础知识 · innodb log顾名思义:即innodb存储引擎产生的日志,也可以称为重做日志文件,默认在innodb_data_home_dir下面有两个文件ib_logfile0和ib_logfile1.MySQL官方手册中将这两个文件叫文InnoDB存储引擎的日志文件: · innodb log的作用:当MySQL的实例和介质失败的时候,Innodb存储引擎就会使用innodb log文件进行恢复,保证数据库的完整性: · innodb log的写原理:(请容许

MySQL二进制日志总结

二进制日志简单介绍 MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句.二进制日志(binary log)中记录了对MySQL数据库执行更改的所有操作,并且记录了语句发生时间.执行时长.操作数据等其它额外信息,但是它不记录SELECT.SHOW等那些不修改数据的SQL语句.二进制日志(binary log)主要用于数据库恢复和主从复制,以及审计(audit)操作. 官方文档关于二进制日志(binary log)的介绍如下: T

联机重做日志文件 (转)

文章转自:http://www.cnblogs.com/kerrycode/archive/2012/08/09/2631035.html 联机日志文件又叫重做日志文件,记录了对数据库修改的信息,包括用户对数据修改和数据库管理员对数据库结构的修改.它主要用于在发生故障的时候和数据库备份文件配合恢复数据库,一般发生故障有2个情况:一个是介质损坏另外一个是用户误操作.每个数据库至少有两个日志文件组,每组至少包含1个或者多个日志成员,这里要多个日志成员的原因是防止日志文件组内某个日志文件损坏后及时提供

修改重做日志文件(redo log)大小

重做日志相关数据字典 1.v$log  记录数据库中有多少个重做日志组,每个组中有多少个成员.日志大小及状态 2.v$logfile 记录着每个日志组成员的属性.文件路径.文件名.状态等 操作步骤 1.查看现有日志组及重做文件大小 SQL> select group#,sequence#,bytes/1024/1024 sizeMB,members,status from v$log; GROUP# SEQUENCE# SIZEMB MEMBERS STATUS ---------- -----

MySQL系列:innodb源码分析之重做日志结构

在innodb的引擎实现中,为了实现事务的持久性,构建了重做日志系统.重做日志由两部分组成:内存日志缓冲区(redo log buffer)和重做日志文件.这样设计的目的显而易见,日志缓冲区是为了加快写日志的速度,而重做日志文件为日志数据提供持久化的作用.在innodb的重做日志系统中,为了更好实现日志的易恢复性.安全性和持久化性,引入了以下几个概念:LSN.log block.日志文件组.checkpoint和归档日志.以下我们分别一一来进行分析. 1.LSN 在innodb中的重做日志系统中

mysql数据库中 二进制日志与重做日志的差别

首先:二进制日志会记录所有与mysql有关的日志记录,包括innodb myisam heap等其他引擎的日志.而innodb引擎的重做日志只记录与其有关的事务日志. 其次:记录的内容不同,不管你将二进制日志文件的格式设为statement 还是 row,又或者是mixed,其记录的都是关于一个事物的具体操作内容.而innodb存储引擎的重做日志文         件记录的关于每个页(page)的更改的屋里情况. 此外,写入的时间不同,二进制日志文件是在事物提交前进行记录的,而事物进行的过程中,

MySQL二进制日志(binary log)总结

本文出处:http://www.cnblogs.com/wy123/p/7182356.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 今天无意中发现了一个云栖社区举行的MySQL“第一季:挑战玄惭之 慢SQL性能优化赛”,在测试服务器上执行其测试脚本写入数据的时候报错提示如下,Multi-statement transaction required more than 'max_binlog_cache_

日志相关的服务器参数详解:

expire_logs_days={0..99} 设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除.默认为0,表示不启用过期自动删除功能.如果启用此功能,自动删除工作通常发生在MySQL启动时或FLUSH日志时.作用范围为全局,可用于配置文件,属动态变量. general_log={ON|OFF} 设定是否启用查询日志,默认值为取决于在启动mysqld时是否使用了--general_log选项.如若启用此项,其输出位置则由--log_output选项进行定义,如果log_outp