久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      本篇文章給大家?guī)砹岁P(guān)于mysql原理中InnoDB存儲引擎架構(gòu)設(shè)計的相關(guān)知識,希望對大家有幫助。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      InnoDB組件結(jié)構(gòu):

      1. buffer pool : 緩沖池,緩存磁盤的數(shù)據(jù)

      2. redo log buffer :記錄對緩沖池的操作,根據(jù)策略寫入磁盤防止宕機(jī)但事務(wù)已經(jīng)提交而丟失數(shù)據(jù)

      3. undo log :當(dāng)對緩沖池的數(shù)據(jù)進(jìn)行修改時,在事務(wù)未提交的時候都可以進(jìn)行回滾,將舊值寫入 undo 日志文件便于回滾,此時緩沖池的數(shù)據(jù)與磁盤中的不一致,是臟數(shù)據(jù)

      1. Buffer Pool

      假設(shè)現(xiàn)在有一條更新語句:

      update users set name = 'lisi' where id = 1

      需要更新到數(shù)據(jù)庫,InnoDB會執(zhí)行哪些操作呢?

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      首先,InnoDB會判讀緩沖池里是否存在 id = 1 這條數(shù)據(jù),如果不存在則從磁盤中加載到緩沖池中,而且還會對這行數(shù)據(jù)加獨(dú)占鎖,防止多個sql同時修改這行數(shù)據(jù)。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      2. undo 日志文件

      假設(shè) id = 1 這條數(shù)據(jù)name原來的值 name = 'zhangsan',現(xiàn)在我們要更新為 name = 'lisi' , 那么我們就需要把舊值name='zhangsan'和id=1這些信息寫入到undo日志文件中。

      對于熟悉數(shù)據(jù)庫的同學(xué)來說都了解事務(wù)的概念,在事務(wù)未提交之前,所有操作都有可能進(jìn)行回滾,即可以把 name = 'lisi' 回滾到 name = 'zhangsan',所以將更新前的值寫到undo日志文件。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      3. 更新buffer pool 數(shù)據(jù)

      在undo日志文件寫入完畢之后,便開始更新內(nèi)存中的這條數(shù)據(jù)。把 id = 1 的 name = 'zhangsan' 更新為 name = 'lisi'。這時內(nèi)存中的數(shù)據(jù)已經(jīng)更新完畢,但磁盤上的還沒有變化,此時出現(xiàn)了不一致的臟數(shù)據(jù)。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      這時可能有一個疑問,萬一事務(wù)提交完成,但MySQL服務(wù)宕機(jī)了,而內(nèi)存中的數(shù)據(jù)還沒寫入到磁盤,是不是會造成數(shù)據(jù)丟失而造成sql執(zhí)行數(shù)據(jù)前后不一致?

      4. redo log buffer

      在InnoDB結(jié)構(gòu)中,有一個 redo log buffer 緩沖區(qū)存放redo日志,所謂redo日志,例如 把id=1,name='zhangsan'修改為name='lisi' 便是一條日志。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      但這時redo log buffer 還僅僅存在內(nèi)存中,沒能實(shí)現(xiàn)MySQL宕機(jī)后的數(shù)據(jù)恢復(fù)。

      5. 事務(wù)沒提交,數(shù)據(jù)庫宕機(jī)后有影響嗎?

      其實(shí)并沒有影響,事務(wù)沒有提交,意味著執(zhí)行沒有成功,就算MySQL崩潰或者宕機(jī)后,內(nèi)存中的 buffer pool 和 redo log buffer 修改過的數(shù)據(jù)都會丟失,也并不影響數(shù)據(jù)前后的一致性。如果事務(wù)提交失敗,那數(shù)據(jù)庫的數(shù)據(jù)更加不會改變。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      6. 提交事務(wù),redo日志的配置策略

      在提交事務(wù)時,redo日記會根據(jù)策略實(shí)現(xiàn)把redo日志從 redo log buffer 里寫入磁盤。策略通過 innoDB_flush_log_at_trx_commit 來配置。

      1. innoDB_flush_log_at_trx_commit的參數(shù)為0,就算事務(wù)提交后,也不會把redo日志寫入磁盤。MySQL宕機(jī)后會內(nèi)存中的數(shù)據(jù)會丟失。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      1. innoDB_flush_log_at_trx_commit的參數(shù)為1,事務(wù)提交后,redo日志會從內(nèi)存刷入磁盤,只要事務(wù)提交成功,redo log 就必然存在磁盤里。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      此時就算buffer pool 的數(shù)據(jù)沒有刷進(jìn)磁盤,也可以從redo log 中得知修改過哪些數(shù)據(jù),MySQL宕機(jī)重啟后,可以從redo日志中恢復(fù)修改的數(shù)據(jù)。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      1. innoDB_flush_log_at_trx_commit的參數(shù)為2,事務(wù)提交后,redo log 僅僅停留在 os cache 中,還沒刷進(jìn)磁盤,萬一此時服務(wù)宕機(jī)了。那么os cache 中的數(shù)據(jù)也會丟失,即使事務(wù)提交成功,也會造成數(shù)據(jù)丟失。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      看完這幾種相信為了保證數(shù)據(jù)安全,參數(shù)為1是最佳策略。

      7. 事務(wù)的最終提交,binlog

      binlog其實(shí)是屬于MySQL Server 的日志文件,而在這出提出是因為與redo log有著很大的關(guān)聯(lián)。

      1) biglog 與 redo log的區(qū)別

      • redo log:記錄的是偏物理性質(zhì)重做日志,比如 “對哪個數(shù)據(jù)頁中的什么記錄,做了哪些修改”

      • binlog:偏向于邏輯性的日志,如:“對users表中的id=10的一行數(shù)據(jù)做了更新操作,更新以后的值是什么”

      2) 提交事務(wù)的時候同時寫入binlog

      在執(zhí)行更新的同時,innoDB與執(zhí)行器一直在交互,包括加載數(shù)據(jù)到緩沖池,寫入undo日志文件,更新內(nèi)存數(shù)據(jù),寫redo日志和刷入磁盤等。而對binlog的寫入也是由執(zhí)行器執(zhí)行。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      其中 1、2、3、4步驟為執(zhí)行更新語句做的事,而 5、6是提交事務(wù)開始做的事。

      3) binlog日志刷盤策略分析

      sync_binlog參數(shù)控制binlog的刷盤策略

      1. sync_ binlog默認(rèn)值是0,提交事務(wù)后,會把binlog日志存在 os cache 中,MySQL宕機(jī)后會造成os cache中數(shù)據(jù)的丟失

      2. sync_binlog 值為1,提交事務(wù)后,把binlog日志直接刷入磁盤中。

      4) 基于binlog 和 redo log 完成事務(wù)的提交

      binlog寫入磁盤后,會把binlog日志文件所在的位置和文件名稱都寫入redo log日志文件中,同時在redo log日志文件里寫入一個commit標(biāo)記。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      5) commit 標(biāo)記有什么意義?

      commit 標(biāo)記意義著保持redo log 和 binlog 日志一致。如果在步驟5或者步驟6,事務(wù)提交開始,MySQL宕機(jī)了,redo log 中并沒有commit標(biāo)記,都算事務(wù)提交失敗。

      意味著 commint 標(biāo)記是事務(wù)最終提交成功。

      8. buffer pool 臟數(shù)據(jù)刷入磁盤

      臟數(shù)據(jù)刷入磁盤是由后臺IO線程隨機(jī)刷入磁盤的。

      完全掌握MySQL原理篇之InnoDB存儲引擎架構(gòu)設(shè)計

      這時候考慮到,在刷入磁盤之前,MySQL宕機(jī)怎么辦?這時候,事務(wù)已經(jīng)提交成功,redo log 中也有commit標(biāo)記,就算宕機(jī)了,重啟后,也會根據(jù)redo日志文件把數(shù)據(jù)更新到內(nèi)存中,等待IO線程的刷盤。

      9. 總結(jié)

      通過更新語句執(zhí)行分析之后,了解到InnoDB存儲引擎中包含了 buffer pool 緩沖池、redo log buffer 緩沖區(qū)等緩存數(shù)據(jù),undo、reod log等日志文件,同時也有MySQL Server 的日志文件。

      在執(zhí)行更新語句的時候,會修改buffer pool、寫undo日志文件、 寫redo log buffer等操作;提交事務(wù)時,會將redo log 刷盤,binlog刷盤,寫入binlog文件名稱和位置,寫入commit標(biāo)記,最后等待IO線程將buffer pool的臟數(shù)據(jù)隨機(jī)刷盤。

      推薦學(xué)習(xí):mysql視頻教程

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號