1.日志
Bin-log,undo-log ,redo-log
undo-log
1.实现事务回滚和MVCC
机制,
也就是当一个事务尝试写某行表数据时,首先会将旧数据拷贝到xx.ibdata
文件中,将表中行数据的隐藏字段:roll_ptr
回滚指针会指向xx.ibdata
文件中的旧数据,然后再写表上的数据。
2.InooDB存储引擎特有,InnoDB
在MySQL
启动时,会在内存中构建一个BufferPool
,而这个缓冲池主要存放两类东西,一类是数据相关的缓冲,如索引、锁、表数据等,另一类则是各种日志的缓冲,如Undo、Bin、Redo....
等日志。
redo-log
1.用来实现数据的恢复
Redo-log
是一种预写式日志,即在向内存写入数据前,会先写日志,当后续数据未被刷写到磁盘、MySQL
崩溃时,就可以通过日志来恢复数据,确保所有提交的事务都会被持久化。
2.red-log刷盘策略:参数来控制,默认是处于第二个级别,也就是每次提交事务时都会刷盘,这也就意味着一个事务执行成功后,相应的Redo-log
日志绝对会被刷写到磁盘中,因此无需担心会出现丢失风险。
bin-log
1.Bin-log
日志也被称之为二进制日志,作用与Redo-log
类似,主要是记录所有对数据库表结构变更和表数据修改的操作,对于select、show
这类读操作并不会记录。bin-log
是MySQL-Server
级别的日志,也就是所有引擎都能用的日志,而redo-log、undo-log
都是InnoDB
引擎专享的,无法跨引擎生效。
2.MySQL-Server
会给每一条工作线程,都分配一个bin_log_buffer
,而并不是放在共享缓冲区中,这是为啥呢?因为MySQL
设计时要兼容所有引擎,直接将bin-log
的缓冲区,设计在线程的工作内存中,这样就能够让所有引擎通用,并且不同线程/事务之间,由于写的都是自己工作内存中的bin-log
缓冲,因此并发执行时也不会冲突!
Bin-logvo-log
MyISAM
不支持事务,所以MySQL-Server
设计的Bin-log
无法用于灾难恢复,因此InnoDB
在设计时,又重新设计出Redo-log
日志,可以利用该日志实现crash-safe
灾难恢复能力,确保任何事务提交后数据都不会丢失。
- ①生效范围不同,
Redo-log
是InnoDB
专享的,Bin-log
是所有引擎通用的。 - ②写入方式不同,
Redo-log
是用两个文件循环写,而Bin-log
是不断创建新文件追加写。 - ③文件格式不同,
Redo-log
中记录的都是变更后的数据,而Bin-log
会记录变更SQL
语句。 - ④使用场景不同,
Redo-log
主要实现故障情况下的数据恢复,Bin-log
则用于数据灾备、同步。
事务两阶段提交方案,啥叫做事务两阶段提交呢?实则是指Redo-log
分两次写入