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层,记录的是语句的原始逻辑,会记录所有更新数据库的逻辑语句。

 

 

MySQLbinlog有有几种录入格式?分别有什么区别?  ——重要

有三种格式,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

posted on 2021-12-28 12:52  nisico  阅读(281)  评论(0)    收藏  举报

导航