mysql redo原子写_InnoDB如何保证redolog的完整性?
redo log里記錄的只是對數據庫頁面的更改,它記錄著類似『更改頁面x 的指定偏移量的數據為k』這樣的信息,是完全二進制的log(數據庫原理概念上的,不是指MySQL binlog,MySQL binlog不是二進制log);在redo log里并沒有存儲在某個事務的某個操這樣的信息。事務的CRUD操作中的寫操作會被數據庫翻譯成一個個的對指定頁面的寫,對頁面的寫會進一步生成一或多個redo log。數據庫在頁面持久化前,會確保先把redo log寫入磁盤持久化。而數據庫頁面上記錄的原值會被覆蓋,數據庫會使用undo log記錄這個更新前的值。
每一個事務寫操作(包括插入,更新,刪除),數據庫要做的就是:
1.計算更新后的記錄與更新前的記錄的差值,把這個信息寫到rollback segment里,形成undo log。由于『寫rollback segment』這個動作本身也是對頁面的修改,要記錄這個操作的redo log。
2.在寫完undo log后,數據庫才把真正的對記錄的更新寫到直正的數據頁面,這個操作也會生成對應的redo log。
在事務提交時,事務會:
1.更新它在redo log中的記錄的事務狀態,同樣地,也會有對應的redo log生成。
2.持久化redo log緩沖區中的數據,數據庫會確保當前事務所生成的所redo log都在提交狀態返回給用戶前被持久化,這些redo log包括undo的redo log,也包括對原如數據更新產生的log。
在數據庫宕機重啟后,數據庫會通過下面的操作恢復,
1.啟動開始時檢測是否發生崩潰,然后定位到最近的一個checkpoint(一個一致的時間點),定位在這個checkpoint時flush到磁盤的數據頁,檢查checksum。如果不正確,說明這個頁在上次寫入是不完整的,從doublewrite buffer里把正確的頁讀出來,并更新到buffer中的頁上。
2.順序地分析redo log,這里包括原始數據的redo log和undo log的redo log。把redo apply頁面上,這樣數據庫就會恢復到一個同宕機前一時刻同樣的(頁面)狀態。
3.數據庫還要通過undo log標識出未提交事務,rollback未提交的事務。要把那些被未完成的事務更新的值,替換回原來的值。
innodb的事務原子性是通過兩個層次上保證的,首先,redo log會保證數據庫的物理上(數據庫頁面)同崩潰前一刻的數據庫是相同的狀態;其次,undo log會保證事務的原子性,即『要么都做,要么都不做』的語義。
總結
以上是生活随笔為你收集整理的mysql redo原子写_InnoDB如何保证redolog的完整性?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息系统分析与设计杨选辉_信息系统分析与
- 下一篇: jenkins maven没有使用全局设