mysql 原理 ~ redo

时间:2021-06-21 21:53:06

一 简介:redo log
二 文件
   ib_logfile0 ib_logfile1 两个redo log 默认为一组 循环覆盖写入
三 相关参数
   innodb_log_file_size=256M 不能太大也不能太小,推荐256M
  innodb_log_file_in_group=16M redo log buffer的大小,不宜太大
  innodb_log_buffer_size=2 日志文件数量默认为2,可根据情况适当调节
四 redo log 与binlog的不同
  1 产生的机制不同
     redo log在innodb引擎层产生
     binlog 在mysql server上层生成
 2 记录的内容类型不一样
    redo log是物理格式日志,记录着每个页的修改的逻辑操作,所以具体来说 redo log记录的是逻辑物理操作
    binlog 是逻辑格式日志,仅仅记录着执行的sql语句,属于逻辑操作
 3 mysql redo+binlog共同构成了一个完整事务的提交,俗称二阶段提交,通过共有的xid方式确定事务的完整性
六 redo log的特点
 1 redo追加是顺序写入
 2 redo_log_buffer->redo_log_file 事务生成redo log到文件的方式
 3 并发事务
   1 并发的事务共享redo_log_buffer,它们的Redo Log按语句的执行顺序,依次交替的记录在一起,
   eg:记录1: <trx1, insert …>
        记录2: <trx2, update …>
        记录3: <trx1, delete …>
        记录4: <trx3, update …>
  2 并发的事务通过加锁的方式保证事务的顺序写入,直到8.0才实现无锁化的顺序写入
  3. 因为C的原因,当一个事务将Redo Log写入磁盘时,也会将其他未提交的事务的日志写入磁盘。
  4. Redo Log上只进行顺序追加的操作,当一个事务需要回滚时,它的Redo Log记录也不会从Redo Log中删除掉。
七 redo log buffer刷新机制
  1 事务提交时候(commit=1)
  2 当log buffer中有一半的内存空间已经被使用
  3 当无法进行覆盖log文件时,触发check point机制
八 LSN号
 1 具体说明
   Log sequence number log_buffer_lsn 缓存记录
  Log flushed up to log_file_lsn 文件记录
  Last checkpoint at log_file_start_lsn  文件开头记录 用来记录已经执行CKPT到达一致的位置点,是不断更新的

2 LSN号和位置
  mtr_commit执行时会给每个log record生成一个lsn,此lsn确定了其在log file中的位置,会在指定位置进行加锁,直到此事务进行写入

3 LSN与故障恢复

1 LSN类型为文件开头记录的位置为check point三者一致的位置点,之后进行整体重做或者回滚

2 redo 记录LSN号和 page lSN号会进行对比

九 具体的记录内容

1 DML操作导致的页面变化,均需要记录Redo日志

2 聚簇索引/二级索引/Undo页面修改,均需要记录Redo日志;