KB3188454 - Улучшение: улучшение протокола VDI с помощью команды VDC_Complete в SQL Server

Применяется к
SQL Server 2012 Service Pack 3 SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Standard SQL Server 2012 Web SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1

Улучшение

В текущей реализации протокола SQL Server Virtual Backup Device Interface (VDI) последнее сообщение, отправляемое из SQL Server клиенту VDI, будет командой VDC_Flush. Чтобы предотвратить потерю данных, клиент VDI должен завершить резервное копирование, прежде чем отвечать на команду VDC_Flush.

Начиная с SQL Server 2008 года и появления FILESTREAM, VDC_Flush команда может быть отправлена несколько раз во время резервного копирования. Из-за этой операции клиенту VDI приходится несколько раз завершать резервное копирование во время операции резервного копирования. Это невозможно для некоторых клиентов VDI. Кроме того, если клиент VDI отвечает на команду VDC_Flush, не убедившись, что резервная копия защищена, когда после VDC_Flush поступает больше данных, SQL Server может сократить журнал транзакций. Однако если резервное копирование в клиенте VDI в конечном итоге завершится сбоем, а журнал транзакций также будет усечен, это может привести к потере данных.

В этом обновлении добавлена новая командная VDC_Complete VDI, указывающая, что SQL Server завершил отправку данных клиенту VDI. Таким образом, клиент VDI сможет завершить резервное копирование, прежде чем отправить ответ на SQL Server.

Эта функция позволяет клиенту VDI не выполнить резервное копирование в случае ошибки, а также предотвращает ошибочное усечение журнала транзакций.

Примечание. Для поддержки новой команды VDC_Complete это обновление также добавляет две новые функции VDI VDF_RequestComplete и VDF_CompleteEnabled.

Сведения об обновлении

Это улучшение включено в следующие накопительные пакеты обновления для SQL Server:

     Накопительный пакет обновления 2 для SQL Server 2016 с пакетом обновления 1 (SP1)

     Накопительный пакет обновления 4 для SQL Server 2016

Накопительный пакет обновления 5 для SQL Server 2012 с пакетом обновления 3 (SP3) 

Накопительный пакет обновления 3 для SQL Server 2014 SP2 

Накопительный пакет обновления 10 для SQL Server 2014 SP1

Сведения о накопительных обновлениях для SQL Server

Сведения о накопительных обновлениях для SQL Server

Каждый новый накопительный пакет обновления для SQL Server содержит все исправления и исправления безопасности, которые входили в состав предыдущего накопительного пакета обновления. Ознакомьтесь с последними накопительными пакетами обновления для SQL Server:

Последний накопительный пакет обновления для SQL Server 2016

Последний накопительный пакет обновления для SQL Server 2014 с пакетом обновления 1 (SP1) или 2 (SP2)

Последний накопительный пакет обновления для SQL Server 2012 с пакетом обновления 3 (SP3)

Дополнительные сведения

Чтобы использовать новую команду VDC_Complete, необходимо применить следующие реализации к клиенту VDI:

  1. Запросите новую функцию 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);
    
  2. Определите, поддерживает ли SQL Server новую команду VDC_Complete с помощью функции GetConfiguration.

    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;
           }
    
  3. При обработке сообщений VDI, получаемых функцией GetCommand, добавьте дополнительный оператор case для обработки команды VDC_Complete.

    case VDC_Complete:
                  // Close the media and ensure that book keeping is completed.
                  backupMedia->Close();
                  completionCode = ERROR_SUCCESS;
                  break;
    

Примечание. Сообщение VDC_Complete должно быть включено в приложение резервного копирования, чтобы оно могло использовать улучшение.

Ссылки

Узнайте о терминологии, используемой корпорацией Майкрософт для описания обновлений программного обеспечения.