KB3188454 – Verbesserung: Erweitern Sie das VDI-Protokoll mit VDC_Complete Befehl in SQL Server

Gilt für
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

Verbesserung

In der aktuellen Implementierung des SQL Server VDI-Protokolls (Virtual Backup Device Interface) ist die letzte Nachricht, die von SQL Server an den VDI-Client gesendet wird, ein VDC_Flush-Befehl. Um Datenverluste zu verhindern, muss der VDI-Client die Sicherung abschließen, bevor er auf den Befehl VDC_Flush reagiert.

Seit SQL Server 2008 und der Einführung von FILESTREAM kann der Befehl VDC_Flush während eines Backups mehrfach gesendet werden. Dieser Vorgang verursacht das Problem, dass der VDI-Client die Sicherung während des Sicherungsvorgangs mehrmals abschließen muss. Dies ist für einige VDI-Clients nicht möglich. Wenn der VDI-Client auf einen VDC_Flush-Befehl reagiert, ohne sicherzustellen, dass die Sicherung gesichert ist, wenn nach dem VDC_Flush mehr Daten kommen, kann SQL Server das Transaktionsprotokoll abschneiden. Wenn die Sicherung auf dem VDI-Client jedoch letztendlich fehlschlägt und das Transaktionsprotokoll ebenfalls abgeschnitten wird, kann es zu einem Datenverlust kommen.

Dieses Update fügt einen neuen VDI-Befehl VDC_Complete hinzu, der angibt, dass SQL Server das Senden von Daten an den VDI-Client abgeschlossen hat. Daher kann der VDI-Client die Sicherung abschließen, bevor er eine Antwort an SQL Server sendet.

Diese Funktionalität ermöglicht es dem VDI-Client, die Sicherung fehlschlagen zu lassen, falls etwas schief geht, und verhindert auch, dass das Transaktionsprotokoll versehentlich abgeschnitten wird.

Hinweis: Um den neuen VDC_Complete-Befehl zu unterstützen, fügt dieses Update auch zwei neue VDI-Funktionen hinzu: VDF_RequestComplete und VDF_CompleteEnabled.

Informationen zum Update

Diese Verbesserung ist in den folgenden kumulativen Updates für SQL Server enthalten:

     Kumulatives Update 2 für SQL Server 2016 SP1

     Kumulatives Update 4 für SQL Server 2016

Kumulatives Update 5 für SQL Server 2012 Service Pack 3 (SP3) 

Kumulatives Update CU 3 für SQL Server 2014 SP2 

Kumulatives Update 10 für SQL Server 2014 SP1

Informationen zu kumulativen Updates für SQL Server

Informationen zu kumulativen Updates für SQL Server

Jedes neue kumulative Update für SQL Server enthält alle Hotfixes und Sicherheitsfixes, die im vorherigen kumulativen Update enthalten waren. Sehen Sie sich die neuesten kumulativen Updates für SQL Server an:

Neuestes kumulative Update für SQL Server 2016

Neuestes kumulatives Update für SQL Server 2014 SP1/SP2

Neuestes kumulatives Update für SQL Server 2012 SP3

Weitere Informationen

Um den neuen Befehl VDC_Complete verwenden zu können, müssen die folgenden Implementierungen auf Ihren VDI-Client angewendet werden:

  1. Fordern Sie das neue VDI-Feature VDF_RequestComplete an. Wenn SQL Server den Befehl VDC_Complete unterstützt, wird eine NULL-Antwort zurückgegeben. Andernfalls würde sie eine NULL-Antwort für das angeforderte Feature zurückgeben. Das folgende Codebeispiel zeigt, wie Sie das Feature anfordern:

    m_pvdiComponents->m_pvdConfig->features = VDF_RequestComplete;
    
    printf("Requested features to SQL Server: 0x{0:X}", m_pvdiComponents->m_pvdConfig->features);
    
  2. Ermitteln Sie mithilfe der GetConfiguration-Funktion, ob der SQL Server den neuen VDC_Complete-Befehl unterstützt.

    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. Wenn Sie die VDI-Nachrichten verarbeiten, die von der GetCommand-Funktion abgerufen werden, fügen Sie eine zusätzliche Case-Anweisung hinzu, um den VDC_Complete-Befehl zu verarbeiten.

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

Hinweis Die VDC_Complete Nachricht muss in die Backup-Anwendung integriert werden, damit diese die Verbesserung nutzen kann.

Referenzmaterial

Informieren Sie sich über die Terminologie, die Microsoft zum Beschreiben von Softwareupdates verwendet.