首页 >> 中医药酒

3000帧动画图解MySQL为什么必须binlog、redo log和undo log

发布时间:2025年08月11日 12:21

结算示意图列于,那普通用户能接受吗?

回答是否定的。

那InnoDB是如何要用到示意图列于不都会遗失的呢?

今天的第一个存档——redo log现身了。

恢复原 - redo log

顾名思义,redo是最重要用的意即,redo log就是最重要用存档的意即。

redo log是如何保证示意图列于不都会遗失的呢?

就是在重写此此前,先将重写后的数值日志到内存上的redo log中所,就算突然供电了,Buffer Pool中所的示意图列于全部遗失了,来电的时候也可以根据redo log恢复原Buffer Pool,这样既利用到了Buffer Pool的多寄存器高效性,也保证了示意图列于不都会遗失。

我们通过一个数值得注意暗示,我们先假定没法有Buffer Pool,user列于上会只有一条日志,日志的age = 1,假定只能指派一条SQL:

行政工作A:update user set age = 2

指派步骤如下:

如上示意图,有了redo log此此前,将age重写如此一来2此此前,即刻将age = 2所写进redo log上会,如果这个时候突然供电多寄存器示意图列于遗失,在来电的时候,可以将redo log上会的示意图列于朗读来恢复原示意图列于,用这样的方式则保证了示意图列于不都会遗失。

你可能都会答,redo log档案也在内存上,示意图列于档案也在内存上,都是内存系统所设计,何必多此一举?为什么不直接将重写的示意图列于所写进示意图列于档案上会去呢?

吉米,因为redo log是内存排序所写,示意图列于板盘是内存随机所写,内存的排序所写比随机所写高效的多啊。

这种先预所写存档此前头再行将示意图列于板盘的应该,有一个矮小上的专业名词——WAL(Write-ahead logging),翻译如此一来中所文就是预所写式存档。

虽然内存排序所写仍然很高效了,但是和多寄存器系统所设计还是有一定的差别。

那么,有没法有办法更进一步最佳解构一下呢?

回答是可以。那就是给redo log也沙一个多寄存器buffer,也就是redo log buffer,用这种套娃式的作法更有所增沙灵活性。

redo log buffer基本是怎么为了让板盘呢?

在这个关键答题此此前此此前,我们先来捋一下MySQL多用户和Unix的间的关系:

MySQL多用户是一个多线程,它运行于Unix之上。理论上,Unix摆了MySQL一定摆了,但是MySQL摆了Unix不一定摆。

所以MySQL摆了有两种可能:

MySQL摆了,Unix也摆了,也就是常时说的代理服务器宕机了。这种可能Buffer Pool上会的示意图列于都会全部遗失,Unix的os cache上会的示意图列于也都会遗失。MySQL摆了,Unix没法有摆。这种可能Buffer Pool上会的示意图列于都会全部遗失,Unix的os cache上会的示意图列于不都会遗失。

OK,明了了MySQL多用户和Unix的间的关系此此前,再行来看redo log的落盘应该。redo log的板盘应该由变量innodb_flush_log_at_trx_commit管控,这个变量有3个数值可以分设:

innodb_flush_log_at_trx_commit = 1:系统会所写,系统会板innodb_flush_log_at_trx_commit = 0:延时所写,延时板innodb_flush_log_at_trx_commit = 2:系统会所写,延时板

所写可以认知如此一来所写进Unix的多寄存器(os cache),板可以认知如此一来把Unix上会的多寄存器板到内存。

这三种意示意图的区分,我们分开讨论:

innodb_flush_log_at_trx_commit = 1:系统会所写,系统会板

这种意示意图都会在每次行政工作提请此此前,每次都都会将示意图列于从redo log板到内存中所去,理论上只要内存不出新关键答题,示意图列于就不都会遗失。

起程顾来时说,这种意示意图灵活性最较高,但是丢示意图列于风险也最较高。

innodb_flush_log_at_trx_commit = 0:延时所写,延时板

这种意示意图在行政工作提请时,只都会把示意图列于所写进redo log buffer中所,然后让往常寄存器定时去将redo log buffer上会的示意图列于板到内存。

这种意示意图是最高效的,但是我们都知道,定时任务是有孔洞的,但是如果行政工作提请后,往常寄存器没法来得及将redo log板到内存,这个时候不管是MySQL多线程摆了还是Unix摆了,这一部分示意图列于都都会遗失。

起程顾来时说这种意示意图灵活性最高,丢示意图列于的风险也最高。

innodb_flush_log_at_trx_commit = 2:系统会所写,延时板

这种意示意图在行政工作提请此此前都会把redo log所写进os cache中所,但并不都会系统会地将redo log板到内存,而是都会每秒指派一次板新内存系统所设计。

这种可能下如果MySQL多线程摆了,Unix没法摆的话,Unix还是都会将os cache板到内存,示意图列于不都会遗失,如下示意图:

但如果MySQL所在的代理服务器摆掉了,也就是Unix都摆了,那么os cache也都会被搬走,示意图列于还是都会遗失。如下示意图:

所以,这种redo log板盘意示意图是上会两种意示意图的最适当意示意图,灵活性尤其高,遗失示意图列于的风险尤其较高,恨大多可能下都力荐这种意示意图。

起程顾一下,redo log的依赖性是使用恢复原示意图列于,所写redo log的步骤是内存排序所写,有三种板盘意示意图,有innodb_flush_log_at_trx_commit 变量管控,力荐分设如此一来2。

起程摇 - undo log

我们都知道,InnoDB是赞同行政工作的,而行政工作是可以起程摇的。

假如一个行政工作将age=1重写如此一来了age=2,在行政工作还没法有提请的时候,往常寄存器仍然将age=2板入了内存。这个时候,不管是多寄存器还是内存上,age都变如此一来了2,如果行政工作要起程摇,找仅仅重写此此前的age=1,无法起程摇了。

那怎么办呢?

很恰当,把重写此此前的age=1存上去,起程摇的时候根据存上去的age=1起程摇就行了。

MySQL无论如何是这么温的!这个日志重写此此前的示意图列于的步骤,叫要用日志undo log。undo翻译如此一来中所文是重设、起程摇的意即,undo log的主要依赖性也就是起程摇示意图列于。

如何起程摇呢?看示意图这个示意图:

MySQL在将age = 1重写如此一来age = 2此此前,先将age = 1存到undo log上会去,这样只能起程摇的时候,可以将undo log上会的age = 1朗读来起程摇。

只能注意的是,undo log当此前假定全局列于空间内上会,你可以恰当的认知如此一来undo log也是日志在一个MySQL的列于上会,断开一条undo log和断开一条普通示意图列于是类似。理论上,所写undo log的步骤中所同样也是要载入redo log的。

录入 - binlog

undo log日志的是重写此此前的示意图列于,给予起程摇的灵活性。

redo log日志的是重写此此前的示意图列于,给予了分崩离析恢复原的灵活性。

那binlog是温什么的呢?

binlog日志的是重写此此前的示意图列于,使用录入。

和redo log存档类似,binlog也有着自己的板盘意示意图,通过sync_binlog变量管控:

sync_binlog = 0 :每次提请行政工作此前将binlog载入os cache,由Unix管控什么时候板到内存sync_binlog =1 :采用该系统所写内存的方式则来所写binlog,不使用os cache来所写binlogsync_binlog = N :当每进行n次行政工作提请此此前,呼叫一次fsync将os cache中所的binlog强制板到内存

那么关键答题来了,binlog和redo log都是日志的重写此此前的数值,这两者有什么区分呢?有redo log为什么还只能binlog呢?

首先看两者的一些区分:

binlog是逻辑存档,日志的是对哪一个列于的哪即刻要用了什么重写;redo log是物理存档,日志的是对哪个示意图列于页中所的哪个日志要用了什么重写,如果你还不明了示意图列于页,你可以认知如此一来对内存上的哪个示意图列于要用了重写。binlog是追沙所写;redo log是循环所写,存档档案有固定大小不一,都会布满此此前的示意图列于。binlog是Server层的存档;redo log是InnoDB的存档。如果不使用InnoDB变速箱,是没法有redo log的。

但时说是,我觉得这些区分并不是redo log不能摒弃binlog的原因,MySQL其网站显然可以微调redo log让他灭掉binlog的灵活性,但他没法有这么要用,为什么呢?

我视为可不redo log摒弃binlog第二大的原因是“没法应该”。

为什么这么时说呢?

第一点,binlog的生态仍然建立联系上去。MySQL高可用主要就是依赖binlog遗传物质,还有很多Corporation的示意图列于归纳系统和示意图列于处理系统,也都是依赖的binlog。摒弃binlog去改变一个生态费力了不讨好。

第二点,binlog并不是MySQL的困难重重,花上时长在没法有困难重重的地方没法应该。

起程顾

起程顾一下:

Buffer Pool是MySQL多线程行政的砖头多寄存器空间内,有增沙内存IO每一次的依赖性。redo log是InnoDB存储器变速箱的一种存档,主要依赖性是分崩离析恢复原,有三种板盘意示意图,有innodb_flush_log_at_trx_commit 变量管控,力荐分设如此一来2。undo log是InnoDB存储器变速箱的一种存档,主要依赖性是起程摇。binlog是MySQL Server层的一种存档,主要依赖性是录入。MySQL摆了有两种可能:Unix摆了MySQL多线程恰巧摆了;Unix没法摆,但是MySQL多线程摆了。

再一,再行用一张示意图起程顾一下全篇的知识点:

所写在再一

这篇文章所写在一年此此前,原先觉得是一篇经纬没法就让发,都只无聊重写了一下发了出新来,努力只能用动示意图的方式则努力到MySQL基础不太好的朋友,众神忽视就好。

只能突显的一点是,由于作者水平受限制,本文只是浅显的远景地阐释了MySQL几种存档的大致依赖性,步骤中所省略了很多细节,比如Buffer Pool的解决问题细节,比如undo log和MVCC的间的关系,比如binlog buffer、change buffer的假定,比如redo log的两阶段提请。

如果您有任何关键答题,我们可以揭示,如果您在文中所发现错误,还望您提到,万分感谢!

好了,今天的文章就到这底下了。

感谢你的写作!我是CoderW,我们下期再行见。

其所《MySQL实战45讲出》《从根儿上认知MySQL》《MySQL电子技术内幕—InnoDB存储器变速箱》第2版。

宝鸡白癜风医院哪家专业
武汉看癫痫去哪里比较好
西宁哪个妇科医院好
常州妇科
成都风湿医院哪个最好

上一篇: 冬至后宁可不吃肉,也要吃这“百草王”!内吃逼出湿气病气,外用补肾助睡眠

下一篇: 同家银行存美元,不同南部网点利率相差1.5倍

友情链接