Risolvere, diagnosticare ed evitare gli errori di connessione SQL e gli errori temporanei per il database SQLTroubleshoot, diagnose, and prevent SQL connection errors and transient errors for SQL Database

Questo articolo illustra come evitare, risolvere, diagnosticare e ridurre gli errori di connessione e gli errori temporanei che si verificano nell'applicazione client durante l'interazione con il database SQL di Azure.This article describes how to prevent, troubleshoot, diagnose, and mitigate connection errors and transient errors that your client application encounters when it interacts with Azure SQL Database. Informazioni su come configurare la logica di ripetizione dei tentativi, compilare la stringa di connessione e modificare altre impostazioni di connessione.Learn how to configure retry logic, build the connection string, and adjust other connection settings.

Errori temporaneiTransient errors (transient faults)

Un errore temporaneo è un errore la cui causa sottostante si risolverà automaticamente in modo rapido.A transient error - also, transient fault - has an underlying cause that will soon resolve itself. Una causa occasionale di errori temporanei è costituita dal cambio rapido di risorse hardware da parte del sistema Azure per ottenere un bilanciamento migliore dei diversi carichi di lavoro.An occasional cause of transient errors is when the Azure system quickly shifts hardware resources to better load-balance various workloads. La maggior parte di questi eventi di riconfigurazione spesso viene completata in meno di 60 secondi.Most of these reconfiguration events often complete in less than 60 seconds. Durante questo intervallo di riconfigurazione possono verificarsi problemi di connessione al database SQL di Azure.During this reconfiguration time span, you may have connectivity issues to Azure SQL Database. Le applicazioni che si connettono al database SQL di Azure devono essere create in modo da prevedere questi errori temporanei, gestirli implementando la logica di ripetizione dei tentativi nel codice anziché visualizzandoli agli utenti come errori dell'applicazione.Applications connecting to Azure SQL Database should be built to expect these transient errors, handle them by implementing retry logic in their code instead of surfacing them to users as application errors.

Se il programma client usa ADO.NET, l'errore temporaneo verrà segnalato al programma tramite la generazione di un'eccezione SqlException.If your client program is using ADO.NET, your program is told about the transient error by the throw of an SqlException. È possibile confrontare la proprietà Number con l'elenco di errori temporanei disponibili nella parte iniziale dell'argomento Codici di errore SQL per applicazioni client del database SQL.The Number property can be compared against the list of transient errors near the top of the topic: SQL error codes for SQL Database client applications.

Confronto tra connessione e comandoConnection versus command

È possibile riprovare a stabilire la connessione SQL o stabilirne una nuova, in base a quanto indicato di seguito:You'll retry the SQL connection or establish it again, depending on the following:

  • Si verifica un errore temporaneo durante un tentativo di connessione: riprovare a stabilire la connessione dopo un intervallo di alcuni secondi.A transient error occurs during a connection try: The connection should be retried after delaying for several seconds.
  • Si verifica un errore temporaneo durante un comando di query SQL: non riprovare immediatamente a eseguire il comando.A transient error occurs during a SQL query command: The command should not be immediately retried. È invece consigliabile stabilire una nuova connessione dopo un breve intervallo di tempo.Instead, after a delay, the connection should be freshly established. Sarà quindi possibile provare a rieseguire il comando.Then the command can be retried.

Logica di ripetizione dei tentativi per errori temporaneiRetry logic for transient errors

I programmi client in cui occasionalmente si verifica un errore temporaneo sono più affidabili se contengono una logica di ripetizione dei tentativi.Client programs that occasionally encounter a transient error are more robust when they contain retry logic.

Se il programma comunica con il database SQL di Azure tramite middleware di terze parti, chiedere al fornitore se il middleware include la logica di ripetizione dei tentativi per errori temporanei.When your program communicates with Azure SQL Database through a 3rd party middleware, inquire with the vendor whether the middleware contains retry logic for transient errors.

Principi per la ripetizione dei tentativiPrinciples for retry

  • È consigliabile ripetere un tentativo di stabilire una connessione se l'errore è temporaneo.An attempt to open a connection should be retried if the error is transient.
  • Non è consigliabile riprovare direttamente a eseguire un'istruzione SQL SELECT non riuscita con un errore temporaneo.A SQL SELECT statement that fails with a transient error should not be retried directly.

    • Stabilire invece una nuova connessione e quindi provare a eseguire di nuovo l'istruzione SELECT.Instead, establish a fresh connection, and then retry the SELECT.
  • Quando un'istruzione SQL UPDATE non riesce con un errore temporaneo, è consigliabile stabilire una nuova connessione prima di provare a eseguire di nuovo l'istruzione UPDATE.When a SQL UPDATE statement fails with a transient error, a fresh connection should be established before the UPDATE is retried.

    • La logica di ripetizione dei tentativi deve assicurare il completamento dell'intera transazione di database o il rollback dell'intera transazione.The retry logic must ensure that either the entire database transaction completed, or that the entire transaction is rolled back.

Altre considerazioni per la ripetizione dei tentativiOther considerations for retry

  • Un programma batch avviato automaticamente dopo l'orario di lavoro e con completamento previsto prima del mattino può permettersi di attendere a lungo tra i diversi tentativi.A batch program that is automatically started after work hours, and which will complete before morning, can afford to very patient with long time intervals between its retry attempts.
  • Un programma di interfaccia utente deve tenere conto della tendenza degli utenti a desistere dopo un'attesa troppo lunga.A user interface program should account for the human tendency to give up after too long a wait.

    • La soluzione, tuttavia, non deve prevedere nuovi tentativi con intervalli di pochi secondi, perché un criterio simile può inondare il sistema con un numero eccessivo di richieste.However, the solution must not be to retry every few seconds, because that policy can flood the system with requests.

Incremento dell'intervallo tra i tentativiInterval increase between retries

È consigliabile attendere 5 secondi prima di riprovare.We recommend that you delay for 5 seconds before your first retry. Al primo tentativo con un ritardo inferiore a 5 secondi, si rischia di sovraccaricare il servizio cloud.Retrying after a delay shorter than 5 seconds risks overwhelming the cloud service. Per ogni tentativo successivo, aumentare in modo esponenziale il ritardo, fino a un massimo di 60 secondi.For each subsequent retry the delay should grow exponentially, up to a maximum of 60 seconds.

Per i client che usano ADO.NET, è disponibile una discussione sul periodo di blocco in Pool di connessioni di SQL Server (ADO.NET).A discussion of the blocking period for clients that use ADO.NET is available in SQL Server Connection Pooling (ADO.NET).

È anche possibile che si voglia impostare un numero massimo di nuovi tentativi prima dell'autoterminazione del programma.You might also want to set a maximum number of retries before the program self-terminates.

Esempi di codice con logica di ripetizione dei tentativiCode samples with retry logic

Esempi di codice di logica di ripetizione dei tentativi sono disponibili in:Code examples with retry logic are available at:

Eseguire test sulla logica di ripetizione tentativiTest your retry logic

Per testare la logica di ripetizione dei tentativi, è necessario simulare o provocare un errore che può essere corretto mentre il programma è ancora in esecuzione.To test your retry logic, you must simulate or cause an error than can be corrected while your program is still running.

Eseguire il test mediante la disconnessione dalla reteTest by disconnecting from the network

Uno dei modi per testare la logica di ripetizione dei tentativi consiste nel disconnettere il computer client dalla rete mentre il programma è in esecuzione.One way you can test your retry logic is to disconnect your client computer from the network while the program is running. Verrà visualizzato un errore analogo a:The error will be:

  • SqlException.Number = 11001SqlException.Number = 11001
  • Messaggio: "Host sconosciuto"Message: "No such host is known"

Come parte del primo tentativo, il programma può correggere l'errore di digitazione e quindi provare a connettersi.As part of the first retry attempt, your program can correct the misspelling, and then attempt to connect.

Per semplificare le operazioni, disconnettere il computer dalla rete prima di avviare il programma.To make this practical, you unplug your computer from the network before you start your program. Il programma riconoscerà quindi un parametro di runtime che ha le conseguenze seguenti sul programma:Then your program recognizes a run time parameter that causes the program to:

  1. Aggiunta temporanea di 11001 al rispettivo elenco di errori da considerare temporanei.Temporarily add 11001 to its list of errors to consider as transient.
  2. Tentativo della prima connessione come di consueto.Attempt its first connection as usual.
  3. Dopo il rilevamento dell'errore, rimozione di 11001 dall'elenco.After the error is caught, remove 11001 from the list.
  4. Visualizzazione di un messaggio che richiede all'utente di connettere il computer alla rete.Display a message telling the user to plug the computer into the network.
    • Sospensione delle ulteriori esecuzioni con il metodo Console.ReadLine o una finestra di dialogo con un pulsante OK.Pause further execution by using either the Console.ReadLine method or a dialog with an OK button. L'utente preme il tasto INVIO dopo la connessione del computer alla rete.The user presses the Enter key after the computer plugged into the network.
  5. Nuovo tentativo di connessione, con esito positivo previsto.Attempt again to connect, expecting success.

Eseguire il test mediante la digitazione non corretta del nome del database durante la connessioneTest by misspelling the database name when connecting

Il programma può intenzionalmente digitare in modo errato il nome utente prima del primo tentativo di connessione.Your program can purposely misspell the user name before the first connection attempt. Verrà visualizzato un errore analogo a:The error will be:

  • SqlException.Number = 18456SqlException.Number = 18456
  • Messaggio: "Accesso non riuscito per l'utente 'WRONG_MyUserName'."Message: "Login failed for user 'WRONG_MyUserName'."

Come parte del primo tentativo, il programma può correggere l'errore di digitazione e quindi provare a connettersi.As part of the first retry attempt, your program can correct the misspelling, and then attempt to connect.

Per semplificare le operazioni, il programma potrebbe riconoscere un parametro di runtime che ha le conseguenze seguenti sul programma:To make this practical, your program could recognize a run time parameter that causes the program to:

  1. Aggiunta temporanea di 18456 al rispettivo elenco di errori da considerare temporanei.Temporarily add 18456 to its list of errors to consider as transient.
  2. Aggiunta intenzionale di 'WRONG_' al nome utente.Purposely add 'WRONG_' to the user name.
  3. Dopo il rilevamento dell'errore, rimozione di 18456 dall'elenco.After the error is caught, remove 18456 from the list.
  4. Rimozione di 'WRONG_' dal nome utente.Remove 'WRONG_' from the user name.
  5. Nuovo tentativo di connessione, con esito positivo previsto.Attempt again to connect, expecting success.

Parametri di SqlConnection di .NET per nuovi tentativi di connessione.NET SqlConnection parameters for connection retry

Se il programma client si connette al database SQL di Azure usando la classe System.Data.SqlClient.SqlConnection, è necessario usare .NET 4.6.1 o versioni successive (o .NET Core) per poterne sfruttare la funzionalità di ripetizione dei tentativi di connessione.If your client program connects to to Azure SQL Database by using the .NET Framework class System.Data.SqlClient.SqlConnection, you should use .NET 4.6.1 or later (or .NET Core) so you can leverage its connection retry feature. Per conoscere i dettagli della funzionalità, vedere qui.Details of the feature are here.

Quando si crea la stringa di connessione per l'oggetto SqlConnection , è necessario coordinare i valori tra i parametri seguenti:When you build the connection string for your SqlConnection object, you should coordinate the values among the following parameters:

  • ConnectRetryCount   (Il valore predefinito è 1. L'intervallo consentito è tra 0 e 255.)ConnectRetryCount   (Default is 1. Range is 0 through 255.)
  • ConnectRetryInterval   (Il valore predefinito è 1 secondo. L'intervallo consentito è tra 1 e 60.)ConnectRetryInterval   (Default is 1 second. Range is 1 through 60.)
  • Timeout di connessione   (Il valore predefinito è 15 secondi. L'intervallo consentito è tra 0 e 2147483647)Connection Timeout   (Default is 15 seconds. Range is 0 through 2147483647)

In particolare, i valori scelti devono rendere vera l'eguaglianza seguente:Specifically, your chosen values should make the following equality true:

  • Timeout di connessione = ConnectRetryCount * ConnectionRetryIntervalConnection Timeout = ConnectRetryCount * ConnectionRetryInterval

Ad esempio, se il numero = 3 e l'intervallo = 10 secondi, un timeout di soli 29 secondi non garantirebbe al sistema il tempo sufficiente per il terzo tentativo e il tentativo di connessione finale: 29 < 3 * 10.For example, if the count = 3, and interval = 10 seconds, a timeout of only 29 seconds would not quite give the system enough time for its 3rd and final retry at connecting: 29 < 3 * 10.

Confronto tra connessione e comandoConnection versus command

I parametri ConnectRetryCount e ConnectRetryInterval consentono all'oggetto SqlConnection di ripetere l'operazione di connessione senza interferire con il programma, ad esempio per restituire il controllo al programma.The ConnectRetryCount and ConnectRetryInterval parameters let your SqlConnection object retry the connect operation without telling or bothering your program, such as returning control to your program. I tentativi possono verificarsi nelle situazioni seguenti:The retries can occur in the following situations:

  • Chiamata al metodo mySqlConnection.OpenmySqlConnection.Open method call
  • Chiamata al metodo mySqlConnection.ExecutemySqlConnection.Execute method call

È importante sottolineare che,There is a subtlety. se si verifica un errore temporaneo durante l'esecuzione della query, l'oggetto SqlConnection non ripete l'operazione di connessione e certamente non ritenta l'esecuzione della query.If a transient error occurs while your query is being executed, your SqlConnection object does not retry the connect operation, and it certainly does not retry your query. Prima di inviare la query per l'esecuzione, tuttavia, SqlConnection controlla rapidamente la connessione e,However, SqlConnection very quickly checks the connection before sending your query for execution. se viene rilevato un problema, SqlConnection ritenta l'operazione di connessione.If the quick check detects a connection problem, SqlConnection retries the connect operation. Se il tentativo ha esito positivo, la query viene inviata per l'esecuzione.If the retry succeeds, you query is sent for execution.

Opportunità di combinare ConnectRetryCount con la logica di ripetizione dei tentativi nell'applicazioneShould ConnectRetryCount be combined with application retry logic?

Si supponga che l'applicazione disponga di una logica di ripetizione dei tentativi particolarmente avanzata,Suppose your application has robust custom retry logic. in cui l'operazione di connessione può essere ritentata fino a 4 volte.It might retry the connect operation 4 times. Se si aggiunge ConnectRetryInterval e ConnectRetryCount = 3 alla stringa di connessione, il numero dei tentativi aumenterà a 4 * 3 = 12 tentativi.If you add ConnectRetryInterval and ConnectRetryCount =3 to your connection string, you will increase the retry count to 4 * 3 = 12 retries. Un numero così elevato di tentativi potrebbe non essere consigliabile.You might not intend such a high number of retries.

Connessioni al database SQL di AzureConnections to Azure SQL Database

Connessione: stringa di connessioneConnection: Connection string

La stringa di connessione necessaria per la connessione al database SQL di Azure è leggermente diversa dalla stringa usata per la connessione a Microsoft SQL Server.The connection string necessary for connecting to Azure SQL Database is slightly different from the string for connecting to Microsoft SQL Server. È possibile copiare la stringa di connessione per il database dal portale di Azure.You can copy the connection string for your database from the Azure portal.

Ottenere la stringa di connessione dal portale di AzureObtain the connection string from the Azure portal

Usare il portale di Azure per ottenere la stringa di connessione necessaria al programma client per interagire con il database SQL di Azure:Use the Azure portal to obtain the connection string necessary for your client program to interact with Azure SQL Database:

  1. Fare clic su ESPLORA > Database SQL.Click BROWSE > SQL databases.
  2. Immettere il nome del database nella casella di testo filtro vicino alla parte superiore sinistra del pannello Database SQL .Enter the name of your database into the filter text box near the upper-left of the SQL databases blade.
  3. Fare clic sulla riga per il database.Click the row for your database.
  4. Quando viene visualizzato il pannello del database, è possibile scegliere i controlli di riduzione a icona standard per comprimere i pannelli usati per la ricerca e il filtro del database per una visualizzazione più chiara.After the blade appears for your database, for visual convenience you can click the standard minimize controls to collapse the blades you used for browsing and database filtering.

    Filtro per isolare il database

  5. Nel pannello del database, fare clic su Mostra stringhe di connessione di database.On the blade for your database, click Show database connection strings.
  6. Se si prevede di utilizzare la libreria di connessione ADO.NET, copiare la stringa di etichetta ADO.If you intend to use the ADO.NET connection library, copy the string labeled ADO.

    Copiare la stringa di connessione ADO per il database

  7. In un formato o un altro, incollare le informazioni sulla stringa di connessione nel codice del programma client.In one format or another, paste the connection string information into your client program code.

Per altre informazioni, vedere il blog sul For more information, see:
Stringhe di connessione e file di configurazione.Connection Strings and Configuration Files.

Connessione: indirizzo IPConnection: IP address

È necessario configurare il server di database SQL in modo che accetti le comunicazioni dall'indirizzo IP del computer che ospita il programma client.You must configure the SQL Database server to accept communication from the IP address of the computer that hosts your client program. Per eseguire questa operazione, modificare le impostazioni del firewall tramite il portale di Azure.You do this by editing the firewall settings through the Azure portal.

Se si dimentica di configurare l'indirizzo IP, il programma restituirà un messaggio di errore che indica l'indirizzo IP necessario.If you forget to configure the IP address, your program will fail with a handy error message that states the necessary IP address.

  1. Accedere al portale di Azure all'indirizzo http://portal.azure.com/.Log in to the Azure portal at http://portal.azure.com/.
  2. Nell'intestazione di sinistra, fare clic su ESPLORA TUTTO.In the left banner, click BROWSE ALL. Il pannello Sfoglia viene visualizzato.The Browse blade is displayed.
  3. Scorrere e fare clic su Server SQL.Scroll and click SQL servers. Il pannello istanze di SQL Server viene visualizzato.The SQL servers blade is displayed.

    Trovare il server di Database SQL di Azure nel portale di

  4. Per praticità, ridurre a icona i pannelli precedenti nel pannello Sfoglia .For convenience, click the minimize control on the earlier Browse blade.
  5. Nella casella di testo di filtro, iniziare a digitare il nome del server.In the filter text box, start typing the name of your server. Viene visualizzata la riga.Your row is displayed.
  6. Fare clic sulla riga per il server.Click the row for your server. Viene visualizzato un pannello per il server.A blade for your server is displayed.
  7. Nel pannello del server, fare clic su impostazioni.On your server blade, click Settings. Il pannello impostazioni viene visualizzato.The Settings blade is displayed.
  8. Fare clic su Firewall.Click Firewall. Il pannello Impostazioni del Firewall viene visualizzato.The Firewall Settings blade is displayed.

    Fare clic su Impostazioni > Firewall

  9. Fare clic su aggiungere Client IP.Click Add Client IP. Digitare un nome per la nuova regola nella prima casella di testo.Type in a name for your new rule into the first text box.
  10. Digitare i valori di indirizzo IP minimo e massimo per l'intervallo che si desidera abilitare.Type in the low and high IP address values for the range you want to enable.

    • Può essere utile impostare il valore minimo su .0 e il massimo su .255.It can be handy to have the low value end with .0 and the high with .255.

    Aggiungere un intervallo di indirizzi IP per consentire

  11. Fare clic su Save.Click Save.

Per altre informazioni, vedere Procedura: Configurare le impostazioni del firewall nel database SQLFor more information, see: How to: Configure firewall settings on SQL Database

Connessione: porteConnection: Ports

È in genere sufficiente assicurarsi che la porta 1433 sia aperta per le comunicazioni in uscita nel computer che ospita il programma client.Typically you only need to ensure that port 1433 is open for outbound communication, on the computer that hosts you client program.

Ad esempio, se il programma client è ospitato in un computer Windows, Windows Firewall nell'host consente di aprire la porta 1433:For example, when your client program is hosted on a Windows computer, the Windows Firewall on the host enables you to open port 1433:

  1. Aprire il Pannello di controlloOpen the Control Panel
  2. > Tutti gli elementi del Pannello di controllo> All Control Panel Items
  3. > Windows Firewall> Windows Firewall
  4. > Impostazioni avanzate> Advanced Settings
  5. > Regole in uscita> Outbound Rules
  6. > Azioni> Actions
  7. > Nuova regola> New Rule

Se il programma client è ospitato in una macchina virtuale (VM) di Azure, vedere If your client program is hosted on an Azure virtual machine (VM), you should read:
Porte superiori a 1433 per ADO.NET 4.5 e il database SQL.Ports beyond 1433 for ADO.NET 4.5 and SQL Database.

Per informazioni generali sulla configurazione di porte e indirizzi IP, vedere Firewall del database SQL di AzureFor background information about cofiguration of ports and IP address, see: Azure SQL Database firewall

Connessione: ADO.NET 4.6.1Connection: ADO.NET 4.6.1

Se il programma utilizza classi ADO.NET come System.Data.SqlClient.SqlConnection per la connessione al database SQL di Azure, è consigliabile utilizzare .NET Framework 4.6.1 o versioni successive.If your program uses ADO.NET classes like System.Data.SqlClient.SqlConnection to connect to Azure SQL Database, we recommend that you use .NET Framework version 4.6.1 or higher.

ADO.NET 4.6.1:ADO.NET 4.6.1:

  • Per il database SQL di Azure, è possibile migliorare l'affidabilità aprendo una connessione con il metodo SqlConnection.Open .For Azure SQL Database, there is improved reliability when you open a connection by using the SqlConnection.Open method. Il metodo Open incorpora ora meccanismi di ripetizione dei tentativi di tipo "massimo sforzo" in risposta agli errori temporanei, per alcuni errori entro l'intervallo del timeout di connessione.The Open method now incorporates best effort retry mechanisms in response to transient faults, for certain errors within the Connection Timeout period.
  • Supporta il pool di connessioni,Supports connection pooling. inclusa una verifica efficiente del funzionamento dell'oggetto connessione fornito al programma.This includes an efficient verification that the connection object it gives your program is functioning.

Quando si usa un oggetto connessione da un pool di connessioni, è consigliabile che il programma chiuda temporaneamente la connessione se non deve essere usata immediatamente.When you use a connection object from a connection pool, we recommend that your program temporarily close the connection when not immediately using it. La riapertura di una connessione è meno dispendiosa della creazione di una nuova connessione.Re-opening a connection is not expensive the way creating a new connection is.

Se si usa ADO.NET 4.0 o versioni precedenti, è consigliabile eseguire l'aggiornamento alla versione più recente di ADO.NET.If you are using ADO.NET 4.0 or earlier, we recommend that you upgrade to the latest ADO.NET.

DiagnosticaDiagnostics

Diagnostica: verificare se le utilità si possono connettereDiagnostics: Test whether utilities can connect

Se il programma non riesce a connettersi al database SQL di Azure, un'opzione di diagnostica consente di provare a connettersi mediante un programma di utilità.If your program is failing to connect to Azure SQL Database, one diagnostic option is to try to connect with a utility program. Idealmente l'utilità si connette mediante la stessa libreria usata dal programma.Ideally the utility would connect by using the same library that your program uses.

In qualsiasi computer Windows è possibile provare queste utilità:On any Windows computer, you can try these utilities:

  • SQL Server Management Studio (ssms.exe), che si connette tramite ADO.NET.SQL Server Management Studio (ssms.exe), which connects by using ADO.NET.
  • sqlcmd.exe, che si connette tramite ODBC.sqlcmd.exe, which connects by using ODBC.

Dopo la connessione, verificare il funzionamento di una breve query SQL SELECT.Once connected, test whether a short SQL SELECT query works.

Diagnostica: verificare le porte aperteDiagnostics: Check the open ports

Si supponga che si sospetti che gli errori di connessione siano dovuti a problemi relativi alle porte.Suppose you suspect that connection attempts are failing due to port issues. Nel computer è possibile eseguire un'utilità che fornisce informazioni sulle configurazioni delle porte.On your computer you can run a utility that reports on the port configurations.

In Linux possono risultare utili le utilità seguenti:On Linux the following utilities might be helpful:

  • netstat -nap
  • nmap -sS -O 127.0.0.1
    • Modificare il valore di esempio con il proprio indirizzo IP.(Change the example value to be your IP address.)

In Windows è possibile usare l'utilità PortQry.exe .On Windows the PortQry.exe utility might be helpful. Ecco un'esecuzione di esempio che ha eseguito una query relativa alla situazione delle porte in un server di database SQL di Azure e che è stata eseguita in un computer portatile:Here is an example execution that queried the port situation on an Azure SQL Database server, and which was run on a laptop computer:

[C:\Users\johndoe\]
>> portqry.exe -n johndoesvr9.database.windows.net -p tcp -e 1433

Querying target system called:
 johndoesvr9.database.windows.net

Attempting to resolve name to IP address...
Name resolved to 23.100.117.95

querying...
TCP port 1433 (ms-sql-s service): LISTENING

[C:\Users\johndoe\]
>>

Diagnostica: registrare gli erroriDiagnostics: Log your errors

La diagnosi di un problema intermittente è spesso agevolata dal rilevamento di uno schema generale nel corso di giorni o settimane.An intermittent problem is sometimes best diagnosed by detection of a general pattern over days or weeks.

Il client può supportare l'analisi tramite la registrazione di tutti gli errori rilevati.Your client can assist in a diagnosis by logging all errors it encounters. È possibile che si riesca a correlare le voci del log con i dati di errore registrati internamente dal database SQL di Azure.You might be able to correlate the log entries with error data that Azure SQL Database logs itself internally.

Enterprise Library 6 (EntLib60) offre classi .NET gestite per semplificare la registrazione:Enterprise Library 6 (EntLib60) offers .NET managed classes to assist with logging:

Diagnostica: cercare errori nei log di sistemaDiagnostics: Examine system logs for errors

Ecco alcune istruzioni Transact-SQL SELECT che eseguono query nei log alla ricerca di errori e di altre informazioni.Here are some Transact-SQL SELECT statements that query logs of error and other information.

Query di un logQuery of log DescrizioneDescription
SELECT e.*
FROM sys.event_log AS e
WHERE e.database_name = 'myDbName'
AND e.event_category = 'connectivity'
AND 2 >= DateDiff
  (hour, e.end_time, GetUtcDate())
ORDER BY e.event_category,
  e.event_type, e.end_time;
La visualizzazione sys.event_log offre informazioni sui singoli eventi, inclusi quelli che possono causare errori temporanei o di connettività.The sys.event_log view offers information about individual events, including some that can cause transient errors or connectivity failures.

In teoria, è possibile correlare i valori start_time o end_time con le informazioni relative al momento in cui si sono verificati problemi nel programma client.Ideally you can correlate the start_time or end_time values with information about when your client program experienced problems.

SUGGERIMENTO: è necessario connettersi al database master per eseguire questa operazione.TIP: You must connect to the master database to run this.
SELECT c.*
FROM sys.database_connection_stats AS c
WHERE c.database_name = 'myDbName'
AND 24 >= DateDiff
  (hour, c.end_time, GetUtcDate())
ORDER BY c.end_time;
La vista sys.database_connection_stats offre un conteggio aggregato dei tipi di evento, per consentire operazioni di diagnostica aggiuntive.The sys.database_connection_stats view offers aggregated counts of event types, for additional diagnostics.

SUGGERIMENTO: è necessario connettersi al database master per eseguire questa operazione.TIP: You must connect to the master database to run this.

Diagnostica: cercare eventi relativi a problemi nel log del database SQLDiagnostics: Search for problem events in the SQL Database log

È possibile cercare voci relative agli eventi problematici nel log del database SQL di Azure.You can search for entries about problem events in the log of Azure SQL Database. Provare a eseguire l'istruzione Transact-SQL SELECT seguente nel database master :Try the following Transact-SQL SELECT statement in the master database:

SELECT
   object_name
  ,CAST(f.event_data as XML).value
      ('(/event/@timestamp)[1]', 'datetime2')                      AS [timestamp]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="error"]/value)[1]', 'int')             AS [error]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="state"]/value)[1]', 'int')             AS [state]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="is_success"]/value)[1]', 'bit')        AS [is_success]
  ,CAST(f.event_data as XML).value
      ('(/event/data[@name="database_name"]/value)[1]', 'sysname') AS [database_name]
FROM
  sys.fn_xe_telemetry_blob_target_read_file('el', null, null, null) AS f
WHERE
  object_name != 'login_event'  -- Login events are numerous.
  and
  '2015-06-21' < CAST(f.event_data as XML).value
        ('(/event/@timestamp)[1]', 'datetime2')
ORDER BY
  [timestamp] DESC
;

Alcune righe restituite da sys.fn_xe_telemetry_blob_target_read_fileA few returned rows from sys.fn_xe_telemetry_blob_target_read_file

Una riga restituita avrà un aspetto analogo al seguente.Next is what a returned row might look like. I valori Null mostrati sono spesso non Null in altre righe.The null values shown are often not null in other rows.

object_name                   timestamp                    error  state  is_success  database_name

database_xml_deadlock_report  2015-10-16 20:28:01.0090000  NULL   NULL   NULL        AdventureWorks

Enterprise Library 6Enterprise Library 6

Enterprise Library 6 (EntLib60) è un framework di classi .NET che semplifica l'implementazione di client affidabili dei servizi cloud, ad esempio il servizio database SQL di Azure SQL.Enterprise Library 6 (EntLib60) is a framework of .NET classes that helps you implement robust clients of cloud services, one of which is the Azure SQL Database service. Gli argomenti dedicati a ogni area per cui EntLib60 può risultare utile sono disponibili in:You can locate topics dedicated to each area in which EntLib60 can assist by first visiting:

Logica di ripetizione dei tentativi per la gestione degli errori temporanei è un'area in cui EntLib60 può essere utile:Retry logic for handling transient errors is one area in which EntLib60 can assist:

Nota

Il codice sorgente per EntLib60 è disponibile per il downloadpubblico.The source code for EntLib60 is available for public download. Microsoft non prevede di fornire altre funzionalità o aggiornamenti di manutenzione per EntLib.Microsoft has no plans to make further feature updates or maintenance updates to EntLib.

Classi di EntLib60 per errori temporanei e ripetizione dei tentativiEntLib60 classes for transient errors and retry

Le classi seguenti di EntLib60 sono particolarmente utili per la logica di ripetizione dei tentativi.The following EntLib60 classes are particularly useful for retry logic. Tutte queste classi sono disponibili nello spazio dei nomi Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling o nei livelli sottostanti:All these are in, or are further under, the namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling:

Nello spazio dei nomi **Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling:In the namespace **Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling:

  • RetryPolicyRetryPolicy class

    • ExecuteActionExecuteAction method
  • ExponentialBackoffExponentialBackoff class
  • SqlDatabaseTransientErrorDetectionStrategySqlDatabaseTransientErrorDetectionStrategy class
  • ReliableSqlConnectionReliableSqlConnection class

    • ExecuteCommandExecuteCommand method

Nello spazio dei nomi Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.TestSupport:In the namespace Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.TestSupport:

  • AlwaysTransientErrorDetectionStrategyAlwaysTransientErrorDetectionStrategy class
  • NeverTransientErrorDetectionStrategyNeverTransientErrorDetectionStrategy class

Ecco i collegamenti alle informazioni relative a EntLib60:Here are links to information about EntLib60:

EntLib60: il blocco di registrazioneEntLib60: The logging block

  • Il blocco di registrazione è una soluzione a flessibilità e configurabilità elevata che consente di:The Logging block is a highly flexible and configurable solution that allows you to:

    • Creare e archiviare messaggi di log in diverse posizioni.Create and store log messages in a wide variety of locations.
    • Classificare e filtrare i messaggi.Categorize and filter messages.
    • Raccogliere informazioni contestuali utili per il debug e la traccia, oltre che per i requisiti di controllo e di registrazione generale.Collect contextual information that is useful for debugging and tracing, as well as for auditing and general logging requirements.
  • Il blocco di registrazione astrae la funzionalità di registrazione dalla destinazione di registrazione, in modo che il codice applicazione sia coerente, indipendentemente dalla posizione e dal tipo di archivio di registrazione di destinazione.The Logging block abstracts the logging functionality from the log destination so that the application code is consistent, irrespective of the location and type of the target logging store.

Per informazioni dettagliate vedere 5 - Più facile che mai: uso del blocco applicazione di registrazioneFor details see: 5 - As Easy As Falling Off a Log: Using the Logging Application Block

Codice sorgente del metodo IsTransient di EntLib60EntLib60 IsTransient method source code

La classe SqlDatabaseTransientErrorDetectionStrategy include anche il codice sorgente C# per il metodo IsTransient.Next, from the SqlDatabaseTransientErrorDetectionStrategy class, is the C# source code for the IsTransient method. Il codice sorgente chiarisce gli errori considerati temporanei e idonei alla ripetizione dei tentativi, a partire da aprile 2013.The source code clarifies which errors were considered to be transient and worthy of retry, as of April 2013.

public bool IsTransient(Exception ex)
{
  if (ex != null)
  {
    SqlException sqlException;
    if ((sqlException = ex as SqlException) != null)
    {
      // Enumerate through all errors found in the exception.
      foreach (SqlError err in sqlException.Errors)
      {
        switch (err.Number)
        {
            // SQL Error Code: 40501
            // The service is currently busy. Retry the request after 10 seconds.
            // Code: (reason code to be decoded).
          case ThrottlingCondition.ThrottlingErrorNumber:
            // Decode the reason code from the error message to
            // determine the grounds for throttling.
            var condition = ThrottlingCondition.FromError(err);

            // Attach the decoded values as additional attributes to
            // the original SQL exception.
            sqlException.Data[condition.ThrottlingMode.GetType().Name] =
              condition.ThrottlingMode.ToString();
            sqlException.Data[condition.GetType().Name] = condition;

            return true;

          case 10928:
          case 10929:
          case 10053:
          case 10054:
          case 10060:
          case 40197:
          case 40540:
          case 40613:
          case 40143:
          case 233:
          case 64:
            // DBNETLIB Error Code: 20
            // The instance of SQL Server you attempted to connect to
            // does not support encryption.
          case (int)ProcessNetLibErrorCode.EncryptionNotSupported:
            return true;
        }
      }
    }
    else if (ex is TimeoutException)
    {
      return true;
    }
    else
    {
      EntityException entityException;
      if ((entityException = ex as EntityException) != null)
      {
        return this.IsTransient(entityException.InnerException);
      }
    }
  }

  return false;
}

Passaggi successiviNext steps