mysql redo log

本文介绍了MySQL InnoDB引擎的redo log,它是数据库系统和直接写文件系统的主要区别。redo log用于在崩溃恢复期间修正未完成事务的数据。讨论了innodb_flush_log_at_trx_commit参数的三种模式,分别对应不同的数据安全性和性能权衡。还涵盖了redo log的写盘情况、循环写入、文件结构以及与Mini Transaction(MTR)的关系。
摘要由CSDN通过智能技术生成

学习笔记,mtr章节的学习见最后阿里月报。

REDO LOG

首先需要了解的是:redo log是数据库系统和直接写文件系统管理数据的最根本的区别

The redo log is a disk-based data structure used during crash recovery to correct data written by incomplete transactions.
默认的redo log 是在mysql 安装路径,文件名称像ib_logfile0 and ib_logfile1.他和oracle 一样也是循环的写的。通过LSN顺序的写日志。
redo log 是 InnoDB 引擎特有的

大多数关系型数据库一样,InnoDB记录了对数据文件的物理更改,并保证总是日志先行,也就是所谓的WAL (Write-Ahead Logging)是一种实现事务日志的标准方法

在5.5之前最大不能大于4G,5.6.3. 后最大可以是512G

mysql> show variables like 'innodb_log_file_size';
+----------------------+------------+
| Variable_name        | Value      |
+----------------------+------------+
| innodb_log_file_size | 2147483648 |
+----------------------+------------+
1 row in set (0.01 sec)

mysql> show variables like 'innodb_log_files_in';
Empty set (0.00 sec)

mysql> show variables like 'innodb_log_files_in%';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_files_in_group | 3     |
+---------------------------+-------+

这几个都不是动态的参数,需要重启。2是innodb_log_files_in_group默认值,最大是100

写redo的过程

redo在mysql 的有三种状态:

1.在redolog buffer中,这其实在mysql 内存中,类似oracle 的log buffer
2.写到了磁盘,但是没有刷盘,其实就是在文件系统的page cache中
3.刷盘,持久化到磁盘

这个redo log写入策略,InnoDB提供了 innodb_flush_log_at_trx_commit参数来控制,这也是innodb引擎最重要的参数之一。

innodb_flush_log_at_trx_commit说明

具体描述见手册

对应的值有 0,1,2

1是最安全的,每次事物提交的时候都会把redo log 直接持久化到磁盘
2每次事物commit的时候只是吧redo log wirte即写入到page cache ,但是持久化到磁盘是每一秒一次。
0日志是每秒执行一次,commit时没有及时写入磁盘。

上面的3种情况:

安全性从0->2->1递增,分别对应于mysqld 进程crash可能丢失 -> OS crash可能丢失 -> 事务安全

即0的时候DBcrash会丢失数据,2的情况下 主机 crash会丢失在文件系统page cache的事务,1的时候能确保事物安全。oracle相当于1的情况。

一般交易系统建议双1模式,如果再特殊活动和业务高峰期有性能问题,可以修改为2,不建议使用0
Redo 写盘的情况
redo log buffer空间不足
事物提交
mater 进程 1秒
binlog切换
停库
检查点

redo log的循环写

在这里插入图片描述

Redo log文件是循环写入的,在覆盖写之前,总是要保证对应的脏页已经刷到了磁盘。在非常大的负载下,Redo log可能产生的速度非常快,导致频繁的刷脏操作,进而导致性能下降,通常在未做checkpoint的日志超过文件总大小的76%之后,InnoDB 认为这可能是个不安全的点,会强制的preflush脏页,导致大量用户线程wait

redo的文件结构

日志文件的前2048字节是存放管理日志内容及整个数据库的状态,2k后面就是普通存放日志的文件。(5.6和5.7版本会有些差)

主要字段有:

  1. LOG_GROUP_ID 这个log文件所属的日志组,占用4个字节,当前都是0;
  2. LOG_FILE_START_LSN 这个log文件记录的开始日志的lsn,占用8个字节;
  3. LOG_FILE_WAS_CRATED_BY_HOT_BACKUP 备份程序所占用的字节数,共占用32字节;
  4. LOG_CHECKPOINT_1/LOG_CHECKPOINT_2 两个记录InnoDB checkpoint信息的字段,分别从文件头的第二个和第四个block开始记录,只使用日志文件组的第一个日志文件。 从地址2KB偏移量开始,其后就是顺序写入的各个日志块(log block)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值