技术日志挑战——第18天:0810

2024-08-10 23:26:21 浏览数 (1)

技术总结:

今天是周六,天气依然比较热,没怎么出门,另外看了一下奥运会

学习笔记:


两阶段提交

redo log(重做日志)让 InnoDB 存储引擎拥有了崩溃恢复能力。

bin log(归档日志)保证了MySQL集群架构的数据一致性。

bin log是MySQL Server提供的一种日志,叫做归档日志,所有引擎都可以使用bin log。

redo log是 InnoDB 引擎特有的。

redo log主要记录的是某个数据页做了什么修改,bin log记录的是语句的原始逻辑,比如更新了某一行的某个字段。

redo log是循环写的,数据会被覆盖。bin log是追加写,一个文件写满,就写下一个文件。

两者是如何配合完成两阶段提交的。

有3个步骤:

1.写入redo log,处于prepare状态。

2.写bin log。

3.修改redo log状态变为commit。

先写处于prepare状态的Redo Log,事务提交后,再写处于commit状态的Redo Log。由于redo log的提交分为prepare和commit两个阶段,所以称之为两阶段提交。

(1) redo log与bin log两份日志之间的逻辑不一致,会出现什么问题?

以updatei语句为例,假设id=2的记录,字段c值是0,把字段c值更新成1,SQL语句为update T set c=1 where id=2。假设执行过程中写完redo log日志后,binlog日志写期间发生了异常,会出现什么情况呢?由于binlog没写完就异常,这时候binlog里面没有对应的修改记录。因此,之后用binlog日志恢复数据时,就会少这一次更新,恢复出来的这一行c值是0,而原库因为redo log日志恢复,这一行c值是1,最终数据不一致。

为了解决两份日志之间的逻辑一致问题,InnoDB存储引擎使用两阶段提交方案。

0 人点赞