[database-design] 磁盤扇區是否寫入原子?



Answers

似乎沒有人同意這個問題。 所以我花了很多時間嘗試不同的Google查詢,直到我終於找到了答案。

來自Stephen Tweedie博士,RedHat員工和Linux內核文件系統以及虛擬內存開發人員在這裡談論ext3(他開發的) 成績單 。 如果有人知道,那就是他。

“將這些東西寫入期刊是不夠的,因為期刊中必須有一些標記說:嗯,(實際上有這個期刊記錄)這個期刊記錄實際上代表了磁盤的完全一致性嗎?這樣做的方法是通過一些原子操作來標記事務在磁盤上完成“[23m,14s]

“現在,磁盤這些天實際上已經做出了這些保證。如果你開始對磁盤進行寫操作,那麼即使電源在該扇區寫入中間失敗,磁盤也有足夠的可用功率,它實際上可以從磁盤中竊取電源。主軸的旋轉能量;它有足夠的功率來完成正在寫入的扇區的寫入。在所有情況下,磁盤都能保證。“ [23m,41s]

Question

澄清問題:

當OS發送命令將扇區寫入磁盤時它是原子的嗎? 即,如果電源在寫入命令之後立即失敗,則新數據的寫入將完全成功,或者舊數據保持不變。 我不關心多扇區寫入會發生什麼 - 撕裂的頁面是可以接受的。

老問題:

假設您在磁盤上有舊數據X,您在其上寫入新數據Y,並且在寫入期間樹落在電源線上。 如果沒有花哨的UPS或備用電池的磁盤控制器,最終可能會出現頁面撕裂的情況,磁盤上的數據是X部分和Y部分。你能否最終得到磁盤上的數據是X部分,Y部分的情況和部分垃圾?

我一直在努力理解像數據庫這樣的ACID系統的設計,而且我天真的想法,似乎firebird,它不使用預寫日誌,依賴於給定的寫入不會破壞舊數據(X) - 只能完全寫入新數據(Y)。 這意味著如果X的一部分被覆蓋,則只能更改被覆蓋的X部分,而不是我們打算保留的X部分。

為了澄清,這意味著如果你有一個頁面大小的緩衝區,比如4096字節,填充半Y,我們要保留的一半X - 我們告訴操作系統在X上寫入緩衝區,沒有嚴重磁盤的情況在寫入期間我們想要保留的半X被破壞的失敗。




如果斷電,人們似乎不同意扇區寫入期間發生的事情。 也許是因為它取決於所使用的硬件,甚至是文件系統。

來自維基百科( http://en.wikipedia.org/wiki/Journaling_file_system ):

某些磁盤驅動器可確保在電源故障期間寫入原子性。 然而,其他人可能會在電源丟失後停止在扇區中途寫入,從而使其與錯誤糾正碼不匹配。 因此該部門腐敗,其內容丟失。 一份物理期刊可以防止這種腐敗,因為它擁有該部門的完整副本,它可以重播下次裝載時的腐敗。

似乎暗示某些硬盤驅動器無法完成該扇區的編寫,但是日誌文件系統可以像xlog保護數據庫一樣保護您免受數據丟失。

從linux內核郵件列表中討論ext3日誌文件系統:

在任何情況下,壞扇區校驗和都是硬件錯誤。 扇區寫入應該是原子的,它發生與否。

我傾向於相信維基評論。 實際上,沒有xlog的數據庫(firebird)的存在意味著扇區寫入是原子的,它不能破壞你不想改變的數據。

這裡有很多關於扇區寫入的原子性的討論,並且沒有達成一致意見。 但是那些不同意的人似乎在談論多扇區寫入(在許多現代硬盤驅動器上並不是原子的。)那些說扇區寫入是原子的人似乎更多地了解他們所談論的內容。




更新磁盤時,驅動器生​​產的唯一保證是單個512字節寫入是原子的(即,它將完整地完成或者根本不會完成); 因此,如果發生不合時宜的功率損耗,則只能完成較大寫入的一部分(有時稱為撕裂寫入)。




我懷疑這個假設是錯誤的。

現代HDD對扇區中的數據進行編碼 - 並使用ECC進行保護。 因此,您可以最終使用所有扇區內容 - 這對使用的編碼沒有意義。

對於越來越多的poplular SSD,情況更加可怕 - 塊被覆蓋之前被清除,因此,根據所使用的固件和可用空間量,完全不相關的扇區可能會被損壞。

順便說一句,操作系統崩潰不會導致單個扇區內的數據損壞。






Related