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的。
录入 - binlogundo 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版。宝鸡白癜风医院哪家专业武汉看癫痫去哪里比较好
西宁哪个妇科医院好
常州妇科
成都风湿医院哪个最好
- 银保监会发文促进商业养老金融发展 提倡为资本市场提供支持
- 理想汽车:暂时没有涨价必要性,上次涨价已考虑未来维护费用
- 苹果产品供应告急,新款MacBookPro多平台缺货,郑州三星招工奖金翻倍
- 苹果系列产品供应告急,新款MacBookPro多平台缺货,郑州富士康招工奖金翻倍
- 申购成功却无法收取 i 茅台致歉
- 申购顺利却无法支付 i 茅台致歉
- 突发!美国“拉黑”5家中企,理由比较美国!
- 家里来侍应必做的一道菜,肥而不腻入口即化,上桌一会就被清盘
- 著名影星的百达翡丽被抢,意大利一旅游协会给出惊人促请!
- 六部门:2025年规模以上工业计量增加值能耗比2020年下降13.5%
- 家里来了阿姨,做了一把手的菜,老婆一看,立马上留下来
- 1991年苏联汇率达到7年来最高水平
- 一家人有糯米粉的试试做这个,简单复刻小时候的味道!
- 与生命铁饼,为老兵留下“红色记忆”