Partager via


Résoudre des problèmes de connectivité et autres erreurs avec Azure SQL Database et Azure SQL Managed Instance

S’applique à : Azure SQL Database Azure SQL Managed Instance

En cas d’échec de la connexion à Azure SQL Database ou Azure SQL Managed Instance, vous recevez des messages d’erreur.

Comme toujours, il convient d'appliquer les meilleures pratiques et les lignes directrices en matière de conception au cours du processus de conception de l'application.

Remarque

Vous pouvez utiliser la fonctionnalité de vérification de la connectivité Azure SQL pour détecter et corriger un large éventail d’erreurs de connectivité pour Azure SQL Database, Azure SQL Managed Instance et dans les environnements Azure Synapse Analytics.

Étapes pour résoudre les problèmes de connexion courants

  1. Vérifiez que l’adresse TCP/IP est activée en tant que protocole client sur le serveur d’applications. Sur les serveurs d’applications où aucun outil SQL n’est installé, vérifiez que l’adresse TCP/IP est activée en exécutant cliconfg.exe (utilitaire réseau du client SQL Server).

  2. Vérifiez la chaîne de connexion de l’application pour être sûr qu’elle est configurée correctement. Par exemple, vérifiez que la chaîne de connexion spécifie le port correct (1433) et le nom complet du serveur. Consultez Obtenir des informations de connexion à l’aide de SQL Server Management Studio.

  3. Essayez d’augmenter la valeur du délai d’expiration de connexion. Nous vous recommandons d’utiliser un délai d’expiration de connexion d’au moins 30 secondes.

  4. Testez la connectivité entre le serveur d’applications et Azure SQL Database à l’aide de Démarrage rapide : Utiliser SSMS pour se connecter à Azure SQL Database ou Azure SQL Managed Instance et exécuter des requêtes, d’un fichier UDL, d’un test ping ou de Telnet. Pour plus d’informations, consultez Résolution des problèmes de connectivité et Diagnostics des problèmes de connectivité.

    Notes

    En guise d’étape de résolution des problèmes, vous pouvez également tester la connectivité sur un autre ordinateur client.

  5. En guise de meilleure pratique, les applications connectées au cloud doivent utiliser une logique de nouvelle tentative.

Si ces procédures ne permettent pas de résoudre votre problème, essayez de collecter davantage de données, puis contactez le support. Si votre application est un service cloud, activez la journalisation. Cette étape retourne l’horodatage UTC de l’échec. Pour plus d’informations sur la façon d’activer la journalisation, consultez Activer la journalisation des diagnostics pour les applications dans Azure App Service. En outre, SQL Database retourne l’ID de suivi. Les services de support technique Microsoft peuvent utiliser ces informations.

Implémenter une logique de nouvelle tentative

Il est fortement recommandé que vos applications client utilise une logique de nouvelle tentative afin qu’il puisse rétablir une connexion après avoir donné à l’erreur temporaire le temps de se corriger elle-même. Nous vous recommandons de patienter 5 secondes avant votre première tentative. Si vous effectuez une nouvelle tentative avant 5 secondes, vous risquez de submerger le service cloud. Pour chaque nouvelle tentative suivante, le délai doit augmenter de manière exponentielle, sans dépasser 60 secondes.

Pour obtenir des exemples de code de logique de nouvelle tentative, voir :

Pour plus d’informations sur la gestion des erreurs temporaires dans votre application, consultez Résoudre les erreurs de connexion temporaires dans SQL Database et SQL Managed Instance

Pour en savoir plus sur la période de blocage des clients qui utilisent ADO.NET, consultez la page Regroupement de connexions (ADO.NET).

Messages d’erreur pour les erreurs temporaires (40197, 40613 et autres)

L’infrastructure Azure a la capacité de reconfigurer dynamiquement les serveurs quand des charges de travail importantes sont à traiter dans le service SQL Database. Ce comportement dynamique peut entraîner la perte par votre programme client de sa connexion à la base de données ou à l’instance. Ce type d’erreur état est connu sous le nom d’ erreur temporaire. Les événements de reconfiguration de la base de données sont liés à un événement planifié (par exemple, une mise à niveau logicielle) ou à un événement non planifié (par exemple, un arrêt de processus ou un équilibrage de charge). La plupart des événements de reconfiguration sont de courte durée et se terminent en l’espace de 60 secondes maximum. Cependant, ces événements peuvent parfois prendre plus de temps, par exemple lorsqu’une transaction volumineuse entraîne une récupération de longue durée. Le tableau suivant liste les différentes erreurs temporaires que les applications peuvent recevoir lors de la connexion à Azure SQL Database.

Liste de codes d’erreur pour les erreurs temporaires

Code d'erreur severity Description
926 14 Database 'replicatedmaster' cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server error log for more information.

Cette erreur peut être journalisée dans le journal des erreurs SQL Managed Instance pour une courte période à la dernière étape d’une reconfiguration quand l’ancienne base de donnée primaire arrête son journal.
D’autres scénarios non temporaires impliquant ce message d’erreur sont décrits dans la documentation sur les erreurs MSSQL.
4060 16 Cannot open database "%.*ls" requested by the login. The login failed.

Pour plus d’informations, consultez Erreurs 4000 à 4999
40197 17 The service has encountered an error processing your request. Please try again. Error code %d.

Vous recevez cette erreur lorsque le service est arrêté en raison de mises à niveau logicielles ou matérielles, de pannes de matériel ou tout autre problème de basculement. Le code d'erreur (%d) incorporé au message d'erreur 40197 fournit des informations supplémentaires sur le type de défaillance ou de basculement survenu. 40020, 40143, 40166 et 40540 sont des exemples de codes d'erreur incorporés au message d'erreur 40197.
La reconnexion vous reconnecte automatiquement à une copie saine de votre base de données. Votre application doit détecter l'erreur 40197, consigner le code d'erreur incorporé (%d) dans le message pour la résolution des problèmes, et essayer de se reconnecter à la base de données SQL jusqu'à ce que les ressources soient disponibles et que votre connexion soit rétablie. Pour plus d’informations, consultez Erreurs temporaires.
40501 20 The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d.

Pour plus d’informations, consultez :
Gestion des ressources.
Limites de ressources pour des pools élastiques suivant le modèle d’achat DTU.
Limites de vCores pour les bases de données uniques.
Limites de vCores pour les pools élastiques.
Limites des ressources d’Azure SQL Managed Instance.
40613 17 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'.

Cette erreur peut se produire s’il existe déjà une connexion d’administrateur dédiée (DAC) à la base de données. Pour plus d’informations, consultez Erreurs temporaires.
49918 16 Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later.

Pour plus d’informations, consultez :
Gestion des ressources.
Limites de ressources pour des pools élastiques suivant le modèle d’achat DTU.
Limites de vCores pour les bases de données uniques.
Limites de vCores pour les pools élastiques.
Limites des ressources d’Azure SQL Managed Instance.
49919 16 Cannot process create or update request. Too many create or update operations in progress for subscription "%ld".

Le service est occupé à traiter plusieurs demandes de création ou de mise à jour pour votre abonnement ou le serveur. Les requêtes sont actuellement bloquées pour l’optimisation des ressources. Requête sys.dm_operation_status pour les opérations en attente. Patientez jusqu’à ce que les demandes de création ou de mise à jour soient terminées ou supprimez l’une de vos requêtes en cours et réessayez votre requête ultérieurement. Si vos opérations semblent bloquées, attendez que d’autres opérations en cours se terminent ou, si possible, annulez-les. Par exemple, vous pouvez annuler une copie de base de données ou une création de géoréplica en supprimant la base de données ou le réplica en cours de création. Si vous ne parvenez pas à annuler une opération apparemment bloquée, ouvrez un ticket de support auprès de Microsoft.
49920 16 Cannot process request. Too many operations in progress for subscription "%ld".

Le service est occupé à traiter plusieurs demandes pour cet abonnement. Les requêtes sont actuellement bloquées pour l’optimisation des ressources. Requête sys.dm_operation_status pour l'état de l'opération. Patientez jusqu’à ce que les requêtes soient terminées ou supprimez l’une de vos requêtes en cours et réessayez votre requête ultérieurement. Si vos opérations semblent bloquées, attendez que d’autres opérations en cours se terminent ou, si possible, annulez-les. Par exemple, vous pouvez annuler une copie de base de données ou une création de géoréplica en supprimant la base de données ou le réplica en cours de création. Si vous ne parvenez pas à annuler une opération apparemment bloquée, ouvrez un ticket de support auprès de Microsoft.
4221 16 Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'.

Le réplica n’est pas disponible pour la connexion, car il manque des versions de ligne pour les transactions qui étaient en cours lorsque le réplica a été recyclé. Le problème peut être résolu en restaurant ou en validant les transactions actives au niveau du réplica principal. Les occurrences de cette erreur peuvent être réduites en évitant les transactions d’écriture longues sur le serveur principal.
615 21 Could not find database ID %d, name '%.*ls'

Cela signifie que le cache en mémoire n’est pas synchronisé avec l’instance de serveur SQL et que les recherches récupèrent un ID de base de données obsolète.

Les connexions SQL utilisent le cache de mémoire pour obtenir le nom de la base de données et le mappage d’ID. Le cache doit être synchronisé avec la base de données principale et mis à jour chaque fois que la base de données est attachée à l’instance de serveur SQL ou détachée de celle-ci.
Cette erreur se produit quand le workflow de détachement ne parvient pas à nettoyer le cache en mémoire à temps et que les recherches suivantes dans la base de données pointent vers un ID de base de données obsolète.
Essayez de vous reconnecter à SQL Database jusqu’à ce que la ressource soit disponible et que la connexion soit rétablie. Pour plus d’informations, consultez Erreurs temporaires.

Étapes pour résoudre les problèmes de connectivité transitoire

  1. Consultez le tableau de bord du service Microsoft Azure si des pannes connues se sont produites pendant la période au cours de laquelle l'application fait l'objet d'un rapport.
  2. Les applications qui se connectent à un service cloud, tel qu’Azure SQL Database, doivent s’attendre à des événements périodiques de reconfiguration et implémenter une logique de nouvelle tentative pour gérer ces erreurs au lieu d’afficher ces événements en tant qu’erreurs de l’application aux utilisateurs.
  3. Lorsqu’une base de données approche des limites de ressources, cela peut s’apparenter à un problème de connectivité transitoire. Consultez l’article Limites des ressources.
  4. Si les problèmes de connectivité persistent ou si la durée pendant laquelle votre application rencontre une erreur dépasse les 60 secondes ou si plusieurs occurrences de l’erreur s’affichent dans un jour donné, créez une demande de support Azure en sélectionnant Obtenir de l’aide sur le site du support Azure .

Ce problème se produit si l’application ne peut pas se connecter au serveur.

Pour le résoudre, suivez la procédure pas-à-pas de la section intitulée Étapes pour résoudre les problèmes de connexion courants.

Le serveur/l’instance est introuvable ou inaccessible (erreurs 26, 40, 10053)

Erreur 26 : Erreur lors de la localisation du serveur spécifié

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)

Erreur 40 : Impossible d’ouvrir une connexion au serveur

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)

Erreur 10053 : Une erreur de niveau transport s’est produite lors de la réception des résultats à partir du serveur.

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)

Ces problèmes se produisent si l’application ne peut pas se connecter au serveur.

Pour les résoudre, suivez la procédure pas-à-pas de la section intitulée Étapes pour résoudre les problèmes de connexion courants.

Impossible de se connecter au serveur en raison de problèmes de pare-feu

Erreur 40615 : Impossible de se connecter à <nom_serveur>

Pour résoudre ce problème, configurez les paramètres du pare-feu sur SQL Database via le Portail Azure.

Erreur 5 : Impossible de se connecter à <nom_serveur>

Pour résoudre ce problème, vérifiez que le port 1433 est ouvert pour les connexions sortantes sur tous les pare-feu situés entre le client et Internet.

Impossible de se connecter au serveur (Erreurs 18456, 40531)

Échec de la connexion pour l’utilisateur '<nom_utilisateur>'

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)

Pour résoudre ce problème, contactez votre administrateur de service afin d’obtenir un nom d’utilisateur et un mot de passe valides.

En règle générale, l’administrateur de service peut utiliser les étapes suivantes pour ajouter les informations d’identification de connexion :

  1. Connectez-vous au serveur à l’aide de SQL Server Management Studio (SSMS).

  2. Pour vérifier si le nom de connexion est désactivé, exécutez la requête SQL suivante dans la base de données master :

    SELECT name, is_disabled FROM sys.sql_logins;
    
  3. Si le nom correspondant est désactivé, vous pouvez décider de l'activer en utilisant l'instruction suivante :

    ALTER LOGIN <User name> ENABLE;
    
  4. Si le nom d’utilisateur de la connexion SQL n’existe pas, modifiez et exécutez la requête SQL suivante pour créer une connexion SQL :

    CREATE LOGIN <SQL_login_name, sysname, login_name>
    WITH PASSWORD = '<password, sysname, Change_Password>';
    GO
    
  5. Dans l’Explorateur d’objets SSMS, développez Bases de données.

  6. Sélectionnez la base de données dont vous souhaitez autoriser l’accès.

  7. Cliquez avec le bouton droit sur Sécurité, puis sélectionnez Nouveau, Utilisateur.

  8. Dans le script généré avec des espaces réservés, suivez les étapes pour remplacer les paramètres du modèle SSMS et l'exécuter, par exemple :

    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
    

    Vous pouvez également utiliser sp_addrolemember pour mapper des utilisateurs spécifiques à des rôles de base de données spécifiques.

    Notes

    Dans Azure SQL Database, utilisez la dernière syntaxe ALTER ROLE pour la gestion de l’appartenance au rôle de base de données.

Pour plus d’informations, consultez Autoriser l’accès aux bases de données.

Erreurs de délai d’expiration de connexion

System.Data.SqlClient.SqlException (0x80131904) : Délai d’expiration de la connexion dépassé

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) : Délai expiré

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: Échec du fournisseur sous-jacent sur Ouverture

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

Impossible de se connecter à <nom_serveur>

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

Ces exceptions peuvent se produire en raison de problèmes de connexion ou de requête. Pour confirmer que des problèmes de connectivité sont à l'origine de cette erreur, consultez Confirmer si une erreur est due à un problème de connectivité.

Des expirations de délai de connexion se produisent car l’application ne peut pas se connecter au serveur. Pour le résoudre, suivez la procédure pas-à-pas de la section intitulée Étapes pour résoudre les problèmes de connexion courants.

Erreurs d’arrêt de la connexion réseau

Les bibliothèques clientes SQL se connectent à Azure SQL Database et à Azure SQL Managed Instance à l’aide du protocole réseau TCP. Une bibliothèque cliente utilise un composant de niveau inférieur appelé fournisseur TCP pour gérer les connexions TCP. Lorsque le fournisseur TCP détecte qu’un hôte distant arrête de manière inattendue une connexion TCP existante, la bibliothèque de client génère une erreur. Étant donné que l’erreur est une erreur cliente et non une erreur de serveur SQL, aucun numéro d'erreur SQL n’est inclus. À la place, le numéro d’erreur est 0 et le message d’erreur du fournisseur TCP est utilisé.

Voici quelques exemples d’erreurs d’arrêt de la connexion réseau :

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.)

Des erreurs d’arrêt de la connexion peuvent se produire parce que la base de données ou le pool élastique est temporairement indisponible. Ils se produisent également en raison de divers problèmes dans l'infrastructure du réseau entre le serveur de base de données et l'application client, y compris les pare-feux, les appareils de réseau, etc. Ces problèmes peuvent être transitoires ou permanents. En règle générale, les applications doivent utiliser un nombre fixe de nouvelles tentatives pour ces erreurs avant de les considérer comme des échecs permanents.

Erreurs de gouvernance des ressources

Azure SQL Database utilise une implémentation de gouvernance des ressources basée sur Resource Governor pour appliquer des limites de ressources. En savoir plus sur la gestion des ressources dans Azure SQL Database.

Les erreurs de gouvernance des ressources les plus courantes sont répertoriées en premier, avec des détails, suivies d’un tableau des messages d’erreur de gouvernance des ressources.

Erreurs 10928 et 10936 : ID de ressource : 1. La limite de requêtes pour [base de données ou pool élastique] est %d et a été atteinte

Si la limite au niveau de la base de données est atteinte, le message d’erreur détaillé dans ce cas indique : 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.

Si la limite du pool élastique est atteinte, le message d’erreur détaillé dans ce cas indique : 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. Les limites du pool élastique sont supérieures aux limites de la base de données. Pour plus d’informations, consultez Limites de ressource. Des limites peuvent être atteintes lorsque plusieurs bases de données du pool utilisent simultanément une ressource (comme les workers).

Ce message d’erreur indique que le nombre limite de workers pour la base de données ou le pool élastique a été atteint. La valeur maximale des workers simultanés pour l’objectif de service de la base de données ou du pool élastique sera présente au lieu de l’espace réservé %d.

Notes

L’offre initiale d’Azure SQL Database prenait en charge uniquement les requêtes à thread unique. À ce moment-là, le nombre de demandes était toujours équivalent au nombre de workers. Les messages d’erreur 10928 et 10936 dans Azure SQL Database contiennent la formulation « La limite de requêtes [...] est N et elle a été atteinte » à des fins de compatibilité descendante. La limite atteinte est en réalité le nombre de workers. Si votre paramètre de degré de parallélisme (MAXDOP) est égal à zéro ou est supérieur à un, le nombre de workers peut être beaucoup plus élevé que le nombre de requêtes, et la limite pourrait être atteinte beaucoup plus tôt que lorsque MAXDOP est égal à 1.

Découvrez-en plus sur les sessions, workers et demandes.

Se connecter avec la connexion administrateur dédiée (DAC) si nécessaire

Si un incident survient et que le nombre limite de workers est atteint, vous pouvez obtenir l’erreur 10928 quand vous vous connectez à l’aide de SQL Server Management Studio (SSMS) ou d’Azure Data Studio. Une seule session peut se connecter à l’aide de la connexion de diagnostic pour les administrateurs de base de données (DAC) même lorsque le seuil maximal de workers est atteint.

Pour établir une connexion avec DAC à partir de SSMS :

  • Dans le menu, sélectionnez Fichier > Nouveau > Requête de moteur de base de données.
  • Dans la boîte de dialogue de connexion dans le champ Nom du serveur, entrez admin:<fully_qualified_server_name> (par exemple admin:servername.database.windows.net).
  • Sélectionnez Options >>
  • Sélectionnez l’onglet Propriétés de la connexion.
  • Dans la zone Connecter à la base de données :, tapez le nom de votre base de données.
  • Sélectionnez Connecter.

Si vous recevez l’erreur 40613, 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', cela peut indiquer qu’une autre session est déjà connectée à DAC. Une seule session peut se connecter à DAC pour une base de données unique ou un pool élastique à la fois.

Si vous rencontrez l’erreur « Échec de la connexion au serveur » après avoir sélectionné Connecter, il est possible que la session DAC ait pu être établie avec succès si vous utilisez une version de SSMS antérieure à 18.9. Les versions antérieures de SSMS ont tenté de fournir IntelliSense pour les connexions à DAC. Cela a échoué, car la connexion DAC prend en charge un seul worker et IntelliSense nécessite un worker distinct.

Vous ne pouvez pas utiliser une connexion DAC avec l’Explorateur d’objets dans SSMS.

Passer en revue votre utilisation max_worker_percent

Pour rechercher les statistiques de consommation des ressources pour votre base de données pendant 14 jours, interrogez la vue de catalogue système sys.resource_stats. La colonne max_worker_percent indique le pourcentage de workers utilisés par rapport au nombre limite de workers pour votre base de données. Connectez-vous à la base de données master sur votre serveur logique pour interroger sys.resource_stats.

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

Vous pouvez également interroger les statistiques de consommation des ressources de la dernière heure à partir de la vue de gestion dynamique sys.dm_db_resource_stats. Connectez-vous directement à votre base de données pour interroger sys.dm_db_resource_stats.

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

Réduire l’utilisation de workers lorsque cela est possible

Le blocage de chaînes peut provoquer une augmentation soudaine du nombre de workers dans une base de données. Un volume élevé de requêtes parallèles simultanées peut entraîner un grand nombre de workers. L’augmentation de votre degré maximal de parallélisme (MAXDOP) ou la définition de MAXDOP à zéro peut augmenter le nombre de workers actifs.

Triez un incident avec un nombre insuffisant de workers en procédant comme suit :

  1. Déterminez si un blocage est en cours ou si vous pouvez identifier un grand nombre de workers simultanés. Exécutez la requête suivante pour examiner les demandes en cours et vérifier si votre base de données retourne l’erreur 10928. Vous devrez peut-être vous connecter avec la connexion administrateur dédiée (DAC) pour exécuter la requête.

    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. Recherchez les lignes avec un blocking_session_id pour identifier les sessions bloquées. Recherchez chaque blocking_session_id dans la liste pour déterminer si cette session est également bloquée. En suivant les valeurs blocking_session_id et session_id, vous finirez par trouver le bloqueur principal : une session qui n'est pas bloquée mais qui bloque. Paramétrez la requête du bloqueur d’en-tête.

      Conseil

      Pour obtenir des informations plus complètes sur la résolution des problèmes liés aux requêtes à long terme ou de blocage, consultez Comprendre et résoudre les problèmes de blocage d’Azure SQL Database.

    2. Pour identifier un volume élevé de workers simultanés, examinez le nombre global de demandes et la colonne worker_count de chaque demande. Worker_count est le nombre de workers pendant la durée échantillonnée et il peut changer au fil de l’exécution de la demande. Optimisez les requêtes pour réduire l’utilisation des ressources si la raison de l’augmentation du nombre de workers est l’exécution de requêtes simultanées à leur degré de parallélisme optimal. Pour plus d’informations, consultez la page Paramétrage/Compréhension de requêtes.

  2. Évaluez le paramètre Degré maximal de parallélisme (MAXDOP) pour la base de données.

Augmenter le nombre limite de workers

Si la base de données ou le pool élastique atteint constamment sa limite de workers malgré la résolution des blocages, l’optimisation des requêtes et la validation de votre paramètre MAXDOP, envisagez d’effectuer un scale-up de la base de données ou du pool élastique pour augmenter le nombre limite de workers.

Recherchez les limites de ressources pour Azure SQL Database par niveau de service et taille de calcul :

Découvrez-en davantage sur la gouvernance des ressources Azure SQL Database des workers.

Erreur 10929 : ID de ressource : 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.

Erreur 40501 : Le service est actuellement occupé.

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

L’erreur 40501 est une erreur de limitation du moteur, indiquant que les limites de ressources sont dépassées.

Pour plus d’informations sur les limites de ressources, consultez Gestion des ressources dans Azure SQL Database.

Erreur 40544 : La base de données a atteint son quota de taille.

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>.

Cette erreur se produit quand la base de données a atteint son quota de taille.

La procédure suivante peut vous aider à contourner le problème ou vous fournir plus d’options :

  1. Vérifiez la taille actuelle de la base de données à l’aide du tableau de bord dans le portail Azure.

    Notes

    Pour identifier les tables qui consomment le plus d’espace et les candidats potentiels au nettoyage, exécutez la requête SQL suivante :

    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. Si la taille actuelle ne dépasse pas la taille maximale prise en charge pour votre édition, vous pouvez utiliser ALTER DATABASE pour augmenter le paramètre MAXSIZE.

  3. Si la base de données dépasse déjà la taille maximale prise en charge pour votre édition, essayez l’une de ces procédures :

    • Nettoyez normalement votre base de données. Par exemple, nettoyez les données indésirables en utilisant truncate/delete. Vous pouvez aussi déplacer les données à l’aide de SQL Server Integration Services (SSIS) ou de l’utilitaire Bulk Copy Program (BCP).
    • Partitionnez ou supprimez des données, supprimez des index ou consultez la documentation pour connaître les résolutions possibles.
    • Pour plus d’informations sur la mise à l’échelle des bases de données, consultez Mettre à l’échelle des ressources de base de données unique et Mettre à l’échelle des ressources de pool élastique.

Erreur 40549 : La session est arrêtée, car l’une des transactions est de longue durée.

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

Si cette erreur survient à plusieurs reprises, vous pouvez essayer de la résoudre en procédant ainsi :

  1. Exécutez la requête suivante pour voir les sessions ouvertes avec une valeur élevée pour la colonne duration_ms :

    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
    

    Vous pouvez ignorer les lignes dont la colonne input_buffer affiche la lecture d’une requête de sys.fn_MSxe_read_event_stream : ces demandes sont liées aux sessions d’événements étendus.

  2. Examinez la colonne blocking_session_id pour voir si le blocage contribue à des transactions à long terme.

    Notes

    Pour plus d’informations sur la résolution des problèmes de blocage dans Azure SQL Database, consultez Comprendre et résoudre les problèmes de blocage d’Azure SQL Database.

  3. Envisagez de traiter vos requêtes par lot. Pour plus d’informations sur la mise en lots, consultez Utiliser le traitement par lot pour améliorer les performances des applications Azure SQL Database et Azure SQL Managed Instance.

Erreur 40551 : La session a été arrêtée en raison d’une utilisation excessive de tempdb

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

Pour contourner ce problème, effectuez les étapes suivantes :

  1. Modifiez les requêtes afin de réduire l’utilisation de l’espace de table temporaire.
  2. Supprimez les objets temporaires une fois qu’ils ne sont plus nécessaires.
  3. Tronquez les tables ou supprimez les tables inutilisées.

Erreur 40552 : La session a été arrêtée en raison de l’utilisation excessive de l’espace réservé au journal des transactions

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

Pour corriger ce problème, essayez les méthodes suivantes :

Erreur 40553 : La session a été arrêtée en raison d’une utilisation excessive de la mémoire

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

Pour contourner ce problème, essayez d’optimiser la requête.

Pour obtenir une procédure de dépannage détaillée, consultez Is my query running fine in the cloud? (Ma requête s’exécute-t-elle correctement dans le cloud ?)

Pour plus d’informations sur d’autres erreurs de mémoire insuffisante et des exemples de requêtes, consultez Résoudre les erreurs de mémoire insuffisante avec Azure SQL Database.

Tableau des messages d’erreur de gouvernance des ressources

Code d'erreur severity Description
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.

L’ID de la ressource indique la ressource qui a atteint la limite. Lorsque l’ID de ressource = 1, cela indique qu’un nombre limite de workers a été atteint. Apprenez-en davantage dans Erreur 10928 : ID de ressource : 1. La limite de requêtes pour la base de données est %d et elle a été atteinte. Lorsque l’ID de ressource = 2, cela indique que la limite de session a été atteinte.
Apprenez-en davantage sur les limites de ressources :
Gestion des ressources dans Azure SQL Database.
Limites de ressources pour le modèle d’achat DTU.
Limites de vCores pour les bases de données uniques.
Limites des ressources d’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.

L’ID de la ressource indique la ressource qui a atteint la limite. Lorsque l’ID de ressource = 1, cela indique qu’un nombre limite de workers a été atteint. Apprenez-en davantage dans Erreur 10936 : ID de ressource : 1. La limite de requêtes pour le pool élastique est %d et elle a été atteinte. Lorsque l’ID de ressource = 2, cela indique que la limite de sessions a été atteinte.
Apprenez-en davantage sur les limites de ressources :
Gestion des ressources dans Azure SQL Database.
Limites de ressources pour des pools élastiques suivant le modèle d’achat DTU.
Limites de vCores pour les pools élastiques.
Limites des ressources d’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.

L’ID de la ressource indique la ressource qui a atteint la limite. Pour les threads de travail, ID de la ressource = 1. Pour les sessions, l’ID de ressource = 2. Pour plus d’informations, consultez :
Gestion des ressources dans Azure SQL Database.
Limites de ressources pour des pools élastiques suivant le modèle d’achat DTU.
Limites de vCores pour les bases de données uniques.
Limites de vCores pour les pools élastiques.
Limites des ressources d’Azure SQL Managed Instance.
Sinon, réessayez plus tard.
40544 20 The database has reached its size quota. Partition or delete data, drop indexes, or consult the documentation for possible resolutions.

Pour plus d’informations sur la mise à l’échelle des bases de données, consultez Mettre à l’échelle des ressources de base de données unique et Mettre à l’échelle des ressources de pool élastique.
40549 16 Session is terminated because you have a long-running transaction. Try shortening your transaction.

Pour plus d’informations sur la mise en lots, consultez Utiliser le traitement par lot pour améliorer les performances des applications Azure SQL Database et Azure SQL Managed Instance.
40550 16 The session has been terminated because it has acquired too many locks. Try reading or modifying fewer rows in a single transaction.

Pour plus d’informations sur la mise en lots, consultez Utiliser le traitement par lot pour améliorer les performances des applications Azure SQL Database et Azure SQL Managed Instance.
40551 16 The session has been terminated because of excessive tempdb usage. Try modifying your query to reduce the temporary table space usage.

Si vous utilisez des objets temporaires, conservez de l’espace dans la base de données tempdb en supprimant des objets temporaires une fois qu’ils ne sont plus nécessaires à la session. Pour plus d’informations sur les limites de tempdb dans SQL Database, consultez Base de données tempdb dans SQL Database.
40552 16 The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Pour plus d’informations sur la mise en lots, consultez Utiliser le traitement par lot pour améliorer les performances des applications Azure SQL Database et Azure SQL Managed Instance.
Si vous effectuez des insertions en bloc à l’aide de l’utilitaire bcp.exe ou de la classe System.Data.SqlClient.SqlBulkCopy, essayez d’utiliser les options -b batchsize ou BatchSize permettant de limiter le nombre de lignes copiées sur le serveur à chaque transaction. Si vous reconstruisez un index en utilisant l’instruction ALTER INDEX, essayez d’utiliser l’option REBUILD WITH ONLINE = ON. Pour plus d’informations sur les tailles des journaux des transactions pour le modèle d’achat vCore, consultez :
Limites de vCores pour les bases de données uniques.
Limites de vCores pour les pools élastiques.
Limites des ressources d’Azure SQL Managed Instance.
40553 16 The session has been terminated because of excessive memory usage. Try modifying your query to process fewer rows.

La diminution du nombre d’opérations ORDER BY et GROUP BY dans votre code Transact-SQL réduit les besoins en mémoire de votre requête. Pour plus d’informations sur la mise à l’échelle des bases de données, consultez Mettre à l’échelle des ressources de base de données unique et Mettre à l’échelle des ressources de pool élastique. Pour plus d’informations sur les erreurs de mémoire insuffisante et des exemples de requêtes, consultez Résoudre les erreurs de mémoire insuffisante avec Azure SQL Database.

Erreurs relatives au pool élastique

Les erreurs suivantes sont liées à la création et à l’utilisation de pools élastiques :

Code d'erreur severity Description Action corrective
1132 17 The elastic pool has reached its storage limit. The storage usage for the elastic pool cannot exceed (%d) MBs.

Tentative d’écriture de données dans une base de données alors que la limite de stockage du pool élastique a été atteinte. Pour plus d’informations sur les limites de ressources, consultez :
Limites de ressources pour des pools élastiques suivant le modèle d’achat DTU.
Limites de vCores pour les pools élastiques.
Envisagez si possible d’augmenter le nombre de DTU du pool élastique ou d’ajouter de la capacité de stockage à ce dernier afin d’accroître sa limite de stockage. Vous pouvez aussi réduire l’espace de stockage utilisé par les bases de données individuelles qu’il contient ou supprimer certaines de ses bases de données. Pour plus d’informations sur la mise à l’échelle d’un pool élastique, consultez Mettre à l’échelle des ressources de pool élastique. Pour plus d’informations sur la suppression de l’espace inutilisé dans les bases de données, consultez Gérer l'espace de fichier des bases de données dans Azure SQL Database.
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.

Pour plus d’informations sur les limites de ressources, consultez :
Limites de ressources DTU pour les pools élastiques.
Limites de vCores pour les pools élastiques.
Sinon, réessayez plus tard. Nombre minimal de DTU/vCore par base de données ; nombre maximal de DTU/vCore par base de données. Le nombre total de workers simultanés dans toutes les bases de données du pool élastique a tenté de dépasser la limite du pool.
Envisagez si possible d’augmenter le nombre de DTU ou de vCore du pool élastique afin d’accroître sa limite de rôles de travail, ou supprimez des bases de données du pool élastique.
40844 16 Database '%ls' on Server '%ls' is a '%ls' edition database in an elastic pool and cannot have a continuous copy relationship. S/O
40857 16 Elastic pool not found for server: '%ls', elastic pool name: '%ls'. Specified elastic pool does not exist in the specified server. Indiquez un nom de pool élastique valide.
40858 16 Elastic pool '%ls' already exists in server: '%ls'. Specified elastic pool already exists in the specified server. Saisissez un nouveau nom pour le pool élastique.
40859 16 Elastic pool does not support service tier '%ls'. Specified service tier is not supported for elastic pool provisioning. Saisissez l’édition correcte, ou laissez le champ du niveau de service vide afin d’utiliser le niveau de service par défaut.
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'. Spécifiez la combinaison de pool élastique et de niveau de service adéquate.
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. Indiquez une édition de base de données identique au niveau de service du pool élastique. L’édition de base de données n’a pas besoin d’être spécifiée.
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. Si vous utilisez l’objectif de service du pool élastique, spécifiez le nom du pool élastique.
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. Essayez à nouveau de définir le nombre de DTU du pool élastique sur la limite minimale ou plus.
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. Essayez à nouveau de définir le nombre de DTU du pool élastique sur la limite maximale ou moins.
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. Envisagez d’utiliser le niveau de service du pool élastique prenant en charge le paramètre souhaité.
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. Envisagez d’utiliser le niveau de service du pool élastique prenant en charge le paramètre souhaité.
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. Envisagez d’utiliser le niveau de service du pool élastique prenant en charge le paramètre souhaité.
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. Envisagez d’augmenter le nombre de DTU du pool élastique, ou de réduire le nombre minimal de DTU par base de données ou le nombre de bases de données dans le pool élastique.
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. Supprimez les bases de données du pool élastique afin de pouvoir supprimer ce dernier.
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. Envisagez d’augmenter le nombre de DTU du pool élastique, le cas échéant, afin d’accroître le nombre limite de bases de données, ou de supprimer des bases de données du pool élastique.
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. Envisagez de réduire le taux d’utilisation du stockage des bases de données individuelles dans le pool élastique, ou de supprimer des bases de données dans le pool afin de réduire sa limite de stockage ou celles des DTU.
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. Vérifiez que le nombre minimal de DTU par base de données ne dépasse pas le nombre maximal de DTU par base de données.
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. Définissez la taille maximale de la base de données dans les limites de la taille maximale autorisée par le niveau de service du pool élastique.

Impossible d’ouvrir la base de données « Master » demandée par la connexion. La connexion a échoué

Ce problème se produit car le compte ne dispose pas de l’autorisation d’accès à la base de données master. Toutefois, par défaut, SQL Server Management Studio (SSMS) tente de se connecter à la base de données master.

Pour résoudre ce problème, effectuez les étapes suivantes :

  1. Sur l’écran de connexion de SSMS, sélectionnez Options, puis Propriétés de la connexion.

  2. Dans le champ Connexion à une base de données, entrez le nom de la base de données par défaut de l’utilisateur comme base de données de connexion par défaut, puis sélectionnez Se connecter.

    Capture d'écran de la boîte de dialogue Connect dans SSMS, montrant l'onglet Propriétés de la connexion.

Erreurs en lecture seule

Si vous tentez d’écrire dans une base de données en lecture seule, un message d’erreur s’affiche. Dans certains scénarios, la cause de l’état de en lecture seule de la base de données peut ne pas être immédiatement évidente.

Erreur 3906 : Échec de la mise à jour de la base de données « databaseName », car celle-ci est en lecture seule.

Lors d’une tentative de modification d’une base de données en lecture seule, l’erreur suivante est générée.

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

Il existe plusieurs explications possibles pour la raison pour laquelle une base de données est en lecture seule.

Après un basculement manuel, les applications se connectent toujours à l’ancien réplica

Dans Azure SQL Database, après un basculement vers un autre réplica, votre application peut toujours se connecter au réplica principal précédent en raison du DNS. Le routage des connexions de groupe de basculement est implémenté à l’aide du DNS.

Causes racines potentielle :

  1. Pendant le basculement, les points de terminaison du groupe de basculement sont mis à jour pour pointer vers les nouveaux serveurs principaux et secondaires appropriés en modifiant la cible de l’entrée DNS appropriée. Par défaut, les entrées DNS sont créées avec une durée de vie de 30 secondes, ce qui signifie que les clients DNS mettez ces entrées en cache pendant 30 secondes. Par conséquent, les mises à jour des enregistrements DNS ne se propagent pas immédiatement ; les entrées seront obsolètes jusqu’à ce que tous les clients et les nœuds intermédiaires aient actualisé leurs caches. Par conséquent, il peut prendre n’importe où entre 0 et environ 10 minutes (selon la topologie de réseau) pour que les connexions aux points de terminaison de groupe de basculement soient routées vers leurs nouvelles cibles après un basculement. Le vidage des caches DNS peut ou ne pas aider le problème, car les nœuds réseau intermédiaires qui répondent aux requêtes DNS souhaitent également mettre en cache les résultats DNS pendant un certain temps.

    La solution de contournement recommandée pour ce problème consiste simplement à attendre que les entrées DNS soient actualisées sur le client. Actuellement, cette solution de contournement entraînerait la résolution du problème à l’intérieur de 10 minutes.

  2. Certaines bibliothèques clientes SQL utilisent une fonctionnalité appelée « regroupement de connexions » qui réutilise les connexions à la même source de données plutôt que de les fermer et de les rouvrir chaque fois qu’une nouvelle connexion de base de données est nécessaire. En particulier, le regroupement de connexions est activé par défaut dans ADO.NET. En cas de combinaison lorsque le problème décrit dans 1), le regroupement de connexions peut entraîner la réutilisation d’une connexion à l’ancienne base de données, ce qui empêche l’application de se connecter à la nouvelle base de données primaire indéfiniment.

Solutions :

Il existe trois solutions de contournement potentielles à ce problème DNS après un basculement de groupe de basculement :

  1. Modifiez l’application pour appeler SQLConnection.ClearAllPools ou SQLConnection.ClearPool(conn) chaque fois qu’une erreur « en lecture seule » est rencontrée.
  2. Dans l’application chaîne de connexion, spécifiez Pooling=False pour désactiver le regroupement de connexions. Cela doit être testé, car il peut avoir un impact significatif sur les performances si l’application ouvre et ferme fréquemment les connexions.
  3. Une autre option pour éviter les retards de réplication/de mise en cache DNS consiste à se connecter directement à l’aide du nom du serveur logique Azure SQL Database (du serveur secondaire d’origine, maintenant le nouveau serveur principal) pour une fenêtre de temps après la rencontre de 3906.

Vous êtes peut-être connecté à un réplica en lecture seule

Pour Azure SQL Database et Azure SQL Managed Instance, vous êtes peut-être connecté à une base de données sur un réplica en lecture seule. Dans ce cas, la requête suivante qui utilise la fonction DATABASEPROPERTYEX () retourne READ_ONLY :

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

Si vous vous connectez avec SQL Server Management Studio, vérifiez que vous avez spécifié ApplicationIntent=ReadOnly sous l’onglet Paramètres de connexion supplémentaires de vos options de connexion.

Si la connexion provient d’une application ou d’un client utilisant une chaîne de connexion, vérifiez que la chaîne de connexion a spécifié ApplicationIntent=ReadOnly. Pour plus d’informations, consultez Se connecter à un réplica en lecture seule.

La base de données peut être définie comme en lecture seule

Si vous utilisez Azure SQL Database, la base de données proprement dite peut avoir été définie comme en lecture seule. Vous pouvez vérifier l’état de la base de données à l’aide de la requête suivante :

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

Vous pouvez modifier l’état de lecture seule d’une base de données dans Azure SQL Database à l’aide de ALTER DATABASE Transact-SQL. Vous ne pouvez actuellement pas définir une base de données dans une instance managée en lecture seule.

Vérifier si une erreur est due à un problème de connectivité

Pour vérifier si une erreur est due à un problème de connectivité, consultez la trace de la pile pour les frames qui montrent des appels visant à ouvrir une connexion, comme les suivants (notez la référence à la classe SqlConnection) :

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

Quand l’exception est déclenchée par des problèmes de requête, vous remarquerez une pile des appels semblable à la suivante (notez la référence à la classe SqlCommand). Dans ce cas, affinez vos requêtes.

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

Pour plus d’informations sur l’affinage des performances, consultez les ressources suivantes :