初识MySQL三大日志
This is a hidden message
Mysql
日志包括错误日志、查询日志、事务日志等等,这里我们主要来看一下事务日志,也就是binlog
、redo log
以及undo log
。
redo log
redo log
也叫重做日志,是Innodb
独有的日志,它让MySQL
拥有了崩溃恢复的能力;
在事务执行的过程中,MySQL
会将事务中操作的日志写入到redo log
日志中,如果 MySQL
实例挂了或宕机了,重启时,InnoDB
存储引擎会使用redo log
恢复数据,保证数据的持久性与完整性。
binlog
redo log
是物理日志,记录的内容是在某个数据页上做了什么修改,属于InnoDB
引擎;
而binlog
是逻辑日志,记录的是所有数据库表结构的变更,以及表数据的修改,binlog
的主要目的是复制和恢复,属于MySQL Server
。
而binlog
日志有三种记录方式:
statement
:记录的是SQL
的原文,同步数据时会执行记录的SQL
,但是如果语句中出现了UUID
、now()
等函数,会出现数据同步不一致的情况;row
:基于行的模式,记录的是行的变化,所以不会出现数据不一致的情况,但是在同步时会出现延迟;mixed
:混合模式,基于语句来判断使用statement
还是row
。
undo log
undo log
日志也叫回滚日志,用来回滚行记录到某个版本;事务未提交之前,undo log
保存了未提交之前的版本数据,undo log
中的数据可作为数据旧版本快照供其他并发事务进行快照读;是为了实现事务的原子性而出现的产物,在InnoDB
存储引擎中用来实现MVCC
。