1. 問題發現
基於x1 master系統在整機下電時,對於ssd固態硬碟實際屬於異常掉電,引發一些思考
【思考】
master系統下電前會根據上位機傳送的預關機指令,更新並儲存檔案系統資訊到mram中,完成後對master系統下電
但是這時對於ssd其實相當於一次spor(系統突然下電),那麼對於ssd是否會發生快取中的使用者資料未及時儲存或者對映表未能刷入快閃儲存器的情況
2. ssd正常掉電應該如何執行?
首先想到對於固態硬碟應該一定有類似於flush之類的指令來通知ssd把所有快取落盤和對映表更新儲存。
查了下ata指令協議發現指令idle immediately,在掉電前, 主機會通過命令通知ssd,ssd收到該命令後, 主要會做以下事情:
(1)把buffer中快取的使用者資料刷入快閃儲存器。
(2)把對映表刷入快閃儲存器。
(3)把快閃儲存器的塊資訊寫入快閃儲存器(比如當前寫的是哪個快閃儲存器塊, 以及寫到該快閃儲存器塊的哪個位置, 哪些快閃儲存器塊已經寫過, 哪些快閃儲存器塊又是無效的等) 。
(4)把ssd其他資訊寫入快閃儲存器。
3. 如果發生異常掉電怎麼辦?
(1)ssd異常掉電的影響
所謂的異常掉電, 就是ssd在沒有收到主機的掉電通知時就被斷電; 或者收到主機的掉電通知, 但還沒有來得及處理上面提到的那些事情, 就被斷電了。 異常掉電可能會導致資料的丟失, 比如快取在ssd中的資料來不及寫到快閃儲存器, 掉電導致這部分資料丟失。 還有, 根據快閃儲存器特性, 如果掉電發生在寫mlc的upper page, 會導致其對應的lower page資料遭到破壞, 也就是意味著之前寫入快閃儲存器的資料也可能由於異常掉電導致丟失。
(2)實測為什麼異常掉電沒有影響
實際上在我們的專案中每次系統下電對於ssd都屬於異常掉電,但是從測試結果發現,從盤內讀出的資料從來沒有丟失過。
檢視了資料發現,為防止異常掉電導致的資料丟失, 乙個簡單的設計就是在ssd上加電容,ssd一旦檢測到掉電, 就讓電容開始放電, 然後把ram中的資料刷到快閃儲存器上面去, 從而避免資料丟失。 企業級的ssd一般都帶有電容。 帶電容的ssd, 還是需要設計異常掉電處理模組, 因為電容不能100%保證ssd在掉電前把所有的資訊刷入快閃儲存器。
4. 防止異常掉電的其他方法
(1)還有乙個比較前衛的想法, 就是把ram這種volatile(掉電資料丟失) 的東西, 用non-volatile(掉電資料不丟失) 的東西來替代, 但要求這種nonvolatile的東西效能上接近ram。 這樣, 整個ssd都是non-volatile的了。 intel和micron合作開發的3d xpoint, 可作為乙個選擇。 3d xpoint兼有快閃儲存器掉電資料不丟失和記憶體快速訪問的特點。
如何保證資料掉電不損壞?
1.建議使用ext3 ext4等日誌式檔案系統,並開啟journal。2.檔案系統無法保證write是原子的,所以,建議直接使用一些優秀的資料庫儲存資料或者配置,比如sqlite。sqlite可以考慮開啟synchronous full,fullfsync 1。如果還是出現檔案損壞的情況,考慮是硬體...
掉電資料塊損壞引起資料庫不能正常開啟
昨天由於掉電乙個測試機上的oracle不能啟動了,後來經過折騰搞好了,記錄下雖然好記性不如賴筆頭 說明,資料庫沒有備份,非歸檔模式執行的 一般會出現 ora 01172 執行緒1 的恢復停止在塊 ora 01151 如果需要 請使用介質恢復以恢復塊和還原備份 當然我也嘗試了recover datab...
system表空間的資料檔案損壞是否能恢復
核心資料檔案備份與恢復 system表空間資料檔案 關鍵性資料檔案分為 system表空間的資料檔案 和 undo tablespace 撤銷表空間的資料檔案 undo tablespace 自動撤銷表空間的資料檔案可以通過查詢引數 undo tablespace 指向的撤銷表空間。system 表...