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