SQL Server 2008R2 FILESTREAM測試
步驟一:在組態管理員中點選『SQL Server』服務按『右鍵』點選『內容』,點選『FILESTREAM』頁籤,然後勾選『啟用FILESTREAM的TSQL存取』。
步驟二:伺服器屬性中進階頁面,請將『檔案資料流存取層級』改成『已啟用完整存取』。
步驟三:建立資料庫時,請務必加入『檔案資料流資料』,此為實體檔案存放位置。
步驟四:建立TABLE時,資料欄位請選擇varbinary(MAX)
CREATE TABLE files
(
[DOCID] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
[doc] VARBINARY(MAX) FILESTREAM NULL
)
GO
步驟五:準備一個要測試寫入DB的檔案。
步驟六:利用下面語法將該檔案寫入資料庫中。
declare @file varbinary(max);
select @file=CAST(bulkcolumn as varbinary(max))
from openrowset(bulk 'c:\dotnetfx35sp1.exe' , single_blob) as doc
insert into files(doc) values(@file);
步驟七:利用sp_spaceused來檢視一下TABLE的資料量,可以發現,我們剛剛塞入一個237MB的檔案,但該TABLE所佔空間才8KB,由此可知實體檔案不在TABLE中。
步驟八:實體檔案在此。
步驟九:將DB完整備份。
步驟十:備份後的檔案很大,因次可以證明,完整備份會將實體檔案一起備份。
步驟十一:將該Table資料刪除。
步驟十二:檢視一下實體檔案,什麼?檔案怎麼還在呢?為什沒有一併刪除?
步驟十三:步驟十二的問題在我爬了很多文後,在一篇文章中獲得解答,由於我在上面步驟中有做過完整備份,一旦做過備份則後續對Table刪除資料時,相對應之文件不會被一併刪除。需要將DB轉成Simple後做Checkpoint後再轉回FULL則已經沒有對應的檔案就會消失,如還沒做過備份則可以利用delete from table checkpoint;
步驟十四:利用步驟十四的方法,檔案都消失了。
步驟十五:還原一下DB看看。
步驟十六:資料都回來了歐。
後記:利用filestream來將實體檔案跟DataBase分開存放,可以降低DB的IO,是一個不錯的方法,但是令我不解的是,為什麼一旦Backup過後,Table中被刪除的資料之相對應的檔案不會一併被刪除呢?這樣一來沒用的檔案持續佔據硬碟空間不是很奇怪嗎?
我是ROCK
rockchang@mails.fju.edu.tw