這篇文章主要講解了“mysql innodb存儲(chǔ)引擎中一個(gè)事務(wù)的完整流程分析”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“mysql innodb存儲(chǔ)引擎中一個(gè)事務(wù)的完整流程分析”吧!
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比臨城網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式臨城網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋臨城地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。首先說(shuō)下innodb的事務(wù)日志概念:
ib_logfile文件就是innodb的事務(wù)日志,可以理解是INNODB的REDO日志,當(dāng)數(shù)據(jù)庫(kù)異常關(guān)閉的時(shí)候,innodb存儲(chǔ)引擎下的mysql借助事務(wù)日志來(lái)完成實(shí)例恢復(fù),即前滾和回滾來(lái)保證數(shù)據(jù)庫(kù)一致性;
區(qū)別于binlog日志又叫二進(jìn)制日志文件,它會(huì)將mysql中所有修改數(shù)據(jù)庫(kù)數(shù)據(jù)的Query以二進(jìn)制的形式記錄到日志文件中,如:create,insert,drop,update等;(對(duì)于select操作則不會(huì)被記錄到binlog里,因?yàn)樗](méi)有修改數(shù)據(jù)庫(kù)的數(shù)據(jù)),binlog主要是用于保證數(shù)據(jù)完整的,如主從備份,通過(guò)從binlog文件中讀取操作Query來(lái)在salve機(jī)上進(jìn)行同樣的操作,保證主從同步,同時(shí)也可以作為恢復(fù)數(shù)據(jù)的工具。
Innodb還有另外一個(gè)日志Undo log,但Undo log是存放在共享表空間里面的(ibdata*文件,存儲(chǔ)的是check point日志序列號(hào))。
InnoDB 日志緩沖區(qū)(InnoDB Log Buffer):這是 InnoDB 存儲(chǔ)引擎的事務(wù)日志所使用的緩沖區(qū)。類似于 Binlog Buffer,InnoDB 在寫(xiě)事務(wù)日志的時(shí)候,為了提高性能,也是先將信息寫(xiě)入 Innofb Log Buffer 中,當(dāng)滿足 innodb_flush_log_trx_commit 參數(shù)所設(shè)置的相應(yīng)條件(或者日志緩沖區(qū)寫(xiě)滿)之后,才會(huì)將日志寫(xiě)到文件(或者同步到磁盤)中??梢酝ㄟ^(guò) innodb_log_buffer_size 參數(shù)設(shè)置其可以使用的大內(nèi)存空間;
下面重點(diǎn)講解 innodb_flush_log_trx_commit 參數(shù):下圖可以清楚的展現(xiàn)出該參數(shù)設(shè)置成不同值時(shí)log刷新的不同過(guò)程;
針對(duì)這張圖第一個(gè)箭頭代表著每次commit的時(shí)候,事務(wù)日志到達(dá)的地方, 然后第二個(gè)箭頭,代表刷新到磁盤永久保存的過(guò)程, 后面的fsync every commit、fsync every second 、fsync every second 是在分別形容第二個(gè)箭頭刷新的條件。
然后還需要注意的:宏觀上寫(xiě)進(jìn)logfile就是寫(xiě)進(jìn)磁盤了。但是微觀上寫(xiě)進(jìn)logfile是先寫(xiě)進(jìn)了os cahce,然后再刷新到raid cache(前提是做了raid)最后到磁盤。
具體分析innodb_flush_log_at_trx_commit=N的意義:
innodb_flush_log_at_trx_commit=0,每次commit時(shí),事務(wù)日志寫(xiě)進(jìn)了innodb log buffer ,然后每秒Log Thread 會(huì)將事務(wù)日志從innodb log buffer刷新到ib_ogfile(也就刷新到了磁盤)。當(dāng)innodb_flush_log_at_trx_commit設(shè)置為0,mysqld進(jìn)程的崩潰會(huì)導(dǎo)致上一秒鐘所有事務(wù)數(shù)據(jù)的丟失,這是因?yàn)槊看蝐ommit,事務(wù)日志只是寫(xiě)進(jìn)了innodb log buffer 中,然后是每秒才將innodb log buffer 中的事務(wù)日志刷新到磁盤永久保存,所以mysqld進(jìn)程的崩潰時(shí),innodb log buffer可能會(huì)有一秒的日志沒(méi)有刷新出來(lái),但是在這種情況下,MySQL性能最好;
innodb_flush_log_at_trx_commit=2,每次commit時(shí),事務(wù)日志寫(xiě)進(jìn)了innodb log buffer,并同時(shí)接著寫(xiě)進(jìn)os cache, 也就是說(shuō)每次commit,事務(wù)日志寫(xiě)進(jìn)了os cache中, 然后每秒從os cache刷新到ib_logfile(也就是刷新到了磁盤)。當(dāng)innodb_flush_log_at_trx_commit設(shè)置為2,只有在操作系統(tǒng)崩潰或者系統(tǒng)掉電的情況下,上一秒鐘所有事務(wù)數(shù)據(jù)才可能丟失,因?yàn)槊看蝐ommit,事務(wù)日志已經(jīng)進(jìn)入了os cache,所以mysqld崩潰,事務(wù)日志是不會(huì)丟失的;
innodb_flush_log_at_trx_commit設(shè)置為1,這是最安全的設(shè)置,同時(shí)由于頻繁的io操作,導(dǎo)致效率是最差的,這時(shí)候不管是mysqld,還是操作系統(tǒng)崩潰,都不會(huì)丟數(shù)據(jù),這是因?yàn)槊看蝐ommit,事務(wù)日志都刷新到了磁盤永久保存了;
選取的原則:
對(duì)于一些數(shù)據(jù)一致性和完整性要求不高的應(yīng)用,配置為 2 就足夠了;如果為了最高性能,可以設(shè)置為 0。有些應(yīng)用,如支付服務(wù),對(duì)一致性和完整性要求很高,所以即使最慢,也最好設(shè)置為 1.。
然后介紹參數(shù)sync_binlog :
sync_binlog = N: 控制的是從binlog buffer中刷新binlog到底層binlog文件(也就是刷新到底層磁盤)
N>0 每向二進(jìn)制日志文件寫(xiě)入N條SQL或N個(gè)事務(wù)后,則把二進(jìn)制日志文件的數(shù)據(jù)刷新到磁盤上;
N=0 不主動(dòng)刷新二進(jìn)制日志文件的數(shù)據(jù)到磁盤上,而是由操作系統(tǒng)決定;
推薦配置組合:
1)innodb_flush_log_at_trx_commit=1同時(shí)sync_binlog =1
這就是所謂的雙1設(shè)置:這種配置適合數(shù)據(jù)安全性要求非常高,而且磁盤IO寫(xiě)能力足夠支持業(yè)務(wù),比如充值消費(fèi)系統(tǒng),銀行業(yè)務(wù);
2)innodb_flush_log_at_trx_commit=1同時(shí)sync_binlog =0
這種設(shè)置:保證了事務(wù)日志是全的,也就保證可以實(shí)例恢復(fù),即前滾和回滾,適合數(shù)據(jù)安全性要求高,磁盤IO寫(xiě)能力不太富余;
3))innodb_flush_log_at_trx_commit=2或者0同時(shí)sync_binlog =2或者m(0<m<100) </m<100)<>
這種設(shè)置:適合數(shù)據(jù)安全性有要求,允許丟失一點(diǎn)事務(wù)日志;
4)innodb_flush_log_at_trx_commit=0同時(shí)sync_binlog =0
這種配置適合 :磁盤IO寫(xiě)能力有限,對(duì)數(shù)據(jù)安全要求較低,例如:日志性登記業(yè)務(wù);
感謝各位的閱讀,以上就是“mysql innodb存儲(chǔ)引擎中一個(gè)事務(wù)的完整流程分析”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)mysql innodb存儲(chǔ)引擎中一個(gè)事務(wù)的完整流程分析這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
文章標(biāo)題:mysqlinnodb存儲(chǔ)引擎中一個(gè)事務(wù)的完整流程分析-創(chuàng)新互聯(lián)
本文路徑:http://jinyejixie.com/article4/pehoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、網(wǎng)站營(yíng)銷、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站制作、全網(wǎng)營(yíng)銷推廣、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容