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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 我与微信审核的“相爱相杀”看个人小程序副业