自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:詳細(xì)說說 bin log、redo log,我...

數(shù)據(jù)庫 MySQL
今天,民工哥就上次那位讀者遇到的問題,分享一下這方面相關(guān)的知識,希望對后面要去面試,或者學(xué)習(xí)這塊的讀者有一定幫助或參考價(jià)值。如果你感覺文章對你有用。

 前段時(shí)間,有一個(gè)讀者后臺(tái)問我:民工哥,我前幾天去面試,就因?yàn)槲液啔v上寫著精通 MySQL,面試官就一個(gè)勁的追著我問:什么 binlog,redo log,而且還是怎么細(xì)就怎么問,搞我的一臉懵逼。。。

當(dāng)時(shí),我也看到這話也是一臉懵逼的狀態(tài),只是呵呵一笑,回了他一句:老弟,你都工作 3 年了,連 bin log、redo log 都不知道,不應(yīng)該啊。。。

所以,今天,民工哥就上次那位讀者遇到的問題,分享一下這方面相關(guān)的知識,希望對后面要去面試,或者學(xué)習(xí)這塊的讀者有一定幫助或參考價(jià)值。如果你感覺文章對你有用,請不要吝嗇你的在看與轉(zhuǎn)發(fā)支持,民工哥在這先謝謝大家了。

首先,我們先來看看一次查詢/更新語句流程圖

本文會(huì)將重點(diǎn)放在執(zhí)行器<->存儲(chǔ)引擎之間的交互。

mysql不是每次數(shù)據(jù)更改都立刻寫到磁盤,而是會(huì)先將修改后的結(jié)果暫存在內(nèi)存中,當(dāng)一段時(shí)間后,再一次性將多個(gè)修改寫到磁盤上,減少磁盤io成本,同時(shí)提高操作速度。

mysql通過WAL(write-ahead logging)技術(shù)保證事務(wù)

在同一個(gè)事務(wù)中,每當(dāng)數(shù)據(jù)庫進(jìn)行修改數(shù)據(jù)操作時(shí),將修改結(jié)果更新到內(nèi)存后,會(huì)在redo log添加一行記錄記錄“需要在哪個(gè)數(shù)據(jù)頁上做什么修改”,并將該記錄狀態(tài)置為prepare,等到commit提交事務(wù)后,會(huì)將此次事務(wù)中在redo log添加的記錄的狀態(tài)都置為commit狀態(tài),之后將修改落盤時(shí),會(huì)將redo log中狀態(tài)為commit的記錄的修改都寫入磁盤。過程如下圖

redo log記錄方式

redolog 的大小是固定的,在 mysql 中可以通過修改配置參數(shù)innodb_log_files_in_group 和 innodb_log_file_size 配置日志文件數(shù)量和每個(gè)日志文件大小,redolog 采用循環(huán)寫的方式記錄,當(dāng)寫到結(jié)尾時(shí),會(huì)回到開頭循環(huán)寫日志。如下圖

write pos表示日志當(dāng)前記錄的位置,當(dāng)ib_logfile_4寫滿后,會(huì)從ib_logfile_1從頭開始記錄;check point表示將日志記錄的修改寫進(jìn)磁盤,完成數(shù)據(jù)落盤,數(shù)據(jù)落盤后checkpoint會(huì)將日志上的相關(guān)記錄擦除掉,即write pos->checkpoint之間的部分是redo log空著的部分,用于記錄新的記錄,checkpoint->write pos之間是redo log待落盤的數(shù)據(jù)修改記錄。當(dāng)writepos追上checkpoint時(shí),得先停下記錄,先推動(dòng)checkpoint向前移動(dòng),空出位置記錄新的日志。建議收藏備查!MySQL 常見錯(cuò)誤代碼說明

有了redo log,當(dāng)數(shù)據(jù)庫發(fā)生宕機(jī)重啟后,可通過redo log將未落盤的數(shù)據(jù)恢復(fù),即保證已經(jīng)提交的事務(wù)記錄不會(huì)丟失。

有了redo log,為啥還需要binlog呢?

  •  1、redo log的大小是固定的,日志上的記錄修改落盤后,日志會(huì)被覆蓋掉,無法用于數(shù)據(jù)回滾/數(shù)據(jù)恢復(fù)等操作。
  •  2、redo log是innodb引擎層實(shí)現(xiàn)的,并不是所有引擎都有。

基于以上,binlog必不可少

  •  1、binlog是server層實(shí)現(xiàn)的,意味著所有引擎都可以使用binlog日志
  •  2、binlog通過追加的方式寫入的,可通過配置參數(shù)max_binlog_size設(shè)置每個(gè)binlog文件的大小,當(dāng)文件大小大于給定值后,日志會(huì)發(fā)生滾動(dòng),之后的日志記錄到新的文件上。
  •  3、binlog有兩種記錄模式,statement格式的話是記sql語句, row格式會(huì)記錄行的內(nèi)容,記兩條,更新前和更新后都有。

binlog和redo log必須保持一致,不允許出現(xiàn)binlog有記錄但redolog沒有的情況,反之亦然。之前說過在一個(gè)事務(wù)中,redolog有prepare和commit兩種狀態(tài),所以,在redolog狀態(tài)為prepare時(shí)記錄binlog可保證兩日志的記錄一致,下圖列出各種情況來說明。

現(xiàn)在我們再來看看整個(gè)完整的流程圖

相關(guān)參數(shù)設(shè)置建議

  •  1、innodb_flush_log_at_trx_commit:設(shè)置為1,表示每次事務(wù)的redolog都直接持久化到磁盤(注意是這里指的是redolog日志本身落盤),保證mysql重啟后數(shù)據(jù)不丟失。
  •  2、sync_binlog:設(shè)置為1,表示每次事務(wù)的binlog都直接持久化到磁盤(注意是這里指的是binlog日志本身落盤),保證mysql重啟后binlog記錄是完整的。 

 

責(zé)任編輯:龐桂玉 來源: 民工哥技術(shù)之路
相關(guān)推薦

2024-06-11 00:00:02

MySQL數(shù)據(jù)庫系統(tǒng)

2022-11-08 11:26:13

Go逃逸代碼

2020-12-04 06:27:04

序列化面試官Java

2022-02-21 17:24:18

序列化對象存儲(chǔ)

2021-11-09 14:08:45

DockerDockerfileJava

2020-07-02 07:52:11

RedisHash映射

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2024-05-30 08:04:20

Netty核心組件架構(gòu)

2021-07-28 08:32:03

MySQLRedo存儲(chǔ)

2024-02-29 16:49:20

volatileJava并發(fā)編程

2024-11-19 15:13:02

2024-08-29 16:30:27

2023-12-27 18:16:39

MVCC隔離級別幻讀

2025-04-16 00:00:01

JWT客戶端存儲(chǔ)加密令

2025-04-08 00:00:00

@AsyncSpring異步

2024-08-12 17:36:54

2024-02-20 08:13:35

類加載引用Class

2024-03-14 14:56:22

反射Java數(shù)據(jù)庫連接

2021-11-25 10:18:42

RESTfulJava互聯(lián)網(wǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號