事务的ACID 是基于日志实现和保证的,D持久性就是通过redo log日志文件来保证的,持久化嘛,和redis一样, A原子性 是通过undo
bin log是在server端的,而redo undo 是在存储引擎端的的、
注意:undo log是逻辑日志,
和redo区别:
1、redo是innodb独有的,binlog是所有引擎都可以使用的
2、redo是物理日志,记录的是在某个数据页上做了什么修改,binlog是逻辑日志,记录的是这个语句的原始逻辑
3、redo是循环写,空间会用完,binlog是可以追加写,不会覆盖之前的日志信息。
Binlog中会记录所有的逻辑,并且采用追加写的方式
一般在企业中db会有备份系统,可以定期执行备份,备份周期可以自己设置
恢复数据的过程:
redo log 是什么?
一个固定大小,“循环写”的日志文件,记录的是物理日志——“在某个数据页上做了某个修改”。
binlog 是什么?
一个无限大小,“追加写”的日志文件,记录的是逻辑日志——“给 ID=2 这一行的 c 字段加1”。
redo log 和 binlog 有一个很大的区别就是,一个是循环写,一个是追加写。也就是说 redo log 只会记录未刷盘的日志,已经刷入磁盘的数据都会从 redo log 这个有限大小的日志文件里删除。binlog 是追加日志,保存的是全量的日志。
当数据库 crash 后,想要恢复未刷盘但已经写入 redo log 和 binlog 的数据到内存时,binlog 是无法恢复的。虽然 binlog 拥有全量的日志,但没有一个标志让 innoDB 判断哪些数据已经刷盘,哪些数据还没有。
举个栗子,binlog 记录了两条日志:
在记录1写入磁盘后,记录2未写入磁盘时,数据库 crash。重启后,只通过 binlog 数据库无法判断这两条记录哪条已经写入磁盘,哪条没有写入磁盘,不管是两条都恢复至内存,还是都不恢复,对 ID=2 这行数据来说,都不对。
但 redo log 不一样,只要刷入磁盘的数据,都会从 redo log 中抹掉,数据库重启后,直接把 redo log 中的数据都恢复至内存就可以了。这就是为什么 redo log 具有 crash-safe 的能力,而 binlog 不具备。
根据 redo log 和 binlog 的两阶段提交,未持久化的数据分为几种情况:
执行流程是:
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!