MySQL鎖係列(四)之 undo log
什麼是undo
1) redo 記錄的是對頁的重做日誌,undo 記錄的是對事務的逆向操作
2) undo 會產生redo,undo的產生也會伴隨這redo的產生,因為重啟恢複的時候,可以通過redo還原這些undo的操作,以達到回滾的目的
undo有什麼用
1) 用於對事務的回滾
2)用於MVCC
undo的存儲結構
- rollback segment
* 在MySQL5.1的年代,一個MySQL實例,就隻有一個rollback segment
* 在MySQL5.1+ 的年代,一個MySQL實例裏麵,可以有128個rollback segment
- undo segment
* 一個segment 有 1024 個 undo slot,一個undo slot 對應一個undo log
* 一個事務(dml)對應一個undo log
- 總結
據此推斷:
1) 5.1 最多能夠承載的並發事務(dml),1 * 1024 = 1024
2)5.1+ 最多能夠承載的並發事務(dml),128 * 1024 = 10w左右
從此可以看出,5.1 之後的版本支持的並發寫入事務數更多,性能更好
undo的格式
- insert_undo
1) insert操作產生的undo
2)為什麼要單獨出來,因為insert的undo可以立馬釋放(不需要purge),不需要判斷是否有其他事務引用,本來insert的事務也沒有任何事務可以看見它嘛
- update_undo
1)delete 或者 update 操作產生的undo日誌
2)判斷undo是否可以被刪除,必須看這個undo上麵是否被其他事務所引用
3) 如果沒有任何事務引用,那麼可以由後台線程purge掉這個undo
- 如何判斷undo日誌是否有其他事務引用呢
1. 每一個undo log中都有一個DB_trx_id , 這個id記錄的是該undo最近一次被更新的事務id
2. 如果這個id 不在readview(活躍事務列表) 裏麵,就可以認為沒事務引用,即可刪除?
undo存放在哪裏
1) 5.7之前的版本,undo都是存放在ibdata,也就是所謂的共享表空間裏麵的
2)5.7以及之後的版本,可以配置存放在單獨的undo表空間中
什麼是purge
1) delete語句操作的後,隻會對其進行delete mark,這些被標記為刪除的記錄隻能通過purge來進行物理的刪除,但是並不回收空間
2)undo log,如果undo 沒有任何事務再引用,那麼也隻能通過purge線程來進行物理的刪除,但是並不回收空間
purge後空間就釋放了嗎
1) undo page裏麵可以存放多個undo log日誌
2)隻有當undo page裏麵的所有undo log日誌都被purge掉之後,這個頁的空間才可能被釋放掉,否則這些undo page可以被重用
DML的相關物理實現算法
- 主鍵索引
1. 對於delete --需要undo綁定該記錄才能進行回滾,所以隻能打上標記,否則undo指向哪裏呢
delete mark
2. 對於update --原記錄可以物理刪除,因為可以在新插入進來的地方進行undo綁定
* 如果不能原地更新: delete(注意:這裏是直接delete,而不是delete mark) + insert
* 如果可以原地更新,那麼直接update就好
- 二級索引
1. 對於delete --不能直接被物理刪除,因為二級索引沒有undo,隻能通過打標記,然後回滾。否則如果被物理刪除,則無法回滾
delete mark
2. 對於update --不能直接被物理刪除,因為二級索引沒有undo,隻能通過打標記,然後回滾。否則如果被物理刪除,則無法回滾
delete mark + insert
最後更新:2017-06-13 16:31:44