redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
一、redo buffer缓冲
redo log日志文件是先写入redo buffer缓冲中的,缓冲大小通过innodb_log_buffer_size设置。
① redo日志刷新到磁盘的条件
A ) master thread 每秒进行刷新
B ) redo log buffer 使用大于1/2进行刷新
C ) 事务提交时进行刷新 innodb_flush_log_at_trx_commit表示事务提交时,redo日志刷新到磁盘不同情况的处理。
innodb_flush_log_at_trx_commit = {0|1|2}
变量1表示,当事务提交时,立马进行刷新磁盘
变量0表示,表示只保存到redo buffer中,不进行立马刷新到磁盘
变量2表示,刷新到操作系统的缓存中,等操作系统来刷新到磁盘。不进行立马刷新到磁盘。
上面每次刷新到磁盘,mysql提供了组提交的技术。
组提交:
一次的fsync可以刷新多个事务,提高io性能、
binlog_group_commit_sync_delay 多长时间提交一次fsync刷新事务
binlog_group_commit_sync_no_delay_count 多少个日志提交一次fsync刷新事务
不建议修改这两个参数。
二、redo log 磁盘的相关信息
① innodb_log_file_size 控制磁盘大小变量
② innodb_log_files_in_group 日志文件分成几个
③ innodb_log_group_home_dir 日志文件的位置
redo log记录的是每个页的修改操作。
④ 重做日志文件存储的位置
在mysql的数据目录的ib_logfile0 和 ib_logfile1中
三、redo 日志和二进制日志的区别
① 二进制日志是在存储引擎上层产生的,不管上面存储引擎都会产生,而redo log是innoDB存储引擎层产生。
② 二进制日志记录操作的方法是逻辑性的语句,类似sql语句,即便它是基于行的格式记录方式。而redo log是物理格式的日志,它记录的是数据库中每个页的修改操作。
③ 二进制日志是事务commit成功的时候才记录,而redo log是事务中的每个操作都会记录,事务中的操作都会写到redo buffer内存中,等commit提交时才会刷新到磁盘。
④ 事务日志记录的是物理页的情况,它具有幂等性,因此记录日志的方式极其简练。幂等性的意思是多次操作前后状态是一样的,例如新插入一行后又删除该行,前后状态没有变化。而二进制日志记录的是所有影响数据的操作,记录的内容较多。例如插入一行记录一次,删除该行又记录一次。
四、 事务commit操作redo和二进制的write过程
事务commit时 | |
第①步 | innoDB prepare redo log |
第②步 | write binlog |
第③步 | innoDB commit redo log |
commit时,会先写prepare redo log日志,再写write binlog ,再innoDB commit redo log;
如果①成功,这时发生宕机,重启mysql事务就会回滚
如果①②成功,这时发生宕机,重启mysql 则会commit这个日志