binlog,redolog,undolog Mysql三种日志的作用和区别( 二 )


binlog,redolog,undolog Mysql三种日志的作用和区别

文章插图
SOL语句:select @@innodb_flush_log_at_trx_commit;
redo log 的写入方式?redo log 采用大小固定,循环写入的方式,当写满后,会重新从头开始循环写,类似一个环状 。这样设计原因是 redo log 记录的是数据页上的修改 , 如果 Buffer Pool 中数据页已经刷到磁盘,这些记录就失效了 , 新日志会将这些失效的记录覆盖擦除 。注意:redo log 满了,在擦除之前 , 要确保这些要被擦除记录都已经刷到磁盘中了 。在擦除旧记录释放新空间期间,不能再接收新的更新请求,此时 MySQL 性能会下降 。因此高并发情况下,合理调整 redo log 大小很重要 。
crash-safe 能力是什么?Innodb 引擎有 crash-safe 能力,即事务提交过程中任何阶段,MySQL 宕机重启后都能保证事务的完整性,已提交的数据不会丢失 。这种能力是通过redo log保证的,MySQL 宕机重启,系统将自动检查 redo log,将修改还未写入磁盘的数据从 redo log 恢复到 MySQL 中 。
二、什么是binlogbinlog 是作为mysql操作记录归档的日志,这个日志记录了所有对数据库的数据、表结构、索引等等变更的操作 。也就是说只要是对数据库有变更的操作都会记录到binlog里面来 ,  可以把数据库的数据当成我们银行账户里的余额,而binlog就相当于我们银行卡的流水 。账户余额只是一个结果 , 至于这个结果怎么来的,那就必须得看流水了 。而同样在mysql里我们就是通过binlog来归档、验证、恢复、同步数据 。
binlog 记录内容binlog应该说是Mysql里最核心的日志, 它记录了除了查询语句(select、show)之外的所有的 DDL 和 DML 语句,也就意味着我们基本上所有对数据库的操作变更都会记录到binlog里面 。binlog以事件形式记录,不仅记录了操作的语句,同时还记录了语句所执行的消耗的时间 。binlog 有三种记录格式,分别是ROW、STATEMENT、MIXED 。
  1. statement(5.6默认)SBR(statement based replication) :语句模式原封不动的记录当前DML 。
  2. ROW(5.7 默认值) RBR(ROW based replication) :记录数据行的变化(用户看不懂,需要工具分析)
  3. mixed(混合)MBR(mixed based replication)模式:以上两种模式的混合
SBR与RBR模式的对比
  • STATEMENT:可读性较高,日志量少,但是不够严谨
  • ROW:可读性很低,日志量大,足够严谨
三、什么是undologuedo log 是也属于引擎层(innodb)的日志,从上面的redo log介绍中我们就已经知道了,redo log 和undo log的核心是为了保证innodb事务机制中的持久性和原子性,事务提交成功由redo log保证数据持久性,而事务可以进行回滚从而保证事务操作原子性则是通过undo log 来保证的 。
要对事务数据回滚到历史的数据状态,所以我们也能猜到undo log是保存的是数据的历史版本 , 通过历史版本让数据在任何时候都可以回滚到某一个事务开始之前的状态 。undo log除了进行事务回滚的日志外还有一个作用,就是为数据库实现MVCC多版本并发控制的功能 。
啥是回滚和前滚?(1)回滚未提交的事务,即事务未执行 commit 。但事务内修改的脏页中,有一部分已刷盘 。此时数据库宕机重启 , 需要回滚来将先前那部分已经刷盘的脏块从磁盘上撤销 。(2)前滚未完全提交的事务,即事务已经执行 commit,但该事务内修改的脏页中只有一部分数据被刷盘 , 另一部分还在 buffer pool,此时数据库宕机重启,就要用前滚来将未来得及刷盘的数据从 redo log 中恢复出来并刷盘 。
undo log记录内容在Mysql里数据每次修改前 , 都首先会把修改之前的数据作为历史保存一份到undo log里面的,数据里面会记录操作该数据的事务ID,然后我们可以通过事务ID来对数据进行回滚 。
【binlog,redolog,undolog Mysql三种日志的作用和区别】

推荐阅读