MySQL 事務日誌

2021-10-04 13:17:23 字數 1518 閱讀 3807

首先,事務日誌分為redo log和undo log兩種。它兩的職責主要是負責保證事務的acid特性。mysql innodb引擎借助重做日誌redo和回滾日誌undoinnodb,通過force log at commit機制實現事務的永續性。即在事務提交的時候,必須先將該事務的所有事務日誌寫入到磁碟上的redo log file和undo log file中進行持久化。事務日誌在初始化資料時會直接生成兩個檔案ib_logfile0、ib_logfile1,這兩個檔案在生成時大小就為5m(大小可設定),其內部從磁碟上劃分了5m連續的磁碟空間,用於儲存事務日誌,事務在執行過程中,資料的更改在未提交前都會先寫到事務日誌中,由於事務日誌是連續的磁碟空間,因此io時是順序的,效能比較高,可以保證資料及時寫入事務日誌。

mysql支援使用者自定義在commit時如何將log buffer中的日誌刷log file中。這種控制通過變數 innodb_flush_log_at_trx_commit 的值來決定。該變數有3種值:0、1、2,預設為1。但注意,這個變數只是控制commit動作是否重新整理log buffer到磁碟。

在主從複製結構中,要保證事務的永續性和一致性,需要對日誌相關變數設定為如下:

如果啟用了二進位制日誌,則設定sync_binlog=1,即每提交一次事務同步寫到磁碟中。總是設定innodb_flush_log_at_trx_commit=1,即每提交一次事務都寫到磁碟中。上述兩項變數的設定保證了:每次提交事務都寫入二進位制日誌和事務日誌,並在提交時將它們重新整理到磁碟中。

undo log有兩個作用:提供回滾和多個行版本控制(mvcc)。在資料修改的時候,不僅記錄了redo,還記錄了相對應的undo,如果因為某些原因導致事務失敗或回滾了,可以借助該undo進行回滾。undo log和redo log記錄物理日誌不一樣,它是邏輯日誌。可以認為當delete一條記錄時,undo log中會記錄一條對應的insert記錄,反之亦然,當update一條記錄時,它記錄一條對應相反的update記錄。當執行rollback時,就可以從undo log中的邏輯記錄讀取到相應的內容並進行回滾。有時候應用到行版本控制的時候,也是通過undo log來實現的:當讀取的某一行被其他事務鎖定時,它可以從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預設存放在共享表空間中。如果開啟了 innodb_file_per_table ,將放在每個表的.ibd檔案中。

mysql 日誌 事務日誌

事務性引擎依靠事務日誌保證acid 原子性,一致性,隔離性,永續性 因此事務日誌,最主要是保證事務可靠性的 事務日誌工作原理 事務日誌的每一行都是一條資訊,一般記錄事務id號,用於記錄哪個事務產生的id資訊,其次,他影響了哪個庫的哪個表,再次他原始資料,和新的資料。一般對於刪除表的操作drop ta...

MySQL學習 事務日誌

事務的隔離性是通過鎖實現,而事務的原子性 一致性和永續性則是通過事務日誌實現。說到事務日誌,不得不說的就是redo和undo。在儲存引擎修改表的資料時,會將資料從磁碟拷貝到記憶體中,然後修改記憶體中的資料拷貝,再將修改行為持久化到磁碟中,而不用每次將修改的資料本身持久化到硬碟中 在innodb的儲存...

mysql 事務的日誌

redo 重做 記錄的是,記憶體資料頁的變化過程1 作用在事務acid過程中,實現的是 d 持久化的作用。2 工作原理 1.修改資料時 1 首先資料會從磁碟取出,載入到記憶體的data buffer page 2 運算元據,使用update語句修改資料,資料 2 變成 1 3 id 2變成id 1的...