undo log格式操作表,记录了修改前的数据(逻辑操作)和版本链。具体的格式根据执行的语句不同而有些许变化,主要记录的具体的变化。比如插入的,记录的内容是插入记录的主键(指针),回滚时候就删除;更新为记录被更新的记录的指针,被更新的旧值,事务ID,会形成版本链;删除,被删除的记录的指针,被删除的旧值,事务ID记录时间引擎层,每执行一条语句形成一个undolog。刷盘时机1.写入buff pool中被redo log记录2.具体刷盘时间由redo机制完成redo log原因:引擎层为了加快读取速度读取内存数据,也就是buff pool。内存容易掉电丢失,为了保证不丢数据需要redo log保证。格式指的是具体物理格式的改变,比如在**对 XXX 表空间中的 YYY 数据页 ZZZ 偏移量的地方做了AAA 更新。**刷盘时机1.Mysql关机2.后台线程每隔1s,自动从redo log buffer完成刷盘3.事务提交后,根据参数的不同完成刷盘- 参数0:redo log写入buffer中,不主动刷盘,由OS控制刷盘时机- 参数1:每完成一个事务,调用write+fsyn,完成刷盘- 参数2:每完成一个事务,调用write,写入pageCache中,没有刷盘4.redo log buffer记录的写入量大于总量的一半参数比较首先,无论参数如何设置,总有后台线程完成自动刷盘,所以参数0,进程崩溃会丢失前一秒内的所有事务数据,参数1则不会丢数据,因为已经写入page Cache中,但是机器宕机也会丢失前一秒内的所有事务数据- 数据安全性:参数 1 > 参数 2 > 参数 0- 写入性能:参数 0 > 参数 2> 参数 1好处1.让mysql拥有有了掉电不丢数据的crash-safe 能力2.同时mysql在修改数据的时候,由原来的随机写变为了顺序写。因为redo在刷盘的时候,是为循环写,也就是追加写的一种,写入速度快。文件格式为两个redo log文件,写入方式为追加写+循环写。双指针记录redo log刷盘进度,和redo log 写进度,如果写进度追上刷盘进度,mysql则会阻塞。bin log目的server提供的功能,主要为了主从同步,备份恢复redo log vs bin log1.写入方式:bin log追加写,redo log 循环写2.文件格式:redo log为数据库的物理格式上的变化,XX表XX偏移量做了XX更新:bin log分为statement和raw和mix:statement逻辑操作,raw完成操作后的数据结果记录,3.服务提供的对象:bin server 和 redo 引擎刷盘时机1.在一个事务中,每一条语句写入bin log的cache中,这是每一个线程拥有区域的2.完成事务后,才进行刷盘,刷盘方式由参数控制:- 参数0:不刷盘,由OS控制- 参数1:每一个事务,执行write+fsyn一次- 参数N:每个事务,执行write,积累N个事务,执行fsyn一次两阶段提交原因:因为redo log和bin log都会独立刷盘,很容易出现半成功的情况,会导致主从不一致。为了防止出现不一致采取了两阶段提交(分布式事务的一种),把单个事务的提交分为两阶段:prepare和commit。由协调者和参与者完成。在mysql事务中协调者为bin log,参与者为redo log。过程prepare:将XA事务的ID,写入redo log,状态设为prepare,redo log完成刷盘commit:将XA事务的ID,写入bin log,bin log完成刷盘,同时调用引擎接口,redo log设置为commit,这里是write的方式写入存在的问题1.IO次数多2.锁竞争激烈如何解决采取组提交单独bin log组提交 prepare阶段不变,redo log完成刷盘,commit阶段分为flush+syn+commit阶段,每个阶段拥有一个队列 flush:完成prepare 的事务按顺序进入flush queue,调用write,写入page cache中 syn:积累N个事务后,调用一次fsyn,完成刷盘 commit: 优化组提交 对redo log也优化了组提交,将redo log刷盘时间放入了flush阶段。 flush:redo log 在queue排队,积累N个redo log调用一次write+fsyn,完成redo log的刷盘,同时调用bin log 的write,将bin log写入page cache中 syn:积累N个事务后,调用一次bin log的fsyn,完成bin刷盘 commit:调用引擎的提交事务接口,将 redo log 状态设置为 commit。