MySQL的redo log與undo log

 1、Redo log、Undo log存放位置

      首先,我們先要知道InnoDB redo log、undo log存放位置。InnoDB的事務日誌是指Redo log,簡稱log,存放在日誌文件ib_logfile*裏面。而Undo log則是存放在共享表空間文件裏面(ibdata*)。


2、事務的原子性
 
      我們知道,InnoDB存儲引擎是事務型存儲引擎,其具有ACID特性,即:原子性、一致性、隔離性、持久性。Undo log就是爲了實現事務的原子性。何爲原子性呢?事務的原子性:事務中的所有操作,要麼全部完成,要麼不作任何操作,不能只做部分操作。如果在執行事務的過程中發生了錯誤,就要回滾到事務開始前的狀態,就好像這個事務從來沒執行過一樣。


3、Undo log原理
 
     Undo log的原理其實很簡單,Undo log是爲了滿足事務的原子性,當你在數據庫中操作任何數據之前,比如你要修改某條記錄的數據,InnoDB首先會將數據備份到一個地方(這個存儲數據備份的地方就是Undo log)。然後進行數據的修改。如果在執行事務的過程中出現了錯誤或者用戶執行了ROLLBACK(回滾)語句,系統可以利用Undo log中的備份將數據恢復到事務開始前的狀態。
 
     Undo log除了可以保證事務的原子性之外,還可以用來輔助完成事務的持久化。


4、事務的持久化
 
     事務一旦完成,該事務對數據庫所做的修改都會持久保存到數據庫中。爲了保證數據的持久性,MySQL會將修改過的數據完全記錄到持久的存儲設備上(比如硬盤咯~~)


5、用Undo log實現原子性和持久性的事務的簡化過程

    現在假設我們有兩個數據,A=1、B=2
    1)事務開始(start transaction 
 or  set autocommit=0)
    2)假設現在我們要修改A記錄,那麼記錄A=1到Undo log
    3)現在修改A=3
    4)假設現在我們還要修改B記錄,那麼記錄B=2到Undo log
    5)現在修改B=4
    6)將Undo log日誌記錄寫到磁盤
    7)將修改後的數據A=3、B=4寫到磁盤
    8)提交事務


 
     這裏有一個隱含的前提條件:“因爲InnoDB存儲引擎把數據和索引都緩存在

InnoDB_buffer_pool_size設定的內存緩衝區中,所以當我們修改InnoDB表數據時,會先修改buffer pool中的數據,最後將buffer pool中的數據寫入到磁盤。”


      Undo log之所以可以保證事務的原子性和持久性,是因爲在上述的簡化事務過程中有以下的特點:
a、在更新任何數據前,先把數據的原始狀態記錄到Undo log;
b、爲了保證數據的持久性,必須在提交事務之前先把數據寫到磁盤上,

    只要事務一提交,數據必然持久化到存儲設備上;
c、Undo log先於數據持久化到磁盤。如果在上述事務簡化過程的 7)~ 
 8)過程中系統崩潰了,

    那麼Undo log還是完整的,可以用來回滾事務以恢復到事務開始前的狀態;
d、如果在上述事務簡化過程的 1)~ 
 6)過程中系統崩潰了,由於修改後的數據並沒有持久化到磁盤,

    所以這並不影響數據庫中的數據,數據還是保持在事務開始前的狀態。


    上述事務簡化過程中存在一個缺陷:每個事務提交前都要將數據和Undo log寫入磁盤,這樣會導致大量的磁盤IO,造成性能低下。
    解決辦法:如果能夠將修改的數據緩存一段時間,就能減少磁盤IO以提高性能。但是這樣會喪失事務的持久性。因此就有了另外的一種機制來實現數據的持久化,這就是InnoDB的Redo log。



6、Redo log原理
 
    和Undo log相反,Redo log記錄的是新數據的備份。在事務提交前,只需要將Redo log持久化,不需要將數據數據持久化。當數據庫系統崩潰時,雖然數據沒有持久化,但是Redo log已經持久化了。在系統從崩潰中恢復時,可以根據Redo log中的內容,將所有的數據恢復到最新的狀態。


7、引入了Redo log之後,現在InnoDB存儲引擎是Undo log和Redo log協同合作,它們的事務簡化過程爲:
 
     假設有A、B兩個數據,A=1、B=2
    1)事務開始;
    2)記錄A=1到undo log;
    3)修改A=3;
    4)記錄A=3到redo log;
    5)記錄B=2到undo log;
    6)修改B=4;
    7)記錄B=4到redo log;
    8)將redo log寫入磁盤;
    9)提交事務。


8、Undo log 
 +  Redo log事務的特點
    1)、爲了保證數據的持久性,必須在事務提交前將Redo log持久化到存儲設備上;
    2)、數據不需要在事務提交前寫入磁盤,而是緩存在內存中;
    3)、Redo log寫入到了磁盤,故可以保證事務的持久性;
    4)、Undo log用於錯誤回滾、保證事務的原子性;
    5)、這裏有一個隱含的點,就是數據是在事務提交後才寫入持久存儲設備上的,

         它是晚於Redo log寫入存儲設備的。如果數據早於Redo log寫入存儲設備,

         那麼如果在數據寫入存儲的過程中發生了錯誤,Redo log就不能用於重做數據了。



轉載自:http://blog.sina.com.cn/s/blog_a1e9c7910102uzk3.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章