Neuerstellen oder Verschieben einer MSDTC-Installation für die Verwendung mit einem SQL-Failovercluster

In diesem Artikel wird beschrieben, wie Sie eine fehlerhafte Installation von Microsoft Distributed Transaction Coordinator (MSDTC) für die Verwendung mit einem Failovercluster SQL Server neu erstellen.

Gilt für: Windows Server 2019, Windows Server 2016, Windows Server 2012 R2
Ursprüngliche KB-Nummer: 294209

Zusammenfassung

Der folgende Blog enthält ausführliche Informationen zu den Änderungen im MSDTC-Verhalten seit der Veröffentlichung von Windows Server 2008.

MSDTC-Empfehlungen für SQL-Failovercluster

Der Zweck der folgenden häufig gestellten Fragen (FAQs) besteht darin, häufige Fragen mit MSDTC zu beantworten, wenn sie mit SQL Server Failoverclusterinstanzen verwendet werden, um aktuelle Empfehlungen und bewährte Methoden einzuschließen.

Der MSDTC ist ein Transaktions-Manager, mit dem Clientanwendungen mehrere unterschiedliche Datenquellen in eine Transaktion einschließen können und der dann das Committen der verteilten Transaktion auf alle Server koordiniert, die in der Transaktion eingetragen sind. Dadurch wird sichergestellt, dass ein Commit für die Transaktion ausgeführt wird, wenn jeder Teil der Transaktion erfolgreich ist, oder ein Rollback ausgeführt wird, wenn ein Teil des Transaktionsprozesses fehlschlägt.

Viele Leute fragen, warum wir MSDTC installieren müssen, bevor SQL Server installiert werden. Sie müssen diesen Vorgang nicht mehr ausführen. Es war eine Anforderung, die SQL Server 2005 erforderlich war. Diese Version von SQL Server hat ihren Lebenszyklus beendet und daher die Anforderung zur Installation SQL Server beendet.

Bei der Bereitstellung von SQL Server in einer hochverfügbaren Umgebung wie Windows-Failoverclustering gibt es bestimmte bewährte Methoden, die das Verhalten der MSDTC-Dienste vorhersagbarer machen können.

  • Wenn das Thema datenbank- und/oder DTC-Transaktionsunterstützung unter einer Verfügbarkeitsgruppe aufkommt, lautet die schnelle Antwort NICHT UNTERSTÜTZT!.

  • Dies ist eine wahre Aussage, und die Unterhaltung neigt dazu, sich dann auf zu konzentrieren, aber warum? Tatsächlich haben einige DBAs verschiedene Formen dieser Transaktionstypen getestet und keine Fehler gefunden.

  • Das Problem ist, dass die Tests nicht abgeschlossen sind und die erforderliche zweistufige Commitaktivität zu Datenverlusten führen kann oder eine Datenbank, die in bestimmten Konfigurationen nicht wie erwartet wie erwartet wiederhergestellt wird. Tatsächlich injizieren die SQL Server Tester Fehler an strategischen Standorten, um szenarien zu erstellen, die auf einem Produktionsserver schwierig (aber nicht unmöglich) zu erstellen sind. Weitere Informationen finden Sie unter Nicht unterstützt: Verfügbarkeitsgruppen mit TC/Datenbankübergreifende Transaktion.

Bei Windows 2008-Failoverclustern und höher müssen Sie MSDTC nicht gruppieren, um die Funktionalität des MSDTC-Diensts zu verwenden, da MSDTC in Windows 2008 neu entworfen wurde. Im Gegensatz zu Windows 2003 mussten Sie bei der Installation des Windows-Failoverclusters MSDTC clustern. Dies ist bei Verwendung von Windows 2008 nicht mehr der Fall, da der MSDTC-Dienst standardmäßig lokal ausgeführt wird, auch wenn Failoverclustering installiert ist.

Wenn Ihre SQL Server-Failoverclusterinstanz MSDTC erfordert und die MSDTC-Ressourcen ein Failover mit der SQL Server Instance ausführen müssen, empfiehlt es sich, eine MSDTC-Ressource in der FailoverCluster-Rolle zu erstellen, die die SQL Server instance enthält und folgendes verwendet:

  • Der SQL Server Netzwerkname\Clientzugriffspunkt
  • Ein Datenträger innerhalb der rolle "SQL Server"
  • Benennen Sie die MSDTC-Ressource mit dem Namen des virtuellen SQL-Servers.

Einrichten und Testen einer neuen MSDTC-Clusterressource mithilfe von PowerShell

  1. Erstellen Sie eine neue MSDTC-Ressource, die den Inhalt zwischen und einschließlich der <> folgenden Abschnitte ersetzt, und führen Sie dann aus.

    $SqlRole = <Actual name of the role containing the SQL Server instance>
    $SqlNetName = <Actual SQL Servernetwork resourcename>
    $VSqlSrv = <Actual SQL Server virtual server name>
    $CluDsk = <Actual disk resource name>
    

    Wenn die MSDTC-Ressource den angegebenen Namen nicht akzeptiert hat, können Sie den Namen mithilfe der folgenden PowerShell ändern, indem Sie den Neuen Verteilten Transaktionskoordinator durch RealSqlVsName ersetzen:

    Get-ClusterResource "New Distributed Transaction Coordinator" | %{$_.Name = RealSqlVsName }
    

    Sie können RealSqlVsName ersetzen $VSqlSrv , wenn sie noch aktiv ist.

  2. Überprüfen Sie Firewallregeln mithilfe des folgenden Skripts:

    Set-NetFirewallRule -Name 'RPC Endpoint Mapper' -Enabled True
    Set-NetFirewallRule -Name 'DTC incoming connections' -Enabled True
    Set-NetFirewallRule -Name 'DTC outgoing connections' -Enabled True
    
  3. Legen Sie die MSDTC-Netzwerkauthentifizierung mithilfe des folgenden Skripts fest:

    Set-DtcNetworkSetting -AuthenticationLevel Mutual `
    -DtcName "Local" -InboundTransactionsEnabled $True `
    -LUTransactionsEnabled $True `
    -OutboundTransactionsEnabled $True `
    -RemoteAdministrationAccessEnabled $False `
    -RemoteClientAccessEnabled $False `
    -XATransactionsEnabled $True -verbose
    
  4. Überprüfen Sie mithilfe des folgenden Befehls, ob die neue MSDTC-Ressource jetzt aufgeführt ist:

    Get-Dtc -Verbose |Sort-Object DtcName
    
  5. Testen Sie die neue MSDTC-Ressource.

    Test-Dtc -LocalComputerName RealSqlVsName -Verbose
    

    Sie können RealSqlVsName ersetzen $VSqlSrv , wenn sie noch aktiv ist. Verwenden Sie $Env:COMPUTERNAME , um die lokale Installation zu testen. Sie müssen die PowerShell-Befehle für Firewallregeln und MSDTC-Authentifizierung auf allen anderen vorhandenen Clusterknoten ausführen.

  6. Testen Sie MSDTC.

    In diesem Beispiel verwenden wir die AdventureWorks2012-Datenbank. Sie müssen einen tatsächlichen Datenbanknamen ersetzen, mit dem Sie testen möchten. Führen Sie in einem SQL Server Abfragefenster die folgende SQL-Anweisung aus:

    USE AdventureWorks2012;
    
    GO
    
    BEGIN DISTRIBUTED TRANSACTION; 
    
    -- Enter fake transaction to the database
    
    INSERT SQL_Statement
    
    DELETE SQL_Statement
    
    COMMIT TRANSACTION
    
    GO
    

    Sie sollten nun sehen, dass eine Zeile betroffen ist und dass der eingefügte Datensatz nicht vorhanden ist.

References

Empfohlene MSDTC-Einstellungen für die Verwendung von verteilten Transaktionen in SQL Server