数据库快照的编程管理

上次修改时间: 2010年2月16日

适用范围: SharePoint Foundation 2010

本主题介绍如何将数据库快照合并到自定义备份和数据恢复解决方案中。

数据库快照管理

如果 Microsoft SharePoint Foundation 服务器场使用 Enterprise 或 Developer 版本的 Microsoft SQL Server,服务器场管理员就可以利用这些版本的快照功能。快照可在 SQL Server 中进行管理,但 SharePoint Foundation API 还提供了一组可与计时器作业(SPTimerServiceSPJobDefinition)共同使用的类来管理快照。您的解决方案可以通过编程方式来确定创建快照的频率、每个快照在自动被删除之前的保留时间,以及在任一时刻维护的快照数量。

备注

SQL Server 快照不是整个数据库的实际副本。初次创建时,快照是空的。每次数据被写入原始数据库时,以前的值就被写入快照。访问快照时,SQL Server 对待快照和原始数据库中未更改的数据 的方式就好像它们是一个数据库。因此,快照连同原始数据库中的数据是创建快照时数据库状况的有效记录。有关详细信息,请参阅Database Snapshots

使您的自定义数据库可从快照恢复

如果贵公司的 SharePoint Foundation 解决方案包括 Enterprise 或 Developer 版本的 SQL Server 承载的补充数据库,则可以通过设计一个代表该数据库的类来实现 IDatabaseSnapshotRestore 接口,从而将这个数据库加入到 SharePoint Foundation 基础结构。有关如何执行此操作的详细信息,请参阅如何:创建可从快照还原的数据库类

快照管理 API

SharePoint Foundation 对象模型中有两个关键的类用于快照管理。下面两小节将讨论这两个类。

SPDatabaseSnapshot

这种类型的对象表示快照。它们只作为 SPDatabaseSnapshotCollection 集合的成员存在,而该集合本身只作为 SPDatabase.Snapshots 属性的值存在。SPDatabaseSnapshot 类的关键成员已在此汇总。有关详细信息,请参阅每个成员(以及该类的其他成员)的参考主题。

  • Delete() – 就像该名称所表示的那样,此方法可删除快照。您可以临时调用它,但通常它是通过计时器作业调用的,计时器作业将按时间间隔进行检查,查看快照是否已经达到允许的最长时间 (MaximumRetention),或者是否已经超过允许的最大快照数目 (SnapshotLimit),以及快照是否为数据库的最旧快照。

  • Restore() – 此方法用快照覆盖数据库,然后删除数据库的所有现有快照。该方法的一次重载可使调用代码选择强制进行覆盖,即使数据库不实现 IDatabaseSnapshotRestore 也是如此。

SPDatabaseSnapshotCollection

SPDatabaseSnapshotCollection 类的关键成员已在此汇总。有关详细信息,请参阅每个成员(以及该类的其他成员)的参考主题。

  • CreateSnapshot() – 此方法促成 SQL Server 创建快照。随后对于数据库的每个写操作,数据库服务器都会将原始值写入快照。该方法还将 EnabledManagement 设置为 true。

  • DeleteSnapshots() – 此方法删除数据库的所有现有快照。

  • RefreshSnapshots() – 此方法根据快照对 SharePoint Foundation 内容数据库和配置数据库进行同步,以确保 SQL Server 中的内容数据库的实际存在的所有快照(且只有这些快照)在配置数据库中注册。一般来说,您的代码出于任何原因访问快照之前,才调用此方法,例如,对于索引器"sfdb.Snapshots[0]",其中,sfdb 是 SPDatabase 对象。但是,CreateSnapshot()DeleteSnapshots() 方法都会自行调用 RefreshSnapshots()

  • EnabledManagement – 此属性为 true 时,表示管理快照的 SharePoint Foundation 内置计数器服务作业应在其管理中包括父数据库;例如,该作业通常按指定间隔创建和删除数据库的快照。当此属性为 false 时,这样的作业将忽略数据库。如果 SharePoint Foundation 解决方案为某些数据库提供您自己的快照管理计时器作业,您必须为这些数据库将 EnabledManagement 设置为 false,否则将有两组计数器作业相互冲突地创建和删除同一个数据库的快照。CreateSnapshot() 方法将此属性设置为 true。

  • CreationInterval – 此属性指定创建父数据库的新快照的频率(小时)。

  • MaximumRetention – 此属性指定在删除快照之前将其保留多长时间(小时)。

  • SnapshotLimit – 此属性指定允许在任一时刻存在的父数据库的最大快照数。

配置要进行管理的数据库快照

若要设置由 SharePoint Foundation 附带的内置快照管理计时器作业所管理的数据库,请运行执行下列操作的代码。

若要设置由自定义快照管理计时器作业所管理的数据库,应执行相同的步骤(除了将 EnabledManagement 属性设置为 false)。

从快照恢复

通过编程方式从快照恢复数据库的主要步骤如下:

  1. 获取对表示数据库的 SPDatabase 对象的引用。

  2. 调用 RefreshSnapshots() 确保您使用的是数据库最新的一组快照。例如,"sfdb.Snapshots.RefreshSnapshots();",其中,sfdb 是对 SPDatabase 对象的引用。

  3. 获取对您要用于还原的快照的引用。例如,若要获取对最新快照的引用,可以使用以下代码行

    Int32 numberOfSnapshots = sfdb.Snapshots.Count;
    SPDatabaseSnapshot spDBSnapshot = sfdb.Snapshots[numberOfSnapshots-1];
    
    Dim numberOfSnapshots As Int32 = sfdb.Snapshots.Count
    Dim spDBSnapshot As SPDatabaseSnapshot = sfdb.Snapshots(numberOfSnapshots-1)
    
  4. 为快照调用 Restore() 方法之一。下面是一个示例。

    spDBSnapshot.Restore();
    
    spDBSnapshot.Restore()
    

实现您自己的快照管理计时器作业

如果您要使用 SharePoint Foundation 对象模型开发自定义快照管理应用程序,则可以从 SPJobDefinition 类派生您自己的类。主要任务是创建 Execute(Guid) 方法的重置。通常,您希望此方法能执行以下操作:

  • 获取对承载数据库的 SPDatabaseServiceInstance 对象的引用。

  • 循环访问对象的 Databases 属性的所有成员,然后执行以下操作:

    • 检查 sfdb.Snapshots.EnabledManagement 的值,其中,sfdb 是对 SPDatabase 对象的引用,如果该值为 true,则不执行任何操作。(如果为 true,则 SharePoint Foundation 的内置快照管理计时器作业将管理数据库的快照。)

    • 对于其他数据库中的每个数据库,通过调用 RefreshSnapshots() 来刷新其快照列表,然后删除其 Age 大于 MaximumRetention 属性值的任何快照。

    • 再次调用 RefreshSnapshots(),然后将最新快照的保留时间 (sfdb.Snapshots[sfdb.Snapshots.Count-1].Age) 与 CreationInterval 的值进行比较。如果前者等于或大于后者,则调用 CreateSnapshot() 创建新快照。

    • 再次调用 RefreshSnapshots(),然后进行检查,查看快照总数是否大于 SnapshotLimit。如果是,则删除足够的快照以便让总数保持在限值内。先删除最旧的快照 (sfdb.Snapshots[0]),然后是剩余快照中最旧的快照 (sfdb.Snapshots[1]) 等。