Ⅰ、事务的实现

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

特性 实现
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

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

  1. mysql重做日志

    一.重做日志(redo log) 1.作用 确保事务的持久性. 防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性. 2 ...

  2. MySQL的日志相关内容

    本篇文章介绍一下mysql的备份和日志,由于备份时需要用到日志,所以在讲备份前,如果日志内容篇幅过长,将会把日志和备份分开单独来讲,先简单介绍一下mysql的日志相关内容. MySQL日志 日志是my ...

  3. MySQL 重做日志文件

    一.innodb log的基础知识 · innodb log顾名思义:即innodb存储引擎产生的日志,也可以称为重做日志文件,默认在innodb_data_home_dir下面有两个文件ib_log ...

  4. 设置MySQL重做日志大小

    什么是InnoDB事务日志 你有没有在文本编辑器中使用过撤消或重做的功能,想像一下编辑器在那种场景下的操作?我确信你应该使用过.你相信吗?事务型数据库有同样的功能.可能不完全一样,但原理是相同的. 就 ...

  5. MySQL重做日志(redo log)

    前面介绍了三种日志:error log.slow log.binlog,这三种都是 Server 层的.今天的 redo log 是 InnoDB引擎专有的日志文件. 为什么要有 redo log 用 ...

  6. MySQL二进制日志总结

    二进制日志简单介绍 MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句.二进制日志(binary log)中记录了对MySQL数据 ...

  7. MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结

    MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...

  8. MySQL各类日志文件相关变量介绍

    文章转自:http://www.ywnds.com/?p=3721 MySQL各类日志文件相关变量介绍 查询所有日志的变量   1 mysql> show global variables li ...

  9. mysql慢查询日志相关参数

    -- mysql慢查询日志相关参数 -- 慢查询日志时间 show variables like "long_query_time"; -- 将时间设置为2s ; -- 是否开启慢 ...

随机推荐

  1. ajax接口和后台交互

    //定义一个公众处理ajax的方法 function handelAjax(url,method,parm,callback) { $.ajax({ url:url, type:method, dat ...

  2. appium安装完成后运行和执行python脚本的错误合集

    1.第一个错误如下: main.js: error: argument "--app": Expected one argument. null 这个一般是appium服务端安装的 ...

  3. Django--文件上传和下载,自测试可用

    html <div class="form-group col-sm-offset-2 col-sm-10"> <label for="exampleI ...

  4. python 多环境共存 基础

    正在学习python 使用的是3.3 但是由于种种原因吧 还得使用python2.7 所以记录一下 如何安装2个版本 假设 在windows 下面安装的python 版本 和路径 如下 python ...

  5. 多线程读者写者问题--用QT实现

    先把代码贴上来,有时间再整理吧..因为工作中用Qt,所以用Qt实现的....刚上班,,忙! 三种方法,读者优先,写者优先和公平竞争.. 读者优先 #include <QCoreApplicati ...

  6. 西门子PLC SCL语言开发学习笔记(二)

    今天来讲下scl两个关键的点 一.按键事件 比如地址I0.0是某个按钮的状态,他只有True和False两个状态,所以我们要获得按下事件需要我们自己模拟. #KeyPress := "Btn ...

  7. [NOI 2017]整数

    Description 题库链接 P 博士将他的计算任务抽象为对一个整数的操作. 具体来说,有一个整数 \(x\) ,一开始为 \(0\) . 接下来有 \(n\) 个操作,每个操作都是以下两种类型中 ...

  8. MySQL常用的备份方式与备份工具简介

    一.MySQL备份方式与备份类型 1.备份的必要性 再生产环境中,为了防止硬件故障.软件故障.自然灾害.误操作等各种原因导致的数据库数据丢失后能恢复到事故之前的状态,我们需要对数据库进行备份和恢复操作 ...

  9. T-SQL :TOP和OFFSET-FETCH筛选 (五)

    通过were和having条件可以对数据进行筛选,那么如何通过排序对数据进行筛选呢? 1.TOP筛选 用于限制查询返回行数或者行数的百分比. 例如 我们对订单表筛选最近产生的订单5条 ) orderi ...

  10. 控制台安装跟检测Microsoft.Net Framework

    1.检测 每一个版本的.Net Framework的安装过程都会在Windows目录下的\Microsoft.NET\Framework目录中生成一个子目录(安装目录). 比如说,假设Windows目 ...