回覆列表
  • 1 # 使用者7193837220508

    資料庫,以ORACLE為例,在資料需要寫的時候,例如,你一個update 某個表的某行操作。一個修改實際上是對錶所在的資料檔案的資料塊的某行記錄進行修改。這個過程1.會首先生成redo log,這個日誌記錄你update操作對xxx號資料檔案,xxx號資料塊,xx行修改啥內容。2.當你update操作提交後,資料庫會此時實際上並沒有立即把那些資料庫修改了,而且會優先把這些日誌寫入磁碟。當日志確保寫完後,資料庫才開始根據redlog日誌來更新那些資料塊。寫完後會把資料塊打個標記(SCN之類),那些應該更新而需要更新的資料資料庫一般會有個佇列來定時重新整理到資料庫(減小資料庫io),這個佇列裡面的資料塊叫髒塊。3.當資料庫在修改是,還回產生undo日誌,用於回滾,undo的日誌記錄對資料塊的變更同時也會寫入redolog(除了temp外,所有資料檔案的變更都會記錄redlog),如果一個操作未生效,就會被自動根據und進行回滾。4.因此,發生掉電分三種情況,①如果資料未提交,那麼原來的資料塊在資料庫啟動的時候會自動被回滾。如果undo日誌掉電沒記錄完,特可以透過redo來撤銷之前的變更,一般叫回滾。②如果掉電在提交後,髒塊未寫入磁碟,那麼資料庫同樣會根據redo日誌,對比資料塊的scn和控制檔案scn還有資料檔案rba之類的一些資料塊版本標記和,從重一遍之前的變更操作,這個操作因為是完成之前未完成的操作,一般叫前滾。③掉電時已經寫入磁碟,資料庫正常啟動,無需回滾或者前滾事務。綜上,資料庫利用日誌來記錄將要修改而未修改的資料塊,同時把資料塊的不通時間的版本進行編號(SCN),當資料未修改後,透過對比SCN來確保資料是否是需要的版本,配合結合REDO來進行回滾和前滾,這個操作在資料庫啟動的時候叫例項恢復。因此,一般情況下掉電都不影響資料庫的。除非資料庫的redolog出問題,例如寫入的redlog損壞了,這種情況資料庫就需要做不完全恢復,可能會丟失一些資料。所以ORACLE一般都是REDOLOG日誌組,可以分別放入不同的儲存裝置,保證儲存安全。(部分儲存控制器電池沒電的時候,同時還是寫快取的話經常會有這種redolog日誌丟失的問題)

  • 中秋節和大豐收的關聯?
  • 一年又快結束了,回首這一年您有什麼遺憾或驕傲的事嗎?