Delen via


Problemen met de configuratie van AlwaysOn-beschikbaarheidsgroepen oplossen (SQL Server)

Van toepassing op:SQL Server

Dit artikel bevat informatie over het oplossen van veelvoorkomende problemen met het configureren van serverexemplaren voor AlwaysOn-beschikbaarheidsgroepen. Veelvoorkomende configuratieproblemen zijn onder andere AlwaysOn-beschikbaarheidsgroepen zijn uitgeschakeld, accounts zijn onjuist geconfigureerd, het eindpunt voor databasespiegeling bestaat niet, het eindpunt is niet toegankelijk (SQL Server-fout 1418), netwerktoegang bestaat niet en er mislukt een opdracht voor de joindatabase (SQL Server-fout 35250).

Opmerking

Zorg ervoor dat u voldoet aan de vereisten voor AlwaysOn-beschikbaarheidsgroepen. Zie Prerequisites, beperkingen en aanbevelingen voor Always On beschikbaarheidsgroepen (SQL Server) voor meer informatie.

In dit onderwerp:

Afdeling Beschrijving
AlwaysOn-beschikbaarheidsgroepen zijn niet ingeschakeld Als een exemplaar van SQL Server niet is ingeschakeld voor AlwaysOn-beschikbaarheidsgroepen, biedt het exemplaar geen ondersteuning voor het maken van beschikbaarheidsgroepen en kan het geen beschikbaarheidsreplica's hosten.
Rekeningen Beschrijft de vereisten voor het correct configureren van de accounts waaronder SQL Server wordt uitgevoerd.
Eindpunten Bij dit onderwerp wordt beschreven hoe u problemen met het eindpunt voor databasespiegeling van een serverexemplaar kunt vaststellen.
Netwerktoegang Documenteert de vereiste dat elke serverinstantie die een replica van beschikbaarheid host, toegang moet hebben tot de poort van elke andere serverinstantie via TCP.
Luisteraar Documentatie over het vaststellen van het IP-adres en de poort van de listener en ervoor zorgen dat het actief is en luistert naar binnenkomende verbindingen.
Eindpunttoegang (SQL Server-fout 1418) Bevat informatie over dit SQL Server-foutbericht.
Join-database mislukt (SQL Server-fout 35250) Bespreekt de mogelijke oorzaken en oplossing van een fout bij het toevoegen van secundaire databases aan een beschikbaarheidsgroep, omdat de verbinding met de primaire replica niet actief is.
Read-Only routing werkt niet correct
Gerelateerde taken Bevat een lijst met taakgerichte artikelen in SQL Server Books Online die relevant zijn voor het oplossen van problemen met een configuratie van een beschikbaarheidsgroep.
gerelateerde inhoud Bevat een lijst met relevante resources die extern zijn voor SQL Server Books Online.

AlwaysOn-beschikbaarheidsgroepen zijn niet ingeschakeld

De functie AlwaysOn-beschikbaarheidsgroepen moet zijn ingeschakeld op elk van de exemplaren van SQL Server.

Als de functie AlwaysOn-beschikbaarheidsgroepen niet is ingeschakeld, wordt dit foutbericht weergegeven wanneer u probeert een beschikbaarheidsgroep te maken op SQL Server.

The Always On Availability Groups feature must be enabled for server instance 'SQL1VM' before you can create an availability group on this instance. To enable this feature, open the SQL Server Configuration Manager, select SQL Server Services, right-click on the SQL Server service name, select Properties, and use the Always On Availability Groups tab of the Server Properties dialog. Enabling Always On Availability Groups may require that the server instance is hosted by a Windows Server Failover Cluster (WSFC) node. (Microsoft.SqlServer.Management.HadrTasks)

Het foutbericht geeft duidelijk aan dat de ag-functie niet is ingeschakeld en u ook wordt omaangegeven hoe u deze kunt inschakelen. Er zijn twee scenario's waarin u zich in deze staat kunt bevinden, naast de voor de hand liggende scenario's waarbij AG niet in de eerste plaats was ingeschakeld.

  1. Als SQL Server is geïnstalleerd en de functie AlwaysOn-beschikbaarheidsgroepen is ingeschakeld voordat u de functie Windows-failoverclustering hebt geïnstalleerd, krijgt u mogelijk deze fout wanneer u probeert een AlwaysOn-beschikbaarheidsgroep te maken.
  2. Als u een bestaande Windows Failover Clustering-functie verwijdert en opnieuw opbouwt terwijl SQL Server nog steeds AlwaysOn heeft geconfigureerd, kan deze fout optreden wanneer u ag opnieuw probeert te gebruiken.

In dergelijke gevallen kunt u de volgende stappen uitvoeren om dit op te lossen:

  1. De functie AG uitschakelen
  2. Start de SQL Server-service opnieuw
  3. De AG-functie weer inschakelen
  4. Start de SQL-service opnieuw op

Zie AlwaysOn-beschikbaarheidsgroepen (SQL Server) in- en uitschakelen voor meer informatie.

Accounts

De accounts waaronder SQL Server wordt uitgevoerd, moeten correct zijn geconfigureerd.

  1. Hebben de accounts de juiste machtigingen?

    1. Als de partners onder hetzelfde domeinaccount werken, bestaan de juiste gebruikersaanmeldingen automatisch in beide hoofddatabases. Dit vereenvoudigt de beveiligingsconfiguratie en wordt aanbevolen.

    2. Als twee serverexemplaren onder verschillende accounts worden uitgevoerd, moet elk account in de master op het exemplaar van de externe server worden aangemaakt, en moet aan die server-principal CONNECT-machtigingen worden verleend om verbinding te maken met het databasespiegelingseindpunt van dat serverexemplaar. Zie voor meer informatie Aanmeldingsaccounts instellen voor databasespiegeling of AlwaysOn-beschikbaarheidsgroepen (SQL Server). U kunt de volgende query op elk exemplaar gebruiken om te controleren of de logins CONNECT-machtigingen hebben.

    SELECT 
      perm.class_desc,
      prin.name,
      perm.permission_name,
      perm.state_desc,
      prin.type_desc as PrincipalType,
      prin.is_disabled
    FROM sys.server_permissions perm
      LEFT JOIN sys.server_principals prin ON perm.grantee_principal_id = prin.principal_id
      LEFT JOIN sys.tcp_endpoints tep ON perm.major_id = tep.endpoint_id
    WHERE 
      perm.class_desc = 'ENDPOINT'
      AND perm.permission_name = 'CONNECT'
      AND tep.type = 4    
    
  2. Als SQL Server wordt uitgevoerd onder een ingebouwd account, zoals lokaal systeem, lokale service of netwerkservice of een niet-domeinaccount, moet u certificaten gebruiken voor eindpuntverificatie. Als uw serviceaccounts domeinaccounts in hetzelfde domein gebruiken, kunt u ervoor kiezen om CONNECT-toegang te verlenen voor elk serviceaccount op alle replicalocaties of u kunt certificaten gebruiken. Zie Certificaten gebruiken voor een eindpunt voor databasespiegeling (Transact-SQL) voor meer informatie.

Eindpunten

Eindpunten moeten correct zijn geconfigureerd.

  1. Zorg ervoor dat elk exemplaar van SQL Server dat een beschikbaarheidsreplica (elke replicalocatie) host, een eindpunt voor databasespiegeling heeft. Als u wilt bepalen of een eindpunt voor databasespiegeling bestaat op een bepaald serverexemplaar, gebruikt de sys.database_mirroring_endpoints catalogusweergave:

    SELECT name, state_desc FROM sys.database_mirroring_endpoints  
    

    Zie Voor meer informatie over het maken van eindpunten een databasespiegelingseindpunt maken voor Windows-verificatie (Transact-SQL) of toestaan dat een databasespiegelingseindpunt certificaten gebruikt voor uitgaande verbindingen (Transact-SQL).

  2. Controleer of de poortnummers juist zijn.

    Gebruik de volgende Transact-SQL instructie om de poort te identificeren die momenteel is gekoppeld aan het eindpunt voor databasespiegeling van een serverexemplaar:

    SELECT type_desc, port FROM sys.tcp_endpoints;  
    GO  
    
  3. Voor problemen met het instellen van Always On-beschikbaarheidsgroepen die moeilijk uit te leggen zijn, raden we u aan om elk serverexemplaar te inspecteren om te bepalen of die luistert op de juiste poorten.

  4. Zorg ervoor dat de eindpunten gestart zijn (STATE=STARTED). Gebruik op elk serverexemplaar de volgende Transact-SQL-instructie:

    SELECT state_desc FROM sys.database_mirroring_endpoints  
    

    Zie sys.database_mirroring_endpoints (Transact-SQL) voor meer informatie over de kolom state_desc.

    Gebruik de volgende Transact-SQL instructie om een eindpunt te starten:

    ALTER ENDPOINT Endpoint_Mirroring   
    STATE = STARTED   
    AS TCP (LISTENER_PORT = <port_number>)  
    FOR database_mirroring (ROLE = ALL);  
    GO  
    

    Zie ALTER ENDPOINT (Transact-SQL)voor meer informatie.

    Opmerking

    In sommige gevallen, als het eindpunt wordt gestart maar de AG-replica's niet communiceren, moet u proberen het eindpunt te stoppen en opnieuw te starten. U kunt ALTER ENDPOINT [Endpoint_Mirroring] STATE = GESTOPT gebruiken, gevolgd door ALTER ENDPOINT [Endpoint_Mirroring] STATE = GESTART

  5. Zorg ervoor dat de aanmelding van de andere server de CONNECT-machtiging heeft. Als u wilt bepalen wie CONNECT-toestemming heeft voor een endpoint, gebruikt u op elke serverexemplaar de volgende Transact-SQL-instructie:

    SELECT 'Metadata Check';  
    SELECT EP.name, SP.STATE,   
       CONVERT(nvarchar(38), suser_name(SP.grantor_principal_id))   
          AS GRANTOR,   
       SP.TYPE AS PERMISSION,  
       CONVERT(nvarchar(46),suser_name(SP.grantee_principal_id))   
          AS GRANTEE   
       FROM sys.server_permissions SP , sys.endpoints EP  
       WHERE SP.major_id = EP.endpoint_id  
       ORDER BY Permission,grantor, grantee;   
    
  6. Zorg ervoor dat de juiste servernaam wordt gebruikt in de eindpunt-URL

    Voor servernaam in een eindpunt-URL is het raadzaam om FQDN (Fully Qualified Domain Name) te gebruiken, hoewel u elke naam kunt gebruiken die de computer uniek identificeert. Het serveradres kan een Netbios-naam zijn (als de systemen zich in hetzelfde domein bevinden), een FQDN (Fully Qualified Domain Name) of een IP-adres (bij voorkeur een statisch IP-adres). Het gebruik van de volledig gekwalificeerde domeinnaam is de aanbevolen optie.

    Als u al een eindpunt-URL hebt gedefinieerd, kunt u er query's op uitvoeren met behulp van:

    select endpoint_url from sys.availability_replicas
    

    Vergelijk vervolgens de endpoint_url-uitvoer met de servernaam (NetBIOS-naam of FQDN). Als u een query wilt uitvoeren op de servernaam, voert u de volgende opdrachten lokaal uit in een PowerShell op de replica:

    $env:COMPUTERNAME
    [System.Net.Dns]::GetHostEntry([string]$env:computername).HostName
    

    Als u de servernaam op een externe computer wilt valideren, voert u deze opdracht uit vanuit PowerShell.

    $servername_from_endpoint_url = "server_from_endpoint_url_output"
    
    Test-NetConnection -ComputerName $servername_from_endpoint_url
    

    Zie De eindpunt-URL opgeven bij het toevoegen of wijzigen van een beschikbaarheidsreplica (SQL Server)voor meer informatie.

Opmerking

Als u Kerberos-verificatie wilt gebruiken voor de communicatie tussen beschikbaarheidsgroepeindpunten (AG), registreert u een Service Principal Name voor Kerberos-verbindingen voor de eindpunten voor databasespiegeling die door de AG worden gebruikt.

Netwerktoegang

Elk serverexemplaar dat als host fungeert voor een beschikbaarheidsreplica moet toegang hebben tot de poort van elke andere serverexemplaar via TCP. Dit is vooral belangrijk als de serverexemplaren zich in verschillende domeinen bevinden die elkaar niet vertrouwen (niet-vertrouwde domeinen). Controleer of u verbinding kunt maken met de eindpunten door de volgende stappen uit te voeren:

  • Gebruik Test-NetConnection (equivalent aan Telnet) om de connectiviteit te valideren. Hier volgen enkele voorbeelden van opdrachten die u kunt gebruiken:

    $server_name = "your_server_name"
    $IP_address = "your_ip_address"
    $port_number = "your_port_number"
    
    Test-NetConnection -ComputerName $server_name -Port $port_number
    Test-NetConnection -ComputerName $IP_address -Port $port_number
    
  • Als het eindpunt luistert en de verbinding is geslaagd, ziet u 'TcpTestSucceeded: True'. Zo niet, dan ontvangt u een 'TcpTestSucceededed : False'.

  • Als Test-NetConnection (Telnet)-verbinding met het IP-adres werkt, maar niet met de ServerName, is er waarschijnlijk een probleem met DNS- of naamomzetting

  • Als de verbinding werkt op ServerName en niet op IP-adres, kan er meer dan één eindpunt zijn gedefinieerd op die server (mogelijk een ander SQL-exemplaar) dat op die poort luistert. Hoewel de status van de endpoint op het betreffende exemplaar 'GESTART' aangeeft, kan een ander exemplaar de poort bezet hebben en voorkomen dat het correcte exemplaar kan luisteren en TCP-verbindingen tot stand kan brengen.

  • Als Test-NetConnection geen verbinding kan maken, zoekt u naar firewall- en/of antivirussoftware die mogelijk de betreffende eindpuntpoort blokkeert. Controleer de firewallinstelling om te zien of de eindpuntpoortcommunicatie tussen de serverexemplaren waarop primaire replica en de secundaire replica worden gehost (standaard poort 5022) is toegestaan. Voer het volgende PowerShell-script uit om te onderzoeken op uitgeschakelde regels voor inkomend verkeer

  • Als u SQL Server uitvoert op azure-VM, moet u er ook voor zorgen dat netwerkbeveiligingsgroep (NSG) het verkeer naar de eindpuntpoort toestaat. Controleer de firewallinstelling (en NSG, voor Azure VM) om te zien of de eindpuntpoortcommunicatie tussen de serverexemplaren waarop primaire replica en de secundaire replica worden gehost (standaard poort 5022) is toegestaan

    Get-NetFirewallRule -Action Block -Enabled True -Direction Inbound |Format-Table
    
  • Leg de uitvoer van de Get-NetTCPConnection-cmdlet vast (het equivalent van NETSTAT -a) en controleer of de status op de opgegeven IP:Poort voor het eindpunt op LISTENING of ESTABLISHED staat.

    Get-NetTCPConnection 
    

Listener

Voor de juiste configuratie van een listener voor een beschikbaarheidsgroep volgt u 'Een listener configureren voor een AlwaysOn-beschikbaarheidsgroep'

  1. Zodra de listener is geconfigureerd, kunt u het IP-adres en de poort valideren waarop het luistert met behulp van de volgende query:

    $server_name = $env:computername  #replace this with your sql instance "server\instance"
    
    sqlcmd -E -S$server_name -Q"SELECT dns_name AS AG_listener_name, port, ip_configuration_string_from_cluster 
    FROM sys.availability_group_listeners"
    
  2. U kunt de listener-informatie ook samen met de SQL Server-poorten vinden met behulp van deze query:

    $server_name = $env:computername      #replace this with your sql instance "server\instance"
    
    sqlcmd -E -S($server_name) -Q("SELECT  convert(varchar(32), SERVERPROPERTY ('servername')) servername, convert(varchar(32),ip_address) ip_address, port, type_desc,state_desc, start_time 
    FROM sys.dm_tcp_listener_states 
    WHERE ip_address not in ('127.0.0.1', '::1') and type <> 2")
    
  3. Als u verbinding wilt maken met de listener en vermoedt dat een poort is geblokkeerd, kunt u een test uitvoeren met behulp van de PowerShell-cmdlet Test-NetConnection (vergelijkbaar met telnet).

    $listener_name = "your_ag_listener"
    $IP_address = "your_ip_address"
    $port_number = "your_port_number"
    
    Test-NetConnection -ComputerName $listener_name -Port $port_number
    Test-NetConnection -ComputerName $IP_address -Port $port_number
    
  4. Controleer ten slotte of de listener luistert op de opgegeven poort:

    $port_number = "your_port_number"
    
    Get-NetTCPConnection -LocalPort $port_number -State Listen
    

Eindpunttoegang (SQL Server-fout 1418)

Dit SQL Server-bericht geeft aan dat het netwerkadres van de server dat is opgegeven in de eindpunt-URL niet kan worden bereikt of niet bestaat en dat u de naam van het netwerkadres controleert en de opdracht opnieuw uitvoert.

Join-database mislukt (SQL Server-fout 35250)

In deze sectie worden de mogelijke oorzaken en oplossing besproken van een fout bij het toevoegen van secundaire databases aan de beschikbaarheidsgroep, omdat de verbinding met de primaire replica niet actief is. Dit is het volledige foutbericht:

Msg 35250 The connection to the primary replica is not active. The command cannot be processed.

Resolutie:

Hieronder vindt u een overzicht van de stappen.

Raadpleeg de enginefout MSSQLSERVER_35250 voor gedetailleerde stapsgewijze instructies

  1. Zorg ervoor dat het eindpunt is gemaakt en gestart.
  2. Controleer of u via Telnet verbinding kunt maken met het eindpunt en zorg ervoor dat de connectiviteit niet wordt geblokkeerd door firewallregels
  3. Controleer op fouten in het systeem. U kunt een query uitvoeren op de sys.dm_hadr_availability_replica_states voor de last_connect_error_number die u kan helpen bij het vaststellen van het verbindingsprobleem.
  4. Zorg ervoor dat het eindpunt zo is gedefinieerd dat het correct overeenkomt met het IP-/poort-adres dat ag gebruikt.
  5. Controleer of het netwerkserviceaccount verbindingsmachtigingen heeft voor het eindpunt.
  6. Controleren op mogelijke problemen met naamresolutie
  7. Zorg ervoor dat uw SQL Server een recente build uitvoert (bij voorkeur de nieuwste build om te beschermen tegen problemen die zijn opgelost.

Read-Only Routing werkt niet correct

  1. Zorg ervoor dat u alleen-lezenroutering hebt ingesteld door het document Alleen-lezenroutering configureren te volgen.

  2. Ondersteuning voor clientstuurprogramma's garanderen

    De clienttoepassing moet een clientprovider gebruiken die ondersteuning biedt voor ApplicationIntent de parameter. Zie ondersteuning voor stuurprogramma- en clientconnectiviteit voor beschikbaarheidsgroepen

    Opmerking

    Als u verbinding maakt met een DNN-listener (gedistribueerde netwerknaam), moet de provider ook de parameter ondersteunen MultiSubnetFailover

  3. Zorg ervoor dat de eigenschappen van de verbindingsreeks correct zijn ingesteld

    Voor een goede werking van alleen-lezenroutering moet uw clienttoepassing deze eigenschappen in de verbindingsreeks gebruiken:

    • Een databasenaam die deel uitmaakt van de beschikbaarheidsgroep (AG)
    • De naam van een listener voor een beschikbaarheidsgroep
      • Als u DNN gebruikt, moet u de naam van de DNN-listener en het DNN-poortnummer opgeven <DNN name,DNN port>
    • ApplicationIntent ingesteld op ReadOnly
    • MultiSubnetFailover ingesteld op true is vereist voor een Distributed Network Name (DNN).

    Examples

    In dit voorbeeld ziet u de verbindingsreeks voor de .NET Microsoft.Data.SqlClient- of System.Data.SqlClient-provider voor een VNN-listener (Virtual Network Name):

    Server=tcp:VNN_AgListener,1433;Database=AgDb1;ApplicationIntent=ReadOnly;MultiSubnetFailover=True
    

    Dit voorbeeld illustreert de verbindingsreeks voor de .NET Microsoft.Data.SqlClient- of System.Data.SqlClient-provider voor een DNN-listener (Distributed Network Name).

    Server=tcp:DNN_AgListener,DNN_Port;Database=AgDb1;ApplicationIntent=ReadOnly;MultiSubnetFailover=True
    

    Opmerking

    Als u opdrachtregelprogramma's zoals SQLCMD gebruikt, moet u ervoor zorgen dat u de juiste schakelopties voor servernaam opgeeft. In SQLCMD moet u bijvoorbeeld de hoofdletter -S switch gebruiken waarmee de servernaam wordt opgegeven, niet de kleine letter -s switch die wordt gebruikt voor kolomscheidingsteken.
    Voorbeeld: sqlcmd -S AG_Listener,port -E -d AgDb1 -K ReadOnly -M

  4. Zorg ervoor dat de listener van de beschikbaarheidsgroep online is. Voer de volgende query uit op de primaire replica om ervoor te zorgen dat de listener van de beschikbaarheidsgroep online is:

    SELECT * FROM sys.dm_tcp_listener_states;
    

    Als u merkt dat de listener offline is, kunt u proberen deze online te brengen met behulp van een opdracht als volgt:

    ALTER AVAILABILITY GROUP myAG RESTART LISTENER 'AG_Listener';
    
  5. Zorg ervoor dat READ_ONLY_ROUTING_LIST correct is ingevuld. Zorg ervoor dat de READ_ONLY_ROUTING_LIST alleen serverexemplaren bevat die als host fungeren voor leesbare secundaire replica's op de primaire replica.

    Als u de eigenschappen van elke replica wilt bekijken, kunt u deze query uitvoeren en het connectiviteitseindpunt (URL) van de alleen-lezen replica onderzoeken.

    SELECT replica_id, replica_server_name, secondary_role_allow_connections_desc, read_only_routing_url 
    FROM sys.availability_replicas;   
    

    Om een alleen-lezen routeringslijst te bekijken en te vergelijken met de eindpunt-URL:

    SELECT * FROM sys.availability_read_only_routing_lists;
    

    Als u een lijst met alleen-lezenroutering wilt wijzigen, kunt u een query als volgt gebruiken:

    ALTER AVAILABILITY GROUP [AG1]   
    MODIFY REPLICA ON  
    N'COMPUTER02' WITH   
    (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('COMPUTER01','COMPUTER02')));  
    

    Zie voor meer informatie alleen-lezenroutering configureren voor een beschikbaarheidsgroep - SQL Server Always On

  6. Controleer of de poort van READ_ONLY_ROUTING_URL is geopend. Zorg ervoor dat windows Firewall de READ_ONLY_ROUTING_URL poort niet blokkeert. Configureer een Windows Firewall voor toegang tot database-engine op elke replica in de read_only_routing_list en alle clients die verbinding maken met deze replica's.

    Opmerking

    Als u SQL Server uitvoert op een Virtuele Azure-machine, moet u aanvullende configuratiestappen uitvoeren. Zorg ervoor dat de netwerkbeveiligingsgroep (NSG) van elke replica-VM verkeer naar de eindpuntpoort en de DNN-poort toestaat als u DNN-listener gebruikt. Als u VNN-listener gebruikt, moet u ervoor zorgen dat de load balancer correct is geconfigureerd.

  7. Zorg ervoor dat de READ_ONLY_ROUTING_URL (TCP://system-address:port) de juiste FQDN (Fully Qualified Domain Name) en het juiste poortnummer bevat. See:

  8. Zorg voor de juiste CONFIGURATIE van SQL Server-netwerken in SQL Server Configuration Manager.

    Controleer op elke replica in de read_only_routing_list dat:

    • Externe SQL Server-connectiviteit is ingeschakeld
    • TCP/IP is ingeschakeld
    • De IP-adressen zijn correct geconfigureerd

    Opmerking

    U kunt snel controleren of al deze correct zijn geconfigureerd als u vanaf een externe computer verbinding kunt maken met de sql Server-exemplaarnaam van een doelreplica met behulp van TCP:SQL_Instance syntaxis.

Zie: Configureer een server om te luisteren op een specifieke TCP-poort (SQL Server Configuration Manager) en bekijk of wijzig servereigenschappen (SQL Server)

Gerelateerde taken

Verwante inhoud