在SharePoint 2010系统中安装RBS FILESTREAM Provider
在SharePoint 2010系統中安裝RBS FILESTREAM Provider
這兩天在研究怎么寫一個RBS Provider,可惜文檔實在是很缺乏,基本上除了一篇Spec之外,就只有SQL產品組寫的一個sample了。之后如果研究有結果,再整理成文章吧,現在先講講怎么直接安裝并使用RBS FILESTREAM Provider。
————– 胡言亂語與正文的分隔線 ——————–
如果使用SharePoint 2007作為文檔管理平臺,它很讓人詬病的一點就是,SharePoint 2007將文件本身直接存儲在SQL Server數據庫之中。雖然Windows SharePoint Services 3.0 SP1增加了一個External BLOB Storage(EBS)接口,但是微軟并沒有提供實現,而是需要開發人員自己來實現它。
SharePoint 2010仍然對EBS提供兼容,但并不推薦使用EBS,推薦的解決方案,乃是使用SQL Server 2008 Remote BLOB Storage(RBS)。
SQL RBS是一組API,通過RBS,一個SQL Server 2008數據庫就不再需要將大二進制數據(BLOB)存儲在數據庫內部,而是可以存儲到外面的某個地方,在數據庫里面可能只會存儲一個對外部BLOB數據的引用。SQL Server 2008和SQL Server 2008 R2都支持RBS。
聽起來RBS實在是一個很好的東東。但是(總是有但是),RBS僅僅是一組API,換句話說,RBS可以讓開發人員利用這組API,開發出一個RBS Provider,真正實現對BLOB數據的存取。如果沒有RBS Provider,RBS自己可不會自動的將BLOB存儲到某個指定的地方去。不同的RBS Provider,可以讓我們將BLOB存儲到文件系統、磁盤存儲設備、文件服務器等等各種地方,反正不繼續放到SQL Server數據庫里面就對了。
在你對RBS有了初步認識之后,我們接著介紹SQL Server 2008里面的另外一個新特性:FILESTREAM。下面這句話摘自SQL Server 2008聯機叢書:“通過將 varbinary(max) 二進制大型對象 (BLOB) 數據以文件形式存儲在文件系統上,FILESTREAM 使 SQL Server 數據庫引擎和 NTFS 文件系統成為了一個整體。”所以,FILESTREAM可以讓管理員選擇將SQL Server數據庫里面的varbinary(max)類型BLOB數據,存儲到本地NTFS文件系統上。在通過FILESTREAM對BLOB數據進行存取的時候,還能順便能夠享受到數據庫事務處理的好處。
聽起來,FILESTREAM和RBS很相似,是不是?但其實,RBS和FILESTREAM是兩個不同的東東,它們互不依賴。RBS是一組API接口,通過這組API,應用程序就能將BLOB數據存儲到數據庫之外的某個地方,具體實現由開發人員創建的RBS Provider來完成。FILESTREAM是SQL Server 2008內置的一個特性,它能將原本存儲在數據庫里面的BLOB數據,存儲到服務器本地的NTFS文件系統上。
SharePoint 2010所利用的,是RBS API,而并非FILESTREAM特性。所以,如果沒有一個RBS Provider,我們并不能馬上就將SharePoint 2010里面存儲的文件,存儲到數據庫之外的某個地方去。但是,既然FILESTREAM特性已經擁有了現成的將數據庫中的BLOB數據存儲到NTFS文件系統上的能力,為什么不能直接使用FILESTREAM,做一個RBS FILESTREAM Provider,也就是利用FILESTREAM的功能實現的一個RBS Provider呢?這樣,豈不是就能將SharePoint 2010中的文件,都存儲到NTFS文件系統上了嗎?
微軟也想到了,所以,微軟以特性包(Feature Pack)的形式,提供了一個RBS FILESTREAM Provider。你可以從這里下載x64版本的RBS FILESTREAM Provider。但是要在SharePoint 2010系統上安裝并使用它,也是需要按照一定的步驟來操作的。下面就是具體的操作步驟。
1、確定SQL Server 2008已經啟用了FILESTREAM
在安裝SQL Server 2008時,會有一個步驟提示是否安裝FILESTREAM。如果你不確定是否安裝了此特性,從SQL Server 2008服務器上打開SQL Server配置管理器,從左邊選中"SQL Server 服務",然后從右邊的窗格中用鼠標右鍵點擊運行的SQL Server實例,選擇"屬性"菜單項。
?
在打開的屬性窗口中,選擇"FILESTREAM"選項卡,然后選中啟用FILESTREAM的選擇框,點擊"確定"按鈕。
打開SQL Server Management Studio,選中左側的SQL Server實例,然后點擊工具欄區域的"新建查詢",打開一個查詢界面,然后在里面輸入下面的SQL語句并執行。
EXEC sp_configure filestream_access_level, 2
RECONFIGURE
2、確定要應用RBS FILESTREAM Provider的內容數據庫
由于RBS是基于數據庫為單元來啟用的,所以你可以選擇在哪些SharePoint內容數據庫上啟用RBS。這意味著,對于SharePoint服務器場里面那些存儲文件數量并不多的內容數據庫,可能并沒有必要為它啟用RBS,而那些可能會存儲大量文件的內容數據庫,則可以啟用RBS,有效的優化它們。
SharePoint 2010系統中,內容數據庫與網站的關系是:
● 一個Web應用程序可以使用一個或多個內容數據庫;
● 在新建Web應用程序時,會為其自動創建一個內容數據庫,管理員可以稍后為此Web應用程序創建更多的內容數據庫;
● 在Web應用程序中創建一個網站集時,這個網站集會被存儲到Web應用程序的某個內容數據庫中;
● 一個網站集(包括其所包含的首要網站和所有子網站),只能被存儲在一個內容數據庫中,而不能被分拆存儲到多個內容數據庫中。
管理員可以打開SharePoint 2010管理中心的內容數據庫管理界面,查看每個Web應用程序所使用的內容數據庫,或是為某個Web應用程序添加新的內容數據庫。
在下面的示范操作中,我們就為上圖中所示的這個名為"WSS_Content"的內容數據庫,啟用RBS。
3、配置內容數據庫
在確定了要啟用RBS的內容數據庫之后,打開SQL Server 2008 Management Studio,找到這個內容數據庫,用鼠標右鍵點擊并選擇"新建查詢"菜單項。
?
在打開的查詢窗口中,輸入下面這些SQL語句并執行。
use [WSS_Content]
if not exists (select * from sys.symmetric_keys where name =
N’##MS_DatabaseMasterKey##’) create master key encryption by password =
N’Admin Key Password !2#4′
use [WSS_Content]
if not exists (select groupname from sysfilegroups where
groupname=N’RBSFilestreamProvider’) alter database [WSS_Content]
add filegroup RBSFilestreamProvider contains filestream
use [WSS_Content]
alter database [WSS_Content] add file (name = RBSFilestreamFile,
filename = ‘c:blobstore‘) to filegroup RBSFilestreamProvider
在上面這些SQL指令中,標記為綠色的,是你在復制了這些指令后,需要按照你的環境中的實際情況,需要修改的部分。"WSS_Content"需要修改為你要啟用RBS的內容數據庫的實際名稱。"c:blobstore"要修改成你希望用來存放BLOB文件的文件夾路徑。從實踐角度出發,你需要選擇一個位于非系統分區、剩余空間大、速度快、穩定可靠的文件夾。注意,這個文件夾只能是一個本地路徑,而不能是網絡路徑,因為FILESTREAM不支持遠程NTFS文件夾。另外,這個文件夾也不要事先建立好,上面的SQL指令會自動幫你將這個文件夾創建出來。
上述SQL語句執行完畢之后,可以打開資源管理器,確認在SQL Server服務器上,相應的文件夾已經創建成功。
4、安裝RBS FILESTREAM Provider
將下載到的RBS_x64.msi文件復制到SharePoint服務器場中的每一臺服務器上,所有的SQL Server數據庫服務器和SharePoint服務器上都必須安裝此RBS Provider。
先在SQL Server數據庫上和SharePoint服務器上(如果服務器場中有多臺SharePoint服務器,則在一臺Web前端服務器上),安裝RBS FILESTREAM Provider,安裝步驟如下。
以管理員身份運行命令提示符。
在命令提示符窗口中,使用"cd"指令將當前路徑設置為"RBS_x64.msi"所在的文件夾,然后輸入下面這行指令并執行:
msiexec /qn /lvx* rbs_install_log.txt /i RBS_X64.msi TRUSTSERVERCERTIFICATE=true FILEGROUP=PRIMARY DBNAME="WSS_Content" DBINSTANCE="sp2010" FILESTREAMFILEGROUP=RBSFilestreamProvider FILESTREAMSTORENAME=FilestreamProvider_1
上面指令中用綠色標注的部分,是需要按照你的環境中的實際情況進行修改的部分。"WSS_Content"需要修改為需要啟用RBS的內容數據庫,"sp2010"需要修改為實際的SQL Server 2008實例名稱(如果在安裝SQL Server 2008時,你沒有使用默認實例名稱,那么它的值可能類似"sp2010express"這樣的格式)。對每個內容數據庫,都只應該使用msiexec.exe執行一次這條指令。
在你敲入了上面這行很長的指令并敲下回車之后,命令提示符窗口看起來會立即執行完成,但實際上,后臺會繼續執行RBS Provider的安裝程序。你可以打開Windows任務管理器,應該會看到有好幾個msiexec.exe進程在執行中。過上一會兒,任務管理器中就不會再顯示有幾個msiexec.exe在運行(在我的環境中仍會剩下一個另外的msiexec.exe進程),這表明RBS Provider安裝過程已經完成。
在RBS Provider安裝過程中,它會將log信息寫入與"RBS_x64.msi"安裝文件同目錄的"rbs_install_log.exe"文件。從資源管理器中打開這個log文件,搜索其中是否有如下"Installation completed successfully"之類的信息,這些信息表示"RBS_x64.msi"的安裝是成功的。
如果在你的SharePoint服務器場中,只有一臺SharePoint服務器,那么按照上面的描述,在它上面安裝完RBS FILESTRREAM Provider就完事了。但是如果服務器場中存在多臺SharePoint服務器,那么就需要繼續在其他的Web前端服務器和應用服務器上,安裝RBS FILESTREAM Provider,不過,命令提示符里面的指令需要換成:
msiexec /qn /lvx* rbs_install_log.txt /i RBS_X64.msi DBNAME="WSS_Content" DBINSTANCE="sp2010" ADDLOCAL="Client,Docs,Maintainer,ServerScript,FilestreamClient,FilestreamServer"
在RBS FILESTREAM Provider安裝到所有服務器上之后,打開SQL Server 2008 Management Studio,刷新內容數據庫的Table列表,應該會看到多出來許多名稱以"mssqlrbs"開頭的,與RBS有關的Table。如果在查詢窗口中執行下面的SQL語句,也應該能查詢出一些結果。
select * from dbo.sysobjects where name like ‘rbs%’
如果在內容數據庫中并沒有上面這些Table,運行上面的SQL語句也查詢不出任何結果,那么表明RBS Provider并沒有正確安裝到內容數據庫上。如果真是這樣,在每臺服務器上,打開資源管理器,雙擊"RBS_x64.msi",然后在出現的安裝界面中,使用"卸載"選項先將RBS Provider卸載掉,然后再按照上面的步驟,重新在命令提示符窗口中嘗試安裝它。
5、為內容數據庫啟用RBS FILESTREAM Provider
終于到了最后一個步驟。在SharePoint服務器上,打開SharePoint 2010 Management Shell,這是一個基于Windows Powershell的命令行管理工具。
在SharePoint 2010 Management Shell中,依次執行下面的指令:
(1) $cdb = Get-SPContentDatabase "WSS_Content"
獲取到指定的內容數據庫(SPContentDatabase)對象實例,綠色所標注的"WSS_Content"需要更換成在你的環境中,實際的內容數據庫名稱。
(2) $rbss = $cdb.RemoteBlobStorageSettings
獲取內容數據庫的RBS設置(SPRemoteBlobStorageSettings)對象實例。
(3) $rbss.Installed()
檢查在內容數據庫上是否安裝了RBS,如果需要,更新相應的屬性值。
(4) $rbss.Enable()
在內容數據庫上啟用RBS。
(5) $pvdName = $rbss.GetProviderNames()[0]
獲取第一個注冊到內容數據庫上的RBS Provider的名稱。
(6) $rbss.SetActiveProviderName($pvdName)
為內容數據庫設置要激活的RBS Provider。
然后,你可以執行"$rbss"來查看它的一些屬性值,如果設置正確,它輸出的內容應該如上圖所示。
如果你啟用RBS FILESTREAM Provider的內容數據庫中,已經存儲了一個網站集,那么在你啟用了RBS Provider之后,網站集里面的文檔,并不會自動的馬上通過FILESTREAM,轉存到NTFS文件系統上。只有新增的文檔才會被存儲到NTFS文件系統上,網站集里面之前上載的文檔,仍然會保存在內容數據庫里面。如果你希望現在將那些舊的文檔,統統轉存到我們所指定的NTFS文件系統中,那么可以繼續在SharePoint 2010 Management Shell中執行下面這個指令:
(7) $rbss.Migrate()
如果你希望設置一個文檔大小閾值,只有大小超過此閾值的文檔,才通過RBS FILESTREAM Provider存儲到NTFS文件系統上,而小于此閾值的文檔,仍然存儲在內容數據庫中,那么可以在SharePoint 2010 Management Shell中繼續執行下面的指令(假設閾值是1048000字節,也就是1M):
(8) $rbss.MinimumBlobStorageSize = 1048000
(9) $rbss.Update()
上面的這些指令,都是針對一個內容數據庫的。如果你有多個內容數據庫要啟用RBS,那么就對每個內容數據庫都執行一遍上述指令。
6、檢查最終效果
在完成了上述所有操作步驟之后,在SharePoint網站中上載一些文檔,然后檢查你所設定的NTFS文件夾,里面應該會包含有一些子文件夾,存儲著這些文檔。
參考鏈接
Jie Li’s Geek World
Enjoy RBS !
轉載于:https://www.cnblogs.com/mybi/archive/2011/04/07/2007824.html
總結
以上是生活随笔為你收集整理的在SharePoint 2010系统中安装RBS FILESTREAM Provider的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity3D正常行走和飞行的实现
- 下一篇: C#.net删除dataGridView