Řešení potíží s konfigurací skupin dostupnosti AlwaysOn (SQL Server)

platí pro:SQL Server

Tento článek obsahuje informace, které vám pomůžou vyřešit typické problémy s konfigurací instancí serveru pro skupiny dostupnosti AlwaysOn. Mezi typické problémy s konfigurací patří zakázané skupiny dostupnosti Always On, nesprávná konfigurace účtů, neexistující koncový bod zrcadlení databáze, nepřístupný koncový bod (chyba SQL Serveru 1418), neexistující síťový přístup a selhání příkazu pro připojení k databázi (chyba SQL Serveru 35250).

Poznámka:

Ujistěte se, že splňujete požadavky skupin dostupnosti AlwaysOn. Další informace najdete v tématu Požádky, omezení a doporučení pro skupiny dostupnosti Always On (SQL Server).

V tomto tématu:

Oddíl Description
Skupiny dostupnosti AlwaysOn nejsou povolené. Pokud pro skupiny dostupnosti AlwaysOn není povolená instance SQL Serveru, instance nepodporuje vytváření skupin dostupnosti a nemůže hostovat žádné repliky dostupnosti.
Účty Popisuje požadavky pro správnou konfiguraci účtů, ve kterých běží SQL Server.
Koncové body Se zabývá tím, jak diagnostikovat problémy s koncovým bodem zrcadlení databáze instance serveru.
Přístup k síti Dokumentuje požadavek, aby každá instance serveru hostující repliku dostupnosti mohla mít přístup k portu všech ostatních instancí serveru přes protokol TCP.
Posluchač Doporučuje, jak nastavit IP adresu a port posluchače a ujistit se, že je aktivní a naslouchá příchozím připojením.
Přístup ke koncovému bodu (chyba SQL Serveru 1418) Obsahuje informace o této chybové zprávě SQL Serveru.
Selhání připojení databáze (chyba SQL Serveru 35250) Popisuje možné příčiny a řešení chyby připojení sekundárních databází ke skupině dostupnosti, protože připojení k primární replice není aktivní.
Směrování pouze pro čtení nefunguje správně
související úkoly Obsahuje seznam článků orientovaných na úlohy v sql Server Books Online, které jsou relevantní pro řešení potíží s konfigurací skupiny dostupnosti.
související obsah Obsahuje seznam relevantních prostředků, které jsou externí pro SQL Server Books Online.

Skupiny dostupnosti AlwaysOn nejsou povolené.

Funkce Skupiny dostupnosti AlwaysOn musí být povolena na všech instancích SQL Serveru.

Pokud funkce Skupiny dostupnosti AlwaysOn není povolená, zobrazí se tato chybová zpráva při pokusu o vytvoření skupiny dostupnosti na SQL Serveru.

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)

Chybová zpráva jasně ukazuje, že funkce skupiny dostupnosti (AG) není povolena, a poskytuje pokyny, jak ji povolit. Existují dva scénáře, kdy se můžete dostat do tohoto stavu kromě zřejmé situace, kdy AG nebyla původně povolena.

  1. Pokud byl SQL Server nainstalován a funkce Skupiny dostupnosti AlwaysOn byla povolena před instalací funkce clusteringu s podporou převzetí služeb při selhání systému Windows, může se tato chyba zobrazit při pokusu o vytvoření skupiny dostupnosti AlwaysOn.
  2. Pokud odeberete existující funkci clusteringu s podporou převzetí služeb při selhání systému Windows a znovu ji sestavíte, zatímco SQL Server stále má nakonfigurovanou funkci Always On, může při pokusu o opětovné použití skupiny dostupnosti dojít k této chybě.

V takových případech ho můžete vyřešit následujícím postupem:

  1. Zakázání funkce AG
  2. Restartujte službu SQL Serveru
  3. Povolit funkci AG znovu
  4. Znovu restartujte službu SQL.

Další informace najdete v tématu Povolení a zakázání skupin dostupnosti AlwaysOn (SQL Server).

Accounts

Účty, na kterých běží SQL Server, musí být správně nakonfigurované.

  1. Mají účty správná oprávnění?

    1. Pokud partneři běží pod stejným účtem domény, existují správná přihlášení uživatelů v obou hlavních databázích automaticky. To zjednodušuje konfiguraci zabezpečení a doporučuje se.

    2. Pokud dvě instance serveru běží pod různými účty, musí být každý účet vytvořen v master na vzdálené instanci serveru a tomuto server principalu musí být udělena oprávnění CONNECT pro připojení ke koncovému bodu zrcadlení databáze této instance serveru. Další informace najdete v tématu Nastavení přihlašovacích účtů pro zrcadlení databáze nebo skupiny dostupnosti AlwaysOn (SQL Server). Pomocí následujícího dotazu na každou instanci můžete zkontrolovat, jestli mají přihlášení oprávnění CONNECT:

    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. Pokud sql Server běží pod předdefinovaný účet, jako je místní systém, místní služba nebo síťová služba nebo nedoménový účet, musíte použít certifikáty pro ověření koncového bodu. Pokud účty služeb používají doménové účty ve stejné doméně, můžete u každého účtu služby udělit přístup CONNECT pro každý účet služby ve všech umístěních replik nebo můžete použít certifikáty. Další informace najdete v tématu Použití certifikátů pro koncový bod zrcadlení databáze (Transact-SQL).

Endpoints

Koncové body musí být správně nakonfigurované.

  1. Ujistěte se, že každá instance SQL Serveru, která bude hostovat repliku dostupnosti (každé umístění repliky), má koncový bod zrcadlení databáze. Pokud chcete zjistit, jestli v dané instanci serveru existuje koncový bod zrcadlení databáze, použijte zobrazení katalogu sys.database_mirroring_endpoints :

    SELECT name, state_desc FROM sys.database_mirroring_endpoints  
    

    Další informace o vytváření koncových bodů najdete v tématu Vytvoření koncového bodu zrcadlení databáze pro ověřování systému Windows (Transact-SQL) nebo Povolení použití certifikátů koncového bodu zrcadlení databáze pro odchozí připojení (Transact-SQL).

  2. Zkontrolujte správnost čísel portů.

    K identifikaci portu aktuálně přidruženého ke koncovému bodu zrcadlení databáze instance serveru použijte následující příkaz Transact-SQL:

    SELECT type_desc, port FROM sys.tcp_endpoints;  
    GO  
    
  3. V případě problémů s nastavením skupin dostupnosti AlwaysOn, které je obtížné vysvětlit, doporučujeme zkontrolovat každou instanci serveru a zjistit, jestli naslouchá na správných portech.

  4. Ujistěte se, že koncové body jsou spuštěné (STATE=STARTED). V každé instanci serveru použijte následující příkaz Transact-SQL:

    SELECT state_desc FROM sys.database_mirroring_endpoints  
    

    Další informace o sloupci state_desc najdete v tématu sys.database_mirroring_endpoints (Transact-SQL).

    Ke spuštění koncového bodu použijte následující příkaz Transact-SQL:

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

    Další informace naleznete v tématu ALTER ENDPOINT (Transact-SQL).

    Poznámka:

    V některých případech, když se koncový bod spustí, ale repliky v rámci AG nekomunikují, zkuste tento koncový bod zastavit a znovu spustit. Můžete použít FUNKCI ALTER ENDPOINT [Endpoint_Mirroring] STATE = ZASTAVENO a potom ALTER ENDPOINT [Endpoint_Mirroring] STATE = STARTED

  5. Ujistěte se, že přihlášení z druhého serveru má oprávnění CONNECT. Pokud chcete zjistit, kdo má oprávnění CONNECT pro koncový bod, použijte v každé instanci serveru následující příkaz Transact-SQL:

    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. Ujistěte se, že se v adrese URL koncového bodu používá správný název serveru.

    Pro název serveru v adrese URL koncového bodu se doporučuje použít plně kvalifikovaný název domény (FQDN), i když můžete použít libovolný název, který počítač jednoznačně identifikuje. Adresa serveru může být název Netbios (pokud jsou systémy ve stejné doméně), plně kvalifikovaný název domény (FQDN) nebo IP adresu (pokud možno statickou IP adresu). Použití plně kvalifikovaného názvu domény je doporučená možnost.

    Pokud jste už definovali adresu URL koncového bodu, můžete ji dotazovat pomocí:

    select endpoint_url from sys.availability_replicas
    

    Potom porovnejte výstup endpoint_url s názvem serveru (název NetBIOS nebo plně kvalifikovaný název domény). Pokud chcete zadat dotaz na název serveru, spusťte v místním prostředí PowerShell na replice následující příkazy:

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

    Pokud chcete ověřit název serveru na vzdáleném počítači, spusťte tento příkaz z PowerShellu.

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

    Další informace najdete v tématu Určení adresy URL koncového bodu při přidávání nebo úpravě repliky dostupnosti (SQL Server).

Poznámka:

Pokud chcete použít ověřování protokolem Kerberos pro komunikaci mezi koncovými body skupiny dostupnosti (AG), zaregistrujte název hlavní služby pro připojení Kerberos pro koncové body zrcadlení databáze používané skupinou dostupnosti.

Síťový přístup

Každá instance serveru, která je hostitelem repliky dostupnosti, musí mít přístup k portu každé z ostatních instancí serveru přes protokol TCP. To je zvlášť důležité, pokud jsou instance serveru v různých doménách, které navzájem nedůvěřují (nedůvěryhodné domény). Pomocí následujícího postupu zkontrolujte, jestli se můžete připojit ke koncovým bodům:

  • K ověření připojení použijte Test-NetConnection (ekvivalent ke službě Telnet). Tady jsou příklady příkazů, které můžete použít:

    $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
    
  • Pokud koncový bod naslouchá a připojení je úspěšné, zobrazí se "TcpTestSucceeded : True". Pokud ne, obdržíte hodnotu TcpTestSucceeded : False.

  • Pokud připojení Test-NetConnection (Telnet) k IP adrese funguje, ale na název serveru nikoliv, pravděpodobně dojde k problému s vyhodnocením jmen nebo DNS.

  • Pokud připojení funguje podle názvu serveru a nikoli IP adresy, může být na tomto serveru definováno více než jeden koncový bod (možná jiná instance SQL), který na tomto portu naslouchá. I když stav koncového bodu na uvedené instanci ukazuje "SPUŠTĚNO", může mít jiná instance ve skutečnosti svázaný port a zabránit té správné instanci v naslouchání a navazování připojení TCP.

  • Pokud se Test-NetConnection nedokáže připojit, zkontrolujte nastavení firewallu a/nebo antivirového softwaru, které mohou blokovat daný port koncového bodu. Zkontrolujte nastavení brány firewall a zjistěte, jestli umožňuje komunikaci portu koncového bodu mezi instancemi serveru, které hostují primární repliku a sekundární repliku (ve výchozím nastavení port 5022). Spuštěním následujícího skriptu PowerShellu zkontrolujte zakázaná pravidla příchozího provozu.

  • Pokud používáte SQL Server na virtuálním počítači Azure, musíte také zajistit, aby skupina zabezpečení sítě (NSG) umožňovala provoz na port koncového bodu. Zkontrolujte nastavení brány firewall (a skupiny zabezpečení sítě pro virtuální počítač Azure) a zjistěte, jestli umožňuje komunikaci portu koncového bodu mezi instancemi serveru, které hostují primární repliku a sekundární repliku (ve výchozím nastavení port 5022).

    Get-NetFirewallRule -Action Block -Enabled True -Direction Inbound |Format-Table
    
  • Zachyťte výstup z rutin Get-NetTCPConnection (ekvivalent NETSTAT -a) a ověřte, že stav je 'Listening' nebo 'Established' na IP:Port zadaného koncového bodu.

    Get-NetTCPConnection 
    

Listener

Pro správnou konfiguraci posluchače skupiny dostupnosti postupujte podle "Konfigurace posluchače pro skupinu dostupnosti Always On".

  1. Jakmile je naslouchací proces nakonfigurovaný, můžete pomocí následujícího dotazu ověřit IP adresu a port, na které naslouchá:

    $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. Pomocí tohoto dotazu můžete také najít informace o naslouchacích službách společně s porty SQL Serveru.

    $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. Pokud potřebujete navázat připojení k naslouchacímu procesu a máte podezření, že je port zablokovaný, můžete provést test pomocí rutiny powershellu Test-NetConnection (ekvivalentní rutině 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. Nakonec zkontrolujte, jestli naslouchá na zadaném portu.

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

Přístup ke koncovému bodu (chyba SQL Serveru 1418)

Tato zpráva SYSTÉMU SQL Server označuje, že síťová adresa serveru zadaná v adrese URL koncového bodu není dostupná nebo neexistuje, a navrhuje, abyste ověřili název síťové adresy a příkaz znovu zadali.

Selhání připojení k databázi (chyba SQL Serveru 35250)

Tato část popisuje možné příčiny a řešení selhání připojení sekundárních databází ke skupině dostupnosti, protože připojení k primární replice není aktivní. Toto je úplná chybová zpráva:

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

Řešení:

Níže je uveden souhrn kroků.

Podrobné pokyny najdete v tématu Chyba modulu MSSQLSERVER_35250

  1. Ujistěte se, že koncový bod je vytvořený a spuštěný.
  2. Zkontrolujte, jestli se ke koncovému bodu můžete připojit přes Telnet, a ujistěte se, že neblokují připojení žádná pravidla brány firewall.
  3. Zkontrolujte chyby v systému. Můžete se dotazovat na sys.dm_hadr_availability_replica_states na last_connect_error_number, které vám může pomoct s diagnostikou problému s připojením.
  4. Ujistěte se, že je koncový bod definovaný tak, aby správně odpovídal IP/portu, který AG (Availability Group) používá.
  5. Zkontrolujte, jestli má účet síťové služby oprávnění CONNECT ke koncovému bodu.
  6. Kontrola možných problémů s řešením názvů
  7. Ujistěte se, že SQL Server používá aktuální verzi buildu (pokud možno nejnovější build), abyste se vyhnuli problémům, které již byly opraveny.

Routování pouze pro čtení nefunguje správně

  1. Ujistěte se, že jste nastavili směrování jen pro čtení podle dokumentu Konfigurace směrování jen pro čtení.

  2. Zajištění podpory klientských ovladačů

    Klientská aplikace musí používat zprostředkovatele klienta, který podporuje ApplicationIntent parametr. Viz Podpora připojení pro ovladače a klienty ve skupinách dostupnosti

    Poznámka:

    Pokud se připojujete k Listeneru DNN (Distributed Network Name), musí poskytovatel také podporovat parametr MultiSubnetFailover.

  3. Ujistěte se, že jsou správně nastavené vlastnosti připojovacího řetězce.

    Aby směrování jen pro čtení fungovalo správně, musí klientská aplikace používat tyto vlastnosti v připojovacím řetězci:

    • Název databáze, který patří k AG
    • Název posluchače skupiny dostupnosti
      • Pokud používáte síť DNN, musíte zadat název naslouchacího procesu DNN a číslo portu DNN. <DNN name,DNN port>
    • ApplicationIntent nastavený na Jen pro čtení
    • Pro název distribuované sítě (DNN) je vyžadováno nastavení MultiSubnetFailover na true.

    Příklady

    Tento příklad ukazuje připojovací řetězec pro .NET Microsoft.Data.SqlClient nebo System.Data.SqlClient poskytovatele pro naslouchací proces názvu virtuální sítě (VNN):

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

    Tento příklad ilustruje připojovací řetězec pro .NET Microsoft.Data.SqlClient nebo System.Data.SqlClient poskytovatele pro posluchače názvu distribuované sítě (DNN):

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

    Poznámka:

    Pokud používáte programy příkazového řádku, jako je SQLCMD, ujistěte se, že jste zadali správné přepínače pro název serveru. Například v SQLCMD musíte použít přepínač s velkým písmenem -S, který určuje název serveru, nikoli přepínač s malým písmenem -s, který se používá pro oddělovač sloupců.
    Příklad: sqlcmd -S AG_Listener,port -E -d AgDb1 -K ReadOnly -M

  4. Ujistěte se, že je naslouchací služba skupiny pro dostupnost online. Pokud chcete zajistit, aby naslouchací proces skupiny dostupnosti byl online, spusťte na primární replice následující dotaz:

    SELECT * FROM sys.dm_tcp_listener_states;
    

    Pokud zjistíte, že je naslouchací proces offline, můžete se ho pokusit přenést do režimu online pomocí následujícího příkazu:

    ALTER AVAILABILITY GROUP myAG RESTART LISTENER 'AG_Listener';
    
  5. Ujistěte se, že READ_ONLY_ROUTING_LIST je správně vyplněný. Na primární replice se ujistěte, že READ_ONLY_ROUTING_LIST obsahuje pouze instance serveru, které hostují čitelné sekundární repliky.

    Pokud chcete zobrazit vlastnosti každé repliky, můžete spustit tento dotaz a prozkoumat koncový bod připojení (URL) repliky jen pro čtení.

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

    Zobrazení seznamu směrování jen pro čtení a porovnání s adresou URL koncového bodu:

    SELECT * FROM sys.availability_read_only_routing_lists;
    

    Pokud chcete změnit seznam směrování jen pro čtení, můžete použít dotaz podobný tomuto:

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

    Další informace naleznete v tématu Konfigurace směrování jen pro čtení pro skupinu dostupnosti – SQL Server AlwaysOn

  6. Zkontrolujte, jestli je otevřený READ_ONLY_ROUTING_URL port. Ujistěte se, že brána Windows Firewall neblokuje READ_ONLY_ROUTING_URL port. Nakonfigurujte bránu firewallu systému Windows pro přístup k databázovému enginu na všech replikách v read_only_routing_list a pro všechny klienty, kteří se k těmto replikám připojují.

    Poznámka:

    Pokud používáte SQL Server na virtuálním počítači Azure, musíte provést další kroky konfigurace. Ujistěte se, že síťová bezpečnostní skupina (NSG) každého virtuálního počítače repliky umožňuje provoz na port koncového bodu a port DNN, pokud používáte DNN posluchač. Pokud používáte naslouchací službu VNN, musíte zajistit, aby byl vyrovnávač zatížení správně nakonfigurovaný.

  7. Ujistěte se, že READ_ONLY_ROUTING_URL (TCP://system-address:port) obsahuje správný plně kvalifikovaný název domény (FQDN) a číslo portu. Viz:

  8. Zajistěte správnou konfiguraci sítě SQL Serveru v nástroji SQL Server Configuration Manager.

    Ověřte na každé replice v read_only_routing_list, že:

    • Je povolené vzdálené připojení SQL Serveru.
    • Je povolen protokol TCP/IP.
    • IP adresy jsou správně nakonfigurované.

    Poznámka:

    Všechny tyto možnosti můžete rychle ověřit, jestli jsou správně nakonfigurované, pokud se můžete připojit ze vzdáleného počítače ke názvu instance SQL Serveru cílové sekundární repliky pomocí TCP:SQL_Instance syntaxe.

Viz: Konfigurace serveru pro naslouchání na konkrétním portu TCP (SQL Server Configuration Manager) a zobrazení nebo změna vlastností serveru (SQL Server)

Související úkoly

Související obsah