作者回复: 你看到的“binlog的记录”,也是从page cache读的哦。
Page cache是操作系统文件系统上的😄
好问题
作者回复: 好问题,我写这篇文章的时候也为了这个问题去翻了代码,是这样的:
达到N次以后,可以刷盘了,然后再进入(sync_delay和no_delay_count)这个逻辑;
Sync_delay如果很大,就达到no_delay_count才刷;
只要sync_binlog=0,也会有前面的等待逻辑,但是等完后还是不调fsync😄
作者回复: 不是。
说明一下哈,所谓的 redo log prepare,是“当前事务提交”的一个阶段,也就是说,在事务A提交的时候,我们才会走到事务A的redo log prepare这个阶段。
事务A在提交前,有一部分redo log被事务B提前持久化,但是事务A还没有进入提交阶段,是无所谓“redo log prepare”的。
好问题
作者回复: 嗯,这个解释也很好。👍🏿
作者回复: 1. Write的时候只要写进去了,fsync其实很快的。连续性是write的时候做的(写的时候保证了连续)
2. 你的理解应该是对的。不是表级
作者回复: 👍🏿
非常好
然后再补上我回答的这个逻辑,就完备了
作者回复: 前面的伪代码不错哈
”binlog_group_commit_sync_no_delay_count这个参数是不是不应该设置的比并发线程数大“,最好是这样的,否则的话,就只能等binlog_group_commit_sync_delay |时间到了
作者回复: 好问题
我觉得一个比较重要的原因是,一个线程只能同时有一个事务在执行。
由于这个设定,所以每当执行一个begin/start transaction的时候,就会默认提交上一个事务;
这样如果一个事务的binlog被拆开的时候,在备库执行就会被当做多个事务分段自行,这样破坏了原子性,是有问题的。
作者回复: 你理解的是对的
作者回复: 你说的对,分析得很好
作者回复: 记录数据就是先写内存,然后写日志(redo和binlog),后台会有机会将内存的数据写到数据盘
作者回复: redo log不需要“顺序”持久化的
作者回复: 每个事务在提交过程的prepare阶段,会把redolog持久化; “当前事务的redolog持久化后prepare状态么”这个描述还是不清楚,你用事务A、事务B这样来描述吧😆
redolog已经被持久化到磁盘了,那么当前事务提交时候,
(其实这里只是“部分”被持久化,因为这个事务自己在执行的过程中,还会产生新的日志),只需要继续持久化剩下的redo log
作者回复: 不会啊,有MVCC的, 08篇再看下
作者回复: 没事,这些操作没提交,崩溃恢复的时候就回滚了
作者回复: 你的理解很到位
作者回复: 这样就是每10次fsync一下(sync_no_delay_count >sync_binlog)