資料庫正在操作時突然斷電,為什麼可以用日誌恢復?既然斷電了,還怎麼能寫入日誌?

時間 2021-05-31 07:34:43

1樓:

斷電了是不能寫入日誌的,可能日誌寫到一半而已,會掉失很多資料,但是沒有關係,此時事務還沒有提交,這些資料丟不會影響一致性,只要保證已經提交的事務的資料沒有丟失就可以了。為了防止斷電資料丟失等情況,事務在提交前一定先要將更新的資料持久化儲存到硬碟,持久化成功了才能告訴客戶端事務執行成功。伺服器重啟時,資料庫會檢查日誌的完整性,將完整的日誌的資料恢復到記憶體中。

2樓:秦三行

對於這種斷電的情況,資料庫已經考慮到了,他們會使用redo日誌,在斷電恢復後對未完成的事物進行重新操作,我簡單介紹兩句redo日誌,每當有操作執行前,資料真正更改前,先講相關操作寫入重做日誌。這樣當斷電,或者一些意外,導致後續任務無法完成時,系統恢復後,可以繼續完成這些更改。

和redo日誌對應的undo日誌,undo日誌叫撤消日誌,當一些更改在執行一半時,發生意外,而無法完成,則可以根據撤消日誌恢復到更改之前的狀態。不知道題主明白了嗎?

3樓:Porzy

因為在執行乙個操作之前,資料庫會首先把這個操作的內容寫入日誌裡記錄起來,然後再進行操作。

這樣一來,突然斷電的時候,即使操作並沒有執行完,但是日誌在操作前已經寫好了,我們仍然可以根據日誌的內容來進行恢復。

試想一種情況:我們打算執行乙個操作,應該按照先寫日誌,再執行操作的順序。假設在寫日誌的時候突然斷電,那麼這個日誌沒有寫完。

這樣也不會影響資料庫的恢復,因為我們在恢復的時候,把不完整的日誌記錄忽略就好了,這些不完整日誌記錄對應的操作都還沒有開始執行,自然沒有影響。

4樓:渭水摸魚

以oracle為例,你所有成功的操作已經寫入日誌了(先寫入日誌,再反饋給你成功與否),但不一定寫入資料檔案。

所以斷電後,你之前的成功操作都是有日誌對應的。

至於你說的"斷電後寫日誌"這個神技,沒見過。

5樓:YFdyh

這個資料庫恢復是指按照內部的操作日誌,使資料庫恢復「完整性」,保證乙個「事務」的結果要麼已被完整執行,要被已被撤銷回滾。如果資料提交未完成,恢復是將資料撤銷回滾到上乙個事務完成的時間點。

引用 http://www.bsuc.cn:8013/wlkc/db/section5/5.4.html (5.4 資料庫的恢復)部分內容

另一種情況是有些己提交的事務對資料庫的更新結果還保留在緩衝區中,尚未寫到磁碟上的物理資料庫中,這也使資料庫處於不一致狀態,因此應將這些事務己提交的結果重新寫入資料庫。這類恢復操作稱為事務的重做(REDO)

在面試時被問到,為什麼MySQL資料庫資料量大了要進行分庫分表?

這個問題就問的很沒有水平,稍微有點基礎的人都知道是因為大資料了會導致查詢速度變慢與其這樣問不如問問為什麼大資料量的時候查詢速度會變慢,這樣至少可以知道求職者對於資料庫儲存方式和索引原理的知識了解多少。 wubx 知乎er的回答都非常精采。我比較好奇你們怎麼可以用這麼大的篇幅回答這個問題,得碼多久的字...

學法學為什麼要學資料庫

Miss毛 我覺得資料庫非常重要,可能是工作的時候接觸過所以深有體會。現在是大資料時代,資料庫體系的學習對你今後的各方面都會有不一樣的幫助。打個比方,你今後從事法律事務,假設會有各種法律case,公司如果能建立乙個資料庫把這些法律case按照不同緯度細分匯入資料庫,對於任何同事需要查閱參考資料時,都...

為什麼rockroach類資料庫對外表現的是關係型別的資料庫,但是還非要用乙個kv資料庫做儲存引擎?

leiysky 不知道啥是rockroach,只知道cockroach CockroachDB 以下簡稱小強 在立項的時候只是想做乙個分布式KV,做了一年後才開始支援SQL,所以選擇乙個KV的儲存引擎是很自然的。成本是一方面,做乙個完整的儲存引擎不是一件容易的事。但更重要的是在分布式資料庫裡儲存引擎...