当前位置: 首页 > 后端技术 > Java

吃透MySQL三大日志,RedoLog、UndoLog、BinLog

时间:2023-04-02 00:13:52 Java

1。后台MySQL实现了事务、崩溃恢复、集群主从复制。底层离不开日志,所以日志是MySQL的本质。只有了解MySQL日志,才能彻底了解MySQL。今天就带大家简单的学习一下MySQL的三大日志系统,RedoLog(重做日志),UndoLog(恢复日志),BinLog(备份日志)。2.RedoLog(重做日志)2.1RedoLog内容及作用RedoLog记录的是物理日志,即磁盘数据页的修改。作用:用于保证事务中改变的数据在服务崩溃后仍能持久化到磁盘。MySQL事务中的持久化是使用RedoLog实现的。2.2什么时候写入RedoLog?LoaddatafromdisktomemoryModifydatainmemoryWritenewdatatoRedoLogBuffer将RedoLogBuffer中的数据持久化到RedoLogfile将RedoLogfile中的数据持久化到数据库磁盘你可能会问,为什么要写RedoLogBuffer和重做日志文件?直接持久化到磁盘不是很好吗?直接写入磁盘会导致严重的性能问题:InnoDB在磁盘上存储的基本单位是页。这种修改可能只改变了一个页面中的几个字节,但是整个页面的数据都需要刷新,这是一种资源浪费。一个事务可能修改多个页面的数据,页面不连续,会产生随机IO,性能变差。这种方案称为WAL(Write-AheadLogging)。预写日志就是先写日志,再写磁盘。2.3RedoLogflushing规则写入RedoLogBuffer后,不会立即持久化到RedoLogFIle。它们需要等待操作系统调用fsync()操作,然后才能刷新到磁盘。什么时候可以将RedoLogBufferflush到RedoLogFIle,可以通过配置innodb_flush_log_at_trx_commit参数来确定。参数值含义0(延迟写入)事务提交后,不会立即刷新到OSBuffer,而是在一秒后刷新到OSBuffer,调用fsync()写入RedoLogFIle,这可能会丢失一秒钟的数据。1(实时写入,每次提交事务,都会刷新到OSBuffer,调用fsync()写入RedoLogFIle,性能较差2(延迟刷新)每次提交事务,都会只会刷新到OSBuffer,然后调用fsync()进入RedoLogFIle,InnoDB的RedoLogFile是固定大小的,可以配置为每组4个文件,每个文件大小为1GB,然后RedoLogFile可以记录4GB的操作,采用循环写的方式覆盖,writepos记录写入的起始位置,并向后移动。checkpoint记录要擦除的位置,也向后移动。writepos和checkpoint之间的位置是可写区,checkpoint和writepos之间的位置是Written区。3.UndoLog(回滚日志)3.1UndoLog的内容和作用UndoLog记录的是逻辑日志,即SQL语句。例如:当我们执行一个insert语句,UndoLog记录了一个相反的delete语句。功能:回滚事务时,恢复修改前的数据。实现MVCC(多版本并发控制)。MySQL事务中的原子性是使用UndoLog实现的。3.2如何回滚UndoLog到上一版本的实现,通过两个隐藏列trx_id(上次提交事务的ID)和roll_pointer(上一版本的地址)建立版本链。并且在事务中读取时会生成一个ReadView(读取视图),在ReadCommitted隔离级别下,每次读取都会生成一个读取视图,而在RepeatableRead隔离级别下,只会为第一次读取生成一个读取视图。4、BinLog(备份日志)4.1BinLog的内容和作用BinLog记录的是MySQL自带的逻辑日志,即原始SQL语句。功能:数据备份,主从同步。BinLog有三种日志格式,可以通过binlog_format配置参数指定。参数值含义Statement记录原始SQL语句,会导致更新时间与原始数据库不一致。
例如update_time=now()Row记录每一行数据的变化,保证数据与原始数据库一致。缺点是数据量大。MixedStatement和Row的混合模式默认采用Statement模式,涉及到日期和函数时使用Row模式,既减少了数据量,又保证了数据的一致性。4.2什么时候写入BinLog?BinLog采用追加写入的方式,不会覆盖原来的日志,所以可以用来恢复之前某个时间的数据。BinLog也是采用WAL方式,先写入日志,再写入磁盘。至于什么时候刷新到磁盘,可以指定sync_binlog配置参数。参数值的含义为0(延迟写入)。每次提交事务时,不会刷新磁盘。系统决定何时刷新磁盘,数据可能会丢失。1(实时写入)每次提交事务都会刷盘,性能较差。N(delayedwriting)只有在N笔交易提交后才会被flush。写入BinLog后添加事务处理:这是两阶段提交的概念,先写入prepare状态的RedoLog,事务提交后再写入commit状态的RedoLog。知识点总结:文章持续更新中。可以在微信搜索“一光架构”第一时间阅读更多技术干货。