zoukankan      html  css  js  c++  java
  • mysql重做日志

    一、重做日志(redo log)

    1、作用

    确保事务的持久性。

    防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。

    2、内容

    物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。

    3、什么时候产生

    事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。

    4、什么时候释放

    当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。

    5、对应的物理文件

    默认情况下,对应的物理文件位于数据库的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

    6、其他

    很重要一点,redo log是什么时候写盘的?前面说了是在事物开始之后逐步写盘的。

    之所以说重做日志是在事务开始之后逐步写入重做日志文件,而不一定是事务提交才写入重做日志缓存,

    原因就是,重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M(这里设置的16M),Innodb存储引擎先将重做日志写入innodb_log_buffer中。

     
     

    然后会通过以下三种方式将innodb日志缓冲区的日志刷新到磁盘

    1,Master Thread 每秒一次执行刷新Innodb_log_buffer到重做日志文件。

    2,每个事务提交时会将重做日志刷新到重做日志文件。

    3,当重做日志缓存可用空间 少于一半时,重做日志缓存被刷新到重做日志文件

    由此可以看出,重做日志通过不止一种方式写入到磁盘,尤其是对于第一种方式,Innodb_log_buffer到重做日志文件是Master Thread线程的定时任务。

    因此重做日志的写盘,并不一定是随着事务的提交才写入重做日志文件的,而是随着事务的开始,逐步开始的。

    另外引用《MySQL技术内幕 Innodb 存储引擎》(page37)上的原话:

    即使某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件。

    这一点是必须要知道的,因为这可以很好地解释再大的事务的提交(commit)的时间也是很短暂的。

    ###############################################################################

    MySQL重做日志恢复数据的流程:

    1.当MySQL启动的时候,先会从数据库文件中读取出上次保存最大的LSN。
    2.然后调用recv_recovery_from_checkpoint_start,并将最大的LSN作为参数传入函数当中。
    3.函数会先最近建立checkpoint的日志组,并读取出对应的checkpoint信息。
    4.通过checkpoint lsn和传入的最大LSN进行比较,如果相等,不进行日志恢复数据,如果不相等,进行日志恢复。
    5.在启动恢复之前,先会同步各个日志组的archive归档状态。
    6.在开始恢复时,先会从日志文件中读取2M的日志数据到log_sys->buf,然后对这2M的数据进行scan,校验其合法性,而后将去掉block header的日志放入recv_sys->buf当中,这个过程称为scan,会改变scanned lsn.
    7.在对2M的日志数据scan后,innodb会对日志进行mtr操作解析,并执行相关的mtr函数。如果mtr合法,会将对应的记录数据按space page_no作为KEY存入recv_sys->addr_hash当中。
    8.当对scan的日志数据进行mtr解析后,innodb对会调用recv_apply_hashed_log_recs对整个recv_sys->addr_hash进行扫描,并按照日志相对应的操作进行对应page的数据恢复。这个过程会改变recovered_lsn。
    9.如果完成第8步后,会再次从日志组文件中读取2M数据,跳到步骤6继续相对应的处理,直到日志文件没有需要恢复的日志数据。
    10.innodb在恢复完成日志文件中的数据后,会调用recv_recovery_from_checkpoint_finish结束日志恢复操作,主要是释放一些开辟的内存。并进行事务和binlog的处理。

    上述过程的示意图如下:


    恢复日志主要的接口函数:
       recv_recovery_from_checkpoint_start    从重做日志组内的最近的checkpoint开始恢复数据

        recv_recovery_from_checkpoint_finish  结束从重做日志组内的checkpoint的数据恢复操作

        recv_recovery_from_archive_start           从归档日志文件中进行数据恢复

        recv_recovery_from_archive_finish         结束从归档日志中的数据恢复操作

        recv_reset_logs                  截取重做日志最后一段作为新的重做日志的起始位置,可能会丢失数据。

     

  • 相关阅读:
    vscode设置不展示 .pyc文件
    Centos7安装python3并与python2共存, 以及安装pip(pip3)
    vmware 安装 centos7 及网络配置,永久修改主机名
    VMware虚拟机ubuntu显示屏幕太小解决办法, 安装 VM tools
    struct timeval和gettimeofday()
    cocos2d-x中CCLabelAtlas的小图片拼接
    Core Animation系列之CADisplayLink
    Xcode5 上64位编译 出错No architectures to compile for
    通过OpenGL ES在iOS平台实践增强现实
    通过OpenGL ES在iOS平台实践增强现实(一)
  • 原文地址:https://www.cnblogs.com/igoodful/p/9081446.html
Copyright © 2011-2022 走看看