
为什么MySQL有binlog,还有redo log? 事务是如何提交的?事务提交先写binlog还是redo log?如何保证这两部分的日志做到顺序一致性? 为了保障主从复制安全,故障恢复是如何做的? 为什么需要保证二进制日志的写入顺序和InnoDB层事务提交顺序一致性呢?
所有已经提交的事务的数据仍然存在。
所有没有提交的事务的数据自动回滚。
0 – 每N秒将Redo Log Buffer的记录写入Redo Log文件,并且将文件刷入硬件存储1次。N由innodb_flush_log_at_timeout控制。
1 – 每个事务提交时,将记录从Redo Log Buffer写入Redo Log文件,并且将文件刷入硬件存储。
2 – 每个事务提交时,仅将记录从Redo Log Buffer写入Redo Log文件。Redo Log何时刷入硬件存储由操作系统和innodb_flush_log_at_timeout决定。这个选项可以保证在MySQL宕机,而操作系统正常工作时,数据的完整性。

0:log buffer每秒一次地写入log file中,且进行flush操作。InnoDB日志刷新频率由控制 innodb_flush_log_at_timeout,它允许你将日志刷新频率设置为N秒(其中N是1 … 2700,默认值为1)。 1:每次事务提交时都会把log buffer的数据写入log file,并进行flush操作。 2:每次事务提交时MySQL都会把log buffer的数据写入log file,不进行flush操作。
0:刷新binlog_cache中的信息到磁盘由os决定。 N:每N次事务提交刷新binlog_cache中的信息到磁盘。
当事务在prepare阶段crash,数据库recovery的时候该事务未写入Binary log并且存储引擎未提交,将该事务rollback。 当事务在binlog阶段crash,此时日志还没有成功写入到磁盘中,启动时会rollback此事务。 当事务在binlog日志已经fsync()到磁盘后crash,但是InnoDB没有来得及commit,此时MySQL数据库recovery的时候将会读出二进制日志的Xid_log_event,然后告诉InnoDB提交这些XID的事务,InnoDB提交完这些事务后会回滚其它的事务,使存储引擎和二进制日志始终保持一致。



号主有话说

往期推荐

点个在看你最好看
文章转载自数元技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




