ACID

atomicity : 原子性
consistency: 一致性
isolation:隔离性
durability :持久性

image.png

1.binlog(二进制日志)

binlog, 归档日志。即二进制文件,他记录了MySQL所有数据的变更,并以二进制的形式存储在磁盘上;
【1】binlog 是 MySQL 的Server层实现的,所有引擎都可以使用。
【2】binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”.redo log 是物理日志,记录的是“在某个数据页上做了什么修改”
【3】binlog 是可以追加写入的。“追加写”是指binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。redo log 是物理日志,记录的是“在某个数据页上做了什么修改”。

2.redo log (重做日志)

redo log又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。在实例和介质失败(media failure)时,redo log文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用redo log恢复到掉电前的时刻,以此来保证数据的完整性。

Mysql 数据存在磁盘里,但如果每次读写数据都需要磁盘IO,效率低。

引入Buffer Pool, 其中包含了磁盘中部分数据页的映射,作为访问数据库的缓冲:当从数据库读取数据时,会首先从Buffer Pool 中读取,如果没有就会从磁盘读取后放入Buffer Pool, 当向数据库写入数据时,会首先写入Buffer Pool ,Buffer Pool中修改的数据会定期刷新到磁盘中。

Buffer Pool 问题:是提高了读写性能。如果Mysql 宕机,而此时Buffer Pool中修改的数据还没有刷到磁盘里,那就会导致数据丢失。事务持久性就无法保证。

Redo log 作用:当Mysql 修改数据时,Buffer Pool 和 Redo Log 都会记录。当事务提交时,会调用fsync 接口对 redo log 进行刷盘。
如果Mysql 宕机,重启时可以读取redo log 中的数据,对数据库进行恢复,redo log 采用的是WAL(Write-ahead logging 预写式日志),所有修改先写入日志,然后再更新到Buffer Pool ,保证了数据不会因mysql 宕机而丢失。

有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe

3.undo log (回滚日志)

保证事务完整性