一、Redo Log日志
mysql中事务涉及到的日志主要有
(1)Redo. Log
(2)Undo Log
(3)Bin Log
今天主要介绍Redo Log日志。在Mysql中事务的原子性和持久性是由Redo Log实现的。Redo Log也被叫做是重做日志,是在数据库执行引擎Innodb中产生的日志,用来保证数据库事务的持久性和原子性,进而保证事务要么全部成功,要么回滚。Redo log记录的主要是物理日志,也就是对磁盘上的数据修改的操作,Redo Log用来恢复提交后的物理数据页。
Redo Log主要包含两部分,一部分是内存中的Redo Log Buffer,随着服务器的宕机,这部分数据容易丢失,另外一部分是存放在磁盘上的文件Redo Log file。在Mysql发生故障,服务停掉的时候,为了尽量避免内存中的脏数据写入到磁盘文件中的ibd文件中,在重启mysql的时候,可将已经提交,但是还没来得及写入到磁盘文件的数据恢复到内存中,从而对提交的数据做持久化操作。
例如,在上图中表示用户下单后,提交订单记录,mysql将数据写入到Redo Log Buffer中,Redo Log Buffer将数据通过刷盘机制,写入到Redo log中,持久化到磁盘文件。当MySQL发生故障的时候,通过Redo log将数据进行恢复,然后持久化到磁盘文件。
二、Redo Log 刷盘规则
Mysql执行引擎中,通过提交事务强制写日志来实现事务的持久化。Innodb为了保证事务提交时,默认每次将Redo Log的 Redo Log Buffer的日志调用操作系统的fysnc函数来写入到磁盘文件中。因为Mysql进程和其占用的内存都工作在操作系统的用户空间中,所以Mysql的Redo Log也工作在操作系统的用户空间中。默认情况下,如果要将mysql的Redo Log Buffer持久化到操作系统的磁盘文件中,还要通过操作系统的内核缓冲区(OS Buffer)。
在innodb存储引擎中,redo Log主要有如下的几种刷盘机制:
(1)开启事务,当提交事务指令发出的时候,是否需要刷新日志,由innodb的innodb_flush_log_at_trx_commit参数决定。
(2)刷新日志的频率由innodb_flush_log_at_timeout参数决定,默认是每秒刷新一次。
(3)当OS Buffer中的内存使用超过一半的时候,也会触发刷盘机制。
当事务提交的时候,innodb不是立刻将 Log Buffer中的数据写入到OS Buffer中的。而是根据一定的规则写入的,从而保证数据的原子性和持久性。刷盘规则的控制由变量 innodb_flush_log_at_trx_commit变量控制,值有0,1,2,下面分别展开叙述。
(1)当innodb_flush_log_at_trx_commit=0的时候,每次提交事务,不会将Log buffer中的内容写入到OS Buffer,而是维护一个单独的线程,每秒写入OS Buffert,并调用操作系统的fysnc函数将 OS Buffer中的数据写入到磁盘。
(2)当innodb_flush_log_at_trx_commit=1,每次提交事务,会把log Buffer中的数写入到OS Buffer 然后调用fysnc函数,写入到Redo Log。如果没有设置nnodb_flush_log_at_trx_commit的值,默认是1,性能较差。
(3)当innodb_flush_log_at_trx_commit=2,每次提交事务,将数据写入到OS Buffer中然后以每秒调用系统fysnc函数将数据写入到Redo Log。