爲何NTFS刪除超過4G大文件或數據庫文件後FILE RECORD大小表現爲0?數據庫
答:NTFS刪除一個文件,必需要完成以下幾個流程,纔算完結:ide
一、更改文件系統$bitmap,釋放空間日誌
二、更改$mft filerecord項的屬性爲刪除it
三、更改$mft:$bitmap的位圖信息爲0,釋放這個filerecord的佔用空間class
四、清除目錄鏈表中關於本文件的item信息。file
這個流程是理想狀態下的處理規則,但實際上,最頭疼的是OS要考慮這個問題:若是在上述4個步驟中出現中斷(如忽然斷電、死機等),如何讓下次操做時可以繼續,或者維繫文件系統仍是一致的(最簡單的,若是文件刪除了,但目錄還在,那老是不合適的,全盤李檢測一次又太消耗時間,並且到底誰錯了,有時候也分不清),爲了解決這個問題,NTFS引入了$logfile,即日誌,簡單說就是爲正在執行的一個完整IO運做(如刪除一個文件)事先記錄一下狀態,若是沒作成功,下回直接回滾回沒作成功的狀態便可。map
但是問題又來了,若是某個文件太大,或者存儲鏈表太長(即碎片太多)。記錄這個文件元信息部分就會變得很大,好比一個文件大小是4G,按4K塊大小算,連續的位圖至少也得有1M,爲了避免至於在日誌文件中保存太大的信息(好比一個4T的文件,先保存1g的位圖,太慢且變數又增大了),NTFS對於複雜文件或大文件是採起分批次處理的:即某個文件多是不斷地被變小,變小,直至變0。鏈表
爲了維持操做的一致性。猜測,NTFS設了兩種狀況,若是是判斷能夠一第二天志記錄即夠完成某個IO原子操做的,就不用清除filerecord的大小和位置信息(runlist)了。但若是ntfs沒法一第二天志完成一個IO原子操做,則須要分紅多個獨立的IO原子操做,每一個IO原子操做記錄一第二天志,完成時更新成新狀態——這樣一來,刪除一個大文件或多碎片的文件,最後一次IO原子操做後,就會清除爲0大小,RUNLIST清空狀態。數據
這個問題中,4G其實也不是變數,猜想來源於4K塊大小,和文件一次釋放1M個簇範圍的片區致使。數據庫每每不容易恢復,大小即便小於4G,其緣由是由於數據庫不斷增加,碎片較多,片段化致使元數據量大,位置分散,沒法一次性完成釋放等操做。
di
-------北亞數據恢復中心 張宇