Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Bijzonderheden
| Attribute | Waarde |
|---|---|
| Productnaam | SQL Server |
| Gebeurtenis-id | 35250 |
| Bron van gebeurtenis | MSSQLSERVER |
| Onderdeel | SQLEngine |
| Symbolische naam | HADR_PRIMARYNOTACTIVE |
| Berichttekst | De verbinding met de primaire replica is niet actief. De opdracht kan niet worden verwerkt. |
Explanation
Deze fout treedt op wanneer u secundaire databases probeert toe te voegen aan een AlwaysOn-beschikbaarheidsgroep, maar geen verbinding kan maken met het eindpunt.
Gebruikersactie
Opmerking
Voer alle volgende stappen uit op zowel de primaire replica als de problematische secundaire replica's.
1. Zorg ervoor dat het eindpunt is gemaakt en gestart
Voer de volgende query uit om het eindpunt te detecteren.
SELECT tep.name AS EndPointName, sp.name AS CreatedBy, tep.type_desc, tep.state_desc, tep.port FROM sys.tcp_endpoints AS tep INNER JOIN sys.server_principals AS sp ON tep.principal_id = sp.principal_id WHERE tep.type = 4;Waarschuwing
Wees voorzichtig bij het uitvoeren van de volgende opdracht, omdat deze een tijdelijke downtime voor de replica kan veroorzaken.
Gebruik deze opdrachten om het eindpunt dat u hebt gedetecteerd opnieuw op te starten.
ALTER ENDPOINT hadr_endpoint STATE = STOPPED; ALTER ENDPOINT hadr_endpoint STATE = STARTED;
2. Controleer of u verbinding kunt maken met het eindpunt
Gebruik telnet of Test-NetConnection om de connectiviteit te valideren. Als het eindpunt luistert en de verbinding is geslaagd, toont Telnet een leeg scherm met een knipperende cursor. Zo niet, dan ontvangt u een verbindingsfout van telnet. Druk op Ctrl+] om een geslaagde telnet-verbinding af te sluiten. Als u gebruikt
Test-NetConnection, zoekt u ofTcpTestSucceeded: FalseTcpTestSucceeded: True.telnet ServerName <port_number> telnet IP_Address <port_number>Test-NetConnection -ComputerName <ServerName> -Port <port_number> Test-NetConnection -ComputerName <IP_address> -Port <port_number>
DNS-problemen
Als telnet of Test-NetConnection slaagt in het IP-adres, maar niet ServerNamelukt, is er waarschijnlijk een probleem met DNS- of naamomzetting. Zie Controleren op problemen met naamomzetting.
Meerdere processen die op dezelfde poort luisteren
Als telnet of Test-NetConnection werkt met behulp ServerNamevan het IP-adres, maar het IP-adres niet gebruikt, is er mogelijk meer dan één eindpunt gedefinieerd op die server (mogelijk een ander SQL-exemplaar) dat is geconfigureerd om op die poort te luisteren. Hoewel de status van het eindpunt op het betreffende exemplaar wordt weergegeven STARTED, kan een ander exemplaar de poortbinding hebben en voorkomen dat het juiste exemplaar luistert en TCP-verbindingen tot stand kan brengen. Voer bijvoorbeeld de volgende opdracht uit om het proces van eigenaar van poort 5022 te vinden:
$port = "5022"
Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
Geblokkeerd eindpunt (firewall, antivirus)
Als telnet of Test-NetConnection geen verbinding kan maken, zoekt u naar firewall- en 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. 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 firewall- en NSG-instelling (voor Azure VM) om te zien of de eindpuntpoortcommunicatie is toegestaan tussen de serverexemplaren die primaire replica hosten en de secundaire replica (standaard poort 5022).
Voer het volgende PowerShell-script uit om te controleren op uitgeschakelde regels voor inkomend verkeer.
Get-NetFirewallRule -Action Block -Enabled True -Direction Inbound |Format-Table
Leg een netstat - of GetTCPConnection-uitvoer vast en controleer of de status een LISTENING of ESTABLISHED op het IP:Port opgegeven eindpunt is:
netstat -a
Get-NetTCPConnection -LocalPort <port_number>
U kunt ook het proces voor poorteigen gebruik vinden: voer een opdracht als volgt uit (bijvoorbeeld met poort 5022).
$port = "5022" Get-Process -Id (Get-NetTCPConnection -LocalPort $port).OwningProcess |Select-Object Name, ProductVersion, Path, Id
3. Controleren op fouten in het systeem
U kunt een query uitvoeren op de sys.dm_hadr_availability_replica_states DMV voor de last_connect_error_number dmV die u kan helpen bij het vaststellen van het joinprobleem. Afhankelijk van welke replica problemen heeft met communiceren, kunt u query's uitvoeren op zowel de primaire als de secundaire replica.
SELECT r.replica_server_name,
r.endpoint_url,
rs.connected_state_desc,
rs.last_connect_error_description,
rs.last_connect_error_number,
rs.last_connect_error_timestamp
FROM sys.dm_hadr_availability_replica_states AS rs
INNER JOIN sys.availability_replicas AS r
ON rs.replica_id = r.replica_id
WHERE rs.is_local = 1;
Als de secundaire replica bijvoorbeeld niet kan communiceren met de DNS-server of als een replica endpoint_url onjuist is geconfigureerd bij het maken van de beschikbaarheidsgroep, ziet u mogelijk de volgende resultaten in:last_connect_error_description
DNS Lookup failed with error '11001(No such host is known)'
4. Zorg ervoor dat het eindpunt is geconfigureerd voor het juiste IP-adres en de juiste poort waarvoor AG is gedefinieerd
Voer de volgende query uit op de primaire replica en vervolgens op elke secundaire replica die geen verbinding kan maken. Met deze query kunt u de eindpunt-URL en -poort vinden.
SELECT endpoint_url
FROM sys.availability_replicas;
Voer de volgende query uit om de eindpunten en poorten te vinden.
SELECT tep.name AS EndPointName,
sp.name AS CreatedBy,
tep.type_desc,
tep.state_desc,
tep.port
FROM sys.tcp_endpoints AS tep
INNER JOIN sys.server_principals AS sp
ON tep.principal_id = sp.principal_id
WHERE tep.type = 4;
Vergelijk endpoint_url en poort uit elke query. Zorg ervoor dat de poort van de endpoint_url poort overeenkomt met de poort die u hebt gedefinieerd voor het eindpunt op elke respectieve replica.
Opmerking
Als u specifieke IP-adressen gebruikt voor het eindpunt om op te luisteren in plaats van de standaardwaarde listen all, moet u mogelijk URL's definiëren die gebruikmaken van het specifieke IP-adres in plaats van de FQDN.
5. Controleer of het netwerkserviceaccount verbindingsmachtigingen heeft voor het eindpunt
Voer de volgende query's uit om de accounts weer te geven die verbinding hebben met het eindpunt op de desbetreffende servers en om de machtiging weer te geven die aan elk relevant eindpunt is toegewezen.
SELECT perm.class_desc,
prin.name,
perm.permission_name,
perm.state_desc,
prin.type_desc AS PrincipalType,
prin.is_disabled
FROM sys.server_permissions AS perm
LEFT OUTER JOIN sys.server_principals AS prin
ON perm.grantee_principal_id = prin.principal_id
LEFT OUTER JOIN sys.tcp_endpoints AS tep
ON perm.major_id = tep.endpoint_id
WHERE perm.class_desc = 'ENDPOINT'
AND perm.permission_name = 'CONNECT'
AND tep.type = 4;
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 AS SP
INNER JOIN sys.endpoints AS ep
ON sp.major_id = ep.endpoint_id
AND EP.type = 4
ORDER BY Permission, grantor, grantee;
6. Controleren op problemen met naamomzetting
Dns-omzetting valideren met behulp van nslookup of Resolve-DnsName op het IP-adres en de naam:
nslookup <IP_Address>
nslookup <ServerName>
Resolve-DnsName -Name <ServerName>
Resolve-DnsName -Name <IP_address>
Wordt de naam omgezet in het juiste IP-adres? Wordt het IP-adres omgezet in de juiste naam?
Controleer op lokale HOSTS-bestandsvermeldingen op elk knooppunt dat mogelijk verwijst naar een onjuiste server. Druk vanaf de opdrachtregel het HOSTS-bestand af met behulp van deze opdracht:
type C:\WINDOWS\system32\drivers\etc\hosts
Get-Content 'C:\WINDOWS\system32\drivers\etc\hosts'
Controleer of er een serveralias is gemaakt of verwijderd voor gebruik door een client die is gedefinieerd op de replica's
7. Zorg ervoor dat uw SQL Server een recente build uitvoert
Controleer op de nieuwste build.
Werk SQL Server-versies bij om te beveiligen tegen problemen zoals KB3213703.
Zie Beschikbaarheidsgroep maken mislukt met fout 35250 'Kan de database niet toevoegen' voor meer informatie.