日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

原来MySQL面试还会问这些...

發(fā)布時(shí)間:2025/3/16 数据库 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 原来MySQL面试还会问这些... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

在前一陣子,大哥問(wèn)過(guò)我:”你知道MySQL的原子性是怎么保證的嗎“。我懵逼了,MySQL怎么保證原子性?我不會(huì)啊。

誰(shuí)都知道在事務(wù)里邊原子性的意思:”一個(gè)事務(wù)包含多個(gè)操作,這些操作要么全部執(zhí)行,要么全都不執(zhí)行

于是大哥就給我講:”用的就是 undo log 啊“。

我:”臥槽,又是知識(shí)盲區(qū)“

后來(lái)在網(wǎng)上翻了一下,MySQL里邊還有幾種常見的log,分別為:

  • undo log

  • binlog

  • redo log

如果你也未曾關(guān)注過(guò)這些log,麻煩在評(píng)論區(qū)給我留個(gè)言,讓我覺(jué)得不是只有我一個(gè)人這么菜,行不行

后來(lái)我又去搜了一下,其實(shí)這幾種log在面試的時(shí)候也經(jīng)常會(huì)問(wèn)到,這篇文章以最簡(jiǎn)單的方式來(lái)講講,希望對(duì)大家有幫助。

一、什么是binlog

binlog其實(shí)在日常的開發(fā)中是聽得很多的,因?yàn)楹芏鄷r(shí)候數(shù)據(jù)的更新就依賴著binlog。

舉個(gè)很簡(jiǎn)單的例子:我們的數(shù)據(jù)是保存在數(shù)據(jù)庫(kù)里邊的嘛,現(xiàn)在我們對(duì)某個(gè)商品的某個(gè)字段的內(nèi)容改了(數(shù)據(jù)庫(kù)變更),而用戶檢索的出來(lái)數(shù)據(jù)是走搜索引擎的。為了讓用戶能搜到最新的數(shù)據(jù),我們需要把引擎的數(shù)據(jù)也改掉。

一句話:數(shù)據(jù)庫(kù)的變更,搜索引擎的數(shù)據(jù)也需要變更

于是,我們就會(huì)監(jiān)聽binlog的變更,如果binlog有變更了,那我們就需要將變更寫到對(duì)應(yīng)的數(shù)據(jù)源。

什么是binlog?

binlog記錄了數(shù)據(jù)庫(kù)表結(jié)構(gòu)和表數(shù)據(jù)變更,比如update/delete/insert/truncate/create。它不會(huì)記錄select(因?yàn)檫@沒(méi)有對(duì)表沒(méi)有進(jìn)行變更)

binlog長(zhǎng)什么樣?

binlog我們可以簡(jiǎn)單理解為:存儲(chǔ)著每條變更的SQL語(yǔ)句(當(dāng)然從下面的圖看來(lái)看,不止SQL,還有XID「事務(wù)Id」等等)

binlog一般用來(lái)做什么

主要有兩個(gè)作用:復(fù)制和恢復(fù)數(shù)據(jù)

  • MySQL在公司使用的時(shí)候往往都是一主多從結(jié)構(gòu)的,從服務(wù)器需要與主服務(wù)器的數(shù)據(jù)保持一致,這就是通過(guò)binlog來(lái)實(shí)現(xiàn)的

  • 數(shù)據(jù)庫(kù)的數(shù)據(jù)被干掉了,我們可以通過(guò)binlog來(lái)對(duì)數(shù)據(jù)進(jìn)行恢復(fù)。

因?yàn)閎inlog記錄了數(shù)據(jù)庫(kù)表的變更,所以我們可以用binlog進(jìn)行復(fù)制(主從復(fù)制)和恢復(fù)數(shù)據(jù)。

二、什么是redo log

假設(shè)我們有一條sql語(yǔ)句:

update?user_table?set?name='java3y'?where?id?=?'3'

MySQL執(zhí)行這條SQL語(yǔ)句,肯定是先把id=3的這條記錄查出來(lái),然后將name字段給改掉。這沒(méi)問(wèn)題吧?

實(shí)際上Mysql的基本存儲(chǔ)結(jié)構(gòu)是頁(yè)(記錄都存在頁(yè)里邊),所以MySQL是先把這條記錄所在的頁(yè)找到,然后把該頁(yè)加載到內(nèi)存中,將對(duì)應(yīng)記錄進(jìn)行修改。

現(xiàn)在就可能存在一個(gè)問(wèn)題:如果在內(nèi)存中把數(shù)據(jù)改了,還沒(méi)來(lái)得及落磁盤,而此時(shí)的數(shù)據(jù)庫(kù)掛了怎么辦?顯然這次更改就丟了。

如果每個(gè)請(qǐng)求都需要將數(shù)據(jù)立馬落磁盤之后,那速度會(huì)很慢,MySQL可能也頂不住。所以MySQL是怎么做的呢?

MySQL引入了redo log,內(nèi)存寫完了,然后會(huì)寫一份redo log,這份redo log記載著這次在某個(gè)頁(yè)上做了什么修改

其實(shí)寫redo log的時(shí)候,也會(huì)有buffer,是先寫buffer,再真正落到磁盤中的。至于從buffer什么時(shí)候落磁盤,會(huì)有配置供我們配置。

寫redo log也是需要寫磁盤的,但它的好處就是順序IO(我們都知道順序IO比隨機(jī)IO快非常多)。

所以,redo log的存在為了:當(dāng)我們修改的時(shí)候,寫完內(nèi)存了,但數(shù)據(jù)還沒(méi)真正寫到磁盤的時(shí)候。此時(shí)我們的數(shù)據(jù)庫(kù)掛了,我們可以根據(jù)redo log來(lái)對(duì)數(shù)據(jù)進(jìn)行恢復(fù)。因?yàn)閞edo log是順序IO,所以寫入的速度很快,并且redo log記載的是物理變化(xxxx頁(yè)做了xxx修改),文件的體積很小,恢復(fù)速度很快

三、binlog和redo log

看到這里,你可能會(huì)想:binlog和redo log 這倆也太像了吧,都是用作”恢復(fù)“的。

其實(shí)他倆除了"恢復(fù)"這塊是相似的,很多都不一樣,下面看我列一下。

存儲(chǔ)的內(nèi)容

binlog記載的是update/delete/insert這樣的SQL語(yǔ)句,而redo log記載的是物理修改的內(nèi)容(xxxx頁(yè)修改了xxx)。

所以在搜索資料的時(shí)候會(huì)有這樣的說(shuō)法:redo log 記錄的是數(shù)據(jù)的物理變化,binlog 記錄的是數(shù)據(jù)的邏輯變化

功能

redo log的作用是為持久化而生的。寫完內(nèi)存,如果數(shù)據(jù)庫(kù)掛了,那我們可以通過(guò)redo log來(lái)恢復(fù)內(nèi)存還沒(méi)來(lái)得及刷到磁盤的數(shù)據(jù),將redo log加載到內(nèi)存里邊,那內(nèi)存就能恢復(fù)到掛掉之前的數(shù)據(jù)了。

binlog的作用是復(fù)制和恢復(fù)而生的。

  • 主從服務(wù)器需要保持?jǐn)?shù)據(jù)的一致性,通過(guò)binlog來(lái)同步數(shù)據(jù)。

  • 如果整個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)都被刪除了,binlog存儲(chǔ)著所有的數(shù)據(jù)變更情況,那么可以通過(guò)binlog來(lái)對(duì)數(shù)據(jù)進(jìn)行恢復(fù)。

又看到這里,你會(huì)想:”如果整個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)都被刪除了,那我可以用redo log的記錄來(lái)恢復(fù)嗎?“不能

因?yàn)楣δ艿牟煌?#xff0c;redo log 存儲(chǔ)的是物理數(shù)據(jù)的變更,如果我們內(nèi)存的數(shù)據(jù)已經(jīng)刷到了磁盤了,那redo log的數(shù)據(jù)就無(wú)效了。所以redo log不會(huì)存儲(chǔ)著歷史所有數(shù)據(jù)的變更,文件的內(nèi)容會(huì)被覆蓋的

binlog和redo log 寫入的細(xì)節(jié)

redo log是MySQL的InnoDB引擎所產(chǎn)生的。

binlog無(wú)論MySQL用什么引擎,都會(huì)有的。

InnoDB是有事務(wù)的,事務(wù)的四大特性之一:持久性就是靠redo log來(lái)實(shí)現(xiàn)的(如果寫入內(nèi)存成功,但數(shù)據(jù)還沒(méi)真正刷到磁盤,如果此時(shí)的數(shù)據(jù)庫(kù)掛了,我們可以靠redo log來(lái)恢復(fù)內(nèi)存的數(shù)據(jù),這就實(shí)現(xiàn)了持久性)。

上面也提到,在修改的數(shù)據(jù)的時(shí)候,binlog會(huì)記載著變更的類容,redo log也會(huì)記載著變更的內(nèi)容。(只不過(guò)一個(gè)存儲(chǔ)的是物理變化,一個(gè)存儲(chǔ)的是邏輯變化)。那他們的寫入順序是什么樣的呢?

redo log事務(wù)開始的時(shí)候,就開始記錄每次的變更信息,而binlog是在事務(wù)提交的時(shí)候才記錄。

于是新有的問(wèn)題又出現(xiàn)了:我寫其中的某一個(gè)log,失敗了,那會(huì)怎么辦?現(xiàn)在我們的前提是先寫redo log,再寫binlog,我們來(lái)看看:

  • 如果寫redo log失敗了,那我們就認(rèn)為這次事務(wù)有問(wèn)題,回滾,不再寫binlog。

  • 如果寫redo log成功了,寫binlog,寫binlog寫一半了,但失敗了怎么辦?我們還是會(huì)對(duì)這次的事務(wù)回滾,將無(wú)效的binlog給刪除(因?yàn)閎inlog會(huì)影響從庫(kù)的數(shù)據(jù),所以需要做刪除操作)

  • 如果寫redo log和binlog都成功了,那這次算是事務(wù)才會(huì)真正成功。

簡(jiǎn)單來(lái)說(shuō):MySQL需要保證redo log和binlog的數(shù)據(jù)是一致的,如果不一致,那就亂套了。

  • 如果redo log寫失敗了,而binlog寫成功了。那假設(shè)內(nèi)存的數(shù)據(jù)還沒(méi)來(lái)得及落磁盤,機(jī)器就掛掉了。那主從服務(wù)器的數(shù)據(jù)就不一致了。(從服務(wù)器通過(guò)binlog得到最新的數(shù)據(jù),而主服務(wù)器由于redo log沒(méi)有記載,沒(méi)法恢復(fù)數(shù)據(jù))

  • 如果redo log寫成功了,而binlog寫失敗了。那從服務(wù)器就拿不到最新的數(shù)據(jù)了。

MySQL通過(guò)兩階段提交來(lái)保證redo log和binlog的數(shù)據(jù)是一致的。

過(guò)程:

  • 階段1:InnoDBredo log 寫盤,InnoDB 事務(wù)進(jìn)入 prepare 狀態(tài)

  • 階段2:binlog 寫盤,InooDB 事務(wù)進(jìn)入 commit 狀態(tài)

  • 每個(gè)事務(wù)binlog的末尾,會(huì)記錄一個(gè) XID event,標(biāo)志著事務(wù)是否提交成功,也就是說(shuō),恢復(fù)過(guò)程中,binlog 最后一個(gè) XID event 之后的內(nèi)容都應(yīng)該被 purge。



四、什么是undo log

undo log有什么用?

undo log主要有兩個(gè)作用:回滾和多版本控制(MVCC)

在數(shù)據(jù)修改的時(shí)候,不僅記錄了redo log,還記錄undo log,如果因?yàn)槟承┰驅(qū)е率聞?wù)失敗或回滾了,可以用undo log進(jìn)行回滾

undo log主要存儲(chǔ)的也是邏輯日志,比如我們要insert一條數(shù)據(jù)了,那undo log會(huì)記錄的一條對(duì)應(yīng)的delete日志。我們要update一條記錄時(shí),它會(huì)記錄一條對(duì)應(yīng)相反的update記錄。

這也應(yīng)該容易理解,畢竟回滾嘛,跟需要修改的操作相反就好,這樣就能達(dá)到回滾的目的。因?yàn)橹С只貪L操作,所以我們就能保證:“一個(gè)事務(wù)包含多個(gè)操作,這些操作要么全部執(zhí)行,要么全都不執(zhí)行”。【原子性】

因?yàn)閡ndo log存儲(chǔ)著修改之前的數(shù)據(jù),相當(dāng)于一個(gè)前版本,MVCC實(shí)現(xiàn)的是讀寫不阻塞,讀的時(shí)候只要返回前一個(gè)版本的數(shù)據(jù)就行了。

最后

這篇文章把binlog /redo log/undo log最核心的知識(shí)給講了,還有一些細(xì)節(jié)性的東西可以自行去補(bǔ)充(比如binlog有幾種的模式,以及文章提到的刷盤策略等等)

如果覺(jué)得學(xué)到了,請(qǐng)給我個(gè)贊行不行。

參考資料:

  • https://www.jianshu.com/p/4bcfffb27ed5

  • https://yq.aliyun.com/articles/617335

  • MySQL的ACID原理!

  • MySQL 是如何實(shí)現(xiàn) ACID 中的 D 的?

  • https://www.cnblogs.com/myseries/p/10728533.html

有道無(wú)術(shù),術(shù)可成;有術(shù)無(wú)道,止于術(shù)

歡迎大家關(guān)注Java之道公眾號(hào)

好文章,我在看??

總結(jié)

以上是生活随笔為你收集整理的原来MySQL面试还会问这些...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美激情 一区 | 国产精品一区二区三区免费在线观看 | 国产麻豆天美果冻无码视频 | 国产白浆在线 | 色老头一区二区三区在线观看 | 免费无码肉片在线观看 | 亚洲人成高清 | 久久99在线| 91成人看片 | 午夜精品久久久久久久久久久 | 中文字幕日韩欧美在线 | 久久重口味 | 亚洲av综合色区 | 中文字幕在线观看免费视频 | 国产无遮挡呻吟娇喘视频 | 91香蕉在线视频 | 日韩人妻无码一区二区三区 | 日本午夜影院 | 视频一区二区在线观看 | 69视频污 | 欧美a级免费 | 另类综合小说 | 乱色熟女综合一区二区三区 | jizz日韩| 色狠狠一区二区三区 | 在线免费看av网站 | 免费播放毛片 | 在线91av | 日本ww色 | 久草a在线 | 折磨小男生性器羞耻的故事 | 一二三区视频 | 亚洲午夜剧场 | 久草国产在线 | 日日夜夜天天 | 欧美色偷偷 | 国外av在线| www.色偷偷| 亚洲成人精品在线 | 无码一区二区三区 | 亚洲欧洲精品一区二区 | 尹人久久 | 91视频免费看片 | 超碰夜夜 | 欧美卡一卡二卡三 | 亚洲永久免费观看 | 国产女人和拘做受视频免费 | 国产黄色精品网站 | 无码人妻精品一区二区蜜桃视频 | 操模特| 精品人妻无码一区二区色欲产成人 | 欧美操穴| 久久午夜鲁丝片 | 极品少妇一区二区 | 亚洲午夜一区二区 | 夜夜躁狠狠躁日日躁av | 日本免费毛片 | 日韩成人动漫在线观看 | 日韩少妇一区二区三区 | 青青草激情| 午夜影院福利 | 欧美色v | 黄色aaa毛片| 精品国产乱码久久久久 | caoprom在线视频 | 午夜精品av | 五月天婷婷在线播放 | 2022精品国偷自产免费观看 | 天堂在线视频免费 | 337p日本欧洲亚洲大胆张筱雨 | 亚洲黄色在线看 | 欧美日韩1| 成年人黄色录像 | 日韩高清中文字幕 | 国产日韩在线观看一区 | 拔擦8x成人一区二区三区 | 国产精品偷乱一区二区三区 | 波多野结衣一区二区三区高清 | 亚洲毛片在线免费观看 | 91青青操 | 老司机在线免费视频 | 中文字字幕第183页 欧美特级一级片 | 久久99热这里只频精品6学生 | 亚洲精品久久视频 | 自拍偷拍三级 | 日韩性生活大片 | 欧美日韩aaa| xxxxwwww在线观看 | 国产精品视频久久久 | 一区不卡av | 国产亚洲精品成人a | 韩国无码一区二区三区精品 | 日韩在线91 | 国产精品99久久免费黑人人妻 | 日本a视频在线观看 | 激情国产视频 | 开心激情深爱 | 女攻总攻大胸奶汁(高h) | 日韩一区二区三区免费 |