Sql-Server

請告訴我有關 FILESTREAM 和 BLOB 文件的資訊

  • July 3, 2018

這對我來說是一個非常令人困惑的話題。

我可以理解什麼是 BLOB,我可以輕鬆使用它。我可以理解 FILESTREAM 是什麼。我可以輕鬆地在數據庫中實現,我可以備份數據庫並使用為儲存這些文件而創建的文件夾恢復它。像這樣的事情,我想,我可以很好地理解。

我不明白的是:

  1. .PDF在數據庫中僅使用 VARBINARY(MAX) 列插入(例如)與將其儲存.PDF在 FILESTREAM 數據庫中有什麼區別。我知道 BLOB varbinary(max).PDF在數據庫內部。如果我物理刪除.PDF,我仍然可以使用儲存在 varbinary(MAX) 列中的值來恢復它嗎?
  2. 當我將此.PDF文件插入文件流時,我可以在文件夾中看到它(為文件組創建的那個),如果我插入 100 個文件,我可以在文件流文件夾中看到 100 個文件,但是當我執行DELETE FROM並刪除 100 行時數據庫,我仍然可以在文件流文件夾中看到這些文件。為什麼會這樣?我認為,為了保持一致性,這些文件也會被刪除。
  3. .PDF對於這兩種情況,在BLOB或 FILESTREAM 中插入文件後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文件。如果以後需要,可以導出。

當我在文件流中插入這個 .PDF 文件時,我可以在文件夾中看到它(為文件組創建的那個),如果我插入 100 個文件,我可以在文件流文件夾中看到 100 個文件,但是當我執行 DELETE FROM 和刪除數據庫中的 100 行,我仍然可以在 filestream 文件夾中看到這些文件。為什麼會這樣?我認為,為了保持一致性,這些文件也會被刪除。

File Streams 使用垃圾收集過程來清理不再需要的文件。系統任務會定期喚醒(約 10 秒左右)並檢查文件流垃圾收集需求。閱讀“為什麼不收集所有文件?”

危險:直接從文件流容器中刪除文件被視為數據庫損壞,dbcc checkdb 將報告損壞錯誤。這些文件以事務方式連結到數據庫,文件的刪除與數據庫中的損壞頁面相同。

對於這兩種情況,在 BLOB VARBINARY(MAX) 或 FILESTREAM 中插入 .PDF 文件後,我還需要原始文件嗎?

對於 BLOB Varbinary(max) –> 您可以刪除原始文件。對於 Filestream,不要從 filestream 文件夾中刪除文件。如果原始文件與文件流文件夾不在同一文件夾中,則可以將其刪除。

參考 :

引用自:https://dba.stackexchange.com/questions/211255