Checkpoink技术

 

redo可以看做,InnoDB用于自我的数据修复,明显的例子就是:意外宕机恢复到宕机前的状态,这个过程不是人为手动可以干预的。
换句话说,有redo,可以最大限度保证InnoDB的自我修复,没有redo,可能恢复就会出问题。
有与没有,都不是手动可以直接操作这个文件的。redo可以看做InnoDB稳定运行的一个前提条件。
可以想象下,没有redo,难道每次宕机后,都要想法去找丢失的那部分数据吗。redo 就可以看做是记录,这部分数据的文件。

binlog : 基于人为操作的数据恢复,手动去恢复数据。但是,对于InnoDB运行来说,binlog的存在是必须的前提条件吗? 不是。你可以不开启binlog。数据库依然可以运行。可以说binlog是手动恢复数据的一种手段,此外也是用于主从数据同步。
由此,可见,前者存在是必要条件,而后者是非必要条件。

 

3. redo log buffer 原理

 

重做日志缓冲(redo log buffer)是Innodb存储引擎的内存区域中的一部分。

【重做日志信息--(1)-->redo log buffer--(2)-->重做日志文件】

 

在(2)中涉及知识:

<1>.关于innodb_log_buffer_size的大小:(默认8M)

mysql> show variables like 'innodb_log_buffer_size%';

+------------------------+---------+

| innodb_log_buffer_size | 8388608 |

+------------------------+---------+

 

8388608(Byte)/1024/1024=8M

 

重做日志缓冲不需要设置的太大,只要保证每秒产生的事务量在缓冲大小范围之内。因为每秒都会刷新缓冲到日志文件。8M足够了。

 

<2>.在以下三种情况下,会将重做日志缓冲中的内容刷新到外部磁盘的重做日志文件中。

  1. Master Thread 每一秒将重做日志缓冲刷新到重做日志文件;
  2. 每个事务提交时会将重做日志缓冲刷新到重做日志文件;
  3. 当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件。

 

4. redo log file 原理

<1>.重做日志介绍

     日志文件名:

          1.innodb_log_group_home_dir参数指定的目录下有两个文件:ib_logfile0,ib_logfile1

          2.该文件被称为:重做日志文件(redo log file),记录Innodb存储引擎的事务日志。至关重要!!!

          3.例如:服务器意外宕机导致实例失败,Innodb存储引擎利用重做日志恢复到宕机前的状态,以此保证数据的完整性。

     日志文件组:

          1.每个Innodb存储引擎至少有1个重做日志文件组,每个组至少包含2个重做日志文件(ib_logfile0,ib_logfile1).

          2.可以通过设置多个镜像日志组(mirrored log groups),将不同组放到不同磁盘,提高重做日志的高可用性。

          3.日志组中的文件大小是一致的,以循环的方式运行。文件1写满时,切换到文件2,文件2写满时,再次切换到文件1.

     日志文件参数:

          1.innodb_log_file_size 重做日志文件的大小。

          2.innodb_log_files_in_group 指定重做日志文件组中文件的数量,默认2

          3.innodb_mirrored_log_groups 指定了日志镜像文件组的数量,默认1

          4.innodb_log_group_home_dir 指定日志文件组所在的路径,默认./ ,表示在数据库的数据目录下。

 

<2>.重做日志文件大小设置

  1. 太大:恢复时可能需要很长时间
  2. 太小:可能导致一个事务需要多次切换重做日志文件;会导致async checkpoint,导致性能抖动。
  3. 错误日志警告信息:

InnoDB:ERROR:the age of the last checkpoint is 9433645,InnoDB:which exceeds the log group capacity 9433498.

解析:重做日志有个capacity变量,代表最后的检查点不能超过这个阈值,如果超过,必须将缓冲池中脏页列表(flush list)中的部分脏数据页写回磁盘,这是会导致用户线程的阻塞。

 

<3>.二进制日志和重做日志的对比:

     1.类别

     二进制日志:记录MySQL数据库相关的日志记录,包括InnoDB,MyISAM等其它存储引擎的日志。

     重做日志:只记录InnoDB存储引擎本身的事务日志

     2.内容

     二进制日志:记录事务的具体操作内容,是逻辑日志

     重做日志:记录每个页的更改的物理情况

     3.时间

     二进制日志:只在事务提交完成后进行写入,只写磁盘一次,不论这时事务量多大。

     重做日志:在事务进行中,就不断有重做日志条目(redo entry)写入重做日志文件。

 

<4>.重做日志条目

     1.条目基本格式

 

 

 

 

 

redo_log_type (1字节)space (压缩后可能<4字节)page_noredo_log_body

 

 

reod_log_type: 占用1字节,表示重做日志类型。各种不同操作有不同的重做日志格式,但有基本的格式。

space:表空间的ID,采用压缩的方式,占用空间可能小于4字节。

page_no:页的偏移量,同样采用压缩方式

redo_log_body:每个重做日志的数据部分,恢复时需要调用相应的函数解析。

 

<5>.写入过程

     1.重做日志信息 先写入 重做日志缓冲 再按一定条件顺序写入重做日志文件!

     2.redo log buffer 向 redo log file 写,是按512个字节,也就是一个扇区的大小进行写入。扇区是写入的最小单位,一定能写入成功,因此过程中不需要double write.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值