Mysql 三大日志(binlog、redolog和undolog)

前言:Mysql事务  实现,Mysql事务的原子性、一致性、持久性由日志来实现。

Myisam引擎只支持binlog,而innodb支持binlog、redolog、undolog。

Redo Log称为重做日志,提供写入操作,恢复提交事务修改页的操作,用来保证事务的持久性。

Undo Log称为回滚日志,回滚记录到某个特定的版本,用来保证事务的原子性和一致性。

锁机制保证了事务的隔离性。

   提交是redolog,中止就是undolog

 

概括:Redolog和Undolog都是做恢复性操作的。

redo log:是存储引擎层生成的日志,记录的是“物理级别”上的页修改操作,比如页号xxx、偏移量yyy、写入了zzz数据。主要为了保证数据可靠性。

undo log: 是存储引擎生成的日志,记录的是逻辑上的日志,比如做了insert语句,记录一条与之相反的delete操作。主要用于事务的回滚(undo log记录的是每个修改操作的逆操作)和一致性非锁定读(MVCC)

 

 

Redo日志

Tips:每条redo记录由“表空间号+数据页号+偏移量+修改数据长度+具体修改的数据”组成。

1、先写到内存缓冲区中,提交后再刷盘。

通过checkPoint机制,来刷入磁盘

 为什么需要RedoLog日志?

缓冲区可以消除CPU和磁盘之间的鸿沟,checkpoint机制可以保证数据的最终落盘。

但是由于checkpoint并不是每次变更的时候触发,而是master线程隔一段时间处理的,所以最坏的情况是事务提交后,宕机,数据无法恢复。

并且多个数据不在一个页可能,因为数据库操作的基本单位都是以页为单位。

持久性无法保证等多个原因:

1、修改量和刷新磁盘工作量不成比例(1个数据,16KB一页)

2、刷新IO刷新较慢(不在一个页,很多页随机IO )

所以写入到redolog中。

 

保证持久性:

1、先写入到内存,再WAL技术先写日志(硬盘)、再写数据写到磁盘。只有日志写入成功,才算事务提交成功。日志写入失败,事务不提交并回滚。

 

redolog包含了两个层面:

1、内存层面(redo log buffer)重做日志的buffer,由redolog block组成,一个16MB

2、物理磁盘层面 (redolog file) 重做日志文件id_logfile0,id_logfile1

redolog的整体流程:

 

 还没提交就在写log。redolog的优先级跟高。

注意:redo log buffer刷盘到redo logfile的过程并不是真正的刷盘,只是刷入到文件缓存中(这个是操作系统提高文件写入效率的优化)。

但是这种就会出现交给系统,刷盘不及时,宕机造成数据丢失。

 

三种刷盘策略:

Innodb_flus_log_at_trx_commit=0.1.2控制的是事务提交后的工作。是否马上刷盘。在事务未提交之前是一直在实时的写入redo log buffer。

0:表示每次事务提交时不进行刷盘操作。(系统默认master thread  1S进行一次redolog日志的同步)

InnoDB存储引擎后台有一个线程,每隔1秒,就会把redo log buffer中的内容写入到系统缓存page cache,然后调用刷盘策略

 

后台线程,每隔一秒就把redologbuffer写入到pagebuffer,调用fsync刷盘。

默认0就是一直用的这个,效率是最高的。最不安全的

参数是1是最安全的。

1:表示每次事务提交时都进行同步,刷盘操作当事务提交的时候会调用fsync对redolog进行刷盘,将redolog buffer写入到redolog文件中。

2:表示每次事务提交只把redo log buffer内容写入page cache,不进行同步。由OS决定什么时候同步。

Tips:Innodb后台会有一个线程,每隔一秒钟,把redo log buffer中的内容写入到文件文件系统缓存page cache(内存),然后调用fsync刷盘。

Redolog小结:

 

 将更新之前的数据写入到的undo log日志文件中。

 

 

 

 

Undo log日志(查询操作不会记录的)

redolog是事务持久性的保证,undolog是保证事务一致性、原子性的保证。在事务更新数据的前置操作要先写入一个undo log日志。

比如:

1、插入一条记录,记录的是delete操作就好

2、删除一条就记录插入。

undo log会产生redo log。

作用1:回滚数据

逻辑上修改,不会是从物理上修改的。比如插入了,执行一次delete,逻辑上的做回去。

作用2:MVCC(多版本并发控制)

当用户读取一行记录,若该记录被其他事务占用,当前事物通过undo读取之前的行版本信息。非锁定读。

 

回滚段中的数据分类

1、未提交的回滚数据,实现读一致性

2、已经提交未过期的数据,仍然收到undo retention参数的保持时间影响

3、事物提交已经过期,当回滚段满了之后,会优先覆盖事务已经提交过期的数据。

 

 

Redolog与Binlog区别:

1、redolog跟binlog的区别,redolog是存储引擎层产生的,而binlog 是数据层层面产生的。假设一个事务,对表做了10万行的记录插入,

在这个过程中,一直不断的往redo log顺序记录,而binlog不会,只有事务提交后才一次性写入binlog日志。

功能:

redolog:让innodb存储引擎拥有崩溃恢复能力

binlog:保证了Mysql集群架构的数据一致性。

undolog:

 

 两阶段提交:

保障binlog和redolog一致性 :

1、 

 

 

 

 

 

 

 每个数据行记录除了记录本身的数据之外,还有几个隐藏列。

 

如果没有显示定义主键,表中也没有唯一索引,那么INnoDb会自动添加一个隐藏列为主键。

事务ID

回滚指针:差用头插法,指向undolog版本的数据。

 

查看日志前100行

cat binlog | head -100 

Binlog(二进制日志)

 

作用应用场景:

1、用于数据恢复,mysql意外停止,查看用户执行了那些操作,根据binlog来恢复数据库服务器。

2、用于数据复制,主从复制等

 

为了安全起见,可以将参数设置为1,表示每次提交事务都执行fsync,如同redo log刷盘策略一样,马上进行刷盘

还有一种折中的办法,设置为N>1,表示每次事务提交事务都write,但累积N个事务后才fsync。 

 

数据恢复:

show variables like '%log_bin%';

 

删除二进制日志

purge

 

posted @   雷雷提  阅读(2739)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 我与微信审核的“相爱相杀”看个人小程序副业
点击右上角即可分享
微信分享提示