一、數據庫正在操作時突然斷電可以用日志恢復
因為在執行一個操作之前,數據庫會首先把這個操作的內容寫入日志里記錄起來,然后再進行操作。這樣一來,突然斷電的時候,即使操作并沒有執行完,但是日志在操作前已經寫好了,仍然可以根據日志的內容來進行恢復。
試想一種情況:我們打算執行一個操作,應該按照先寫日志,再執行操作的順序。假設在寫日志的時候突然斷電,那么這個日志沒有寫完。這樣也不會影響數據庫的恢復,因為我們在恢復的時候,把不完整的日志記錄忽略就好了,這些不完整日志記錄對應的操作都還沒有開始執行,自然沒有影響。
以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日志組,可以分別放入不同的存儲設備,保證存儲安全。
延伸閱讀:
二、什么是CDC
CDC是(Change Data Capture 變更數據獲取)的簡稱。
核心思想是,監測并捕獲數據庫的變動(包括數據 或 數據表的插入INSERT、更新UPDATE、刪除DELETE等),將這些變更按發生的順序完整記錄下來,寫入到消息中間件中以供其他服務進行訂閱及消費。
CDC 技術應用場景也非常廣泛,包括:
數據分發,將一個數據源分發給多個下游,常用于業務解耦、微服務。
數據集成,將分散異構的數據源集成到數據倉庫中,消除數據孤島,便于后續的分析。
數據遷移,常用于數據庫備份、容災等。