一、重做日志(redo log)

1、作用

确保事务的持久性。

防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。

2、内容

物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。

3、什么时候产生

事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。

4、什么时候释放

当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。

5、对应的物理文件

默认情况下,对应的物理文件位于数据库的data目录下的ib_logfile1&ib_logfile2

innodb_log_group_home_dir 指定日志文件组所在的路径,默认./ ,表示在数据库的数据目录下。

innodb_log_files_in_group 指定重做日志文件组中文件的数量,默认2

关于文件的大小和数量,由一下两个参数配置

innodb_log_file_size 重做日志文件的大小。

innodb_mirrored_log_groups 指定了日志镜像文件组的数量,默认1

6、其他

很重要一点,redo log是什么时候写盘的?前面说了是在事物开始之后逐步写盘的。

之所以说重做日志是在事务开始之后逐步写入重做日志文件,而不一定是事务提交才写入重做日志缓存,

原因就是,重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M(这里设置的16M),Innodb存储引擎先将重做日志写入innodb_log_buffer中。

然后会通过以下三种方式将innodb日志缓冲区的日志刷新到磁盘

1,Master Thread 每秒一次执行刷新Innodb_log_buffer到重做日志文件。

2,每个事务提交时会将重做日志刷新到重做日志文件。

3,当重做日志缓存可用空间 少于一半时,重做日志缓存被刷新到重做日志文件

由此可以看出,重做日志通过不止一种方式写入到磁盘,尤其是对于第一种方式,Innodb_log_buffer到重做日志文件是Master Thread线程的定时任务。

因此重做日志的写盘,并不一定是随着事务的提交才写入重做日志文件的,而是随着事务的开始,逐步开始的。

另外引用《MySQL技术内幕 Innodb 存储引擎》(page37)上的原话:

即使某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件。

这一点是必须要知道的,因为这可以很好地解释再大的事务的提交(commit)的时间也是很短暂的。

###############################################################################

MySQL重做日志恢复数据的流程:

1.当MySQL启动的时候,先会从数据库文件中读取出上次保存最大的LSN。

2.然后调用recv_recovery_from_checkpoint_start,并将最大的LSN作为参数传入函数当中。

3.函数会先最近建立checkpoint的日志组,并读取出对应的checkpoint信息。

4.通过checkpoint lsn和传入的最大LSN进行比较,如果相等,不进行日志恢复数据,如果不相等,进行日志恢复。

5.在启动恢复之前,先会同步各个日志组的archive归档状态。

6.在开始恢复时,先会从日志文件中读取2M的日志数据到log_sys->buf,然后对这2M的数据进行scan,校验其合法性,而后将去掉block header的日志放入recv_sys->buf当中,这个过程称为scan,会改变scanned lsn.

7.在对2M的日志数据scan后,innodb会对日志进行mtr操作解析,并执行相关的mtr函数。如果mtr合法,会将对应的记录数据按space page_no作为KEY存入recv_sys->addr_hash当中。

8.当对scan的日志数据进行mtr解析后,innodb对会调用recv_apply_hashed_log_recs对整个recv_sys->addr_hash进行扫描,并按照日志相对应的操作进行对应page的数据恢复。这个过程会改变recovered_lsn。

9.如果完成第8步后,会再次从日志组文件中读取2M数据,跳到步骤6继续相对应的处理,直到日志文件没有需要恢复的日志数据。

10.innodb在恢复完成日志文件中的数据后,会调用recv_recovery_from_checkpoint_finish结束日志恢复操作,主要是释放一些开辟的内存。并进行事务和binlog的处理。

上述过程的示意图如下:

恢复日志主要的接口函数:

recv_recovery_from_checkpoint_start    从重做日志组内的最近的checkpoint开始恢复数据

recv_recovery_from_checkpoint_finish  结束从重做日志组内的checkpoint的数据恢复操作

recv_recovery_from_archive_start           从归档日志文件中进行数据恢复

recv_recovery_from_archive_finish         结束从归档日志中的数据恢复操作

recv_reset_logs                  截取重做日志最后一段作为新的重做日志的起始位置,可能会丢失数据。

mysql增加重做日志组_mysql重做日志相关推荐

  1. mysql 重做日志 镜像_MySQL重做日志

    MySQL重做日志 故障的类型 事物内部故障 系统故障 介质故障 计算机病毒 日志类型 redo log(重做日志) 处理系统故障 undo log 处理事务故障 (回滚) 重做日志 用来实现事物的持 ...

  2. oracle rac alter日志,ORACLE 11G RAC 增加日志组及增大日志文件

    1.查看目前日志组和日志文件情况 SQL> select * from v$logfile order by 1; GROUP# STATUS  TYPE    MEMBER           ...

  3. mysql 重做日志 镜像_mysql重做日志 - osc_vr7hvjd2的个人空间 - OSCHINA - 中文开源技术交流社区...

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

  4. mysql重做日志文件_MySQL 重做日志文件

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

  5. mysql二进制日志管理_MYSQL二进制日志管理脚本

    MYSQL二进制日志管理脚本脚本原理是每小时对进行flush生成新的二进制日志,将二进制日志备份至NFS,并压缩存放:#!/bin/bash#Purpose:管理二进制日志,每小时刷新二进制日志,并将 ...

  6. linux中mysql数据库启用日志记录_MYSQL启用日志,和查看日志

    mysql有以下几种日志: 错误日志:     -log-err 查询日志:     -log 慢查询日志:   -log-slow-queries 更新日志:     -log-update 二进制 ...

  7. 开启mysql日志记录_Mysql开启日志记录

    vim /etc/my.conf.d/server.cnf: #lower_case_tables_name = 1 #错误日志 log_error = /var/log/mysql_error.lo ...

  8. mysql二进制日志特点_MySQL二进制日志分析-概述篇

    MySQL从3.23版本开始引入了二进制日志,用于的数据复制, 二进制日志根据MySQL的版本不同,目前有4个版本: https://dev.mysql.com/doc/internals/en/bi ...

  9. wdcp mysql日志文_mysql的日志简单总结

    事务日志 redo log mysql的innodb引擎在开启事务后,中间的操作都会先在内存中进行.然后将这些数据先写入到redo log中--"日志先行"(Write-Ahead ...

最新文章

  1. 12 种方式轻松实现 Ruby 调用
  2. ORACLE 11g 使用ROWNUM完美解决ORA-00600:内部错误代码
  3. (chap4 IP协议) 多播和子网掩码
  4. ClickHouse设置用户名密码
  5. 如何使用Windows搜索在任何文件中搜索文本
  6. MongoDB 字段拼接 $concat(aggregation)
  7. 从离散值中把值相近的放在一起
  8. EasyInvoice 简介
  9. python人工智能文字识别_Python人工智能之图片识别,Python3一行代码实现图片文字识别...
  10. mysql 编译安装详解_MySQL编译安装详解
  11. 大数据分析项目生命周期
  12. 学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习
  13. html双击变成可编辑状态,JS实现双击编辑可修改状态的方法
  14. Android Studio中对res、AndroidManifest、buil.gradle文件夹的讲解
  15. Android工程师进阶34讲学习笔记
  16. 驱动篇 -- PMOS管应用
  17. 逃离迷宫的路径(打印路径)
  18. 关闭联通游戏代扣费的功能
  19. python3的变量和数据类型
  20. 低压差稳压器--AMS1117芯片简介 结构

热门文章

  1. css修改方框内容,CSS改变checkbox的方框及对勾的粗细
  2. ReactNative连接android模拟器
  3. TApplicaiton.ProcessMessages不能在非主线程使用
  4. 微信多订单合并付款_拼多多只能微信支付吗?拼多多合并支付有什么优势?
  5. 我劝你不要再留QQ邮箱了
  6. 医院pacs系统服务器配置,浪潮为千佛山医院PACS系统开“药方”
  7. mysql insert 1062_mysql insert error 1062
  8. 不要使用容易被误解的名字
  9. 0xc0000225无法进系统_Win10无法开机0xc0000225错误代码解决方法
  10. [SL] Silverlight + WCF Demo项目