<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在資料庫系統中,既有存放資料的檔案,也有存放紀錄檔的檔案。紀錄檔在記憶體中也是有快取Log buffer,也有磁碟檔案log file,本文主要描述存放紀錄檔的檔案。
MySQL中的紀錄檔檔案,有這麼兩類常常討論到:undo紀錄檔與redo紀錄檔。
undo紀錄檔用於存放資料修改被修改前的值,假設修改 tba 表中 id=2的行資料,把Name='B' 修改為Name = 'B2' ,那麼undo紀錄檔就會用來存放Name='B'的記錄,如果這個修改出現異常,可以使用undo紀錄檔來實現回滾操作,保證事務的一致性。
對資料的變更操作,主要來自 INSERT UPDATE DELETE,而UNDO LOG中分為兩種型別,一種是 INSERT_UNDO(INSERT操作),記錄插入的唯一鍵值;一種是 UPDATE_UNDO(包含UPDATE及DELETE操作),記錄修改的唯一鍵值以及old column記錄。
Id | Name |
1 | A |
2 | B |
3 | C |
4 | D |
MySQL跟undo有關的引數設定有這些:
mysql> show global variables like '%undo%'; +--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | innodb_max_undo_log_size | 1073741824 | | innodb_undo_directory | ./ | | innodb_undo_log_truncate | OFF | | innodb_undo_logs | 128 | | innodb_undo_tablespaces | 3 | +--------------------------+------------+ mysql> show global variables like '%truncate%'; +--------------------------------------+-------+ | Variable_name | Value | +--------------------------------------+-------+ | innodb_purge_rseg_truncate_frequency | 128 | | innodb_undo_log_truncate | OFF | +--------------------------------------+-------+
控制最大undo tablespace檔案的大小,當啟動了innodb_undo_log_truncate 時,undo tablespace 超過innodb_max_undo_log_size 閥值時才會去嘗試truncate。該值預設大小為1G,truncate後的大小預設為10M。
設定undo獨立表空間個數,範圍為0-128, 預設為0,0表示表示不開啟獨立undo表空間 且 undo紀錄檔儲存在ibdata檔案中。該引數只能在最開始初始化MySQL範例的時候指定,如果範例已建立,這個引數是不能變動的,如果在資料庫設定文 件 .cnf 中指定innodb_undo_tablespaces 的個數大於範例建立時的指定個數,則會啟動失敗,提示該引數設定有誤。
如果設定了該引數為n(n>0),那麼就會在undo目錄下建立n個undo檔案(undo001,undo002 ...... undo n),每個檔案預設大小為10M.
什麼時候需要來設定這個引數呢?
當DB寫壓力較大時,可以設定獨立UNDO表空間,把UNDO LOG從ibdata檔案中分離開來,指定 innodb_undo_directory目錄存放,可以制定到高速磁碟上,加快UNDO LOG 的讀寫效能。
InnoDB的purge執行緒,根據innodb_undo_log_truncate設定開啟或關閉、innodb_max_undo_log_size的引數值,以及truncate的頻率來進行空間回收和 undo file 的重新初始化。
該引數生效的前提是,已設定獨立表空間且獨立表空間個數大於等於2個。
purge執行緒在truncate undo log file的過程中,需要檢查該檔案上是否還有活動事務,如果沒有,需要把該undo log file標記為不可分配,這個時候,undo log 都會記錄到其他檔案上,所以至少需要2個獨立表空間檔案,才能進行truncate 操作,標註不可分配後,會建立一個獨立的檔案undo_<space_id>_trunc.log,記錄現在正在truncate 某個undo log檔案,然後開始初始化undo log file到10M,操作結束後,刪除表示truncate動作的 undo_<space_id>_trunc.log 檔案,這個檔案保證了即使在truncate過程中發生了故障重啟資料庫服務,重啟後,服務發現這個檔案,也會繼續完成truncate操作,刪除檔案結束後,標識該undo log file可分配。
用於控制purge回滾段的頻度,預設為128。假設設定為n,則說明,當Innodb Purge操作的協調執行緒 purge事務128次時,就會觸發一次History purge,檢查當前的undo log 表空間狀態是否會觸發truncate。
如果需要設定獨立表空間,需要在初始化資料庫範例的時候,指定獨立表空間的數量。
UNDO內部由多個回滾段組成,即 Rollback segment,一共有128個,儲存在ibdata系統表空間中,分別從resg slot0 - resg slot127,每一個resg slot,也就是每一個回滾段,內部由1024個undo segment 組成。
回滾段(rollback segment)分配如下:
回滾段中除去32個提供給臨時表事務使用,剩下的 128-32=96個回滾段,可執行 96*1024 個並行事務操作,每個事務佔用一個 undo segment slot,注意,如果事務中有臨時表事務,還會在臨時表空間中的 undo segment slot 再佔用一個 undo segment slot,即佔用2個undo segment slot。如果錯誤紀錄檔中有:Cannot find a free slot for an undo log。
則說明並行的事務太多了,需要考慮下是否要分流業務。
回滾段(rollback segment )採用 輪詢排程的方式來分配使用,如果設定了獨立表空間,那麼就不會使用系統表空間回滾段中undo segment,而是使用獨立表空間的,同時,如果回顧段正在 Truncate操作,則不分配。
當資料庫對資料做修改的時候,需要把資料頁從磁碟讀到buffer pool中,然後在buffer pool中進行修改,那麼這個時候buffer pool中的資料頁就與磁碟上的資料頁內容不一致,稱buffer pool的資料頁為dirty page 髒資料,如果這個時候發生非正常的DB服務重啟,那麼這些資料還沒在記憶體,並沒有同步到磁碟檔案中(注意,同步到磁碟檔案是個隨機IO),也就是會發生資料丟失,如果這個時候,能夠在有一個檔案,當buffer pool 中的data page變更結束後,把相應修改記錄記錄到這個檔案(注意,記錄紀錄檔是順序IO),那麼當DB服務發生crash的情況,恢復DB的時候,也可以根據這個檔案的記錄內容,重新應用到磁碟檔案,資料保持一致。
這個檔案就是redo log ,用於記錄 資料修改後的記錄,順序記錄。它可以帶來這些好處:
假設修改 tba 表中 id=2的行資料,把Name='B' 修改為Name = 'B2' ,那麼redo紀錄檔就會用來存放Name='B2'的記錄,如果這個修改在flush 到磁碟檔案時出現異常,可以使用redo log實現重做操作,保證事務的永續性。
Id | Name |
1 | A |
2 | B |
3 | C |
4 | D |
這裡注意下redo log 跟binary log 的區別,redo log 是儲存引擎層產生的,而binary log是資料庫層產生的。假設一個大事務,對tba做10萬行的記錄插入,在這個過程中,一直不斷的往redo log順序記錄,而binary log不會記錄,知道這個事務提交,才會一次寫入到binary log檔案中。binary log的記錄格式有3種:row,statement跟mixed,不同格式記錄形式不一樣。
redo log 檔案的個數,命名方式如:ib_logfile0,iblogfile1... iblogfilen。預設2個,最大100個。
檔案設定大小,預設值為 48M,最大值為512G,注意最大值指的是整個 redo log系列檔案之和,即(innodb_log_files_in_group * innodb_log_file_size )不能大於最大值512G。
檔案存放路徑
Redo Log 快取區,預設8M,可設定1-8M。延遲事務紀錄檔寫入磁碟,把redo log 放到該緩衝區,然後根據 innodb_flush_log_at_trx_commit引數的設定,再把紀錄檔從buffer 中flush 到磁碟中。
Redo log檔案以ib_logfile[number]
命名,Redo log 以順序的方式寫入檔案檔案,寫滿時則回溯到第一個檔案,進行覆蓋寫。(但在做redo checkpoint時,也會更新第一個紀錄檔檔案的頭部checkpoint標記,所以嚴格來講也不算順序寫)。
實際上redo log有兩部分組成:redo log buffer 跟redo log file。buffer pool中把資料修改情況記錄到redo log buffer,出現以下情況,再把redo log刷下到redo log file:
假設有A、B兩個資料,值分別為1,2,開始一個事務,事務的操作內容為:把1修改為3,2修改為4,那麼實際的記錄如下(簡化):
A.事務開始.
B.記錄A=1到undo log.
C.修改A=3.
D.記錄A=3到redo log.
E.記錄B=2到undo log.
F.修改B=4.
G.記錄B=4到redo log.
H.將redo log寫入磁碟。
I.事務提交
Undo + Redo的設計主要考慮的是提升IO效能,增巨量資料庫吞吐量。可以看出,B D E G H,均是新增操作,但是B D E G 是緩衝到buffer區,只有G是增加了IO操作,為了保證Redo Log能夠有比較好的IO效能,InnoDB 的 Redo Log的設計有以下幾個特點:
A. 儘量保持Redo Log儲存在一段連續的空間上。因此在系統第一次啟動時就會將紀錄檔檔案的空間完全分配。 以順序追加的方式記錄Redo Log,通過順序IO來改善效能。
B. 批次寫入紀錄檔。紀錄檔並不是直接寫入檔案,而是先寫入redo log buffer.當需要將紀錄檔重新整理到磁碟時 (如事務提交),將許多紀錄檔一起寫入磁碟.
C. 並行的事務共用Redo Log的儲存空間,它們的Redo Log按語句的執行順序,依次交替的記錄在一起,以減少紀錄檔佔用的空間。例如,Redo Log中的記錄內容可能是這樣的:
記錄1: <trx1, insert …>
記錄2: <trx2, update …>
記錄3: <trx1, delete …>
記錄4: <trx3, update …>
記錄5: <trx2, insert …>
D. 因為C的原因,當一個事務將Redo Log寫入磁碟時,也會將其他未提交的事務的紀錄檔寫入磁碟。
E. Redo Log上只進行順序追加的操作,當一個事務需要回滾時,它的Redo Log記錄也不會從Redo Log中刪除掉。
前面說到未提交的事務和回滾了的事務也會記錄Redo Log,因此在進行恢復時,這些事務要進行特殊的的處理。有2種不同的恢復策略:
A. 進行恢復時,只重做已經提交了的事務。
B. 進行恢復時,重做所有事務包括未提交的事務和回滾了的事務。然後通過Undo Log回滾那些
未提交的事務。
MySQL資料庫InnoDB儲存引擎使用了B策略, InnoDB儲存引擎中的恢復機制有幾個特點:
A. 在重做Redo Log時,並不關心事務性。 恢復時,沒有BEGIN,也沒有COMMIT,ROLLBACK的行為。也不關心每個紀錄檔是哪個事務的。儘管事務ID等事務相關的內容會記入Redo Log,這些內容只是被當作要操作的資料的一部分。
B. 使用B策略就必須要將Undo Log持久化,而且必須要在寫Redo Log之前將對應的Undo Log寫入磁碟。Undo和Redo Log的這種關聯,使得持久化變得複雜起來。為了降低複雜度,InnoDB將Undo Log看作資料,因此記錄Undo Log的操作也會記錄到redo log中。這樣undo log就可以象資料一樣快取起來,而不用在redo log之前寫入磁碟了。
包含Undo Log操作的Redo Log,看起來是這樣的:
記錄1: <trx1, Undo log insert <undo_insert …>>
記錄2: <trx1, insert …>
記錄3: <trx2, Undo log insert <undo_update …>>
記錄4: <trx2, update …>
記錄5: <trx3, Undo log insert <undo_delete …>>
記錄6: <trx3, delete …>
C. 到這裡,還有一個問題沒有弄清楚。既然Redo沒有事務性,那豈不是會重新執行被回滾了的事務?
確實是這樣。同時Innodb也會將事務回滾時的操作也記錄到redo log中。回滾操作本質上也是對資料進行修改,因此回滾時對資料的操作也會記錄到Redo Log中。
一個回滾了的事務的Redo Log,看起來是這樣的:
記錄1: <trx1, Undo log insert <undo_insert …>>
記錄2: <trx1, insert A…>
記錄3: <trx1, Undo log insert <undo_update …>>
記錄4: <trx1, update B…>
記錄5: <trx1, Undo log insert <undo_delete …>>
記錄6: <trx1, delete C…>
記錄7: <trx1, insert C>
記錄8: <trx1, update B to old value>記錄9: <trx1, delete A>
一個被回滾了的事務在恢復時的操作就是先redo再undo,因此不會破壞資料的一致性。
到此這篇關於mysql紀錄檔檔案之undo log和redo log的文章就介紹到這了,更多相關mysql undo log和redo log內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45