undo log記錄的內容是邏輯的(基於每條記錄),redo log記錄的是物理的(基於page),rollback是邏輯上的回滾併發
innodb_undo_tablespaces 5.6能夠將undo設爲多個表空間 innodb_undo_logs 能夠設置有多少個undo,默認128,5.7是96,前面32個留給臨時表(ibtmp1),其實也無所謂,一般用不到
從底層來看很是複雜mvc
對象 | 說明 |
---|---|
rollback segment | 回滾段 |
undo log segment undo | undo日誌段 |
undo page | 組成了undo日誌段 |
undo log | 存在於undo page中 |
undo log record | 存在於undo log中 |
上面這個太底層,這裏只分析回滾段和undo log內容,其餘本身看書spa
Rollback undo log Segment segment +-----------+ +---------+ +------+ | segment 1 | | 1 +------------> undo | +-----------+ +---------+ +------+ | segment 2 +------------> 2 | +-----------+ +---------+ | segment 3 | | ... | +-----------+ +---------+ +------+ | | | 1024 +------------> undo | | . | +---------+ +------+ | . | | . | | | +-----------+ | segment127| +-----------+ | segment128| +-----------+
5.5只有一個rollback segment,即只有1024個undo log segment,就表示只能有1024個併發事務(線程)去執行undo 若是用不到undo,其實能夠超過1024個線程 在5.6中支持128*1024個併發執行undo線程
undo默認保存在ibdata,即系統表空間中線程
再回顧下,ibdata1中有哪些東西?日誌
double Write 元數據信息(數據字典) undo信息(5.6後可分離),分開放可避免競爭 innodb_undo_directory innodb_undo_logs innodb_undo_tablespaces insert buffer/change buffer 在MySQL5.7之後,Rollback Segment從128個小到96個,剩餘的32個rollback segment預留給臨時表空間(ibtmp1)使用
undo log records(兩種)code
一、insert undo log record 記錄insert對象
二、update undo log record, 記錄update和delete(trx_undo_upd_exist_rec,trx_undo_del_mark_rec,trx_undo_upd_del_rec)blog
undo是邏輯日誌,記錄了每一行修改的值(先後項)事務
以前說的redo寫prepare,就是把上圖中紅色框框部分修改成prepare狀態(redo記錄頁的變化,undo也是一種頁)ip
tips;