SQL Server 2012 FileTable

SQL Server 2012 FileTable

步驟一:如下圖所示,在SQL組態管理員中,點選左邊SQL Server服務,再點選右方SQL Server右鍵選內容,點選FileStream頁籤,並勾選啟用FileStream功能。

clip_image002

 

 

 

步驟二:執行exec sp_configure ‘filestream access level’,2 設定FILESTREAM啟用完整存取。

clip_image003

 

 

 

 

步驟三:確定FILESTREAM存取權限是否已啟用完整存取。

clip_image005

 

 

 

 

步驟四:建立料庫時,先到檔案群組頁中,新增一個FileStream的檔案群組。

clip_image007

步驟五:完成步驟四後回到一般選項,新增一個檔案類型是FileStream的檔案,注意!檔案群組請下拉選擇我們在步驟四建立的FILEGROUP。。

clip_image009

 

 

 

 

 

步驟六:完成資料庫建立後,請至資料庫屬性的選項頁面,鍵入目錄名稱及非交易式存取設定為FULL

clip_image011

 

 

 

 

 

 

步驟七:點選資料表按下右鍵,下拉選單中點選新增FileTable

clip_image013

 

 

 

 

 

步驟八:點選新增FileTable後,會產出下圖中的預設TSQL語法。

clip_image015

 

 

 

 

 

 

步驟九:SQL預設的語法修正成我們想要的。

FILETABLE_DIRECTORY 指定目錄,以做為 FileTable 中儲存之所有檔案和目錄的根目錄。

FILETABLE_COLLATE_FILENAME 指定定序名稱,用於套用至 FileTable 中的 Name 資料行。

指定 database_default,則資料行會繼承目前資料庫的定序。

http://msdn.microsoft.com/zh-tw/library/gg509088.aspx

clip_image017

 

 

 

步驟十:TABLE建好了,看來所有欄位皆由系統自動產生。

clip_image019

步驟十:將檔案轉成binary後寫入TABLE,注意![name]這一個欄位也要寫入歐,且不可重複歐。

clip_image020

 

 

步驟十一:已經建好一筆資料嘍。

clip_image022

 

 

步驟十二:資料夾也對建立出一筆檔案。

clip_image024

步驟十三:將檔案刪除。

clip_image025

 

步驟十四:資料不見了,被刪除了。

clip_image027

 

步驟十五:檔案也被刪除了。

clip_image029

FileTable有一個特殊的功能,可以在特殊的路徑下直接塞入檔案資料,而相對應的資料表會自動產生一筆相對應的資料。而該特殊路徑都是剛剛我們一些關鍵的設定,如下圖。\\電腦名稱\Instance FileStream的共用名稱\資料庫FileStream的目錄名稱\建資料表時的FileTable_Directory

clip_image031

 

 

 

 

上圖中,我有在資料夾貼上一個testfile.txt的檔案(有點小,須注意看),因此在相對應的資料表,自動產生出一筆資料,很神奇吧。

clip_image033

 

 

 

 

如果我們在該路徑下在建立一層資料夾(如下圖),在該資料夾下建立一個檔案,該TABLE會怎樣產生相對應的資料呢?

clip_image035

 

 

 

 

 

 

 

 

 

由下圖可知TABLE會建立一筆Directory的資料,而該資料夾底下的資料則我們可以在該筆資料的parent_path_locator欄位中看到內容是Directorypath_locator內容(如下圖藍色圈選處)

clip_image037

 

 

 

 

 

 

 

 

 

 

 

 

重頭戲來啦!測試完整備份後,資料刪除後,相對應的檔案是否會消失。

步驟十六:新增三筆資料進資料表。

clip_image039

 

 

 

 

步驟十七:做一次完整備份。

clip_image041

 

 

步驟十八:刪除資料表資料。

clip_image043

 

 

 

 

 

 

 

步驟十九:已刪除資料表資料,但我們發現實體檔案並沒有被清除。

clip_image045

 

 

 

 

 

 

 

 

 

 

步驟二十:SQL2012有一個系統預存程序http://msdn.microsoft.com/zh-tw/library/gg492195

sp_filestream_force_garbage_collection

主要功能為強制執行 FILESTREAM 記憶體回收行程,刪除任何不必要的 FILESTREAM 檔案

如下圖所示,當我們執行完該預存程序後,會產出一筆資料顯示目前資料庫中的FILESTREAM狀況,其中有個num_unprocessed_items欄位值為3,代表有3個未處理的檔案數目

clip_image047

 

 

經過這一次實驗,發現SQL2012 FILETABLE SQL2008 FILESTREAM復原模式FULL的狀態下,只要做過完整備份後,再對資料表資料做刪除時,相對應的實體檔案並不會消失,一定要將復原模式改為SIMPLE後,檔案才會消失。

 

而資料庫復原模式如果是SIMPLE模式,即使做過完整備份,對資料表資料做刪除時,相對應的實體檔案會一併消失

 

看來這樣的狀況是正常的,本來以為會不會是BUG,只是搞不懂為何會有這樣的設計呢?

後記: 在凌晨3點鐘剛洗完澡的一個靈光乍現,當DBsimple模式並不會有檔案不會跟資料一起消失的狀況,而FULL模式卻會。那交易紀錄應該是關鍵,這時突然想到資料有LDF存交易紀錄,檔案卻是沒有,因此當SIMPLE時,資料刪了,由於不會記交易紀錄,相對應的檔案也就跟著刪除了,但FULL卻不行,萬一檔案一刪,等一下要還原交易紀錄時不就會形成有資料無檔案。因此我做了個實驗,剛剛刪不掉的檔案在我做了一次交易紀錄備份後就消失了,YA....終於找到解答

2013/10/16補上備份資料庫後,已刪除之資料的實體檔案會被刪除

 

如下圖所示FILETABLE中有4個檔案。

clip_image049

 

 

刪除TABLE中所有資料。

clip_image050

 

 

 

我們可以發現存放實體檔案的資料夾內還是存在檔案,並無一併被刪除。

clip_image052

 

 

 

接下來我們做資料庫備份。

clip_image054

 

 

我們再來檢查一下,可以發現檔案都消失了歐

clip_image056

 

備註:備份資料庫後SQL會刪除已不在FILETABLE中的實體檔案,因為實體檔案已經被備份起來了,但我測試好幾次發現,要讓實體檔案被刪除,只做一次備份並沒有用,我實驗時新增一筆檔案然後再刪除,接下來要當資料庫執行過兩次交易紀錄備份後檔案就會被刪除,只是不曉得為何要這樣流程才可以,但至少讓大家知道了如果要讓用不到的實體刪除,就是記得要交易紀錄備份歐。

 

我是ROCK

rockchang@mails.fju.edu.tw