Mysql redo log重做日志

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这个日志

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值