SQL Server – Problem beim Einrichten der Spiegelung


Andreas Rauch

Das Spiegeln von Datenbanken ist definitiv mein “Hochverfügbarkeits – Lieblingsfeature”. Sofern die Datenbanken bereits auf dem Zielserver im NoRecovery-Modus wiederhergestellt wurden, dauert das Einrichten keine 10 Sekunden. Nur eines scheitert gerne.. den Failover zu starten. Was kann denn in diesen 10 Sekunden passiert sein.. Der Assistent zum Einrichten der Spiegelung erledigt folgende Dinge:

- Anlegen der Spiegelungsendpunkte (Ein Listener auf normalerweise TCP Port 5022) auf allen beteiligten Servern (Prinzipal, Spiegelpartner, Zeuge)

- Und dann gab es da noch eine bescheidene Frage nach den Dienstkonten, die ein CONNECT Recht benötigen würden.

Meist wird das Einrichten mit folgender Fehlermeldung – Error 1418 – quittiert:

Die Server-Netzwerkadresse TCP://Server:5022 ist nicht erreichbar oder nicht vorhanden. Überprüfen Sie den Namen der Netzwerkadresse, und dass die Ports für die lokalen und Remoteendpunkte betriebsbereit sind.

Um das Einrichten des Assistenten zu kontrollieren, kann man nun folgende Dinge tun:

  1. Kontrolle der Spiegelendpunkte via netstat

    Das erreicht man am besten über den Kommandokonsolenbefehl netstat
    zB. netstat –an oder netstat –ano für zusätzlich Information wie Besitzer des Ports bzw netstat –anb für die Prozess-ID
    Es sollte in der Liste auf jeden Fall ein 0.0.0.0:5022 [Abhören] auftauchen.

    image

  2. Kontrolle der Endpunkte in SQL Server

    Die Endpunkte müssen gestartet sein. Dies kann man sehr leicht durch folgendes Skript lösen:

    SELECT state, state_desc from sys.database_mirroring_endpoints

    In den Spalten sollte ein Started zu finden sein.

    Ein Endpunkt läßt sich auch per Skript einrichten (ist auf jedem Server auszuführen)

     

    CREATE ENDPOINT Endpoint_Mirroring
        STATE=STARTED
        AS TCP (LISTENER_PORT=5022)
        FOR DATABASE_MIRRORING (ROLE=ALL); –ALL auf Spiegel; PARTNER auf Prinzipal; WITNESS auf Zeugen
    GO

     

  3. Zugriffsrechte der Dienstkonten auf die jeweiligen Endpunkte !! ( Error 1418 )

    Dies ist genau der Punkt, an dem die Spiegelung im SQL Server Management Studio später versagen wird. Die Dienstkonten benötigen ein CONNECT Recht auf die jeweiligen Endpunkte. Das muss jedem Endpunkt, also allen beteiligten Servern, eingerichtet werden.

    Mit folgendem Skript lässt sich auch dieses Problem lösen:

    --Dienstkonten für die Spiegelung müssen ein Login besitzen, falls nicht vorhanden..
    CREATE LOGIN [Domäne\User] FROM WINDOWS 
    
    --Zugriffsrechte auf Spiegelungsendpunkt geben
    GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO Domäne\User


    Das Spiegeln muss natürlich anschließend gestartet werden. Entweder per SSMS oder auch per Skript:

    --Auf Spiegel anschließend auf Prinzipal
    ALTER DATABASE Datenbank
        SET PARTNER =
        'TCP://PARTNERHOST1.COM:5022';
    GO
    
    --Zeuge in Betrieb nehmen
    ALTER DATABASE Datenbank
        SET WITNESS =
        'TCP://WITNESSHOST4.COM:5022';
    GO
  4. Firewall (Error 1418)

    Sollte es dann immer noch scheitern, nochmals gründlich die Firewall prüfen! Zwinkerndes Smiley

     

  5. Sonstige Fehlerquellen

    - Das Wiederherstellungsmodell muss auf FULL (Vollständig) gesetzt sein

    - Das Vollständige Backup sollte inkl. Transaktionsprotokollsicherung auf dem Spiegelpartner im Modus NoRecovery wiederhergestellt werden.

    - Die Dienstkonten sind im günstigsten Fall auf allen Maschinen die gleichen Windows-Konten.

    Falls eine Meldung erscheinen sollte, dass Spiegelung zuvor entfernt werden sollte… bitte sehr! Und für den Fall der Fälle.. der manuelle Failover.

     

    --Entfernen der Spiegelung
    
    ALTER DATABASE Datenbank
    SET PARTNER OFF
    
    --Manueller Failover
    ALTER DATABASE Datenbank
    SET PARTNER FAIlLOVER


    Anschließend eine Überprüfung des Status der Spiegelung

    SELECT db.name, m.mirroring_role_desc
    FROM sys.database_mirroring m JOIN sys.databases db
    ON db.database_id = m.database_id
    WHERE db.name = Datenbank;
    GO
Kommentare sind geschlossen