SharePoint 2010 RBS FILESTREAM Provider 的“垃圾收集”

在以前的博客中,我曾經介紹過如何在SharePoint 2010系統中安裝和配置RBS FILESTREAM Provider,實現將SharePoint中的文件存儲到磁盤文件系統中。但是當用戶在SharePoint中上載文件時,文件的二進制內容就會通過RBS FILESTREAM Provider,寫入到指定的磁盤文件夾之中。通過RBS可以極大的提高SharePoint存儲文件的能力,也有效的使SharePoint的內容數據庫不會跟着文件數量的增多而不斷膨脹。

但是當用戶從SharePoint網站上刪除一個文件時(並且已經將文件徹底的從SharePoint回收站中刪除),RBS FILESTREAM Provider並不會“真正”的從磁盤文件系統把相應的文件也刪除掉。爲了提高性能,RBS FILESTREAM Provider只會記錄下有一個文件被“刪除”了,但是要想真正從磁盤文件系統上刪除這個物理文件,就需要一些額外的步驟,來完成“垃圾收集”的工作。

RBS FILESTREAM Provider內置了一個命令行維護工具,這個工具就能夠實現“垃圾收集”。除此之外,實際上它還可以進行一致性檢查、數據維護等諸多工作。但今天我們要講的,還是集中在如何使用這個維護工具實現“垃圾收集”,來將那些垃圾物理文件從磁盤文件系統上徹底刪除。

當RBS FILESTREAM Provider被安裝到機器上時,在默認的安裝目錄中(Program Files\Microsoft SQL Remote Blob Storage 10.50),有一個“Maintainer”文件夾。裏面有2個文件:Microsoft.Data.SqlRemoteBlobs.Maintainer.exe和Microsoft.Data.SqlRemoteBlobs.Maintainer.exe.config,前者就是那個命令行維護工具,後者則是維護工具的配置文件。

在使用維護工具之前,需要打開那個配置文件,在配置文件中指定啓用了RBS功能的SharePoint內容數據庫的連接字符串。每個內容數據庫都需要分別指定一個連接字符串。如果你是第一次打開配置文件,會發現裏面的連接字符串默認是使用加密方式保存的。嗯,我個人覺得這實在是一件沒有必要的事情,因爲維護工具本來就需要直接運行在SharePoint服務器上,這是一件需要服務器管理員權限才能乾的事情,所以似乎把服務器上配置文件中的連接字符串進行加密,未免過分小心了…當然,如果你是使用混合認證方式連接到數據庫,那把連接字符串加密一下也未嘗不可。加密連接字符串的方式是使用aspnet_regiis.exe這個命令行工具。不過在這篇文章中,我就只演示用明文保存連接字符串好了。

下圖就是在我的機器上,配置文件的內容。裏面只定義了一個連接字符串。連接字符串的名稱是“WSS_Content_ConnStr”,連接字符串的內容是“Data Source=sp2010;Initial Catalog=WSS_Content;Integrated Security=True”。這些都需要感覺實際環境中的情況進行修改。如果有多個SharePoint內容數據庫都啓用了RBS,那麼就需要針對它們分別添加多個連接字符串,給每個連接字符串一個不同的名稱。

image

接下來就可以在命令行中執行維護工具了。輸入如下指令並運行:

Microsoft.Data.SqlRemoteBlobs.Maintainer.exe -ConnectionStringName WSS_Content_ConnStr -Operation GarbageCollection -GarbageCollectionPhases rdo

指令中綠色標記的部分,需要等同於配置文件中所指定的連接字符串名稱。維護工具在執行時,會輸出一些文字信息,顯示出它收集了多少個垃圾文件。

image

如果你在自己的實驗環境中執行了上面的指令,很可能發現它並沒有刪除一個垃圾文件,而如果你重複執行它,它甚至會告訴你,由於間隔時間太短,它“拒絕”頻繁運行。這是因爲每個SharePoint內容數據庫在啓用了RBS之後,都會多3個與維護工具相關的時間間隔參數:“delete_scan_period”、“orphan_scan_period”和“garbage_collection_time_window”,它們指定了諸如最小允許的掃描週期、清除垃圾文件週期等等設置。這3個參數會共同影響維護工具的掃描和清除垃圾文件的過程。

在通常情況下,是不需要修改這3個參數的。在實驗環境中,爲了檢驗垃圾收集的效果,可以嘗試修改這3個參數。打開SQL Server 2008 Management Studio,選中一個SharePoint內容數據庫,然後執行:

exec mssqlrbs.rbs_sp_set_config_value 'delete_scan_period','time 00:00:00'

exec mssqlrbs.rbs_sp_set_config_value 'orphan_scan_period','time 00:00:00'

exec mssqlrbs.rbs_sp_set_config_value 'garbage_collection_time_window','time 00:00:00'

上面3條SQL指令將這3個時間間隔參數都設置爲0。如果維護工具發現有垃圾文件,在它輸出到屏幕的信息中會顯示相應的信息。

到現在爲止,上面所講的整個過程就是RBS FILESTREAM Provider的垃圾收集。但是由於RBS FILESTREAM Provider使用了SQL Server 2008中的FILESTREAM特性,而FILESTREAM組件自己對於垃圾文件,也有自己的一套管理方法。換句話說,在RBS的層次,RBS會通過自己的垃圾收集來刪除垃圾文件,但這並不會影響到FILESTREAM的層次。即使在RBS層次已經完成了“垃圾收集”,並認爲已經把一個文件刪除了,但在FILESTREAM層次,卻可能仍然不會將文件從磁盤文件系統上刪除,除非FILESTREAM組件自己進行一次“垃圾收集”。

強制FILESTREAM進行“垃圾收集”最簡單的方法就是在數據庫上執行下面這個SQL指令:

CHECKPOINT

最後,對於RBS FILESTREAM Provider維護工具,由於它是一個命令行工具,所以可以使用Windows計劃任務來定時執行它。對於FILESTREAM的SQL指令,可以通過SQL Server的作業來定時執行。

參考:

關於RBS“垃圾收集”的詳細信息

關於FILESTREAM“垃圾收集”的詳細信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章