学习笔记,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版本会有些差)
主要字段有:
- LOG_GROUP_ID 这个log文件所属的日志组,占用4个字节,当前都是0;
- LOG_FILE_START_LSN 这个log文件记录的开始日志的lsn,占用8个字节;
- LOG_FILE_WAS_CRATED_BY_HOT_BACKUP 备份程序所占用的字节数,共占用32字节;
- LOG_CHECKPOINT_1/LOG_CHECKPOINT_2 两个记录InnoDB checkpoint信息的字段,分别从文件头的第二个和第四个block开始记录,只使用日志文件组的第一个日志文件。 从地址2KB偏移量开始,其后就是顺序写入的各个日志块(log block)