在SharePoint 2010系统中安装RBS FILESTREAM Provider

在SharePoint 2010系统中安装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数据库里面就对了。

image

在你对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实例,选择"属性"菜单项。

image 

在打开的属性窗口中,选择"FILESTREAM"选项卡,然后选中启用FILESTREAM的选择框,点击"确定"按钮。

image

打开SQL Server Management Studio,选中左侧的SQL Server实例,然后点击工具栏区域的"新建查询",打开一个查询界面,然后在里面输入下面的SQL语句并执行。

EXEC sp_configure filestream_access_level, 2
RECONFIGURE

image


2、确定要应用RBS FILESTREAM Provider的内容数据库

由于RBS是基于数据库为单元来启用的,所以你可以选择在哪些SharePoint内容数据库上启用RBS。这意味着,对于SharePoint服务器场里面那些存储文件数量并不多的内容数据库,可能并没有必要为它启用RBS,而那些可能会存储大量文件的内容数据库,则可以启用RBS,有效的优化它们。

SharePoint 2010系统中,内容数据库与网站的关系是:

 ● 一个Web应用程序可以使用一个或多个内容数据库;
 ● 在新建Web应用程序时,会为其自动创建一个内容数据库,管理员可以稍后为此Web应用程序创建更多的内容数据库;
 ● 在Web应用程序中创建一个网站集时,这个网站集会被存储到Web应用程序的某个内容数据库中;
 ● 一个网站集(包括其所包含的首要网站和所有子网站),只能被存储在一个内容数据库中,而不能被分拆存储到多个内容数据库中。

管理员可以打开SharePoint 2010管理中心的内容数据库管理界面,查看每个Web应用程序所使用的内容数据库,或是为某个Web应用程序添加新的内容数据库。

image

在下面的示范操作中,我们就为上图中所示的这个名为"WSS_Content"的内容数据库,启用RBS。

3、配置内容数据库

在确定了要启用RBS的内容数据库之后,打开SQL Server 2008 Management Studio,找到这个内容数据库,用鼠标右键点击并选择"新建查询"菜单项。

image 

在打开的查询窗口中,输入下面这些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指令会自动帮你将这个文件夹创建出来。

image

上述SQL语句执行完毕之后,可以打开资源管理器,确认在SQL Server服务器上,相应的文件夹已经创建成功。

4、安装RBS FILESTREAM Provider

下载到的RBS_x64.msi文件复制到SharePoint服务器场中的每一台服务器上,所有的SQL Server数据库服务器和SharePoint服务器上都必须安装此RBS Provider。

先在SQL Server数据库上和SharePoint服务器上(如果服务器场中有多台SharePoint服务器,则在一台Web前端服务器上),安装RBS FILESTREAM Provider,安装步骤如下。

以管理员身份运行命令提示符。

image

在命令提示符窗口中,使用"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执行一次这条指令。

image

在你敲入了上面这行很长的指令并敲下回车之后,命令提示符窗口看起来会立即执行完成,但实际上,后台会继续执行RBS Provider的安装程序。你可以打开Windows任务管理器,应该会看到有好几个msiexec.exe进程在执行中。过上一会儿,任务管理器中就不会再显示有几个msiexec.exe在运行(在我的环境中仍会剩下一个另外的msiexec.exe进程),这表明RBS Provider安装过程已经完成。

image

在RBS Provider安装过程中,它会将log信息写入与"RBS_x64.msi"安装文件同目录的"rbs_install_log.exe"文件。从资源管理器中打开这个log文件,搜索其中是否有如下"Installation completed successfully"之类的信息,这些信息表示"RBS_x64.msi"的安装是成功的。

image

如果在你的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%’

image

如果在内容数据库中并没有上面这些Table,运行上面的SQL语句也查询不出任何结果,那么表明RBS Provider并没有正确安装到内容数据库上。如果真是这样,在每台服务器上,打开资源管理器,双击"RBS_x64.msi",然后在出现的安装界面中,使用"卸载"选项先将RBS Provider卸载掉,然后再按照上面的步骤,重新在命令提示符窗口中尝试安装它。

5、为内容数据库启用RBS FILESTREAM Provider

终于到了最后一个步骤。在SharePoint服务器上,打开SharePoint 2010 Management Shell,这是一个基于Windows Powershell的命令行管理工具。

image

在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。

image

然后,你可以执行"$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 !

SpagoBI中文社区,致力于国际优秀开源BI套件SpagoBI在中国的普通推广; 联系我们QQ群:275725345
原文地址:https://www.cnblogs.com/mybi/p/2007824.html