Mysql 事務日誌(Ib_logfile)

来源:https://www.cnblogs.com/qianyuliang/archive/2018/11/06/9916372.html
-Advertisement-
Play Games

mysql的innodb中事務日誌ib_logfile(0/1)概念:事務日誌或稱redo日誌,在mysql中預設以ib_logfile0,ib_logfile1名稱存在,可以手工修改參數,調節開啟幾組日誌來服務於當前mysql資料庫,mysql採用順序,迴圈寫方式,每開啟一個事務時,會把一些相關信 ...


mysql的innodb中事務日誌ib_logfile(0/1)

概念:
事務日誌或稱redo日誌,在mysql中預設以ib_logfile0,ib_logfile1名稱存在,可以手工修改參數,調節開啟幾組日誌來服務於當前mysql資料庫,mysql採用順序,迴圈寫方式,每開啟一個事務時,會把一些相關信息記錄事務日誌中(記錄對數據文件數據修改的物理位置或叫做偏移量);
這個系列文件個數由參數innodb_log_files_in_group控制,若設置為4,則命名為ib_logfile0~3。
這些文件的寫入是順序、迴圈寫的,logfile0寫完從logfile1繼續,logfile3寫完則logfile0繼續。

作用:
在系統崩潰重啟時,作事務重做;在系統正常時,每次checkpoint時間點,會將之前寫入事務應用到數據文件中。

Ib_logfile的checkpoint field
實際上不僅要記錄checkpoint做到哪兒(LOG_CHECKPOINT_LSN),還要記錄用到了哪個位置(LOG_CHECKPOINT_OFFSET)等其他信息。所以在ib_logfile0的頭部預留了空間,用於記錄這些信息。
因此即使使用後面的logfile,每次checkpoint完成後,ib_logfile0都是要更新的。同時你會發現所謂的順序寫盤,也並不是絕對的
相關的一些數字
a) InnoDB留了兩個checkpoint filed,按照註釋的解釋,目的是為了能夠“write alternately”
b) 每個checkpint field需要的大小空間為304位元組。(相關定義在log0log.h)
c) 第一個checkpoint的起始位置在ib_logfile0的第512位元組(OS_FILE_LOG_BLOCK_SIZE)處;
d) 第二個在1536 (3 * OS_FILE_LOG_BLOCK_SIZE)位元組處。


特點:
redo log只是記錄所有innodb表數據的變化。
redo log只是記錄正在執行中的dml以及ddl語句。
redo log可以作為異常down機或者介質故障後的數據恢復使用

引入一個問題:
在m/s環境中,innodb寫完ib_logfile後,服務異常關閉,會不會主庫能用ib_logfile恢複數據,而
binlog沒寫導致從庫同步時少了這個事務?從而導致主從不一致;
redo日誌寫入方式:
1.ib_logfile寫入當前事務更新數據,並標上事務準備trx_prepare
2.寫入bin-log
3.ib_logfile當前事務提交提交trx_commit

恢復方式:
如果ib_logfile已經寫入事務準備,那麼在恢復過程中,會依據bin-log中該事務是否存在恢複數據。

假設:
1)結束後異常,因沒有寫入bin-log,從庫不會同步這個事務,主庫上,重啟時,在恢復日誌中這個事務沒有commit,即rollback這個事務.
2)結束後異常,這會bin-log已經寫入,從庫會同步這個事務。主庫依據恢復日誌和bin-log,也正常恢復此事務
綜上描述:
bin-log寫入完成,主從會正常完成事務;bin-log沒有寫入,主從庫rollback事務;不會出現主從庫不一致問題.
相關參數(全局&靜態):

innodb_log_buffer_size
innodb_log_file_size
innodb_log_files_in_group
innodb_log_group_home_dir
innodb_flush_log_at_trx_commit


innodb_log_buffer_size:
事務日誌緩存區,可設置1M~8M,預設8M,延遲事務日誌寫入磁碟,把事務日誌緩存區想象形如"漏斗"狀,會不停向磁碟記錄緩存的日誌記錄,而何時寫入通過參數innodb_flush_log_at_trx_commit控制,稍後解釋,啟用大的事務日誌緩存,可以將完整運行大事務日誌,
暫時存放在事務緩存區中,不必(事務提交前)寫入磁碟保存,同時也起到節約磁碟空間占用; innodb_log_file_size:控制事務日誌ib_logfile的大小,範圍5MB
~4G;所有事務日誌ib_logfile0+ib_logfile1+..累加大小不能超過4G,事務日誌大,checkpoint會少,節省磁碟IO,但是大的事務日誌意味著資料庫crash時,恢復起來較慢. 引入問題:修改該參數大小,導致ib_logfile文件的大小和之前存在的文件大小不匹配 解決方式:在乾凈關閉資料庫情況下,刪除ib_logfile,而後重啟資料庫,會自行創建該文件; innodb_log_files_in_group:DB中設置幾組事務日誌,預設是2; innodb_log_group_home_dir:事務日誌存放目錄,不設置,ib_logfile0...存在在數據文件目錄下 innodb_flush_log_at_trx_commit:控制事務日誌何時寫盤和刷盤,安全遞增:0,2,1 事務緩存區:log_buffer; 0:每秒一次事務緩存區刷新到文件系統,同時文件系統到磁碟同步,但是事務提交時,不會觸發log_buffer到文件系統同步; 2:每次事務提交時,會把事務緩存區日誌刷新到文件系統中去,且每秒文件系統到磁碟同步; 1:每次事務提交時刷新到磁碟,最安全; 適用環境: 0:磁碟IO能力有限,安全方便較差,無複製或複製延遲可以接受,如日誌性業務,mysql損壞丟失1s事務數據; 2:數據安全性有要求,可以丟失一點事務日誌,複製延遲也可以接受,OS損壞時才可能丟失數據; 1:數據安全性要求非常高,且磁碟IO能力足夠支持業務,如充值消費,敏感業務;

 

引入ib_logfile的寫入策略

1、基本概念
a)、ib_logfile文件個數由innodb_log_files_in_group配置決定,若為2,則在datadir目錄下有兩個文件,命令從0開始,分別為ib_logfile0和ib_logfile.
b)、文件為順序寫入,當達到最後一個文件末尾時,會從第一個文件開始順序復用。
c)、lsn: Log Sequence Number,是一個遞增的整數。 Ib_logfile中的每次寫入操作都包含至少1個log,每個log都帶有一個lsn。在記憶體page修複過程中,只有大於page_lsn的log才會被使用。
d)、lsn的保存在全局變數log_sys中。遞增數值等於每個log的實際內容長度。即如果新增的一個log長度是len,則log_sys->lsn += len.
e)、ib_logfile每次寫入以512(OS_FILE_LOG_BLOCK_SIZE)位元組為單位。實際寫入函數 log_group_write_buf (log/log0log.c)
f)、每次寫盤後是否flush,由參數innodb_flush_log_at_trx_commit控制。


2、log_sys介紹
log_sys是一個全局記憶體結構。以下說明幾個成員的意義。

  
lsn 表示已經分配的最後一個lsn的值。
written_to_all_lsn n表示實際已經寫盤的lsn。需要這個值是因為並非每次生成log後就寫盤。
flushed_to_disk_lsn 表示刷到磁碟的lsn。需要這個值是因為並非每次寫盤後就flush。
buf 待寫入的內容保存在buf中
buf_size buf的大小。由配置中innodb_log_buffer_size決定,實際大小為innodb_log_buffer_size /16k * 16k。
buf_next_to_write buf中下一個要寫入磁碟的位置
buf_free buf中實際內容的最後位置。當buf_free> buf_next_to_write時,說明記憶體中還有數據未寫盤。




3、相關更新
用一個簡單的更新語句來說明log_sys以及ib_logfile的更新內容的過程。假設我們的更新只涉及到非索引的固定長度欄位。
a) 在bufferpool中寫入undo log。 對於一個單一的語句,需要先創建一個undolog頭。
b) 在bufferpool中寫入undo log的實際內容。
c) 在log_sys->buf中寫入buffer page的更新內容。此處保存了更新的完整信息。
d) 在log_sys->buf中寫入啟動事務(trx_prepare)的日誌
e) 將c、d更新的log內容寫入ib_logfile中。
f) 在log_sys->buf中寫入事務結束(trx_commit)的日誌
g) 將f步驟的log內容寫入ib_logfile中。

4、說明
a) 完成上述所有操作時,數據文件還沒有更新。
b) 每次寫入log_sys->buf時同時更新lsn和buf_free。 每次寫ib_logfile時同時更新written_to_all_lsn和buf_next_to_write;
c) 每次寫ib_logfile時以512位元組為對齊,如需寫入600位元組,則實際寫入1k。寫到最後一個文件末尾則從第一個文件重覆使用。
d) 從上述流程看到,在a~d過程中若出現異常關閉,由於沒有寫入到磁碟中,因此整個事務放棄;若在e剛完成時出現異常關閉,雖然事務內容已經寫盤,但沒有提交。在重啟恢復的時候,發現這個事務還沒有提交,邏輯上整個事務放棄。 (重啟日誌中會有Found 1 prepared transaction(s) in InnoDB字樣)。在g完成後出現異常關閉,則能夠在重啟恢復中正常提交。

在e和f之間會寫mysql的bin-log,若bin-log寫完前異常關閉,事務無效,bin-log寫入成功後,則異常重啟後能夠根據bin-log恢復事務的修改。

e) 若涉及到索引更新,在步驟c之後會增加索引更新的log。由於索引可能有merge過程,因此在merge過程中會另外增加寫入一個log。但事務完全提交仍在步驟g中。索引的更新由於已經寫盤,並不會因此丟失。

參考文檔:

1,https://yq.aliyun.com/articles/8829

2,https://www.percona.com/forums/questions-discussions/mysql-and-percona-server/1435-what-is-the-purpose-of-ibdata1-ib-logfile0-ib-logfile1

3,https://www.aliang.org/MySQL/ib_logfile.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先聲明,此系列shell系列博客分為四篇發佈,分別是: 基礎篇:https://www.cnblogs.com/lsy131479/p/9914747.html 提升篇:https://www.cnblogs.com/lsy131479/p/9914897.html 高級篇:https://www ...
  • 第1步:安裝Stow 在這個例子中,我們使用的是CentOS,因此我們需要擴展的EPEL庫。您可以使用以下命令安裝它們:yum install epel-release然後,下麵這段命令:yum install stow按Y確認安裝:現在已經安裝了stow,我們必須選擇存儲包文件的位置。 第2步:選 ...
  • 1 當進程打開了某個文件時,只要該進程保持打開該文件,即使將其刪除,它依然存在於磁碟中。這意味著,進程並不知道文件已經被刪除,它仍然可以向打開該文件時提供給它的文件描述符進行讀取和寫入。除了該進程之外,這個文件是不可見的,因為已經刪除了其相應的目錄索引節點。 2 在/proc 目錄下,其中包含了反映 ...
  • 判斷字元串是否為純數字,負數不算。如'00012','54585','1000' SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION [dbo].[svf_IsNumeric] ( @string NVARCHAR(MAX ...
  • 問題:為什麼HIVE中用了 NOT IN,結果集沒了? 註:這個是原創,轉載請註明,謝謝!直接進實驗室>> > select * from a;OK1 a12 a23 a3Time taken: 0.063 seconds, Fetched: 3 row(s) hive> select * from ...
  • 安裝: 基本使用 pymysql增刪該查 增刪改 查詢 ...
  • 開卷有益——作者的話 有時候真的感嘆人生歲月匆匆,特別是當一個IT人沉浸於某個技術領域十來年後,驀然迴首,總有說不出的萬千感慨。 筆者有幸從04年就開始從事大規模數據計算的相關工作,08年作為Greenplum 早期員工加入Greenplum團隊(當時的工牌是“005”,哈哈),記得當時看了一眼Gr ...
  • mysql 嚴格模式 Strict Mode說明 1.開啟與關閉Strict Mode方法找到mysql安裝目錄下的my.cnf(windows系統則是my.ini)文件 在sql_mode中加入STRICT_TRANS_TABLES則表示開啟嚴格模式,如沒有加入則表示非嚴格模式,修改後重啟mysq ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...