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就不能用於重做數據了。