請告訴我有關 FILESTREAM 和 BLOB 文件的資訊
這對我來說是一個非常令人困惑的話題。
我可以理解什麼是 BLOB,我可以輕鬆使用它。我可以理解 FILESTREAM 是什麼。我可以輕鬆地在數據庫中實現,我可以備份數據庫並使用為儲存這些文件而創建的文件夾恢復它。像這樣的事情,我想,我可以很好地理解。
我不明白的是:
- 當我將此
DELETE FROM
並刪除 100 行時數據庫,我仍然可以在文件流文件夾中看到這些文件。為什麼會這樣?我認為,為了保持一致性,這些文件也會被刪除。VARBINARY(MAX)
,我還需要原始文件嗎?因為它在數據庫中,所以我可以很容易地恢復它。我以 .PDF 為例
我可以使用和實現這兩種方法,但我仍然不清楚它們會發生什麼。對我來說,是一樣的,但是一個儲存在數據庫之外,另一個儲存在數據庫內部。
根據Paul Randal 撰寫的白皮書-
- 小於 256 KB (KB) 的 BLOB(例如小元件圖示)最好儲存在數據庫中。
- 大於 1 兆字節 (MB) 的 BLOB 最好儲存在數據庫之外。
- 對於大小在 256 KB 和 1 MB 之間的數據,更高效的儲存解決方案取決於數據的讀取與寫入比率以及“覆蓋”率。僅在數據庫中儲存 BLOB 數據(例如,使用 varbinary (max) 數據類型)限制為每個 BLOB 2 GB。
回答您的問題:
僅使用數據庫中的 VARBINARY(MAX) 列插入 .PDF(例如)與將此 .PDF 儲存在 FILESTREAM 數據庫中有什麼區別。我知道 BLOB varbinary(max) .PDF 在數據庫內部。如果我物理刪除 .PDF,我仍然可以使用儲存在 varbinary(MAX) 列中的值來恢復它嗎?
將 pdf 作為 pdf 插入數據庫
SINGLE_BLOB
後,您不需要原始當我在文件流中插入這個 .PDF 文件時,我可以在文件夾中看到它(為文件組創建的那個),如果我插入 100 個文件,我可以在文件流文件夾中看到 100 個文件,但是當我執行 DELETE FROM 和刪除數據庫中的 100 行,我仍然可以在 filestream 文件夾中看到這些文件。為什麼會這樣?我認為,為了保持一致性,這些文件也會被刪除。
File Streams 使用垃圾收集過程來清理不再需要的文件。系統任務會定期喚醒(約 10 秒左右)並檢查文件流垃圾收集需求。閱讀“為什麼不收集所有文件?”
危險:直接從文件流容器中刪除文件被視為數據庫損壞,dbcc checkdb 將報告損壞錯誤。這些文件以事務方式連結到數據庫,文件的刪除與數據庫中的損壞頁面相同。
對於這兩種情況,在 BLOB VARBINARY(MAX) 或 FILESTREAM 中插入 .PDF 文件後,我還需要原始文件嗎?
對於 BLOB Varbinary(max) –> 您可以刪除原始文件。對於 Filestream,不要從 filestream 文件夾中刪除文件。如果原始文件與文件流文件夾不在同一文件夾中,則可以將其刪除。
參考 :
- 優秀的白皮書 (pdf):BLOB 還是不 BLOB:數據庫或文件系統中的大型對象儲存?
- redgate 的免費書籍:SQL Server FILESTREAM 的藝術