閱讀114 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go  阿裏發布品牌數據銀行!能像貨幣一樣儲蓄和增值
  下一篇:go  關於免費的seo網站推廣方法有哪些?