提高
在 SQL Server 虚拟备份设备接口(VDI)协议的当前实现中,从 SQL Server 发送到 VDI 客户端的最后一条消息将是 VDC_Flush 命令。 为了防止数据丢失,VDI 客户端必须先完成备份,然后才能响应 VDC_Flush 命令。 从 SQL Server 2008 开始,并引入了 FILESTREAM,在备份期间,可以多次发送 VDC_Flush 命令。 此操作会导致 VDI 客户端必须在备份操作期间完成多次备份的问题。 对于某些 VDI 客户端,这是不可能的。 此外,如果在不确保备份在VDC_Flush后有更多数据时,VDI 客户端响应VDC_Flush命令,SQL Server 可能截断事务日志。 但是,如果备份在 VDI 客户端上最终失败,并且事务日志也会被截断,可能会发生数据丢失。此更新添加一个新的 VDI 命令 VDC_Complete ,该命令指示 SQL Server 已完成将数据发送到 VDI 客户端。 因此,VDI 客户端将能够在将响应发送到 SQL Server 之前完成备份。此功能允许 VDI 客户端在出现错误时失败,还会导致错误地截断事务日志。注意 为了支持新的 VDC_Complete 命令,此更新还会 VDF_RequestComplete 和 VDF_CompleteEnabled添加两个新的 VDI 功能。
更新信息
SQL Server 的以下累积更新中包括此改进: Sql server 2016 SP1 的累积更新 2 SP1累积更新4(适用于 sql server 2016 )
Sql server 2012 的累积更新5服务包3(SP3)累积更新3(适用于sql Server 2014) sql server 2014 SP1 累积更新 10
关于 SQL Server 的累积更新
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:
更多信息
若要使用 "新建 VDC_Complete " 命令,必须将以下实现应用于您的 VDI 客户端:
-
请求新的 VDI 功能 VDF_RequestComplete。 如果 SQL Server 支持 VDC_Complete命令,它将返回 not NULL 响应。 否则,它将为所请求的功能返回 NULL 响应。 下面的代码示例演示了如何请求该功能:
m_pvdiComponents->m_pvdConfig->features = VDF_RequestComplete; printf("Requested features to SQL Server: 0x{0:X}", m_pvdiComponents->m_pvdConfig->features);
-
通过使用GetConfiguration函数确定 SQL Server 是否支持新的VDC_Complete命令。
hr = m_pvdiComponents->m_pvdDeviceSet->GetConfiguration(timeout, m_pvdiComponents->m_pvdConfig); if (!(m_pvdiComponents->m_pvdConfig->features & VDF_CompleteEnabled)) { printf("Server does not support VDC_Complete."); return VD_E_NOTSUPPORTED; }
-
当处理由 GetCommand 函数提取的 VDI 消息时,请添加一个用于处理 VDC_Complete 命令的其他 case 语句。
case VDC_Complete: // Close the media and ensure that book keeping is completed. backupMedia->Close(); completionCode = ERROR_SUCCESS; break;
注意VDC_Complete 消息必须合并到备份应用程序中,以便它可以使用改进功能。
参考
了解 Microsoft 用于描述软件更新的 术语 。