电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

MySQL系列之redo log、undo log和binlog詳解

瀏覽:3日期:2023-10-07 13:01:22
事務(wù)的實現(xiàn)

redo log保證事務(wù)的持久性,undo log用來幫助事務(wù)回滾及MVCC的功能。

InnoDB存儲引擎體系結(jié)構(gòu)

MySQL系列之redo log、undo log和binlog詳解

MySQL系列之redo log、undo log和binlog詳解

redo log

Write Ahead Log策略

事務(wù)提交時,先寫重做日志再修改頁;當由于發(fā)生宕機而導致數(shù)據(jù)丟失時,就可以通過重做日志來完成數(shù)據(jù)的恢復。

InnoDB首先將重做日志信息先放到重做日志緩存 按一定頻率刷新到重做日志文件

重做日志文件: 在默認情況,InnoDB存儲引擎的數(shù)據(jù)目錄下會有兩個名為ib_logfile1和ib_logfile2的文件。每個InnoDB存儲引擎至少有1個重做日志文件組(group),每個文件組下至少有2個重做日志文件。

下面圖一,很好說明重做日志組以循環(huán)寫入方式運行,InnoDB存儲引擎先寫ib_logfile1,當達到文件最后時,會切換至重做日志文件ib_logfile2.

而圖2,增加一個OS Buffer,有助于理解fsync過程。

MySQL系列之redo log、undo log和binlog詳解

MySQL系列之redo log、undo log和binlog詳解

關(guān)于log group,稱為重做日志組,是一個邏輯上的概念。InnoDB存儲引擎實際只有一個log group。

MySQL系列之redo log、undo log和binlog詳解

log group中第一個redo log file,其前2KB部分保存4個512字節(jié)大小塊:

MySQL系列之redo log、undo log和binlog詳解

重做日志緩沖刷新到磁盤

下面三種情況刷新:

Master Thread每一秒將重做日志緩沖刷新到重做日志文件 每個事務(wù)提交時會將重做日志緩沖刷新到重做日志文件 當重做日志緩沖池剩余空間小于1/2時,重做日志刷新到重做日志文件

補充上述三種情況第二種,觸發(fā)寫磁盤過程由參數(shù)innodb_flush_log_at_trx_commit控制,表示提交(commit)操作時,處理重做日志的方式。

參數(shù)innodb_flush_log_at_trx_commit有效值有0、1、2

0表示當提交事務(wù)時,并不將事務(wù)的重做日志寫入磁盤上日志文件,而是等待主線程每秒刷新。 1表示在執(zhí)行commit時將重做日志緩沖同步寫到磁盤,即伴有fsync的調(diào)用 2表示將重做日志異步寫到磁盤,即寫到文件系統(tǒng)的緩存中。不保證commit時肯定會寫入重做日志文件。

0,當數(shù)據(jù)庫發(fā)生宕機時,部分日志未刷新到磁盤,因此會丟失最后一段時間的事務(wù)。2,當操作系統(tǒng)宕機時,重啟數(shù)據(jù)庫后會丟失未從文件系統(tǒng)緩存刷新到重做日志文件那部分事務(wù)。

下圖有助于理解

MySQL系列之redo log、undo log和binlog詳解

重做日志塊

在InnoDB存儲引擎中,重做日志都是以512字節(jié)進行存儲的。意味著重做日志緩存、重做日志文件都是以塊(block)的方式進行保存的,每塊512字節(jié)。

重做日志頭12字節(jié),重做日志尾8字節(jié),故每個重做日志塊實際可以存儲492字節(jié)。

MySQL系列之redo log、undo log和binlog詳解

重做日志格式

redo log是基于頁的格式來記錄的。默認情況下,innodb的頁大小是16KB(由 innodb_page_size變量控制),一個頁內(nèi)可以存放非常多的log block(每個512字節(jié)),而log block中記錄的又是數(shù)據(jù)頁的變化。

log body的格式分為4部分:

redo_log_type:占用1個字節(jié),表示redo log的日志類型。 space:表示表空間的ID,采用壓縮的方式后,占用的空間可能小于4字節(jié)。 page_no:表示頁的偏移量,同樣是壓縮過的。 redo_log_body表示每個重做日志的數(shù)據(jù)部分,恢復時會調(diào)用相應(yīng)的函數(shù)進行解析。例如insert語句和delete語句寫入redo log的內(nèi)容是不一樣的。

MySQL系列之redo log、undo log和binlog詳解

如下圖,分別是insert和delete大致的記錄方式。

MySQL系列之redo log、undo log和binlog詳解

redo日志恢復

下面LSN(Log Sequence Number)代表checkpoint,當數(shù)據(jù)庫在LSN為10000時發(fā)生宕機,恢復操作僅恢復LSN10000-LSN13000范圍內(nèi)日志

MySQL系列之redo log、undo log和binlog詳解

undo log

undo log的作用

undo是邏輯日志,只是將數(shù)據(jù)庫邏輯地恢復到原來的樣子;所有修改都被邏輯地取消了,但是數(shù)據(jù)結(jié)構(gòu)和頁本身在回滾之后可能不大相同。

undo log有兩個作用:提供回滾和多個行版本控制(MVCC)。

InnoDB存儲引擎回滾時,對于每個INSERT,會完成一個DELETE;對于每個DELETE,會執(zhí)行一個INSERT;對于每個UPDATE,會執(zhí)行一個相反的UPDATE,將修改前的行放回去。

MVCC: 當用戶讀取一行記錄時,若該記錄已經(jīng)被其他事務(wù)占用,當前事務(wù)可以通過undo讀取之前的行版本信息,以此實現(xiàn)非鎖定讀取。

undo log的存儲方式

innodb存儲引擎對undo的管理采用段的方式。rollback segment稱為回滾段,每個回滾段中有1024個undo log segment。

在以前老版本,只支持1個rollback segment,這樣就只能記錄1024個undo log segment。后來MySQL5.5可以支持128個rollback segment,即支持128*1024個undo操作,還可以通過變量 innodb_undo_logs (5.6版本以前該變量是 innodb_rollback_segments )自定義多少個rollback segment,默認值為128。

undo log默認存放在共享表空間中。

MySQL系列之redo log、undo log和binlog詳解

事務(wù)提交undo log處理過程

當事務(wù)提交時,InnoDB存儲引擎會做以下兩件事:

將undo log放入一個列表中,以供之后的purge使用,是否可以最終刪除undo log及所在頁由purge線程來判斷 判斷undo log 所在的頁是否可以重用,若可以,分配給下個事務(wù)使用

當事務(wù)提交時,首先將undo log放入鏈表中,然后判斷undo頁的使用空間是否小于3/4,若是,則表示該undo頁可以被重用,之后新的undo log記錄在當前undo log的后面

undo log分為:

insert undo log update undo log

因為事務(wù)隔離性,insert undo log對其他事務(wù)不可見,所以該undo log可以在事務(wù)提交后直接刪除,不需要進行purge操作。

update undo log記錄的是對delete和update操作產(chǎn)生的undo log。該undo log可能需要提供MVCC機制,因此不能提交時就進行刪除

update分為兩種情況:

date的列如果不是主鍵列,在undo log中直接反向記錄是如何update的。即update是直接進行的。 update主鍵的操作可以分為兩步: 首先將原主鍵記錄標記為已刪除,因此需要產(chǎn)生一個類型為TRX_UNDO_DEL_MARK_REC的undo log 之后插入一條新的記錄,產(chǎn)生一個類型為TRX_UNDO_INSERT_MARK_REC的undo log

MySQL系列之redo log、undo log和binlog詳解

InnoDB purge時,會先從history列表找undo log,然后再從undo page中找undo log;可以避免大量隨機讀取操作,從而提高purge效率。

MySQL系列之redo log、undo log和binlog詳解

MVCC(多版本并發(fā)控制)

MVCC其實就是在每一行記錄后面增加兩個隱藏列,記錄創(chuàng)建版本號和刪除版本號,而每一個事務(wù)在啟動的時候,都有一個唯一的遞增的版本號。

MVCC只在REPEATABLE READ 和READ COMMITTED兩個隔離級別下工作。讀未提交不存在版本問題,序列化則對所有讀取行加鎖。

示例:

插入操作:記錄的創(chuàng)建版本號就是事務(wù)版本號

如插入一條記錄,事務(wù)id假設(shè)是1,則創(chuàng)建版本號也是1

id name create version delete version 1 test 1

更新操作:先標記舊版本號為已刪除,版本號就是當前版本號,再插入一條新的記錄

如事務(wù)2把name字段更新update table set name = ’new test’ where id = 1;

原來的記錄被標記刪除,刪除版本號為2,并插入新記錄,創(chuàng)建版本號為2

id name create version delete version 1 test 1 2 1 new test 2

刪除操作:把事務(wù)版本作為刪除版本號

如事務(wù)3把記錄刪除delete from table where id = 1;

id name create version delete version 1 test 2 3 查詢操作

需滿足以下兩個條件的記錄才能被事務(wù)查詢出來:

InnoDB只查找版本早于當前事務(wù)版本的數(shù)據(jù)行 行的刪除版本要么未定義,要么大于當前版本號,這可以確保事務(wù)讀取到的行,在事務(wù)未開始之前未被刪除

MVCC好處:減少鎖的爭用,提升性能

binlog

二進制文件概念及作用

二進制文件(binary log)記錄了對MySQL數(shù)據(jù)庫執(zhí)行更改的所有操作(不包含SELECT、SHOW等,因為對數(shù)據(jù)沒有修改)

二進制文件主要幾種作用:

恢復:某些數(shù)據(jù)的恢復需要二進制日志 復制: 通過復制和執(zhí)行二進制日志使一臺遠程的MySQL(slave)與另一臺MySQL數(shù)據(jù)庫(master)進行實時同步 審計: 用戶可以通過二進制日志中信息來進行審計,判斷是否有對數(shù)據(jù)庫進行注入的攻擊

二進制文件三個格式

MySQL 5.1開始引入binlog_format參數(shù),該參數(shù)可設(shè)值有STATEMENT、ROW和MIX

STATEMENT: 二進制文件記錄的是日志的邏輯SQL語句 ROW:記錄表的行更改情況。如果設(shè)置了ROW模式,可以將InnoDB事務(wù)隔離級別設(shè)為READ_COMMITTED,以獲得更好的并發(fā)性 MIX:MySQL默認采用STATEMENT格式進行二進制文件的記錄,但在一些情況下會使用ROW,可能的情況有: 表的存儲引擎為NDB,這時對表DML操作都以ROW格式進行 使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不確定函數(shù) 使用了INSERT DELAY語句 使用了用戶定義函數(shù) 使用了臨時表redo log和二進制文件區(qū)別

(二進制文件用來進行POINT-IN-TIME(PIT))的恢復及主從復制環(huán)境的建立。

二進制文件會記錄所有與MySQL數(shù)據(jù)庫有關(guān)的日志記錄,包括InnoDB、MyISAM等其他存儲引擎的日志。而InnoDB存儲引擎的重做日志只記錄有關(guān)該存儲引擎本身的事務(wù)日志。 記錄的內(nèi)容不同,無論用戶將二進制日志文件記錄的格式設(shè)為STATEMENT、ROW或MIXED,其記錄的都是關(guān)于一個事務(wù)的具體操作內(nèi)容,即該日志是邏輯日志。而InnoDB存儲引擎的重做日志文件記錄的是關(guān)于每個頁的更改的物理情況。 此外,寫入的時間頁不同,二進制日志文件僅再事務(wù)提交前進行提交,即只寫磁盤一次,不論這時該事務(wù)多大。而在事務(wù)進行的過程中,卻不斷有重做日志條目(reod entry)被寫入到重做日志文件中。

MySQL系列之redo log、undo log和binlog詳解

group commit

若事務(wù)為非只讀事務(wù),則每次事務(wù)提交時需要進行一次fsync操作,以此保證重做日志都已經(jīng)寫入磁盤。但磁盤fsync性能有限,為提高磁盤fsync效率,當前數(shù)據(jù)庫都提供group commit功能,即一次可以刷新確保多個事務(wù)日志被寫入文件。

對InnoDB group commit,進行兩階段操作:

修改內(nèi)存中事務(wù)對應(yīng)的信息,并且將日志寫入重做日志緩沖 調(diào)用fsync將確保日志都從重做日志緩沖寫入磁盤

InnoDB1.2前,開啟二進制文件,group commit功能失效問題:

開啟二進制文件后,其步驟如下:1)當事務(wù)提交時,InnoDB存儲引擎進行prepare操作2)MySQL數(shù)據(jù)庫上層寫入二進制文件3)InnoDB將日志寫入重做日志文件

a)修改內(nèi)存中事務(wù)對應(yīng)的信息,并將日志寫入重做日志緩沖b)調(diào)用fsync將確保日志都從重做日志緩沖寫入磁盤

其中在保證MySQL數(shù)據(jù)庫上層二進制文件的寫入順序,和InnoDB事務(wù)提交順序一致,MySQL內(nèi)部使用了prepare_commit_mutex鎖,從而步驟3)中a)步不可以在其他事務(wù)執(zhí)行步驟b)時進行,從而導致roup commit功能失效。

MySQL系列之redo log、undo log和binlog詳解

解決方案便是BLGC(Binary Log Group Commit)

MySQL 5.6 BLGC實現(xiàn)方式分為三個階段:

Flush階段:將每個事務(wù)的二進制文件寫入內(nèi)存 Sync階段:將內(nèi)存中的二進制刷新到磁盤,若隊列有多個事務(wù),那么僅一次fsync操作就完成了二進制日志的寫入,這就是BLGC Commit階段:leader根據(jù)順序調(diào)用存儲引擎層事務(wù)提交,由于innodb本就支持group commit,所以解決了因為鎖 prepare_commit_mutex 而導致的group commit失效問題。

MySQL系列之redo log、undo log和binlog詳解

到此這篇關(guān)于MySQL系列之redo log、undo log和binlog詳解的文章就介紹到這了,更多相關(guān)mysql redo log、undo log和binlog內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

相關(guān)文章:
主站蜘蛛池模板: 精密光学实验平台-红外粉末压片机模具-天津博君 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 讲师宝经纪-专业培训机构师资供应商_培训机构找讲师、培训师、讲师经纪就上讲师宝经纪 | 正压送风机-多叶送风口-板式排烟口-德州志诺通风设备 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 硅胶布|电磁炉垫片|特氟龙胶带-江苏浩天复合材料有限公司 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 烟雾净化器-滤筒除尘器-防爆除尘器-除尘器厂家-东莞执信环保科技有限公司 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 高博医疗集团上海阿特蒙医院| 北京燃气公司 用户服务中心 | 广东佛电电器有限公司|防雷开关|故障电弧断路器|智能量测断路器 广东西屋电气有限公司-广东西屋电气有限公司 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 重庆小面培训_重庆小面技术培训学习班哪家好【终身免费复学】 | 国产离子色谱仪,红外分光测油仪,自动烟尘烟气测试仪-青岛埃仑通用科技有限公司 | 艺术生文化课培训|艺术生文化课辅导冲刺-济南启迪学校 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 紧急泄压人孔_防爆阻火器_阻火呼吸阀[河北宏泽石化] | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 山东彩钢板房,山东彩钢活动房,临沂彩钢房-临沂市贵通钢结构工程有限公司 | 蔬菜配送公司|蔬菜配送中心|食材配送|饭堂配送|食堂配送-首宏公司 | C形臂_动态平板DR_动态平板胃肠机生产厂家制造商-普爱医疗 | 三氯异氰尿酸-二氯-三氯-二氯异氰尿酸钠-优氯净-强氯精-消毒片-济南中北_优氯净厂家 | 鑫达滑石-辽宁鑫达滑石集团 | 工业淬火油烟净化器,北京油烟净化器厂家,热处理油烟净化器-北京众鑫百科 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 磷酸肌酸二钠盐,肌酐磷酰氯-沾化欣瑞康生物科技 | 小型单室真空包装机,食品单室真空包装机-百科 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 祝融环境-地源热泵多恒系统高新技术企业,舒适生活环境缔造者! | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 警用|治安|保安|不锈钢岗亭-售货亭价格-垃圾分类亭-移动厕所厂家-苏州灿宇建材 | sfp光模块,高速万兆光模块工厂-性价比更高的光纤模块制造商-武汉恒泰通 | 自动焊锡机_点胶机_螺丝机-锐驰机器人 | YAGEO国巨电容|贴片电阻|电容价格|三星代理商-深圳市巨优电子有限公司 |