doc: 阅读mysql文档

This commit is contained in:
asahi
2025-08-26 21:01:33 +08:00
parent 35b41067e1
commit 8edc81b4c2

View File

@@ -616,5 +616,31 @@ binlog机制mysql上层的和存储引擎无关而redo log机制是和存
- 如果事务可以在binlog被找到那么事务将会被提交
- 如果事务在binlog中找不到那么事务将会被回滚
但是,上述实现需要确保`事务在engine中提交前binlog必须先被持久化`。故而,在上图中在调用`write`写入binlog后还需要确保调用`fsync`来令binlog内容被刷新到磁盘文件中
> 如果`innodb_flush_log_at_trx_commit`被设置为1那么在2pc的prepare阶段就被持久化到磁盘中后续再对binlog进行write和fsync。故而当执行crash recovery时如果redo log为prepared状态且对应事务在binlog中存在那么事务在redo log中一定存在可以直接对redo log进行commit但如果事务在binlog中不存在那么可以对innodb事务进行回滚
在大多场景下如果binlog不存在那么仅需对所有prepared transaction进行回滚即可。
> 当使用`on-line backup`方法(例如`Innodb Hot Backup`这些工具会直接拷贝当前数据库的文件和innodb的transaction logs。但是transaction logs也有可能包含prepared状态的事务。在通过备份恢复时也会对所有prepared事务及逆行回滚令数据库处于一致的状态。
>
> 并且,`on-line backup`经常被用于启动新slave。`last committed transaction`在binary log中的log position被记录到了redo log header中在recovery时recovery program将会打印binary log中last committed transaction的位置。
##### prepare_commit_mutex
为了保证`on-line backup`行为的正确性事务进行提交的顺序必须要和其被写入到binlog中的顺序一致如果不能保证顺序的一致性将会出现如下问题
- 如果事务按照`T1, T2, T3`的顺序写入到binlog但是其提交顺序为`T1, T3, T2`那么将会导致根据binlog执行恢复时binlog中间出现空洞例如T1和T3已经被提交但是T2尚未被提交导致binlog中T1和T3的binlog block都是commit但是T2却是prepared
<img src="https://img-blog.csdn.net/20161222103606133?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhb2NoZW5zaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
<img src="https://img-blog.csdn.net/20161222103703259?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhb2NoZW5zaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
> 上图中,事务提交顺序为`T2, T3`但是binlog中的顺序为`T1, T2, T3`。从而导致位于binlog中最靠前位置的T1还未提交为prepared状态但是T2和T3的binlog处于commit状态从而binlog发生空洞
在slave机器上发生recovery时如果binlog存在空洞slave将会直接跳过空洞从而导致slave中事务缺失。
##### binary log group commit
`binary log group commit`实现将commit过程拆分为了如下图所示的多个阶段
<img src="https://img-blog.csdn.net/20161222103803619?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hhb2NoZW5zaHVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
上述stages位于binlog commit过程的内部并且不会造成其他影响。由于commit过程被拆分为了如下stages故而可以同时存在数个线程同时对事务进行处理这样会增加吞吐量。
对于每个stage都存在一个queuesession在queue中排队等待被处理。如果一个session被注册到了空的queue那么其将被认为是stage leader如果session被注册时queue不为空那么其将作为stage follower。stage leader将会将queue中所有的threads移出stage并且将leader和所有的followers注册到下个stage。