mysql中redolog和binlog的总结

一.redolog

1.redo log的概念

redolog是物理日志,默认大小是4G,记录在某个数据页上做了什么修改。有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。因为redo log 的写入机制是事务中有更新操作时就会将更新操作记录在 redo log buffer 中,在事务提交时,根据相关参数的设定,按照不同逻辑持久化到磁盘文件

2.redo log写入文件的过程简介

redo日志从生成到写入文件要要经历①redo log buffer ②page cache ③redo.file

最后把page cache写入file的时机可以自己设置,默认是已经有一个后台进程每1s进行一次完整的刷盘操作。当 redolog buffer 占用的空间即将达到 innodb_log_buffer_size的一半的时候,后台线程会主动刷盘

3.redo log 可设置的三个刷盘策略

innodb_flush_log_at_trx_commit的参数值作用(后台进程的刷盘和这个参数的刷盘是分别进行的,不冲突):

①0是事务提交后不刷盘,事务提交后日志只写入redo log buffer

②1是事务提交后马上执行完整刷盘(默认)

③2是事务提交后马上把redo log buffer的内容写到page cache

SELECT @@innodb_flush_log_at_trx_commit #查看刷盘策略
SET GLOBAL innodb_flush_log_at_trx_commit=1  #修改刷盘策略

异常情况:

①当参数值为0时,mysql或者服务器挂了,redo log buffer中的数据全部丢失

②当数值为2时,mysql挂了:因为日志数据在page_cache,所以数据不丢失.如果服务器挂了,数据丢失

注意:别忘了后台进程也在执行每1秒执行一次刷盘的操作

4.日志文件组

因为redo log的有点像循环队列的执行过程,其中write pos是记录当前位置,check point记录要擦除的位置,他们之间的空间是可写入数据的空间。环中write pos 写满了,check point就开始擦除了。

注意:每次myslq加载日志文件组恢复数据的时候,会清空加载过的redolog记录

二.binlog

binlog是逻辑日志,属于mysql server层,用于灾难后的数据恢复和mysql的主从复制

1.三种模式

①statement :记录原始sql语句

②row:记录数据值

③mixed:statement和row两种混合使用

注意:statement模式由于是记录sql语句,所以比如当sql语句中用now()函数时会导致恢复的日期数据不一致,此时用row可以解决这个问题但是用row模式需要更大的空间来存储,恢复和同步更消耗IO性能。此时用mixed可以解决这个问题,mixed模式下会自动判断sql语句是否会引起数据不一致,如果会就用row模式,反之就用statement模式

2.刷盘时机
事务执行过程中,先把日志写到binlog cache,如果事务太大则会用额外写入磁
盘空间。当事务提交的时候再写到page cache,最后再fsync到binlog
我们可以通过参数binlog_page_size控制单个线程 binlog cache 大小,如果存
储内容超过了这个参数,就要暂存到磁盘

参数sync_binlog控制fsync的时机:
①sync_binlog=1时,每次事务提交都把数据持久化到磁盘
②sync_binlog=0时(默认值),每次事务提交都只把内容写到page cache,持久化到磁盘的时
机由系统控制
③sync_binlog=n时,是当事务每次提交都只写到page cache积累了n个之后才持久化到磁

几个重要的参数:
①sync_binlog:决定刷盘时机,控制二进制日志被同步到磁盘前二进制日志提交组的数量4
②max_binlog_size:binlog文件的最大容量
③binlog_cache_size:在事务中binlog的缓存大小

三.redolog和binlog的区别

①redolog具有crash-safe的能力,而binlog没有。
②redolog是记录在数据页上做了什么修改,而binlog记录的是语句的原始逻辑
③redolog是循环写(前面的图片已经说的很清楚了),所以binlog存在数据覆盖的问题,binlog
是追加写,一个binlog文件写满了就会再创建一个binlog文件写,所以binlog是归档日志
④binlog是事务提交的时候才从binlog cache写到binlog,而redolog有后台每1秒自动刷
盘的功能,在这点上保证了事务即使未提交时发生崩溃也能完好的恢复事务中的数据
⑤binlog属于server层,redolog属于innodb引擎特有的
四.两阶段提交
两阶段提交是为了保证redolog和binlog数据的一致性
简单来说就是当数据发生更新时,先写redolog,写好后redolog进入prepare状态,再写
binlog,写好binlog后把redolog改成commit状态。如果binlog没写好就发生了故障,此时
事务回滚

本文参考自javaguid:MySQL三大日志(binlog、redo log和undo log)详解 | JavaGuide

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>