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

  • innodb_flush_log_at_trx_commit=2,表示在每次事务提交的时候会把log buffer刷到文件系统中去,但并不会立即刷写到磁盘 。如果只是MySQL数据库挂掉了,由于文件系统没有问题,那么对应的事务数据并没有丢失 。只有在数据库所在的主机操作系统损坏或者突然掉电的情况下,数据库的事务数据可能丢失1秒之类的事务数据 。这样的好处,减少了事务数据丢失的概率,而对底层硬件的IO要求也没有那么高(log buffer写到文件系统中,一般只是从log buffer的内存转移的文件系统的内存缓存中,对底层IO没有压力) 。
    binlog,redolog,undolog Mysql三种日志的作用和区别

    文章插图
  • SOL语句:select @@innodb_flush_log_at_trx_commit;
    redo log 的写入方式?【binlog,redolog,undolog Mysql三种日志的作用和区别】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多版本并发控制的功能 。

    经验总结扩展阅读