MySQL中有六种日志文件,别离是:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)。
个中重做日志和回滚日志与事务操纵息息相关,二进制日志也与事务操纵有必然的干系,这三种日志,对领略MySQL中的事务操纵有着重要的意义。
这里简朴总结一下这三者具有必然相关性的日志。
重做日志(redo log)
浸染:
确保事务的耐久性。
防备在产生妨碍的时间点,另有脏页未写入磁盘,在重启mysql处事的时候,按照redo log举办重做,从而到达事务的耐久性这一特性。
内容:
物理名目标日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。
什么时候发生:
事务开始之后就发生redo log,redo log的落盘并不是跟着事务的提交才写入的,而是在事务的执行进程中,便开始写入redo log文件中。
什么时候释放:
当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被包围)。
对应的物理文件:
默认环境下,对应的物理文件位于数据库的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
其他:
很重要一点,redo log是什么时候写盘的?前面说了是在事物开始之后慢慢写盘的。
之所以说重做日志是在事务开始之后慢慢写入重做日志文件,而不必然是事务提交才写入重做日志缓存,
原因就是,重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认巨细为8M(这里配置的16M),Innodb存储引擎先将重做日志写入innodb_log_buffer中。
昆山软件开拓 的binlog举办重播" src="http://www.importnew.com/https:/images2017.cnblogs.com/blog/380271/201801/380271-20180128095300756-752816619.png" />
然后会通过以下三种方法将innodb日志缓冲区的日志刷新到磁盘
1,Master Thread 每秒一次执行刷新Innodb_log_buffer到重做日志文件。
2,每个事务提交时会将重做日志刷新到重做日志文件。
3,当重做日志缓存可用空间 少于一半时,重做日志缓存被刷新到重做日志文件
由此可以看出,重做日志通过不止一种方法写入到磁盘,尤其是对付第一种方法,Innodb_log_buffer到重做日志文件是Master Thread线程的按时任务。
因此重做日志的写盘,并不必然是跟着事务的提交才写入重做日志文件的,而是跟着事务的开始,慢慢开始的。
别的引用《MySQL技能黑幕 Innodb 存储引擎》(page37)上的原话:
纵然某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件。
这一点是必需要知道的,因为这可以很好地表明再大的事务的提交(commit)的时间也是很短暂的。
回滚日志(undo log)
浸染:
生存了事务产生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发节制下的读(MVCC),也即非锁定读
内容:
逻辑名目标日志,在执行undo的时候,仅仅是将数据从逻辑上规复至事务之前的状态,而不是从物理页面上操纵实现的,这一点是差异于redo log的。
什么时候发生:
事务开始之前,将当前是的版本生成undo log,undo 也会发生 redo 来担保undo log的靠得住性
什么时候释放:
当事务提交之后,undo log并不能立马被删除,
而是放入待清理的链表,由purge线程判定是否由其他事务在利用undo段中表的上一个事务之前的版本信息,抉择是否可以清理undo log的日志空间。
对应的物理文件:
MySQL5.6之前,undo表空间位于共享表空间的回滚段中,共享表空间的默认的名称是ibdata,位于数据文件目次中。
MySQL5.6之后,undo表空间可以设置成独立的文件,可是提前需要在设置文件中设置,完成数据库初始化后生效且不行改变undo log文件的个数
假如初始化数据库之前没有举办相关设置,那么就无法设置成独立的表空间了。
关于MySQL5.7之后的独立undo 表空间设置参数如下
innodb_undo_directory = /data/undospace/ –undo独立表空间的存放目次
innodb_undo_logs = 128 –回滚段为128KB
innodb_undo_tablespaces = 4 –指定有4个undo log文件