一、數(shù)據(jù)庫正在操作時突然斷電可以用日志恢復
因為在執(zhí)行一個操作之前,數(shù)據(jù)庫會首先把這個操作的內(nèi)容寫入日志里記錄起來,然后再進行操作。這樣一來,突然斷電的時候,即使操作并沒有執(zhí)行完,但是日志在操作前已經(jīng)寫好了,仍然可以根據(jù)日志的內(nèi)容來進行恢復。
試想一種情況:我們打算執(zhí)行一個操作,應(yīng)該按照先寫日志,再執(zhí)行操作的順序。假設(shè)在寫日志的時候突然斷電,那么這個日志沒有寫完。這樣也不會影響數(shù)據(jù)庫的恢復,因為我們在恢復的時候,把不完整的日志記錄忽略就好了,這些不完整日志記錄對應(yīng)的操作都還沒有開始執(zhí)行,自然沒有影響。
以O(shè)RACLE為例,在數(shù)據(jù)需要寫的時候,例如,你一個update 某個表的某行操作。一個修改實際上是對表所在的數(shù)據(jù)文件的數(shù)據(jù)塊的某行記錄進行修改。這個過程1.會首先生成redo log,這個日志記錄你update操作對xxx號數(shù)據(jù)文件,xxx號數(shù)據(jù)塊,xx行修改啥內(nèi)容。2.當你update操作提交后,數(shù)據(jù)庫會此時實際上并沒有立即把那些數(shù)據(jù)庫修改了,而且會優(yōu)先把這些日志寫入磁盤。當日志確保寫完后,數(shù)據(jù)庫才開始根據(jù)redlog日志來更新那些數(shù)據(jù)塊。寫完后會把數(shù)據(jù)塊打個標記(SCN之類),那些應(yīng)該更新而需要更新的數(shù)據(jù)數(shù)據(jù)庫一般會有個隊列來定時刷新到數(shù)據(jù)庫(減小數(shù)據(jù)庫io),這個隊列里面的數(shù)據(jù)塊叫臟塊。3.當數(shù)據(jù)庫在修改是,還回產(chǎn)生undo日志,用于回滾,undo的日志記錄對數(shù)據(jù)塊的變更同時也會寫入redolog(除了temp外,所有數(shù)據(jù)文件的變更都會記錄redlog),如果一個操作未生效,就會被自動根據(jù)und進行回滾。4.因此,發(fā)生掉電分三種情況,①如果數(shù)據(jù)未提交,那么原來的數(shù)據(jù)塊在數(shù)據(jù)庫啟動的時候會自動被回滾。如果undo日志掉電沒記錄完,特可以通過redo來撤銷之前的變更,一般叫回滾。②如果掉電在提交后,臟塊未寫入磁盤,那么數(shù)據(jù)庫同樣會根據(jù)redo日志,對比數(shù)據(jù)塊的scn和控制文件scn還有數(shù)據(jù)文件rba之類的一些數(shù)據(jù)塊版本標記和,從重一遍之前的變更操作,這個操作因為是完成之前未完成的操作,一般叫前滾。③掉電時已經(jīng)寫入磁盤,數(shù)據(jù)庫正常啟動,無需回滾或者前滾事務(wù)。
綜上,數(shù)據(jù)庫利用日志來記錄將要修改而未修改的數(shù)據(jù)塊,同時把數(shù)據(jù)塊的不通時間的版本進行編號(SCN),當數(shù)據(jù)未修改后,通過對比SCN來確保數(shù)據(jù)是否是需要的版本,配合結(jié)合REDO來進行回滾和前滾,這個操作在數(shù)據(jù)庫啟動的時候叫實例恢復。因此,一般情況下掉電都不影響數(shù)據(jù)庫的。除非數(shù)據(jù)庫的redolog出問題,例如寫入的redlog損壞了,這種情況數(shù)據(jù)庫就需要做不完全恢復,可能會丟失一些數(shù)據(jù)。所以O(shè)RACLE一般都是REDOLOG日志組,可以分別放入不同的存儲設(shè)備,保證存儲安全。
延伸閱讀:
二、什么是CDC
CDC是(Change Data Capture 變更數(shù)據(jù)獲?。┑暮喎Q。
核心思想是,監(jiān)測并捕獲數(shù)據(jù)庫的變動(包括數(shù)據(jù) 或 數(shù)據(jù)表的插入INSERT、更新UPDATE、刪除DELETE等),將這些變更按發(fā)生的順序完整記錄下來,寫入到消息中間件中以供其他服務(wù)進行訂閱及消費。
CDC 技術(shù)應(yīng)用場景也非常廣泛,包括:
數(shù)據(jù)分發(fā),將一個數(shù)據(jù)源分發(fā)給多個下游,常用于業(yè)務(wù)解耦、微服務(wù)。
數(shù)據(jù)集成,將分散異構(gòu)的數(shù)據(jù)源集成到數(shù)據(jù)倉庫中,消除數(shù)據(jù)孤島,便于后續(xù)的分析。
數(shù)據(jù)遷移,常用于數(shù)據(jù)庫備份、容災(zāi)等。