SQL Server 2008R2 FILESTREAM測試

SQL Server 2008R2 FILESTREAM測試

 

步驟一:在組態管理員中點選『SQL Server』服務按『右鍵』點選『內容』,點選『FILESTREAM』頁籤,然後勾選『啟用FILESTREAMTSQL存取』。

clip_image002[4]

 

 

 

步驟二:伺服器屬性中進階頁面,請將『檔案資料流存取層級』改成『已啟用完整存取』。

clip_image003[4]

步驟三:建立資料庫時,請務必加入『檔案資料流資料』,此為實體檔案存放位置。

clip_image005[4]

 

 

 

 

 

步驟四:建立TABLE時,資料欄位請選擇varbinary(MAX)

CREATE TABLE files

(

        [DOCID] [uniqueidentifier] ROWGUIDCOL NOT NULL  UNIQUE,

        [doc] VARBINARY(MAX) FILESTREAM NULL

)

GO

clip_image007[4]

 

 

 

 

 

 

步驟五:準備一個要測試寫入DB的檔案。

clip_image008[4]

 

 

 

 

 

步驟六:利用下面語法將該檔案寫入資料庫中。

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);

clip_image010[4]

 

 

 

 

 

步驟七:利用sp_spaceused來檢視一下TABLE的資料量,可以發現,我們剛剛塞入一個237MB的檔案,但該TABLE所佔空間才8KB,由此可知實體檔案不在TABLE中。clip_image012[4]

 

 

 

 

 

 

 

步驟八:實體檔案在此。

clip_image014[4]

 

 

 

 

 

步驟九:將DB完整備份。

clip_image015[4]

 

 

步驟十:備份後的檔案很大,因次可以證明,完整備份會將實體檔案一起備份。

clip_image017[4]

步驟十一:將該Table資料刪除。

clip_image019[4]

 

 

 

 

 

步驟十二:檢視一下實體檔案,什麼?檔案怎麼還在呢?為什沒有一併刪除?

clip_image021[4]

 

 

步驟十三:步驟十二的問題在我爬了很多文後,在一篇文章中獲得解答,由於我在上面步驟中有做過完整備份,一旦做過備份則後續對Table刪除資料時,相對應之文件不會被一併刪除。需要將DB轉成Simple後做Checkpoint後再轉回FULL則已經沒有對應的檔案就會消失,如還沒做過備份則可以利用delete from table checkpoint;

clip_image022[4]

 

 

 

 

 

 

步驟十四:利用步驟十四的方法,檔案都消失了。

clip_image023[4]

 

 

 

 

 

 

 

 

 

步驟十五:還原一下DB看看。

clip_image025[4]

 

 

 

步驟十六:資料都回來了歐。

clip_image027[4]

 

後記:利用filestream來將實體檔案跟DataBase分開存放,可以降低DBIO,是一個不錯的方法,但是令我不解的是,為什麼一旦Backup過後,Table中被刪除的資料之相對應的檔案不會一併被刪除呢?這樣一來沒用的檔案持續佔據硬碟空間不是很奇怪嗎?

 

我是ROCK

rockchang@mails.fju.edu.tw