MySQL中的redolog/undolog/binlog

MySQL中逻辑分层简单介绍

下面是MySQL的逻辑分层图:

  • 连接层:连接与线程处理,这一层并不是MySQL独有,一般的基于C/S架构的都有类似组件,比如连接处理、授权认证、安全等。
  • 服务层:包括缓存查询、解析器、优化器,这一部分是MySQL核心功能,包括解析、优化SQL语句,查询缓存目录,内置函数(日期、时间、加密等函数)的实现。
  • 引擎层:负责数据存储,存储引擎的不同,存储方式、数据格式、提取方式等都不相同,这一部分也是很大影响数据存储与提取的性能的;对存储层的抽象。
  • 存储层:存储数据,文件系统

redo log、binlog、undo log 区别与作用

redolog和undolog只存在于innodb中,这两个日志在innodb中统称为事务日志。undolog用于回滚,redolog用于前滚

  • 前滚:
    事务提交之后,部分数据写入了磁盘,但是还有部分数据存在脏页上,并没有写入磁盘。此时设备宕机,没有写入磁盘的数据丢失。就要依赖redolog来恢复这部分数据
  • 回滚:
    事务还未提交,改动并没有完全生效,但是记录已经被修改。此时设备宕机,数据是有问题的,就要依赖undolog回滚改动

bin log

  归档日志(二进制日志)(Server 层日志)
  作用:用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。
用于数据库的基于时间点的还原。
  内容:逻辑格式的日志,记录了数据库表结构和表数据变更,比如update/delete/insert/truncate/create。它不会记录select(因为这没有对表没有进行变更),可以简单认为就是sql语句。
  binlog 有三种模式:Statement(基于 SQL 语句的复制)、Row(基于行的复制) 以及 Mixed(混合模式)

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

undo log

  回滚日志(引擎层)

  • 作用:
    Undo 记录某 数据 被修改 前 的值,可以用来在事务失败时进行rollback,用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读
  • 内容:
    逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,记录数据修改被修改前的值
  • 释放时间
    当事务提交之后,undo log并不能立马被删除,而是会被放到待清理链表中,待判断没有事物用到该版本的信息时才可以清理相应undolog
posted @ 2020-07-17 10:50  遗失的岁月  阅读(1457)  评论(0编辑  收藏  举报