MySQL update正在执行中突然断电,数据是否更改成功?
? ? ? ? ?今天有個朋友突然問到我這個問題,當我們的update語句執行過程中,服務器突然斷電了會發生什么?其實這個問題主要在于對mysql update生命周期的理解,以及了解mysql 的redolog和binlog這兩個日志的作用。
????????上一篇文章講到mysql update的執行過程,MySQL update生命周期?。執行過程主要分為server層和存儲引擎層兩步操作,server層主要是創建連接和SQL的解析優化,存儲引擎層主要是事務的執行和提交的操作。這里就不細講了可以查看之前的文章或者其他論壇文章。
redolog
? ? ? ?redolog 也叫預寫式日志WAL(write-ahead logging),它是innoDB存儲引擎層特有的一種日志。redolog 空間大小固定,可循環寫。
? ? ? ?redolog的結構包含四部分信息:
? ? ? ?type redo日志的類型(mlog_1byte、mlog_2byte、mlog_4byte、mlog_8byte、mlog_write_string);
???????space ID表空間ID;
???????page number 頁號;
???????offset 數據修改的位置;
???????data 該條日志得具體數據內容,redolog是物理日志所以data里記錄的是物理操作(例如:某個事務ID將哪張表空間的第幾頁中的哪個數據做了什么樣的修改)。
? ? ?? redolog的寫入過程
? ? ? ??redolog最終也是寫入在磁盤中的,它寫入在磁盤中是順序IO因此它的性能是非常高的。
? ? ? ??寫入log buffer
? ? ? ? redo log在寫入時也不是直接寫入磁盤中的,它是被寫入到 一個大小為512字節的 redo log block頁中。它先寫入到?redo 日志緩沖區 (log buffer)?的內存區域中,該區域在MySQL啟動時就會向操作系統申請,這片區域被劃分為若干個連續的 block,可以通過啟動選項?innodb_log_buffer_size?指定 log buffer 的大小。
? ? ? ? redo日志刷盤
? ? ? ? 寫入到log buffer內存后,需要將數據刷到磁盤中刷盤的策略主要有:1.當log buffer空間不足;2.當前的事務完整提交;3. 固定每秒刷盤一次;4.正常關閉服務器;
binlog
? ? ? ? binlog也叫做歸檔日志,它是mysql? server層的日志。不區分存儲引擎,所有存儲引擎都可以使用。binlog 日志是邏輯日志,記錄的是sql語句的原始邏輯,binlog日志是以追加的方式寫入在文件中并不會覆蓋之前的日志。
? ? ? ? binlog日志的使用場景
? ? ? ? 1. mysql主從時做數據復制同步使用,binlog日志是二進制的文件所以它的復制性能會高。
? ? ? ? 2. 做容災的數據恢復。
? ? ? ? binlog的寫入過程
? ? ? ? ?寫入binglog cache
? ? ? ? mysql服務器系統給每個線程分配一個binlog cache的內存塊,當事務在執行的過程中,會把操作的日志寫到binlog cache中,同一個事務的binlog日志不會被分開寫入都是一次性寫入到binlog cache中。如果是支持事務的存儲引擎,必須要事務提交后才會寫入日志。
?????????binlog日志刷盤
? ? ? ? ?binlog日志刷盤取決于sync_binlog參數的設置,表示每sync_binlog次事務提交則將日志刷新到磁盤。如果設置為0,則完全由文件系統去控制它緩存的刷新。因此未保證數據的完整性最好將sync_binlog設置為1,每次事務提交都刷新,但會對性能有所影響。
如果在update執行過程中突然斷電會發生什么?
? ? ? ? 1. 如果在斷電時 redolog 還沒有寫入,那么重啟后將沒有任何的數據變化。
? ? ? ? 2. 如果redolog 已經寫入了但狀態還在prepare時,binlog日志還沒有寫入,那么重啟后會將事務進行回滾,數據也沒有任何變化。
? ? ? ? 3.?如果redolog 已經寫入了,binlog也寫入了,但redolog日志還沒commit, 那么重啟后會檢查binlog是否完整,如果完整則提交事務,數據發生變化,如果不完整則回滾事務,數據也不發生變化。
總結
以上是生活随笔為你收集整理的MySQL update正在执行中突然断电,数据是否更改成功?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: secureCRT安装和使用教程【图文并
- 下一篇: 数据库mysql加密存储_数据库数据加密