
文章插图
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 。
- statement(5.6默认)SBR(statement based replication) :语句模式原封不动的记录当前DML 。
- ROW(5.7 默认值) RBR(ROW based replication) :记录数据行的变化(用户看不懂,需要工具分析)
- mixed(混合)MBR(mixed based replication)模式:以上两种模式的混合
- STATEMENT:可读性较高,日志量少,但是不够严谨
- ROW:可读性很低,日志量大,足够严谨
要对事务数据回滚到历史的数据状态,所以我们也能猜到undo log是保存的是数据的历史版本,通过历史版本让数据在任何时候都可以回滚到某一个事务开始之前的状态 。undo log除了进行事务回滚的日志外还有一个作用,就是为数据库实现MVCC多版本并发控制的功能 。