gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

完全掌握MySQL三大日志binlog、redo log和undo log

本篇文章給大家帶來了關于mysql日志的相關知識,我們重點需要關注的是二進制日志(binlog)和事務日志(包括redo log和undo log),希望對大家有幫助。

完全掌握MySQL三大日志binlog、redo log和undo log

1、binlog

binlog用于記錄數據庫執行的寫入性操作(不包括查詢)信息,以二進制的形式保存在磁盤中。binlog是mysql的邏輯日志,并且由Server層進行記錄,使用任何存儲引擎的mysql數據庫都會記錄binlog日志。

  • 邏輯日志:可以簡單得理解為sql語句;
  • 物理日志:MySQL中數據都是保存在數據頁中的,物理日志記錄的是數據頁上的變更;在這里插入代碼片

binlog是通過追加的方式進行寫入的,可以通過max_binlog_size參數設置每個binlog文件的大小,當文件大小達到給定值之后,會生成新的文件來保存日志。

binlog使用場景
項目 在實際應用中,binlog的主要使用場景有兩個,分別是主從復制和數據恢復。

  • 主從復制:在Master端開啟binlog,然后將binlog發送到各個Slave端,Slave端重放binlog從而達到主從數據一致。
  • 數據恢復:通過使用mysqlbinlog工具來恢復數據。

MySQL主從同步原理
完全掌握MySQL三大日志binlog、redo log和undo log完全掌握MySQL三大日志binlog、redo log和undo log

  • 主節點 binlog dump 線程
    當從節點連接主節點時,主節點會創建一個log dump 線程,用于發送binlog的內容。在讀取binlog中的操作時,此線程會對主節點上的binlog加鎖,當讀取完成,甚至在發動給從節點之前,鎖會被釋放;
  • 從節點I/O線程
    當從節點上執行start slave命令之后,從節點會創建一個I/O線程用來連接主節點,請求主庫中更新的binlog。I/O線程接收到主節點binlog dump進程發來的更新之后,保存在本地relaylog中;
  • 從節點SQL線程
    SQL線程負責讀取relaylog中的內容,解析成具體的操作并執行,最終保證主從數據的一致性;
    MySQL 數據庫主從同步原理

binlog的內容
上面說了,binlog是一種邏輯日志,可以簡單得理解為sql語句,但是實際上還包含著執行的sql語句的反向邏輯。delete對應著delete本身以及反向的insert信息;update包含著對應的update執行前后數據行的相關信息;insert包含自身的insert以及對應的delete信息。

binlog的格式
binlog共有三種格式,分別是statement、row以及mixed。MySQL 5.7.7版本之前默認使用的是statement,MySQL 5.7.7之后默認使用的是row。日志的格式可以通過my.ini配置文件中的binlog-format來修改。
(1)statement:基于sql語句的復制(statement-based replication,SBR),每一條修改數據的sql語句都會記錄到binlog中。

  • 優點:不需要具體記錄某一行的變化,節約空間,減少io,提高性能;
  • 缺點:在執行sysdate()或者sleep()等操作的時候,可能導致主從數據不一致的情況;

(2)row:基于行記錄的復制(row-based replication,RBR),不記錄sql語句上下文相關信息,而是記錄哪條記錄被修改的細節。

  • 優點:非常詳細地記錄每一行記錄修改的細節,因而不會出現數據無法被正確復制的情況;
  • 缺點:由于會非常詳細地記錄每一條記錄修改的細節,這樣會產生大量的日志內容。假設現在有一條update語句,修改了很多條記錄,則每條修改記錄都會記錄到binlog中。特別地,alter table這個操作,由于表結構的變化,每行記錄都會發生變化,導致日志量暴增;

(3)mixed:根據上面所說的,statement和row各有優缺點,因此出現了mixed這個版本,將這二者進行混合。一般情況下使用statement格式來進行保存,當遇到statement無法解決時,切換為row格式來進行保存。
特別地,上面說了,新版本(MySQL 5.7.7之后)默認使用的row格式,這里的row也做了相應的優化,在遇到alter table這個操作時采用statement格式進行記錄,其余操作仍然使用row格式。

binlog刷盤時機

對于InnoDB存儲引擎來說,只有在事務提交的時候才會記錄binlog,此時記錄還在內存中,MySQL通過sync_binlog來控制binlog的刷盤時機,取值范圍為0-N:

  • 0:不強制刷到磁盤,由系統自行判斷何時寫入磁盤中;
  • 1:每次提交后都要將binlog寫入磁盤中;
  • N:每N個事務,才會將binlog寫入磁盤中;

從上面可以看出,sync_binlog最安全的是設置是1,這也是MySQL 5.7.7之后版本的默認值。但是設置一個大一些的值可以提升數據庫性能,因此實際情況下也可以將值適當調大,犧牲一定的一致性來獲取更好的性能。

binlog的物理文件大小

在my.ini配置文件中,可以通過max_binlog_size來配置binlog的大小。當日志量超過binlog文件的大小時,系統會重新生成一個新的文件來繼續保存文件。當一個事務比較大時,或者是當日志越來越多的時候,此時占據的物理空間太大怎么辦?MySQL提供了一種自動刪除的機制,還是在my.ini配置文件中,可以通過配置expire_logs_days這個參數來解決,單位為天。當這個參數為0,表示永不刪除;為N時,表示第N天后自動刪除。

2、redo log

redolog是InnoDB引擎專有的日志系統。主要是用來實現事務的持久性以及實現crash-safe功能。redolog屬于物理日志,記錄的是sql語句執行之后數據頁上的具體修改內容。
我們都知道,當MySQL運行的時候,會將數據從磁盤中加載到內存當中。當執行sql語句對數據進行修改時,修改后的內容其實都只是暫時保存到內存當中,如果此時斷電或者出現其他情況,這些修改就會丟失。因而,當修改完數據之后,MySQL會尋找機會將這些內存中的記錄刷回到磁盤當中。但這就出現一個性能問題,主要有兩個方面:

InnoDB中是以頁為數據單位與磁盤進行交互的,而一個事務很可能只是修改了一個頁上的幾個字節,如果將一個完整的數據頁刷回磁盤當中,浪費資源;

一個事務可能涉及到多個數據頁,這些數據頁只是邏輯上連續,在物理上并不連續,使用隨機IO性能太差;

因此,MySQL設計了redolog來記錄事務對數據頁具體做了哪些修改,之后將redolog再刷回磁盤當中。你可能會有疑惑,本來就是想減少io,這不又加上一次io么?InnoDB的設計者在設計之初就已經考慮到了這些。redolog文件一般都比較小,且在刷回磁盤的過程中是順序io,相比于隨機io來說,性能更好。

redo log基本概念
redolog由兩部分組成,一個是內存中的日志緩存redo log buffer,一個是磁盤中的日志文件redo log file。當每次對數據記錄進行修改的時候,都會將這些修改內容先寫入redo log buffer中,后續等待合適的時機將內存中的修改刷回到redo log file中。這種先寫日志,再寫磁盤的技術就是WAL(Write-Ahead Logging)技術。需要注意的是redolog比數據頁先刷回磁盤,聚簇索引,二級索引,undo頁面的修改,均需要記錄redolog。

在計算機操作系統中,用戶空間(user space)下的緩沖區數據一般情況下是無法直接寫入磁盤的,中間必須經過操作系統內核空間(kernel space)緩沖區(OS Buffer)。因此,redo log buffer寫入redo log file實際上是先寫入OS Buffer,然后再通過系統調用fsync()將其刷到redo log file中,過程如下:
完全掌握MySQL三大日志binlog、redo log和undo log
mysql支持三種將redo log buffer寫入redo log file的時機,可以通過innodb_flush_log_at_trx_commit參數配置,各參數值含義如下:

參數值 含義
0(延遲寫) 事務提交時不會將redo log buffer中日志寫入到os buffer,而是每秒寫入os buffer并調用fsync()寫入到redo log file中。也就是說設置為0時是(大約)每秒刷新寫入到磁盤中的,當系統崩潰,會丟失1秒鐘的數據。
1(實時寫,實時刷) 事務每次提交都會將redo log buffer中的日志寫入os buffer并調用fsync()刷到redo log file中。這種方式即使系統崩潰也不會丟失任何數據,但是因為每次提交都寫入磁盤,IO的性能較差。
2(實時寫,延遲刷) 每次提交都僅寫入到os buffer,然后是每秒調用fsync()將os buffer中的日志寫入到redo log file。

完全掌握MySQL三大日志binlog、redo log和undo log
redo log記錄形式
redolog采用固定大小,循環寫入的格式,當redolog寫滿之后,會重新從頭開始寫。為什么這么設計呢?
redo log存在的意義主要就是降低對數據頁刷盤的要求。redolog記錄了數據頁上的修改,但是當數據頁也刷回到磁盤后,這些記錄就失去作用了。因此當MySQL判斷之前的redolog已經失去作用之后,新數據會將這些失效的數據進行覆蓋。那如何判斷該不該進行覆蓋呢?
完全掌握MySQL三大日志binlog、redo log和undo log
上圖是redo log file的示意圖,write pos表示redolog當前記錄的日志序列號LSN(log sequence number)。當數據頁也已經刷回磁盤之后,會更新redo log file中的LSN,表示到這個LSN之前的數據已經落盤,這個LSN就是check point。write pos到check point之間的部分是redolog空余的部分,用于記錄新的記錄;check point到write pos之間是redolog已經記錄的數據頁修改部分,但此時數據頁還未刷回磁盤的部分。當write pos追上check point時,會先推動check point向前移動,空出位置再記錄新的日志。

啟動innodb的時候,不管上次是正常關閉還是異常關閉,總是會進行恢復操作。恢復時,會先檢查數據頁中的LSN,如果這個LSN小于redolog中的LSN,即write pos位置,說明在redolog上記錄著數據頁上尚未完成的操作,接著就會從最近的一個check point出發,開始同步數據。

那有沒有可能數據頁中的LSN大于redolog中的LSN呢?答案是當然可能。出現這種情況時,這時超出redolog的部分將不會重做,因為這本身就表示已經做過的事情,無需再重做。
redo log與binlog區別

redo log binlog
文件大小 redo log的大小是固定的。 binlog可通過配置參數max_binlog_size設置每個binlog文件的大小。
實現方式 redo log是InnoDB引擎層實現的,并不是所有引擎都有。 binlog是Server層實現的,所有引擎都可以使用 binlog日志
記錄方式 redo log 采用循環寫的方式記錄,當寫到結尾時,會回到開頭循環寫日志。 binlog 通過追加的方式記錄,當文件大小大于給定值后,后續的日志會記錄到新的文件上
適用場景 redo log適用于崩潰恢復(crash-safe) binlog適用于主從復制和數據恢復

由binlog和redo log的區別可知:binlog日志只用于歸檔,只依靠binlog是沒有crash-safe能力的。但只有redo log也不行,因為redo log是InnoDB特有的,且日志上的記錄落盤后會被覆蓋掉。因此需要binlog和redo log二者同時記錄,才能保證當數據庫發生宕機重啟時,數據不會丟失。
兩階段提交
上面簡單介紹了redolog和binlog,在對數據進行修改時,他們都會對這些修改進行保存落地,只是一個是物理日志,一個是邏輯日志。那他倆具體在修改過程中是如何執行的呢?

假設現在有一條update語句要執行,update from table_name set c=c+1 where id=2,執行流程如下:

  • 先定位到id=2這一條記錄;
  • 執行器拿到引擎給的行數據,把這個值加上 1,得到新的一行數據,再調用引擎接口寫入這行新數據;
  • 引擎將這行新數據更新到內存中,同時將這個更新操作記錄到redolog里面,此時 redolog 處于 prepare 狀態。然后告知執行器執行完成了,隨時可以提交事務;
  • 執行器生成這個操作的 binlog,并把binlog寫入磁盤;
  • 執行器調用引擎的提交事務接口,引擎把剛剛寫入的 redo log 改成提交(commit)狀態,更新完成;

示意圖如下所示:
完全掌握MySQL三大日志binlog、redo log和undo log
這種將redolog的寫入拆分成prepare和commit兩個步驟的過程稱之為兩階段提交。

redolog 和binlog都可以用于表示事務的提交狀態,而兩階段提交就是讓這兩個狀態保持邏輯上的一致。如果不使用兩階段提交,而是先寫其中一個再寫另外一個可能會帶來一些問題。

此時還是使用update來舉例。假設當前id=2,有一個字段c=0,分別分析以下情況:
先寫redolog再寫binlog
假設先寫redolog,當redolog寫完,但是binlog還未寫完的時候,此時MySQL突然出現異常導致重啟。由于之前redolog已經寫完,系統重啟后,修改的記錄仍然存在,所以恢復后這一行 c 的值是 1。但由于系統重啟,binlog中并未有這條記錄。之后備份日志的時候,存起來的binlog里面就沒有這條語句。然后你會發現,如果需要用這個 binlog 來恢復臨時庫的話,由于這個語句的binlog丟失,這個臨時庫就會少了這一次更新,恢復出來的這一行 c 的值就是 0,與原庫的值不同。
先寫binlog再寫redolog
假如先寫binlog,然后寫redolog的時候系統重啟。重啟之后,redolog中沒有對c進行修改的記錄,此時c的值還是0。但是 binlog里面已經記錄了“把 c 從 0 改成 1”這個日志。所以,在之后用 binlog來恢復的時候就多了一個事務出來,恢復出來的這一行 c 的值就是 1,與原庫的值不同。

因此,綜上所述,如果是先寫某一個日志再寫另一個日志,就會出現數據庫的狀態與使用binlog恢復出來的庫的狀態不一致的情況。

3、undo log

undolog主要用來記錄某條行記錄被修改之前的狀態,記錄的是修改前的數據。這樣的話,當事務進行回滾時,就可以通過undolog將記錄恢復到事務開始前的樣子。事務的原子性和持久性也是依靠undolog來實現的。undo log主要記錄了數據的邏輯變化,比如一條INSERT語句,對應一條DELETE的undo log,對于每個UPDATE語句,對應一條相反的UPDATE的undo log,這樣在發生錯誤時,就能回滾到事務之前的數據狀態。同時,在進行數據恢復的時候,與binlog,redolog結合使用,保證了數據恢復的正確性。

undolog的作用流程如下所示:
完全掌握MySQL三大日志binlog、redo log和undo log

  • 在事務開始之前將修改前的版本寫入到undo log中;
  • 開始進行修改,將修改過的數據保存到內存當中;
  • 將undolog持久化到磁盤當中;
  • 將數據頁刷回到磁盤當中;
  • 事務提交;

需要注意的是,與redolog一樣,undolog也是要先于數據頁刷回到磁盤當中。在恢復數據時,如果undolog是完整的,可以根據undolog來回滾事務。

在一個事務當中,可能會對同一條數據進行多次修改,那么是不是每一次修改前的記錄都要記錄到undolog中呢?這樣的話,會導致undolog日志量太大,此時redolog就要上場了。在一個事務當中,如果是對同一條記錄進行修改,undolog只會記錄事務開始前的原始記錄,當再次對這條記錄進行修改時,redolog會記錄后續的變化。在數據恢復時,redolog完成前滾,undolog完成回滾,二者相互協調完成數據的恢復。過程如下所示:
完全掌握MySQL三大日志binlog、redo log和undo log
還有一個功能就是MVCC多版本控制鏈了,這個請參考這篇文章
MySQL之MVCC實現原理

binlog,redolog和undolog是MySQL中最重要的三個日志,在進行數據恢復時,三者進行協調合作,保證數據恢復的正確性。
完全掌握MySQL三大日志binlog、redo log和undo log

推薦學習:mysql視頻教程

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
中文字幕第88页| 一级黄色特级片| 亚洲av毛片在线观看| 中文字幕有码av| 国产aaaaa毛片| 97公开免费视频| 免费看污污网站| av五月天在线| 亚洲一级片av| 超级碰在线观看| 妺妺窝人体色777777| 人妻夜夜添夜夜无码av| 国产老熟妇精品观看| 日韩网址在线观看| 国产精品igao| 五月天视频在线观看| 中文字幕av久久| 亚洲精品久久久久久久蜜桃臀| 福利视频一二区| 国产精品欧美激情在线观看| 黄色片一级视频| 久国产精品视频| 青青青青在线视频| 成人精品视频一区二区| 国产无遮挡猛进猛出免费软件| 成年人免费观看的视频| 日本wwwcom| 欧美精品无码一区二区三区| 国产精品视频中文字幕| 精品视频在线观看一区二区| 六月激情综合网| 九九热视频免费| 丰满爆乳一区二区三区| 亚洲综合av在线播放| 国产成人生活片| 国内自拍视频网| 亚洲人成无码网站久久99热国产 | 妞干网在线播放| 妓院一钑片免看黄大片| 欧美 日韩 国产精品| 91极品视频在线观看| heyzo亚洲| 欧美污在线观看 | www.这里只有精品| 日韩一级片免费视频| 成人av毛片在线观看| 黄色片一级视频| 日本欧美黄色片| www.-级毛片线天内射视视| 三年中国国语在线播放免费| 黄色大片在线免费看| 日韩video| 超碰97免费观看| www.国产福利| wwwwwxxxx日本| 欧美精品色婷婷五月综合| 久草视频这里只有精品| 日本一级淫片演员| 久久免费视频2| 精品久久免费观看| 91制片厂免费观看| 精品亚洲视频在线| 日韩av.com| 日韩精品视频网址| 国产高清av片| 一级片黄色免费| 中文字幕色呦呦| 成人午夜视频免费观看| 草草草视频在线观看| 四虎4hu永久免费入口| 91制片厂免费观看| 成人小视频在线观看免费| 中文字幕黄色大片| av影院在线播放| 欧美成人高潮一二区在线看| av女优在线播放| 男人天堂网视频| 日韩欧美亚洲另类| 国产欧美自拍视频| 精品国产一区二区三区无码| 国产3p露脸普通话对白| 北条麻妃在线视频观看| 韩国日本美国免费毛片| 污污网站在线观看视频| 激情五月五月婷婷| 久久久久久久久久久视频| 国产一二三四在线视频| 日日夜夜精品视频免费观看| 大伊香蕉精品视频在线| 国内外免费激情视频| 天堂av手机在线| 成人黄色av片| 久久久久xxxx| 国产一区二区在线视频播放| 美女网站免费观看视频| 91精品国产三级| 国产精品333| 久久精品国产99久久99久久久| 久久综合亚洲精品| 激情视频免费网站| 亚洲色婷婷久久精品av蜜桃| 又色又爽又高潮免费视频国产| 男女h黄动漫啪啪无遮挡软件| 人妻av中文系列| 亚洲区成人777777精品| 无码人妻精品一区二区三区66| 成人污网站在线观看| 国产高清视频网站| 日本手机在线视频| 黄色一级片免费播放| 91黄色小网站| 国产无限制自拍| 99久re热视频精品98| 色婷婷.com| 久久精品网站视频| 欧美视频免费看欧美视频| 亚欧美一区二区三区| 色婷婷狠狠18| mm1313亚洲国产精品无码试看| 国产无限制自拍| 波多野结衣av一区二区全免费观看| 超碰在线人人爱| 日本三区在线观看| 欧美女人性生活视频| 欧美一区二区激情| 97免费视频观看| 日本阿v视频在线观看| 九九久久九九久久| 永久免费看av| 蜜臀在线免费观看| 2021国产视频| 特级西西人体www高清大胆| 日韩av.com| 999久久久精品视频| 亚洲天堂av一区二区| 午夜免费福利视频在线观看| 毛葺葺老太做受视频| 日本成人中文字幕在线| 中文字幕国产传媒| 中文字幕22页| 亚洲综合在线一区二区| 国内外成人激情免费视频| 黑人巨茎大战欧美白妇 | 日韩精品免费播放| 91最新在线观看| 日韩欧美中文视频| 国产av熟女一区二区三区| 日本一本中文字幕| av片中文字幕| 超碰在线资源站| 国产乱子伦精品视频| 国自产拍偷拍精品啪啪一区二区| 欧美深夜福利视频| 国产裸体免费无遮挡| 亚洲天堂2018av| 中文字幕免费高| 国产成人在线免费看| 国产一级特黄a大片免费| 中文字幕一区二区在线观看视频| 久久久久亚洲av无码专区喷水| 日韩 欧美 视频| 性刺激的欧美三级视频| 97精品国产97久久久久久粉红| 久无码久无码av无码| 一本色道久久亚洲综合精品蜜桃| 日韩视频 中文字幕| 亚洲五月天综合| 成人免费a级片| 三上悠亚av一区二区三区| 男人c女人视频| 国产成人美女视频| 91传媒久久久| 国产女人18毛片| 国产高潮免费视频| 日韩av三级在线| 久久香蕉视频网站| 在线观看国产福利| 99热成人精品热久久66| 99久热在线精品视频| 看看黄色一级片| 欧美亚洲日本在线观看| 国产精品第157页| 欧美少妇一区二区三区| 亚洲这里只有精品| 一级在线免费视频| 日韩av资源在线| 日韩av黄色网址| 国产一级爱c视频| 精品成在人线av无码免费看| 亚洲欧美天堂在线| 日本人69视频| 色七七在线观看| 日韩视频免费在线播放| 成人午夜视频免费在线观看| 国产免费xxx| 少妇久久久久久被弄到高潮| 无码人妻aⅴ一区二区三区日本| 亚洲第一区第二区第三区| www.这里只有精品| 一级片黄色免费|