Delen via


Verbindingsproblemen en andere fouten oplossen

van toepassing op:Azure SQL DatabaseAzure SQL Managed InstanceSQL-database in Fabric

U ontvangt foutberichten wanneer de verbinding met Azure SQL Database, SQL Database in Microsoft Fabric of Azure SQL Managed Instance mislukt.

Pas zoals altijd best practices en ontwerprichtlijnen toe tijdens het ontwerpproces van de toepassing.

Opmerking

U kunt Azure SQL Connectivity Checker gebruiken om een groot aantal connectiviteitsfouten te detecteren en op te lossen.

Stappen voor het oplossen van veelvoorkomende verbindingsproblemen

  1. Zorg ervoor dat TCP/IP is ingeschakeld als clientprotocol op de toepassingsserver. Controleer op toepassingsservers waarop u geen SQL-hulpprogramma's hebt geïnstalleerd , of TCP/IP is ingeschakeld door cliconfg.exe (SQL Server Client Network-hulpprogramma) uit te voeren.

  2. Controleer de verbindingsreeks van de toepassing om te controleren of deze juist is geconfigureerd. Zorg er bijvoorbeeld voor dat de verbindingsreeks de juiste poort (1433) en de volledig gekwalificeerde servernaam opgeeft. Zie Verbindingsgegevens ophalen met behulp van SQL Server Management Studio.

  3. Probeer de time-outwaarde van de verbinding te verhogen. U wordt aangeraden een time-out voor de verbinding van ten minste 30 seconden te gebruiken.

  4. Test de connectiviteit tussen de toepassingsserver en de Azure SQL Database met behulp van quickstart: SSMS gebruiken om verbinding te maken met en query's uit te voeren op Azure SQL Database of Azure SQL Managed Instance, een UDL-bestand, ping of telnet. Voor meer informatie, zie Connectiviteitsproblemen oplossen en Diagnostiek van connectiviteitsproblemen.

    Opmerking

    Als stap voor probleemoplossing kunt u ook de connectiviteit op een andere clientcomputer testen.

  5. Als best practice moeten cloudtoepassingen gebruikmaken van logica voor opnieuw proberen.

Als deze stappen uw probleem niet oplossen, probeert u meer gegevens te verzamelen en neemt u contact op met de ondersteuning. Als uw toepassing een cloudservice is, schakelt u logboekregistratie in. Deze stap retourneert een UTC-tijdstempel van de fout. Zie Diagnostische logboekregistratie inschakelen voor apps in Azure App Service voor meer informatie over het inschakelen van logboekregistratie. Daarnaast retourneert SQL Database de tracerings-id. Microsoft Customer Support Services kan deze informatie gebruiken.

Het implementeren van herhalingslogica

Het wordt ten zeerste aanbevolen dat uw clienttoepassingen opnieuw probeerlogica gebruiken, zodat een verbinding kan worden hersteld nadat de tijdelijke fout tijd heeft gehad om zichzelf te corrigeren. Het wordt aanbevolen om 5 seconden te wachten voordat u het opnieuw probeert. Het opnieuw proberen na een vertraging van minder dan 5 seconden kan de cloudservice overweldigen. Voor elke volgende nieuwe poging moet de vertraging exponentieel toenemen, tot maximaal 60 seconden.

Zie voor codevoorbeelden van logica voor opnieuw proberen:

Raadpleeg Tijdelijke verbindingsfouten oplossen voor meer informatie over het afhandelen van tijdelijke fouten in uw toepassing.

Een bespreking van de blokkeringsperiode voor clients die gebruikmaken van ADO.NET is beschikbaar in verbindingsgroepering (ADO.NET).>

Tijdelijke foutberichten (40197, 40613 en andere)

De Azure-infrastructuur biedt de mogelijkheid om servers dynamisch opnieuw te configureren wanneer zware workloads optreden in de SQL Database-service. Dit dynamische gedrag kan ervoor zorgen dat uw clientprogramma de verbinding met de database of instantie verliest. Dit soort foutvoorwaarde wordt een tijdelijke fout genoemd. Herconfiguratiegebeurtenissen van de database vinden plaats vanwege een geplande gebeurtenis (bijvoorbeeld een software-upgrade) of een niet-geplande gebeurtenis (bijvoorbeeld een procescrash of taakverdeling). De meeste herconfiguratiegebeurtenissen hebben een korte levensduur en moeten maximaal 60 seconden worden voltooid. Het kan echter soms langer duren voordat deze gebeurtenissen zijn voltooid, bijvoorbeeld wanneer een grote transactie een langlopend herstel veroorzaakt. De volgende tabel bevat verschillende tijdelijke fouten die toepassingen kunnen ontvangen bij het maken van verbinding met Azure SQL Database.

Lijst met tijdelijke foutcodes

Foutcode Ernstigheid Beschrijving
926 14 Database 'replicatedmaster' cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server error log for more information.

Deze fout kan gedurende korte tijd worden geregistreerd in het foutenlogboek van SQL Managed Instance tijdens de laatste fase van een herconfiguratie, terwijl het oude primaire logboek wordt afgesloten.
Andere, niet-tijdelijke scenario's met dit foutbericht worden beschreven in de documentatie over MSSQL-fouten.
4060 16 Cannot open database "%.*ls" requested by the login. The login failed.

Zie Fouten 4000 tot 4999 voor meer informatie
40197 zeventien The service has encountered an error processing your request. Please try again. Error code %d.

U ontvangt deze fout wanneer de service niet beschikbaar is vanwege software- of hardware-upgrades, hardwarefouten of andere failoverproblemen. De foutcode (%d) die is ingesloten in het bericht van fout 40197 biedt aanvullende informatie over het soort fout of failover dat is opgetreden. Enkele voorbeelden van foutcodes worden ingesloten in het bericht van fout 40197 zijn 40020, 40143, 40166 en 40540.
Als u opnieuw verbinding maakt, wordt u automatisch verbonden met een goede kopie van uw database. Uw toepassing moet fout 40197 onderscheppen, de ingesloten foutcode (%d) vastleggen in het bericht voor probleemoplossing en opnieuw verbinding maken met SQL Database totdat de resources beschikbaar zijn en de verbinding opnieuw tot stand is gebracht. Zie Tijdelijke fouten voor meer informatie.
40501 20 The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

Zie voor meer informatie:
Resourcebeheer.
Resourcelimieten voor elastische pools met behulp van het DTU-aankoopmodel.
vCore-limieten voor individuele databases.
Limieten op basis van vCore voor elastische pools.
Resourcelimieten voor Azure SQL Managed Instance.
40613 zeventien Database '%.*ls' on server '%.*ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them with the session tracing ID of '%.*ls'.

Deze fout kan optreden als er al een bestaande toegewezen beheerdersverbinding (DAC) tot stand is gebracht voor de database. Zie Tijdelijke fouten voor meer informatie.
49918 16 Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later.

Zie voor meer informatie:
Resourcebeheer.
Resourcelimieten voor elastische pools met behulp van het DTU-aankoopmodel.
vCore-limieten voor individuele databases.
Limieten op basis van vCore voor elastische pools.
Resourcelimieten voor Azure SQL Managed Instance.
49919 16 Cannot process create or update request. Too many create or update operations in progress for subscription "%ld".

De service is bezig met het verwerken van meerdere aanvragen voor het maken of bijwerken van uw abonnement of server. Aanvragen worden momenteel geblokkeerd voor resourceoptimalisatie. Voer query's uit op sys.dm_operation_status voor in behandeling zijnde bewerkingen. Wacht totdat het maken of bijwerken van aanvragen in behandeling is voltooid of verwijder een van uw aanvragen die in behandeling zijn en probeer het later opnieuw. Als uw bewerkingen lijken te zijn vastgelopen, wacht u tot andere actieve bewerkingen zijn voltooid of annuleert u deze indien mogelijk. U kunt bijvoorbeeld het maken van een databasekopie of geo-replica annuleren door de database of replica te verwijderen die wordt gemaakt. Als u een blijkbaar vastgelopen bewerking niet kunt annuleren, opent u een ondersteuningsticket bij Microsoft.
49920 16 Cannot process request. Too many operations in progress for subscription "%ld".

De service is bezig met het verwerken van meerdere aanvragen voor dit abonnement. Aanvragen worden momenteel geblokkeerd voor resourceoptimalisatie. Query sys.dm_operation_status voor de bewerkingsstatus. Wacht totdat aanvragen in behandeling zijn voltooid of verwijder een van uw aanvragen die in behandeling zijn en probeer het later opnieuw. Als uw bewerkingen lijken te zijn vastgelopen, wacht u tot andere actieve bewerkingen zijn voltooid of annuleert u deze indien mogelijk. U kunt bijvoorbeeld het maken van een databasekopie of geo-replica annuleren door de database of replica te verwijderen die wordt gemaakt. Als u een blijkbaar vastgelopen bewerking niet kunt annuleren, opent u een ondersteuningsticket bij Microsoft.
4221 16 Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'.

De replica is niet beschikbaar voor aanmelding omdat rijversies ontbreken voor transacties die in-flight waren toen de replica werd gerecycled. Het probleem kan worden opgelost door de actieve transacties op de primaire replica terug te draaien of vast te leggen. Voorkomens van deze aandoening kunnen worden geminimaliseerd door lange schrijftransacties op de primaire server te voorkomen.
615 21 Could not find database ID %d, name '%.*ls'

Dit betekent dat de cache in het geheugen niet wordt gesynchroniseerd met het SQL Server-exemplaar en dat zoekacties verouderde database-id ophalen.

SQL-aanmeldingen maken gebruik van cache in het geheugen om de databasenaam op te halen voor id-toewijzing. De cache moet worden gesynchroniseerd met de back-enddatabase en moet worden bijgewerkt wanneer de database wordt gekoppeld en losgekoppeld van het SQL Server-exemplaar.
Deze fout treedt op wanneer de werkstroom voor loskoppelen de cache in het geheugen niet tijdig opschoont en latere zoekopdrachten in de database verwijzen naar een verouderd database-ID.
Probeer opnieuw verbinding te maken met SQL Database totdat de resource beschikbaar is en de verbinding opnieuw tot stand is gebracht. Zie Tijdelijke fouten voor meer informatie.

Stappen voor het oplossen van tijdelijke verbindingsproblemen

  1. Controleer het Microsoft Azure-servicedashboard op bekende storingen die zijn opgetreden tijdens de periode waarin de toepassing rapporteert.
  2. Toepassingen die verbinding maken met een cloudservice zoals Azure SQL Database, moeten periodieke herconfiguratie-gebeurtenissen verwachten en logica voor opnieuw proberen implementeren om deze fouten af te handelen in plaats van toepassingsfouten op te lossen voor gebruikers.
  3. Als een database de resourcelimieten nadert, kan het lijken een tijdelijk verbindingsprobleem te zijn. Zie Resourcelimieten.
  4. Als de verbindingsproblemen zich blijven voordoen of als de duur van de fout in uw toepassing langer is dan 60 seconden of als u meerdere exemplaren van de fout ziet op een bepaalde dag, dient u een ondersteuning voor Azure aanvraag in door Ondersteuning krijgen te selecteren op de Azure-ondersteuningssite.

Het probleem treedt op als de toepassing geen verbinding kan maken met de server.

Voer de stappen uit (in de aangegeven volgorde) in de sectie Stappen om veelvoorkomende verbindingsproblemen op te lossen om dit probleem te verhelpen.

De server/instantie is niet gevonden of is niet toegankelijk (fouten 26, 40, 10053)

Fout 26: Fout bij het lokaliseren van de opgegeven server

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections.(provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)

Fout 40: Kan geen verbinding met de server openen

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

Fout 10053: Er is een transportfout opgetreden bij het ontvangen van resultaten van de server

10053: A transport-level error has occurred when receiving results from the server. (Provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine)

Deze problemen treden op als de toepassing geen verbinding kan maken met de server.

Als u deze problemen wilt oplossen, voert u de stappen uit (in de volgorde die wordt weergegeven) in de stappen voor het oplossen van veelvoorkomende verbindingsproblemen .

Kan geen verbinding maken met de server vanwege firewallproblemen

Fout 40615: Kan geen verbinding maken met < servernaam >

U kunt dit probleem oplossen door firewallinstellingen in SQL Database te configureren via Azure Portal.

Fout 5: Kan geen verbinding maken met < servernaam >

U kunt dit probleem oplossen door ervoor te zorgen dat poort 1433 is geopend voor uitgaande verbindingen op alle firewalls tussen de client en internet.

Kan niet aanmelden bij de server (fouten 18456, 40531)

Aanmelden is mislukt voor gebruiker '< Gebruikersnaam >'

Login failed for user '<User name>'.This session has been assigned a tracing ID of '<Tracing ID>'. Provide this tracing ID to customer support when you need assistance. (Microsoft SQL Server, Error: 18456)

Neem contact op met de servicebeheerder om u een geldige gebruikersnaam en een geldig wachtwoord te geven om dit probleem op te lossen.

Normaal gesproken kan de servicebeheerder de volgende stappen gebruiken om de aanmeldingsreferenties toe te voegen:

  1. Meld u aan bij de server met behulp van SQL Server Management Studio (SSMS).

  2. Als u wilt controleren of de aanmeldingsnaam is uitgeschakeld, voert u de volgende SQL-query uit in de master database:

    SELECT name, is_disabled FROM sys.sql_logins;
    
  3. Als de bijbehorende naam is uitgeschakeld, kunt u besluiten deze in te schakelen met behulp van de volgende instructie:

    ALTER LOGIN <User name> ENABLE;
    
  4. Als de gebruikersnaam voor SQL-aanmelding niet bestaat, bewerkt u de volgende SQL-query en voert u deze uit om een nieuwe SQL-aanmelding te maken:

    CREATE LOGIN <SQL_login_name, sysname, login_name>
    WITH PASSWORD = '<password, sysname, Change_Password>';
    GO
    
  5. Vouw databases uit in SSMS-objectverkenner.

  6. Selecteer de database waaraan u de gebruiker toestemming wilt verlenen.

  7. Klik met de rechtermuisknop op Beveiliging en selecteer Nieuw, Gebruiker.

  8. Volg in het gegenereerde script met tijdelijke aanduidingen de stappen om SSMS-sjabloonparameters te vervangen en uit te voeren, bijvoorbeeld:

    CREATE USER [<user_name, sysname, user_name>]
    FOR LOGIN [<login_name, sysname, login_name>]
    WITH DEFAULT_SCHEMA = [<default_schema, sysname, dbo>];
    GO
    
    -- Add user to the database owner role
    EXEC sp_addrolemember N'db_owner', N'<user_name, sysname, user_name>';
    GO
    

    U kunt ook sp_addrolemember specifieke gebruikers toewijzen aan specifieke databaserollen.

    Opmerking

    Houd in Azure SQL Database rekening met de nieuwere ALTER ROLE-syntaxis voor het beheren van het lidmaatschap van de databaserol.

Zie Databasetoegang autoriseren voor meer informatie.

Verlopen fouten bij verbindingstime-out

System.Data.SqlClient.SqlException (0x80131904): Time-out van verbinding verlopen

System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired. The timeout period elapsed while attempting to consume the pre-login handshake acknowledgement. This could be because the pre-login handshake failed or the server was unable to respond back in time. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=3; handshake=29995;

System.Data.SqlClient.SqlException (0x80131904): Time-out is verlopen

System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

System.Data.Entity.Core.EntityException: De onderliggende provider heeft gefaald bij het openen

System.Data.Entity.Core.EntityException: The underlying provider failed on Open. -> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. -> System.ComponentModel.Win32Exception: The wait operation timed out

Kan geen verbinding maken met < servernaam >

Cannot connect to <server name>.ADDITIONAL INFORMATION:Connection Timeout Expired. The timeout period elapsed during the post-login phase. The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections. The duration spent while attempting to connect to this server was - [Pre-Login] initialization=231; handshake=983; [Login] initialization=0; authentication=0; [Post-Login] complete=13000; (Microsoft SQL Server, Error: -2) For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=-2&LinkId=20476 The wait operation timed out

Deze uitzonderingen kunnen optreden vanwege verbindingsproblemen of queryproblemen. Als u wilt controleren of connectiviteitsproblemen deze fout hebben veroorzaakt, raadpleegt u Controleren of een fout wordt veroorzaakt door een verbindingsprobleem.

Er treden verbindingstime-outs op omdat de toepassing geen verbinding kan maken met de server. Voer de stappen uit (in de aangegeven volgorde) in de sectie Stappen om veelvoorkomende verbindingsproblemen op te lossen om dit probleem te verhelpen.

Fouten bij beëindiging van netwerkverbinding

SQL-clientbibliotheken maken verbinding met Azure SQL Database en Azure SQL Managed Instance met behulp van het TCP-netwerkprotocol. Een clientbibliotheek maakt gebruik van een onderdeel op een lager niveau met de naam TCP-provider om TCP-verbindingen te beheren. Wanneer de TCP-provider detecteert dat een externe host onverwacht een bestaande TCP-verbinding beëindigt, genereert de clientbibliotheek een fout. Omdat de fout een clientfout is en geen SQL-serverfout, is er geen SQL-foutnummer opgenomen. In plaats daarvan is het foutnummer 0 en wordt het foutbericht van de TCP-provider gebruikt.

Voorbeelden van fouten bij beëindiging van netwerkverbindingen zijn:

A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) An existing connection was forcibly closed by the remote host

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

The client was unable to establish a connection because of an error during connection initialization process before login. Possible causes include the following: the client tried to connect to an unsupported version of SQL Server; the server was too busy to accept new connections; or there was a resource limitation (insufficient memory or maximum allowed connections) on the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

Verbindingsafbrekingsfouten kunnen optreden omdat de database of elastische pool tijdelijk niet beschikbaar is. Ze treden ook op vanwege verschillende problemen in de netwerkinfrastructuur tussen de databaseserver en de clienttoepassing, waaronder firewalls, netwerkapparaten, enzovoort. Deze problemen kunnen tijdelijk of permanent zijn. Als algemene richtlijnen moeten toepassingen een vast aantal nieuwe pogingen voor deze fouten gebruiken voordat ze permanente fouten overwegen.

Fouten in resourcebeheer

Azure SQL Database maakt gebruik van een implementatie van resourcebeheer op basis van Resource Governor om resourcelimieten af te dwingen. Meer informatie over resourcebeheer in Azure SQL Database.

De meest voorkomende fouten in resourcebeheer worden eerst vermeld met details, gevolgd door een tabel met foutberichten over resourcebeheer.

Fouten 10928 en 10936: Resource ID: 1. De aanvraaglimiet voor de [database of elastische pool] is %d en is bereikt

Als de limiet op databaseniveau is bereikt, wordt het gedetailleerde foutbericht in dit geval gelezen: Resource ID : 1. The request limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

Als de limiet voor elastische pools is bereikt, wordt het gedetailleerde foutbericht in dit geval gelezen: Resource ID : 1. The request limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance. Limieten voor elastische pools zijn hoger dan databaselimieten. Zie Resourcebeheer in Azure SQL Database voor meer informatie. Er kunnen limieten worden ondervonden wanneer meerdere databases in de pool gelijktijdig een resource (zoals werkers) gebruiken.

Dit foutbericht geeft aan dat de limiet voor het aantal taken voor de database of de elastic pool is bereikt. De maximumwaarde voor gelijktijdige werknemers voor de servicedoelstelling van de database of elastische pool zal bestaan in plaats van de tijdelijke aanduiding %d.

Opmerking

De eerste aanbieding van Azure SQL Database ondersteunde alleen query's met één thread. Op dat moment was het aantal aanvragen altijd gelijk aan het aantal werknemers. Foutberichten 10928 en 10936 in Azure SQL Database bevatten de tekst 'De aanvraaglimiet [...] is N en is bereikt voor achterwaartse compatibiliteitsdoeleinden. De limiet is in feite het aantal werknemers. Als de maximale mate van parallelle uitvoering (MAXDOP) gelijk is aan nul of groter is dan één, kan het aantal werkrollen veel hoger zijn dan het aantal aanvragen en kan de limiet veel sneller worden bereikt dan wanneer MAXDOP gelijk is aan één.

Meer informatie over sessies, werknemers en aanvragen.

Maak indien nodig verbinding met de Dedicated Admin Connection (DAC)

Als er een live-incident wordt uitgevoerd waarbij de werkrollimiet is bereikt, krijgt u mogelijk fout 10928 wanneer u verbinding maakt met behulp van SQL Server Management Studio (SSMS). Eén sessie kan verbinding maken met behulp van de diagnostische verbinding voor databasebeheerders (DAC), zelfs wanneer de maximale werkroldrempel is bereikt.

Een verbinding tot stand brengen met de DAC vanuit SSMS:

  • Selecteer bestand > nieuwe > database-enginequery in het menu
  • Voer admin:<fully_qualified_server_name> in het dialoogvenster Verbinding in het veld Servernaam (bijvoorbeeld admin:servername.database.windows.net).
  • Opties selecteren >>
  • Selecteer het tabblad Verbindingseigenschappen
  • Typ in het vak Verbinding maken met database de naam van uw database
  • Selecteer Maak verbinding met.

Als u fout 40613 ontvangt, Database '%.&#x2a;ls' on server '%.&#x2a;ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them the session tracing ID of '%.&#x2a;ls'kan dit erop wijzen dat er al een andere sessie is verbonden met de DAC. Slechts één sessie kan verbinding maken met de DAC voor één database of een elastische pool tegelijk.

Als u de fout 'Kon geen verbinding maken met server' krijgt nadat u op Verbinding hebt geklikt, is de DAC-sessie mogelijk nog steeds tot stand gebracht als u een versie van SSMS versie vóór 18.9 gebruikt. Vroege versies van SSMS probeerden Intellisense te bieden voor verbindingen met de DAC. Dit is mislukt, omdat de DAC slechts één werkrol ondersteunt en IntelliSense een afzonderlijke werkrol vereist.

U kunt geen DAC-verbinding gebruiken met objectverkenner in SSMS.

Controleer uw gebruik van max_worker_percent

Als u statistieken voor resourceverbruik voor uw database gedurende 14 dagen wilt vinden, voert u een query uit op de sys.resource_stats systeemcatalogusweergave. De kolom max_worker_percent toont het percentage werknemers dat is gebruikt ten opzichte van de werknemerslimiet voor uw database. Maak verbinding met de master database op uw logische server om een query uit te voeren sys.resource_stats.

SELECT start_time, end_time, database_name, sku, avg_cpu_percent, max_worker_percent, max_session_percent 
FROM sys.resource_stats;

U kunt ook query's uitvoeren op statistieken over resourceverbruik van het afgelopen uur vanuit de sys.dm_db_resource_stats dynamische beheerweergave. Maak rechtstreeks verbinding met uw database om een query uit te voeren sys.dm_db_resource_stats.

SELECT end_time, avg_cpu_percent, max_worker_percent, max_session_percent
FROM sys.dm_db_resource_stats;

Gebruik van werknemers verlagen indien mogelijk

Blokkerende ketens kunnen een plotselinge piek veroorzaken in het aantal werklieden in een database. Een groot aantal parallelle gelijktijdige query's kan een groot aantal werknemers veroorzaken. Het verhogen van de maximale mate van parallelle uitvoering (MAXDOP) of het instellen van MAXDOP op nul kan het aantal actieve werkprocessen verhogen.

Sorteer een incident met onvoldoende werknemers door de volgende stappen uit te voeren:

  1. Onderzoek of er sprake is van blokkering of of u een groot aantal gelijktijdige werknemers kunt identificeren. Voer de volgende query uit om de huidige aanvragen te onderzoeken en te controleren op blokkering wanneer uw database fout 10928 retourneert. Mogelijk moet u verbinding maken met de Dedicated Admin Connection (DAC) om de query uit te voeren.

    SELECT
        r.session_id, r.request_id, r.blocking_session_id, r.start_time, 
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        (SELECT COUNT(*) 
            FROM sys.dm_os_tasks AS t 
            WHERE t.session_id=r.session_id and t.request_id=r.request_id) AS worker_count,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1;
    GO
    
    1. Zoek naar rijen met een blocking_session_id om geblokkeerde sessies te identificeren. Zoek elke blocking_session_id in de lijst om te bepalen of die sessie ook wordt geblokkeerd. Als u de waarden blocking_session_id en session_id volgt, wordt u uiteindelijk naar de hoofdblokkeerder geleid: een sessie die zelf niet geblokkeerd is maar andere blokkeert. Stem de hoofdblokkade-query af.

      Aanbeveling

      Zie Blokkeringsproblemen begrijpen en oplossen voor uitgebreidere informatie over het oplossen van langdurige of blokkerende query's.

    2. Als u een groot aantal gelijktijdige werknemers wilt identificeren, controleert u het totale aantal aanvragen en de worker_count kolom voor elke aanvraag. Worker_count is het aantal werknemers op het moment dat een steekproef wordt genomen en kan in de loop van de tijd veranderen wanneer de aanvraag wordt uitgevoerd. Pas query's aan om het gebruik van resources te verminderen als de oorzaak van de toename van werkprocessen gelijktijdige query's zijn die optimaal parallel uitgevoerd worden. Zie queryafstemming/hintingvoor meer informatie.

  2. Evalueer de maximale mate van parallelle uitvoering (MAXDOP) voor de database.

Werknemerslimieten verhogen

Als de database of elastische pool consistent zijn worker limiet bereikt ondanks het oplossen van blokkeringen, het optimaliseren van query's en het valideren van uw MAXDOP-instelling, kunt u overwegen de database of elastische pool te schalen om de worker limiet te verhogen.

Zoek resourcelimieten voor Azure SQL Database op servicelaag en rekenkracht:

Meer informatie over Azure SQL Database-resourcebeheer van werknemers.

Fout 10929: Resource-ID: 1

10929: Resource ID: 1. The %s minimum guarantee is %d, maximum limit is %d and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database. See http://go.microsoft.com/fwlink/?LinkId=267637 for assistance. Otherwise, please try again later.

Fout 40501: De service is momenteel bezet

40501: The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

Fout 40501 is een fout door motorbeperking, een aanwijzing dat resourcelimieten worden overschreden.

Zie Resourcebeheer in Azure SQL Database voor meer informatie over resourcelimieten.

Fout 40544: De database heeft het quotum voor de grootte bereikt

40544: The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions. Incident ID: <ID>. Code: <code>.

Deze fout treedt op wanneer de database het quotum voor de grootte heeft bereikt.

De volgende stappen kunnen u helpen het probleem te omzeilen of u meer opties te bieden:

  1. Controleer de huidige grootte van de database met behulp van het dashboard in Azure Portal.

    Opmerking

    Voer de volgende SQL-query uit om te bepalen welke tabellen de meeste ruimte verbruiken en daarom potentiële kandidaten zijn voor opschoning:

    SELECT o.name,
     SUM(p.row_count) AS 'Row Count',
     SUM(p.reserved_page_count) * 8.0 / 1024 AS 'Table Size (MB)'
    FROM sys.objects o
    JOIN sys.dm_db_partition_stats p on p.object_id = o.object_id
    GROUP BY o.name
    ORDER BY [Table Size (MB)] DESC;
    GO
    
  2. Als de huidige grootte niet groter is dan de maximale grootte die wordt ondersteund voor uw editie, kunt u ALTER DATABASE gebruiken om de instelling MAXSIZE te verhogen.

  3. Als de database al de maximale ondersteunde grootte voor uw editie heeft overschreden, voert u een of meer van de volgende stappen uit:

    • Voer normale activiteiten voor het opschonen van databases uit. U kunt bijvoorbeeld de ongewenste gegevens opschonen met behulp van afkappen/verwijderen of gegevens verplaatsen met behulp van SQL Server Integration Services (SSIS) of het hulpprogramma voor bulksgewijs kopiëren (bcp).
    • Partitieer of verwijder gegevens, verwijder indexen, of raadpleeg de documentatie voor mogelijke oplossingen.
    • Voor het schalen van database resources, zie Individuele databasebronnen schalen en Elastische poolbronnen schalen.

Fout 40549: Sessie wordt beëindigd omdat u een langlopende transactie hebt

40549: Session is terminated because you have a long-running transaction. Try shortening your transaction.

Als u deze fout herhaaldelijk tegenkomt, probeert u het probleem op te lossen door de volgende stappen uit te voeren:

  1. Voer de volgende query uit om geopende sessies te zien met een hoge waarde voor de duration_ms kolom:

    SELECT
        r.start_time, DATEDIFF(ms,start_time, SYSDATETIME()) as duration_ms, 
        r.session_id, r.request_id, r.blocking_session_id,  
        r.status, r.command, DB_NAME(r.database_id) AS database_name,
        i.parameters, i.event_info AS input_buffer,
        r.last_wait_type, r.open_transaction_count, r.total_elapsed_time, r.cpu_time,
        r.logical_reads, r.writes, s.login_time, s.login_name, s.program_name, s.host_name
    FROM sys.dm_exec_requests as r
    JOIN sys.dm_exec_sessions as s on r.session_id=s.session_id
    OUTER APPLY sys.dm_exec_input_buffer (r.session_id,r.request_id) AS i
    WHERE s.is_user_process=1
    ORDER BY start_time ASC;
    GO
    

    U kunt rijen negeren waarin de input_buffer-kolom een query toont die wordt gelezen van sys.fn_MSxe_read_event_stream: deze verzoeken zijn gerelateerd aan Extended Event-sessies.

  2. Controleer de blocking_session_id kolom om te zien of blokkeren bijdraagt aan langlopende transacties.

    Opmerking

    Zie Problemen met blokkeren in Azure SQL Database begrijpen en oplossen voor meer informatie over het oplossen van blokkeringsproblemen in Azure SQL Database.

  3. Overweeg om uw query's in batches te plaatsen. Zie Batchverwerking gebruiken om de prestaties van azure SQL Database- en Azure SQL Managed Instance-toepassingen te verbeteren voor meer informatie over batchverwerking.

Fout 40551: De sessie is beëindigd vanwege overmatig tempdb-gebruik

40551: The session has been terminated because of excessive TEMPDB usage. Try modifying your query to reduce the temporary table space usage.

Volg deze stappen om dit probleem te omzeilen:

  1. Wijzig de query's om het gebruik van tijdelijke tabelruimte te verminderen.
  2. Verwijder tijdelijke objecten nadat ze niet meer nodig zijn.
  3. Tabellen afkappen of ongebruikte tabellen verwijderen.

Fout 40552: De sessie is beëindigd vanwege overmatig gebruik van transactielogboeken

40552: The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Probeer de volgende methoden om dit op te lossen:

  • Het probleem kan optreden vanwege invoeg-, update- of verwijderbewerkingen. Probeer het aantal rijen te verminderen waarop onmiddellijk wordt gewerkt door batchverwerking of splitsing in meerdere kleinere transacties te implementeren.
  • Het probleem kan optreden vanwege herbouwbewerkingen voor indexen. U kunt dit probleem omzeilen door ervoor te zorgen dat het aantal rijen dat wordt beïnvloed in de tabel * (gemiddelde grootte van het veld dat is bijgewerkt in bytes + 80) < 2 gigabyte (GB).
  • Voor het opnieuw samenstellen van een index moet de gemiddelde grootte van het veld dat wordt bijgewerkt, worden vervangen door de gemiddelde indexgrootte.
  • Zie Problemen met een volledig transactielogboek in Azure SQL Database oplossen en problemen met een volledig transactielogboek in Azure SQL Managed Instance oplossen.

Fout 40553: De sessie is beëindigd vanwege overmatig geheugengebruik

40553: The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

U kunt dit probleem omzeilen door de query te optimaliseren.

Zie Is mijn query goed uitgevoerd in de cloud voor een uitgebreide procedure voor probleemoplossing?

Zie Problemen met onvoldoende geheugen oplossen met Azure SQL Database voor meer informatie over andere geheugenfouten en voorbeeldquery's.

Tabel met foutberichten over resourcebeheer

Foutcode Ernstigheid Beschrijving
10928 20 Resource ID: %d. The %s limit for the database is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

De resource-id geeft de resource aan die de limiet heeft bereikt. Als Resource-ID = 1, geeft dit aan dat er een werknemerslimiet is bereikt. Meer informatie in fout 10928: Resource-id: 1. De aanvraaglimiet voor de database is %d en is bereikt. Als resource-id = 2, geeft dit aan dat de sessielimiet is bereikt.
Meer informatie over resourcelimieten:
Resourcebeheer in Azure SQL Database.
Resourcelimieten voor DTU-aankoopmodel.
vCore-limieten voor individuele databases.
Resourcelimieten voor Azure SQL Managed Instance.
10936 20 Resource ID: %d. The %s limit for the elastic pool is %d and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.

De resource-id geeft de resource aan die de limiet heeft bereikt. Als Resource-ID = 1, geeft dit aan dat er een werknemerslimiet is bereikt. Meer informatie in fout 10936: Resource-id: 1. De aanvraaglimiet voor de elastische pool is %d en is bereikt.. Als resource-id = 2, geeft dit aan dat de sessielimiet is bereikt.
Meer informatie over resourcelimieten:
Resourcebeheer in Azure SQL Database.
Resourcelimieten voor elastische pools met behulp van het DTU-aankoopmodel.
Limieten op basis van vCore voor elastische pools.
Resourcelimieten voor Azure SQL Managed Instance.
10929 20 Resource ID: %d. The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

De resource-id geeft de resource aan die de limiet heeft bereikt. Voor werkrolthreads is de Resource-ID = 1. Voor sessies is de resource-id = 2. Zie voor meer informatie:
Resourcebeheer in Azure SQL Database.
Resourcelimieten voor elastische pools met behulp van het DTU-aankoopmodel.
vCore-limieten voor individuele databases.
Limieten op basis van vCore voor elastische pools.
Resourcelimieten voor Azure SQL Managed Instance.
Probeer het later opnieuw.
40544 20 The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions.

Voor het schalen van database resources, zie Individuele databasebronnen schalen en Elastische poolbronnen schalen.
40549 16 Session is terminated because you have a long-running transaction. Try shortening your transaction.

Zie Batchverwerking gebruiken om de prestaties van azure SQL Database- en Azure SQL Managed Instance-toepassingen te verbeteren voor meer informatie over batchverwerking.
40550 16 The session has been terminated because it has acquired too many locks. Try reading or modifying fewer rows in a single transaction.

Zie Batchverwerking gebruiken om de prestaties van azure SQL Database- en Azure SQL Managed Instance-toepassingen te verbeteren voor meer informatie over batchverwerking.
40551 16 The session has been terminated because of excessive tempdb usage. Try modifying your query to reduce the temporary table space usage.

Als u tijdelijke objecten gebruikt, bespaart u ruimte in de tempdb database door tijdelijke objecten te verwijderen nadat deze niet meer nodig zijn voor de sessie. Zie tempdb voor meer informatie over limieten in SQL Database.
40552 16 The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Zie Batchverwerking gebruiken om de prestaties van azure SQL Database- en Azure SQL Managed Instance-toepassingen te verbeteren voor meer informatie over batchverwerking.
Als u bulksgewijze invoegingen uitvoert met behulp van het bcp.exe hulpprogramma of de System.Data.SqlClient.SqlBulkCopy klasse, gebruikt u de -b batchsize of BatchSize opties om het aantal rijen te beperken dat in elke transactie naar de server is gekopieerd. Als u een index opnieuw bouwt met de ALTER INDEX instructie, kunt u de REBUILD WITH ONLINE = ON optie gebruiken. Zie voor meer informatie over transactielogboekgrootten voor het vCore-aankoopmodel:
vCore-limieten voor individuele databases.
Limieten op basis van vCore voor elastische pools.
Resourcelimieten voor Azure SQL Managed Instance.
40553 16 The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

Wanneer u het aantal ORDER BY en GROUP BY bewerkingen in uw Transact-SQL code vermindert, verlaagt u de geheugeneisen van uw query. Voor het schalen van database resources, zie Individuele databasebronnen schalen en Elastische poolbronnen schalen. Zie Problemen met onvoldoende geheugen en voorbeeldquery's oplossen met Azure SQL Database voor meer informatie over geheugenfouten en voorbeeldquery's.

Fouten in elastische pools

De volgende fouten zijn gerelateerd aan het maken en gebruiken van elastische pools:

Foutcode Ernstigheid Beschrijving Corrigerende actie
1132 zeventien The elastic pool has reached its storage limit. The storage usage for the elastic pool cannot exceed (%d) MBs.

Er wordt geprobeerd gegevens naar een database te schrijven wanneer de opslaglimiet van de elastische pool is bereikt. Zie voor meer informatie over resourcelimieten:
Resourcelimieten voor elastische pools met behulp van het DTU-aankoopmodel.
Limieten op basis van vCore voor elastische pools.
Overweeg indien mogelijk de DTU's van en/of opslag toe te voegen aan de elastische pool om de opslaglimiet te verhogen, de opslag die wordt gebruikt door afzonderlijke databases in de elastische pool te verminderen of databases uit de elastische pool te verwijderen. Zie elastische poolresources schalen voor het schalen van elastische pools. Zie Bestandsruimte beheren voor databases in Azure SQL Database voor meer informatie over het verwijderen van ongebruikte ruimte uit databases.
10929 16 The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database.

Zie voor meer informatie over resourcelimieten:
DTU-resourcelimieten voor elastische pools.
Limieten op basis van vCore voor elastische pools.
Probeer het later opnieuw. DTU/vCore min per database; DTU/vCore max per database. Het totale aantal gelijktijdige werkers in alle databases van de elastische pool probeerde de poollimiet te overschrijden.
Overweeg indien mogelijk de DTU's of vCores van de elastische pool te verhogen om de limiet voor medewerkers te verhogen of verwijder databases uit de elastische pool.
40844 16 Database '%ls' on Server '%ls' is a '%ls' edition database in an elastic pool and cannot have a continuous copy relationship. Niet van toepassing.
40857 16 Elastic pool not found for server: '%ls', elastic pool name: '%ls'. Specified elastic pool does not exist in the specified server. Geef een geldige naam voor een elastische pool op.
40858 16 Elastic pool '%ls' already exists in server: '%ls'. Specified elastic pool already exists in the specified server. Geef de naam van de nieuwe elastische pool op.
40859 16 Elastic pool does not support service tier '%ls'. Specified service tier is not supported for elastic pool provisioning. Geef de juiste editie op of laat de servicelaag leeg om de standaardservicelaag te gebruiken.
40860 16 Elastic pool '%ls' and service objective '%ls' combination is invalid. Elastic pool and service tier can be specified together only if resource type is specified as 'ElasticPool'. Geef de juiste combinatie van elastische pool en servicelaag op.
40861 16 The database edition '%.*ls' cannot be different than the elastic pool service tier which is '%.*ls'. The database edition is different than the elastic pool service tier. Geef geen database-editie op die verschilt van de servicelaag van de elastische pool. De database-editie hoeft niet te worden opgegeven.
40862 16 Elastic pool name must be specified if the elastic pool service objective is specified. Elastic pool service objective does not uniquely identify an elastic pool. Geef de naam van de elastische pool op als u de servicedoelstelling van de elastische pool gebruikt.
40864 16 The DTUs for the elastic pool must be at least (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool below the minimum limit. Stel de DTU's voor de elastische pool opnieuw in op ten minste de minimale limiet.
40865 16 The DTUs for the elastic pool cannot exceed (%d) DTUs for service tier '%.*ls'. Attempting to set the DTUs for the elastic pool above the maximum limit. Stel de DTU's voor de elastische pool opnieuw in op niet groter dan de maximumlimiet.
40867 16 The DTU max per database must be at least (%d) for service tier '%.*ls'. Attempting to set the DTU max per database below the supported limit. Overweeg het gebruik van de servicelaag voor elastische pools die ondersteuning biedt voor de gewenste instelling.
40868 16 The DTU max per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU max per database beyond the supported limit. Overweeg het gebruik van de servicelaag voor elastische pools die ondersteuning biedt voor de gewenste instelling.
40870 16 The DTU min per database cannot exceed (%d) for service tier '%.*ls'. Attempting to set the DTU min per database beyond the supported limit. Overweeg het gebruik van de servicelaag voor elastische pools die ondersteuning biedt voor de gewenste instelling.
40873 16 The number of databases (%d) and DTU min per database (%d) cannot exceed the DTUs of the elastic pool (%d). Attempting to specify DTU min for databases in the elastic pool that exceeds the DTUs of the elastic pool. Overweeg de DTU's van de elastische pool te verhogen of de DTU min per database te verlagen of het aantal databases in de elastische pool te verlagen.
40877 16 An elastic pool cannot be deleted unless it does not contain any databases. The elastic pool contains one or more databases and therefore cannot be deleted. Verwijder databases uit de elastische pool om deze te verwijderen.
40881 16 The elastic pool '%.*ls' has reached its database count limit. The database count limit for the elastic pool cannot exceed (%d) for an elastic pool with (%d) DTUs. Attempting to create or add database to elastic pool when the database count limit of the elastic pool has been reached. Overweeg indien mogelijk de DTU's van de elastische pool te verhogen om de databaselimiet te verhogen of databases uit de elastische pool te verwijderen.
40889 16 The DTUs or storage limit for the elastic pool '%.*ls' cannot be decreased since that would not provide sufficient storage space for its databases. Attempting to decrease the storage limit of the elastic pool below its storage usage. Overweeg het opslaggebruik van afzonderlijke databases in de elastische pool te verminderen of databases uit de pool te verwijderen om de DTU's of opslaglimiet te verminderen.
40891 16 The DTU min per database (%d) cannot exceed the DTU max per database (%d). Attempting to set the DTU min per database higher than the DTU max per database. Zorg ervoor dat de DTU min per database niet groter is dan de DTU-maximum per database.
TBD 16 The storage size for an individual database in an elastic pool cannot exceed the max size allowed by '%.*ls' service tier elastic pool. The max size for the database exceeds the max size allowed by the elastic pool service tier. Stel de maximale grootte van de database in binnen de limieten van de maximale grootte die door de elastische pool servicelaag is toegestaan.

Kan de database master die is aangevraagd door de aanmelding niet openen. De aanmelding is mislukt

Dit probleem treedt op omdat het account geen toegang heeft tot de master database. Sql Server Management Studio (SSMS) probeert echter standaard verbinding te maken met de master database.

Volg deze stappen om dit probleem op te lossen:

  1. Selecteer Opties in het aanmeldingsscherm van SSMS en selecteer vervolgens Verbindingseigenschappen.

  2. Voer in het veld Verbinding maken met database de standaarddatabasenaam van de gebruiker in als de standaardaanmeldingsdatabase en selecteer vervolgens Verbinding maken.

    Schermopname van het dialoogvenster Verbinding maken in SSMS, met het tabblad Verbindingseigenschappen.

Fouten met het kenmerk Alleen-lezen

Als u probeert te schrijven naar een database die alleen-lezen is, krijgt u een foutmelding. In sommige scenario's is het niet meteen duidelijk waarom de database een alleen-lezen status heeft.

Fout 3906: Kan databasenaam niet bijwerken omdat de database het kenmerk Alleen-lezen heeft.

Wanneer u een alleen-lezendatabase probeert te wijzigen, wordt de volgende fout gegenereerd.

Msg 3906, Level 16, State 2, Line 1
Failed to update database "%d" because the database is read-only.

Er zijn meerdere mogelijke verklaringen waarom een database alleen voor lezen is.

Na een handmatige failover maken toepassingen nog steeds verbinding met de oude replica

Na een failover naar een andere replica in Azure SQL Database maakt uw toepassing mogelijk nog steeds verbinding met de vorige primaire replica vanwege DNS. Failovergroepverbindingsroutering wordt geïmplementeerd met behulp van DNS.

Mogelijke hoofdoorzaken:

  1. Tijdens een failover worden eindpunten van de failovergroep bijgewerkt om te verwijzen naar de juiste nieuwe primaire en nieuwe secundaire servers door het doel van de juiste DNS-vermelding te wijzigen. DNS-vermeldingen worden standaard gemaakt met een TTL van 30 seconden, wat betekent dat DNS-clients deze vermeldingen gedurende 30 seconden in de cache opslaan. Als gevolg hiervan worden updates van de DNS-records niet onmiddellijk doorgegeven; vermeldingen zijn verlopen totdat alle clients en tussenliggende knooppunten hun caches hebben vernieuwd. Het kan dus 0 tot ongeveer 10 minuten duren (afhankelijk van de netwerktopologie) voordat aanmeldingen bij failovergroepeindpunten naar hun nieuwe doelwitten worden gerouteerd na een failover. Door DNS-caches leeg te maken, kan het probleem al dan niet worden opgelost, omdat tussenliggende netwerkknooppunten die reageren op DNS-aanvragen ook DNS-resultaten gedurende een bepaalde tijd in de cache opslaan.

    De aanbevolen tijdelijke oplossing voor dit probleem is om te wachten totdat de DNS-vermeldingen op de client worden vernieuwd. Op dit moment leidt deze tijdelijke oplossing tot het probleem dat zich binnen tien minuten oplost.

  2. Sommige SQL-clientbibliotheken gebruiken een functie met de naam 'verbindingsgroepering', waarmee verbindingen met dezelfde gegevensbron opnieuw worden gebruikt in plaats van ze te sluiten en opnieuw te openen wanneer er een nieuwe databaseverbinding nodig is. Met name verbindingspooling is standaard ingeschakeld in ADO.NET. Wanneer het probleem dat in 1 wordt beschreven, wordt gecombineerd, kan het groeperen van verbindingen ertoe leiden dat nieuw geopende verbindingen een verbinding met de oude database opnieuw gebruiken, waardoor de toepassing geen verbinding kan maken met de nieuwe primaire database voor onbepaalde tijd.

Oplossingen:

Er zijn drie mogelijke tijdelijke oplossingen voor dit DNS-probleem na een failover van een failovergroep:

  1. Wijzig de toepassing zodat SQLConnection.ClearAllPools of SQLConnection.ClearPool(conn) wordt aangeroepen wanneer er een 'alleen-lezen'-fout optreedt.
  2. Geef Pooling=False in de verbindingsreeks van de toepassing op dat u groepsgewijze verbindingen wilt uitschakelen. Dit moet worden getest, omdat dit de prestaties aanzienlijk kan beïnvloeden als de toepassing wordt geopend en verbindingen regelmatig sluit.
  3. Een andere optie om vertragingen voor DNS-replicatie/caching te voorkomen, is door rechtstreeks verbinding te maken met de naam van de logische server van Azure SQL Database (van de oorspronkelijke secundaire server, nu de nieuwe primaire server) gedurende een bepaalde periode nadat fout 3906 optreedt.

Mogelijk bent u verbonden met een alleen-lezen replica

Voor zowel Azure SQL Database als Azure SQL Managed Instance kan het zijn dat u verbonden bent met een database op een alleen-lezen replica. In dit geval geeft de volgende query met de functie DATABASEPROPERTYEX() de waarde READ_ONLY terug.

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Updateability');
GO

Wanneer u verbinding maakt met SQL Server Management Studio, controleer dan of u ApplicationIntent=ReadOnly hebt opgegeven op het tabblad Aanvullende verbindingsparameters binnen uw verbindingsopties.

Als de verbinding afkomstig is van een toepassing of client met een verbindingsreeks, controleer of de verbindingsreeks ApplicationIntent=ReadOnly heeft gespecificeerd. Lees meer in Verbinding maken met een alleen-lezen replica.

De database kan zijn ingesteld op alleen-lezen

Als u Azure SQL Database gebruikt, is de database zelf mogelijk ingesteld op alleen-lezen. U kunt de status van de database controleren met de volgende query:

SELECT name, is_read_only
FROM sys.databases
WHERE database_id = DB_ID();

U kunt de alleen-lezenstatus voor een database in Azure SQL Database wijzigen met ALTER DATABASE Transact-SQL. U kunt momenteel geen database in een beheerd exemplaar instellen op alleen-lezen.

Controleer of een fout wordt veroorzaakt door een verbindingsprobleem

Als u wilt controleren of een fout wordt veroorzaakt door een verbindingsprobleem, controleert u de stacktracering voor frames waarin aanroepen worden weergegeven om een verbinding zoals de volgende te openen (let op de verwijzing naar de SqlConnection-klasse ):

System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
 at System.Data.SqlClient.SqlConnection.Open()
 at AzureConnectionTest.Program.Main(String[] args)
ClientConnectionId:<Client connection ID>

Wanneer de uitzondering wordt geactiveerd door queryproblemen, ziet u een aanroepstack die vergelijkbaar is met het volgende (let op de verwijzing naar de klasse SqlCommand ). In deze situatie kunt u uw query's afstemmen.

  at System.Data.SqlClient.SqlCommand.ExecuteReader()
  at AzureConnectionTest.Program.Main(String[] args)
  ClientConnectionId:<Client ID>

Zie voor meer informatie over het afstemmen van de prestaties: