如何编写用于 SharePoint Portal Server 2003 的备份和恢复应用程序
本页内容
简介 | |
以编程方式备份和恢复站点 | |
示例应用程序:代码演练 | |
小结 | |
其他资源 | |
简介
Microsoft Office SharePoint Portal Server 2003 使用一组产品和技术 - Microsoft Office 2003、Microsoft SQL Server 2000 SP3 以及 Microsoft Windows SharePoint Services - 使您能够创建连接整个组织的统一的门户站点。SharePoint Portal Server 2003 建立在 Windows SharePoint Services 体系结构的顶层,提供诸如企业集成、内容管理、组织、发布以及连网协作等其他功能。但是,由于 Windows SharePoint Services 和 SharePoint Portal Server 2003 之间功能的差异,您应当仅使用 SharePoint Portal Server 工具来备份和恢复使用 SharePoint Portal Server 所创建的站点。
SharePoint Portal Server Data Backup and Restore 实用工具是用于备份和恢复使用 SharePoint Portal Server 2003 所创建站点的 SharePoint Portal Server 工具。在运行 SharePoint Portal Server 的服务器中,您可以从 All Programs 菜单上的 SharePoint Portal Server 组访问该实用工具。有关备份和恢复使用 SharePoint Portal Server 2003 所创建站点的信息,请参阅 Microsoft Office SharePoint Portal Server 2003 Administrator's Guide。
返回页首
以编程方式备份和恢复站点
SharePoint Portal Server 2003 还提供备份和恢复 API,使客户和第三方能够开发自定义的备份和恢复应用程序。该 API 包含在 mssctlbm.dll 和 mssitlbm.dll 之中,它们是作为 SharePoint Portal Server 2003 中的私有程序集提供的。您可以从 SharePoint Portal Server 2003 光盘的下列路径找到备份和恢复 API:
\Products\Applications\Server\SharePoint Portal Server 2003\RTM\SPS\Files\PFiles\SPS\Bin
注 在 spsbackup.dll 中,SharePoint Portal Server 2003 还提供其他非托管代码 API,这些 API 提供备份和恢复运行索引服务(以前称为索引服务器)的计算机的 IStream 接口。此外,SharePoint Portal Server 对象模型包含对使用 PortalSite 对象的 PrepareSiteForBackup() 和 Restore() 方法进行备份和恢复的支持。
本文随附的备份和恢复示例应用程序 (SPSBackupSample.exe) 说明如何使用备份和恢复 API 来备份和恢复 SharePoint Portal Server 站点和任何 Windows SharePoint Services 站点(如果他们安装在 SharePoint Portal Server Web 服务器上)。备份和恢复 API 具有与 SPSBackupSample.exe 相同的基本功能。该示例是使用 Microsoft Visual C++ 7.1 编写的。
注 由于 Microsoft SharePoint Products and Technologies 2003 SDK 中可找到的 SharePoint Portal Server 2003 文档没有讲述备份和恢复 API 问题,因此可以通过本文帮助您使用 API 来编写自己的备份和恢复应用程序。但是,您应当 仅 使用本文随附的示例(本文开始时提供的下载链接)作为原型应用程序;该示例不是专门为用于产品环境而设计的。
运行备份和恢复示例
在我们深入研究该代码之前,您应当运行示例应用程序并查看其工作方式。下载 SPSBackupSample.EXE 并在运行 SharePoint Portal Server 2003 和 Platform SDK 的计算机上生成该应用程序 (SPSBackupSample)。您应当仅在运行 SharePoint Portal Server 2003 的前端 Web 服务器上使用该示例。
要运行示例
1. | 启动备份过程:在命令提示符窗口中,键入 \SPSBackupSample –b,然后按下 Enter。 |
2. | 完成备份时恢复站点:键入 \SPSBackupSample –r,然后按下 Enter。 注 在应用程序备份和恢复站点时,系统会提示您输入备份和恢复位置及一些其他详细信息。 |
备份文档库(基于 Web 存储系统)
要配置该示例的备份组件以备份文档库(基于 Web 存储系统),您需要创建一个新的 COM+ 包,并在服务器上注册 WSSBackup.dll,在该服务器上将文档库组件安装于您的场拓扑结构中。您可以找到包含在下载代码中的 WSSBackup.dll。
要使用 COM+ 配置备份组件
1. | 在 Windows 资源管理器中,在 Administrative Tools 下面,指向 Component Services,再指向 Computers,然后单击正在运行文档库组件的计算机名。右键单击 COM+ Applications,单击 New,然后单击 Application。 |
2. | 使用下列详细信息创建新的应用程序: Name: WSSBackup Activation Type:服务器应用程序 Identity:具有适当权限可以备份 Microsoft Exchange Server 的域帐户。 |
3. | 在创建应用程序之后,将其展开,右键单击 Components,指向 New Component,然后单击 Install New Component(s)。浏览 WSSBackup.dll。 |
返回页首
示例应用程序:代码演练
下列节提供为备份和恢复示例而编写的代码演练 (SPSBackupSample.exe),以说明备份和恢复 API 的功能和使用。
您可以使用本文和代码示例作为创建您自己的备份和恢复应用程序的参考或入门点。
在您阅读下列操作指南时,在 Microsoft Visual Studio .NET 中,打开 C++ 解决方案文件 SPSBackupSample.sln 并参考其代码。
备份服务器场
BackupMode() 方法是在备份和恢复示例应用程序 (SPSBackupSample.exe) 中执行备份的主要途径。在命令提示符窗口中,键入
本节描述 BackupMode() 方法的操作。在 .cpp 文件中,搜索 void BackupMode() 找到该方法。
下列步骤说明 BackupMode() 方法备份服务器场所遵循的过程。
要备份服务器场
1. | 创建 TopologyManager 对象的一个实例。 TopologyManager * tm = new TopologyManager(); | ||||||||||||||||
2. | 检查支持的拓扑结构。
| ||||||||||||||||
3. | (有关相关示例代码,请参阅 CheckAndAcquireLock() 函数。)锁定拓扑管理器。获取独占锁定,这样就不会在该场上执行其他管理操作。 注 即使使用独占锁定,用户也可以访问该场中的任何站点或门户站点。如果您没有获取独占锁定,该场在备份过程中具有完整功能,其他用户可以创建新的门户站点和文档工作区站点。这可能导致备份映像不是该场的完整复制。 tm ->Lock->Acquire()) 检查使用该方法返回的 Boolean 值以确保给予了这种锁定。如果没有给予这种锁定,请用户强制锁定。但是,此时要小心确保完成解除锁定的过程。 (tm ->Lock->Acquire(true)) | ||||||||||||||||
4. | 要在备份来自门户站点的任何数据之前确保门户站点数据的一致性,请调用 ps->PrepareForBackup()。 | ||||||||||||||||
5. | 要备份服务器场中每个门户站点的数据库,通过 tm ->PortalSites 集合枚举。 iEnum = static_cast(psc->GetEnumerator()); while(iEnum->MoveNext()) 集合中的每个 PortalSite 对象都具有三个属性(表示三种数据库)。这些属性是:SiteDatabase、ServiceDatabase 以及 UserProfileDatabase。每个 PortalSite 对象也具有我们感兴趣的三个其他属性:IsFederated、IsCentral 以及 ID。 (bool) ps->IsFederated Indicates whether the portal site consumes shared services (bool) ps->IsCentral Indicates whether the portal site provides shared services (Guid) ps->ID ID of the PortalSite object. We check the ID during restore. A portal site cannot be restored if it already exists. | ||||||||||||||||
6. | 对于您备份的每个 PortalSite 对象,在备份元数据中存储 IsFederated、IsCentral 以及 ID 属性。 * Sample XML Metadata IsCentral="False" PortalID="4de04d81-ab32-4308-bc5f-0f93eb709fc4"> ImageName="testPort1_SITE.bak" /> ImageName="testPort1_SERV.bak" /> ImageName="testPort1_PROF.bak" /> | ||||||||||||||||
7. | 使用您选择的 SQL 备份方法,使用连接字符串和数据库名称备份 SharePoint Portal Server 数据库。 | ||||||||||||||||
8. | 出于性能原因,缓存 ID 以用于随后的检索。循环访问不同集合会导致对数据库的多次往返。代码示例使用 Hashtable 对象的一个实例缓存这些 ID。 | ||||||||||||||||
9. | 在虚拟服务器上备份任何其他内容数据库,过程如下。
| ||||||||||||||||
10. | 备份搜索数据库和运行索引服务的服务器。
| ||||||||||||||||
11. | (有关相关的示例代码,请参阅 BackupSearchApplication() 函数)锁定运行索引服务的活动服务器,避免同时发生其他备份。调用 SearchAdminClass 类的 AcquireBackupPermission() 方法。如果锁定失败,解除对运行索引服务的计算机的锁定,不进行备份。 有关更多信息,请参阅 C++ 解决方案文件中的 LockIndexServers 函数,如下所示: bool LockIndexServers(SearchAdminClass * sAdmin, List * al) | ||||||||||||||||
12. | 对于您备份的每个门户站点,您必须循环访问每个活动索引服务并调用 CSPSBackupClass 类的 BackupToStream() 方法。
| ||||||||||||||||
13. | BackupToStream 是一个异步方法。在其执行时,调用 spsBackup->GetBackupStatus() 检索备份的当前状态,并据此更新您的用户界面。 GetBackupStatus(ActiveIndexServerName,ps->SearchApplicationName, &nBackupState, &nLastError, &dLastTime, &nPercentCompleted); 下列枚举包含您必须在应用程序中定义的 nBackupState 的值。 // Enum for the various states from GetBackupStatus() typedef enum tagSPSBackupState { SPSBACKUPSTATE_IDLE = 0, SPSBACKUPSTATE_BACKUP = 1, SPSBACKUPSTATE_RESTORE = 2 }SPSBackupState; | ||||||||||||||||
14. | 备份来自每个索引管理服务器的搜索计划配置。这是一个无需分析的 XML BLOB。 SearchFarmConfig *sfc = new SearchFarmConfig(); String * sBackupSchedules = sfc->BackupSchedules(IndexServerName, portalSiteObject); | ||||||||||||||||
15. | 调用您以前锁定的每个索引服务的 ReleaseBackupPermission。 警告 如果执行该步骤失败,在重新启动搜索服务之前,运行索引服务的每台服务器上的 Microsoft SharePoint Portal Server 搜索 (SharePointPSSearch) 服务均不允许您备份或恢复。 有关参考,请参阅 C++ 解决方案文件中的下列函数。 void ReleaseIndexServers(SearchAdminClass * sAdmin, List * al) *Sample backup metadata for indexes: ImageName="testing123IndexServerA4de04d81-ab32-4308-bc5f- 0f93eb709fc4.stream" IsJobServer="True"> ** Scheduled Tasks XML BLOB goes here – left out for clarity. ]]>
| ||||||||||||||||
16. | (有关相关的示例代码,请参阅 BackupWSS() 函数。)备份任何不是 SharePoint Portal Server 2003 信息的 Windows SharePoint Services 虚拟服务器信息。
| ||||||||||||||||
17. | (有关相关的示例代码,请参阅 BackupSSO() 函数。)备份 Microsoft Single Sign-On 服务数据库。
| ||||||||||||||||
18. | (有关相关的示例代码,请参阅 BackupLegacyDocLib() 函数。)备份旧式文档库。 Exchange Streaming API 用于备份文档库(基于 Web 存储系统)。有关更多信息,请参阅 Microsoft Exchange Server SDK 中的 Backup and Restore。
| ||||||||||||||||
19. | 完成备份后,解除锁定。 tm->Lock->Release(true); | ||||||||||||||||
现在,您已经完成在场中备份站点所需执行的这些步骤。下列节描述如何恢复场。
恢复场
RestoreMode() 方法是在示例应用程序中执行恢复的主要途径。在命令提示符窗口中键入 \SPSBackupSample –r 并按下 Enter 时调用该方法。
本节描述 RestoreMode() 方法的操作。要找到该方法,在 .cpp 文件中搜索 void RestoreMode()。
下列步骤说明 RestoreMode() 方法恢复服务器场的过程。
要恢复服务器场
1. | 创建 TopologyManager 对象的一个实例。 TopologyManager * tm = new TopologyManager(); | |||||||||||||||||||||||||||||||
2. | 检查支持的拓扑结构。
| |||||||||||||||||||||||||||||||
3. | 锁定 TopologyManager。获取独占锁定,这样就不会在该场上执行其他管理操作。 注 尽管使用独占锁定,用户仍然能够访问该场中的任何站点或门户站点。 tm ->Lock->Acquire()) 检查使用该方法返回的 Boolean 值,以确保给予了锁定。如果没有给予这种锁定,请用户强制锁定。但是,要非常小心地确保完成解除锁定过程。 (tm ->Lock->Acquire(true)) | |||||||||||||||||||||||||||||||
4. | 获取场共享服务配置。获取用于 TopologyManager->GlobalProperties->IsCentral 和 TopologyManager->GlobalProperties->IsFederated 的值。 IsFarmCentral = tm->GlobalProperties->IsCentral; IsFarmFederated = tm->GlobalProperties->IsFederated; | |||||||||||||||||||||||||||||||
5. | 缓存拓扑结构。枚举 tm->DatabaseServices 和 tm->IndexServices 集合并缓存信息。 注 尽管该步骤不是必需的,但是它有助于减少对数据库的往返。参考下列代码示例中的注释。 // Enumerate and cache servers running Indexing Service in the farm // Enumerate and cache the database servers in the farm | |||||||||||||||||||||||||||||||
p < class=' _5'> > | 6. | 锁定正在运行索引服务的服务器。 警告 您必须在调用 Restore() 方法之前锁定正在运行索引服务的服务器。在调用 Restore() 之后锁定服务器会导致您的应用程序和尝试获取锁定的 SPSAdmin. 服务之间的竞争情形。锁定活动索引管理服务器,这样在使用 SearchAdminClass 类的 AcquireBackupPermission() 方法的同时就不会发生其他的恢复操作。如果在适当数量的重试后锁定失败,则解除服务器锁定,也不进行门户站点的恢复。 bool LockIndexServers(SearchAdminClass * sAdmin, List * al) | ||||||||||||||||||||||||||||||
p < class=' _5'> > | 7. | 确定是否能够恢复门户站点。您可以使用下列伪代码逻辑来恢复门户站点。无论是在提供门户站点,还是在使用门户站点,共享服务都会严重影响其是否恢复和如何恢复。有关更多信息,请参阅下列代码示例中的注释。 /* Start Of Restore Matrix */ 使用下列恢复矩阵来确定何时以及是否能够恢复门户站点。
** 在其已经是此场的父门户站点时。如果存在现有父门户站点,则可以将其作为子门户站点进行恢复。 *** 应当自动将其本身设为父门户站点。 MasterPortalExists = TopologyManager.GlobalProperties.MasterPortalSite <> NULL IsFarmCentral = TopologyManager->GlobalProperties->IsCentral IsFarmFederated = TopologyManager->GlobalProperties->IsFederated IsPortalCentral = PortalSite->IsCentral IsPortalFederated = PortalSite->IsFederated ' A farm that is NOT using shared services If IsFarmCentral = false and IsFarmFederated = false Then If IsPortalFederated = True Then ' Cannot restore without being in a farm ' configured for shared services Else ' Restore normally End If End if ' A farm that provides shared services If IsFarmCentral = true Then 'If the portal site was a parent portal site If IsPortalCentral = True Then 'Call restore and set 'TopologyManager.GlobalProperties.MasterPortalSite ' = NewPortalSite if the portal site was 'If the portal site was a child portal site Else If IsPortalFederated = True Then If MasterPortalExists Then 'Restore and skip search Restore Else 'Cannot Restore unless parent portal site exists End If ' A portal site that was formerly independent Else If IsPortalCentral = false AND IsPortalFederated = false Then If MasterPortalExists = false Then If No Portal in backup is Marked IsPortalCentral then 'Offer to promote to parent End If If PromoteToMaster = true Then 'Call Restore and set 'TopologyManager.GlobalProperties.MasterPortalSite '= NewPortalSite Else 'Cannot Restore unless parent portal exists End If End If End If End If ' A farm that consumes shared services from another farm – ' Inter Federated If IsFarmFederated = true Then If MasterFarmConnectionString <> NULL and MasterConfigurationDatabase <> NULL Then 'Call Restore – in this Restore case all portal sites will. 'be child portal sites so skip search Restore End If End If | ||||||||||||||||||||||||||||||
p < class=' _5'> > | 8. | (有关相关的示例代码,请参阅 RestorePortal() 函数。)检查现有门户站点。确保在调用 Restore() 方法之前不存在门户站点。如果您尝试通过现有门户站点进行恢复,Restore() 会引发一个异常。有关如何检查现有门户站点的示例,参阅下列代码。 PortalSite * GetPortalByID(TopologyManager *tm, String *ID). * To delete the portal site, call the Delete method of the TopologyManager object's PortalSites collection object. ps = PortalSite to delete fDeleteDatabases = bool whether to delete the underlying databases or not. tm->PortalSites->Delete(ps, fDeleteDatabases); 注 如果将 Delete() 方法的第二个参数设为 true,并且内容数据库是不可访问的(例如,服务器已停机),则不会清理任何内容。要解决此问题,您可以在清理配置数据库的异常处理程序中取消扩展虚拟服务器。有关示例,参阅下列示例函数。 void DeletePortal(TopologyManager *tm, PortalSite *ps, bool fDeleteDatabases) | ||||||||||||||||||||||||||||||
p < class=' _5'> > | 9. | 缓存现有门户站点 ID。循环访问和缓存每个 PortalSite tm->PortalSites 的 ID 属性。该代码示例使用称为 htVSID 的哈希表来存储现有 ID。 | ||||||||||||||||||||||||||||||
p < class=' _5'> > | 10. | 获取有效的目标虚拟服务器。
| ||||||||||||||||||||||||||||||
p < class=' _5'> > | 11. | 从用户收集恢复信息。
| ||||||||||||||||||||||||||||||
p < class=' _5'> > | 12. | 如果用户选择删除目标数据库,则将该数据库恢复至选定的数据库服务器。 | ||||||||||||||||||||||||||||||
p < class=' _5'> > | 13. | 恢复门户站点调用 PortalSite 对象的静态 Restore 方法。
| ||||||||||||||||||||||||||||||
p < class=' _5'> > | 14. | 恢复内容数据库。收集用于每个单个内容数据库及数据库名称的目标数据库服务器。 警告 目标数据库服务器应当限于第 5 个步骤中缓存的 SQL Server 计算机。
| ||||||||||||||||||||||||||||||
p < class=' _5'> > | 15. | (有关相关的示例代码,请参阅 RestoreSearchApplication() 函数。)恢复搜索数据库和正在运行索引服务的服务器。 如果门户站点没有共享,并且索引被锁定,则仅恢复搜索(从第 6 个步骤)。 if(false == tp->_isPortalFederated && true == fIndexServersLocked)
| ||||||||||||||||||||||||||||||
p < class=' _5'> > | 16. | (有关相关的示例代码,请参阅 RestoreSSO() 函数。)如果场无法启用共享的服务,则恢复 Single Sign-On 数据库。
| ||||||||||||||||||||||||||||||
p < class=' _5'> > | 17. | (有关相关的示例代码,请参阅 RestoreWSS() 函数。)恢复任何已备份的独立的 Windows SharePoint Services 虚拟服务器。
| ||||||||||||||||||||||||||||||
p < class=' _5'> > | 18. | (有关相关的示例代码,请参阅 RestoreLegacyDocLib() 函数。)检查备份旧式文档库的元数据。如有,则使用可在 Microsoft Exchange Server SDK 中的 Backup and Restore记录的 HrESE API 将其恢复。 | ||||||||||||||||||||||||||||||
p < class=' _5'> > | 19. | 在恢复旧式文档库后,枚举您的元数据来检查备份文档工作区站点。对于要备份的每个文档工作区站点,通过枚举当前场的 TopologyManager->DocumentWorkspaces 集合来查看配置数据库中是否已存在工作区站点。如果不存在,则使用下列代码(该代码将文档工作区站点添加到场的配置数据库中)创建一个新的 DocumentWorkspace 对象。 // Url = http://newDocumentServer/doclibName ds = tm- >DefaultDocumentService DocumentWorkspace * dw = new DocumentWorkspace(backedUPName, Url, ds); Then call tm->DocumentWorkspaces->Add(dw); | ||||||||||||||||||||||||||||||
p < class=' _5'> > | 20. | 循环访问以前锁定的、正在运行索引服务的服务器,并调用 ReleaseBackupPermission()。 | ||||||||||||||||||||||||||||||
p < class=' _5'> > | 21. | 完成恢复操作时调用 tm->Lock->Release()。 | ||||||||||||||||||||||||||||||
返回页首
小结
本文中的备份和恢复示例说明如何以编程方式开发 SharePoint Portal Server 2003 故障恢复或迁移解决方案。您不应使用本示例作为实际产品的备份解决方案的替代。但是,它非常适合于用作自定义或第三方 ISV 解决方案的原型。
返回页首
其他资源
Microsoft Exchange Server SDK 中的Microsoft SharePoint Products and Technologies2003 SDK
Microsoft Office SharePoint Portal Server 2003Administrator's Guide
Backup and Restore
本文来源:https://www.2haoxitong.net/k/doc/0e0aa534a32d7375a417802b.html
文档为doc格式