mysql三大日志redolog、undolog、binlog



mysql执行一条数据库修改语句的执行过程:少了写入undolog和binlog。
注意!! binlog是提交事务后写入的,redo log commit阶段也是事务提交后才有的。




binlog 归档日志
redolog事务日志,保证持久性,崩溃恢复机制。undolog 保证原子性。


除了后台线程每秒1次的轮询操作,还有一种情况,当 redo log buffer 占用的空间即将达到 innodb_log_buffer_size 一半的时候,后台线程会主动刷盘。
不同的刷盘策略:




binlog
不管什么存储引擎都会有binlog,binlog属于mysql 的server层,记录的是语句的原始逻辑,会记录所有更新数据库的逻辑语句。

MySQL的binlog有有几种录入格式?分别有什么区别? ——重要
有三种格式,statement,row和mixed。statement模式下,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大。mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。
此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。



因为redolog和binlog写入时机不一致,因此如果故障发生在binlog写入时,也就是提交事务后,redolog已经写入了,binlog缺失,那么主数据库恢复没问题,从数据库就会丢失刚才的修改,导致主从数据不一致。
mysql引入两阶段提交(针对redolog):

mysql的数据何时真正写入磁盘


整理自www.javaguide.cn

浙公网安备 33010602011771号