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 known as a transient fault, has an underlying cause that soon resolves 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 viene completata in meno di 60 secondi.Most of these reconfiguration events finish in less than 60 seconds. Durante questo intervallo di riconfigurazione possono verificarsi problemi di connessione al database SQL.During this reconfiguration time span, you might have connectivity issues to SQL Database. Le applicazioni che si connettono al Database SQL devono essere compilate in modo da prevedere tali errori temporanei.Applications that connect to SQL Database should be built to expect these transient errors. Per gestirli, implementare la logica di ripetizione nel codice anziché mostrarli agli utenti come errori dell'applicazione.To handle them, implement 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 uses ADO.NET, your program is told about the transient error by the throw of SqlException. Confrontare la proprietà Number con l'elenco di errori temporanei disponibile nella parte iniziale dell'articolo Codici di errore SQL per applicazioni client del database SQL.Compare the Number property against the list of transient errors that are found near the top of the article SQL error codes for SQL Database client applications.

Connessione e comandoConnection vs. command

Provare a ristabilire la connessione SQL o stabilirne una nuova, in base a quanto indicato di seguito: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: After a delay of several seconds, retry the connection.
  • 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: Do not immediately retry the command. È invece consigliabile stabilire una nuova connessione dopo un breve intervallo di tempo.Instead, after a delay, freshly establish the connection. Quindi eseguire di nuovo il comando.Then retry the command.

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 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 SQL Database through third-party middleware, ask the vendor whether the middleware contains retry logic for transient errors.

Principi per la ripetizione dei tentativiPrinciples for retry

  • Se l'errore è temporaneo, provare a ristabilire la connessione.If the error is transient, retry to open a connection.
  • Non riprovare direttamente a eseguire un'istruzione SQL SELECT non riuscita con un errore temporaneo.Do not directly retry a SQL SELECT statement that failed with a transient error.
    • 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, stabilire una nuova connessione prima di provare a eseguire di nuovo l'istruzione UPDATE.When a SQL UPDATE statement fails with a transient error, establish a fresh connection before you retry the UPDATE.
    • 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 finished 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 automatically starts after work hours and finishes before morning can afford to be 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 non deve prevedere nuovi tentativi con intervalli di pochi secondi, perché un criterio simile può inondare il sistema con un numero eccessivo di richieste.The solution must not 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 wait 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).For a discussion of the blocking period for clients that use ADO.NET, see SQL Server connection pooling (ADO.NET).

È anche possibile che si voglia impostare un numero massimo di nuovi tentativi prima dell'autoterminazione del programma.You also might 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 that 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. L'errore è:The error is:

  • 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 il test, disconnettere il computer dalla rete prima di avviare il programma.To make this test practical, 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 runtime parameter that causes the program to:

  • Aggiunta temporanea di 11001 al rispettivo elenco di errori da considerare temporanei.Temporarily add 11001 to its list of errors to consider as transient.
  • Tentativo della prima connessione come di consueto.Attempt its first connection as usual.
  • Dopo il rilevamento dell'errore, rimozione di 11001 dall'elenco.After the error is caught, remove 11001 from the list.
  • Visualizzazione di un messaggio che richiede all'utente di connettere il computer alla rete.Display a message that tells 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 is plugged into the network.
  • 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. L'errore è:The error is:

  • 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 il test, il programma riconosce un parametro di runtime che ha le conseguenze seguenti sul programma:To make this test practical, your program recognizes a runtime parameter that causes the program to:

  • Aggiunta temporanea di 18456 al rispettivo elenco di errori da considerare temporanei.Temporarily add 18456 to its list of errors to consider as transient.
  • Aggiunta intenzionale di 'WRONG_' al nome utente.Purposely add 'WRONG_' to the user name.
  • Dopo il rilevamento dell'errore, rimozione di 18456 dall'elenco.After the error is caught, remove 18456 from the list.
  • Rimozione di 'WRONG_' dal nome utente.Remove 'WRONG_' from the user name.
  • 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 usando la classe .NET Framework 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 SQL Database by using the .NET Framework class System.Data.SqlClient.SqlConnection, use .NET 4.6.1 or later (or .NET Core) so that you can use its connection retry feature. Per altre informazioni sulla caratteristica, vedere questa pagina Web.For more information on the feature, see this webpage.

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

  • ConnectRetryCount:  Il valore predefinito è 1.ConnectRetryCount:  Default is 1. L'intervallo consentito è tra 0 e 255.Range is 0 through 255.
  • ConnectRetryInterval:  Il valore predefinito è 1 secondo.ConnectRetryInterval:  Default is 1 second. L'intervallo consentito è tra 1 e 60.Range is 1 through 60.
  • Timeout di connessione:  Il valore predefinito è 15 secondi.Connection Timeout:  Default is 15 seconds. L'intervallo consentito è tra 0 e 2147483647.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 garantisce al sistema il tempo sufficiente per il terzo tentativo e il tentativo di connessione finale: 29 < 3 * 10.For example, if the count equals 3 and the interval equals 10 seconds, a timeout of only 29 seconds doesn't give the system enough time for its third and final retry to connect: 29 < 3 * 10.

Connessione e comandoConnection vs. 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 connessioneIf a transient error occurs while your query is being executed, your SqlConnection object doesn't retry the connect operation. e certamente non ritenta l'esecuzione della query.It certainly doesn't 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, your 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 quattro volte.It might retry the connect operation four 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 SQLConnections to SQL Database

Connessione: stringa di connessioneConnection: Connection string

La stringa di connessione necessaria per connettersi al database SQL è leggermente diversa rispetto alla stringa usata per connettersi a SQL Server.The connection string that's necessary to connect to SQL Database is slightly different from the string used to connect to 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 that's necessary for your client program to interact with Azure SQL Database.

  1. Selezionare Tutti i servizi > Database SQL.Select All services > SQL databases.

  2. Immettere il nome del database nella casella di testo di 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. Selezionare la riga per il database.Select the row for your database.

  4. Quando viene visualizzato il pannello del database, per una visualizzazione più chiara selezionare i pulsanti Riduci a icona per comprimere i pannelli usati per la ricerca e il filtro del database.After the blade appears for your database, for visual convenience select the Minimize buttons to collapse the blades you used for browsing and database filtering.

  5. Nel pannello del database selezionare Mostra stringhe di connessione del database.On the blade for your database, select 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 Stringhe di connessione e file di configurazione.For more information, see 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 impostare questa configurazione, modificare le impostazioni del firewall tramite il portale di Azure.To set up this configuration, edit the firewall settings through the Azure portal.

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

  1. Accedere al portale di Azure.Sign in to the Azure portal.

  2. Nell'elenco a sinistra selezionare Tutti i servizi.In the list on the left, select All services.

  3. Scorrere e selezionare SQL Server.Scroll and select SQL servers.

    Trovare il server di Database SQL di Azure nel portale di

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

  5. Selezionare la riga per il server.Select the row for your server. Viene visualizzato un pannello per il server.A blade for your server is displayed.

  6. Nel pannello del server, selezionare Impostazioni.On your server blade, select Settings.

  7. Selezionare Firewall.Select Firewall.

    Selezionare Impostazioni > Firewall

  8. Selezionare Aggiungi IP client.Select Add Client IP. Digitare un nome per la nuova regola nella prima casella di testo.Type a name for your new rule in the first text box.

  9. 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 come fine del valore minimo .0 e come fine del valore massimo su .255.It can be handy to have the low value end with .0 and the high value end with .255.

    Aggiungere un intervallo di indirizzi IP per consentire

  10. Selezionare Salva.Select Save.

Per altre informazioni, vedere Configurare le impostazioni del firewall nel database SQL.For more information, see Configure firewall settings on SQL Database.

Connessione: porteConnection: Ports

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

Ad esempio, se il programma client è ospitato in un computer Windows, è possibile usare Windows Firewall nell'host per aprire la porta 1433.For example, when your client program is hosted on a Windows computer, you can use Windows Firewall on the host to open port 1433.

  1. Aprire il Pannello di controllo.Open Control Panel.

  2. Selezionare Tutti gli elementi del Pannello di controllo > Windows Firewall > Impostazioni avanzate > Regole in uscita > Azioni > Nuova regola.Select All Control Panel Items > Windows Firewall > Advanced Settings > Outbound Rules > Actions > New Rule.

Se il programma client si trova su una macchina virtuale (VM) di Azure, leggere Porte superiori a 1433 per ADO.NET 4.5 e il database SQL.If your client program is hosted on an Azure virtual machine (VM), read 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 Azure.For background information about configuration of ports and IP addresses, see Azure SQL Database firewall.

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

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

ADO.NET 4.6.1:ADO.NET 4.6.1:

  • Per il database SQL, è possibile migliorare l'affidabilità aprendo una connessione con il metodo SqlConnection.Open.For SQL Database, reliability is improved 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 di durata della connessione.The Open method now incorporates best-effort retry mechanisms in response to transient faults for certain errors within the connection timeout period.
  • È supportato il pool di connessioni, inclusa una verifica efficiente del corretto funzionamento dell'oggetto connessione fornito al programma.Connection pooling is supported, which 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 it's not immediately in use. Riaprire una connessione non ha alcun costo, a differenza della creazione di una nuova connessione.It's not expensive to reopen a connection, but it is to create a new connection.

Se si usa ADO.NET 4.0 o versioni precedenti, è consigliabile eseguire l'aggiornamento alla versione più recente di ADO.NET.If you use ADO.NET 4.0 or earlier, we recommend that you upgrade to the latest ADO.NET. A partire da novembre 2015, è possibile scaricare ADO.NET 4.6.1.As of November 2015, you can download ADO.NET 4.6.1.

DiagnosticaDiagnostics

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

Se il programma non riesce a connettersi al database SQL, un'opzione di diagnostica consente di provare a connettersi mediante un programma di utilità.If your program fails to connect to 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 connects 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.NETSQL Server Management Studio (ssms.exe), which connects by using ADO.NET
  • sqlcmd.exe, che si connette tramite ODBCsqlcmd.exe, which connects by using ODBC

Dopo la connessione del programma, verificare il funzionamento di una breve query SQL SELECT.After your program is connected, test whether a short SQL SELECT query works.

Diagnostica: verificare le porte aperteDiagnostics: Check the open ports

Se si ritiene che i tentativi di connessione abbiano esito negativo a causa di problemi di porta, è possibile eseguire sul computer un'utilità che segnala le configurazioni delle porte.If you suspect that connection attempts fail due to port issues, you can run a utility on your computer 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 e che è stata eseguita in un computer portatile:Here's an example execution that queried the port situation on a SQL Database server and that 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.You might be able to correlate the log entries with error data that 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. Per altre informazioni, vedere 5 - Più facile che mai: uso del blocco applicazione di registrazione.For more information, see 5 - As easy as falling off a log: Use the Logging Application Block.

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

Ecco alcune istruzioni Transact-SQL SELECT che eseguono query nei log degli errori e alla ricerca di altre informazioni.Here are some Transact-SQL SELECT statements that query error logs 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, which includes 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.

È necessario connettersi al database master per eseguire questa query.You must connect to the master database to run this query.
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.

È necessario connettersi al database master per eseguire questa query.You must connect to the master database to run this query.

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.You can search for entries about problem events in the SQL Database log. 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

Nell'esempio seguente viene illustrato il possibile aspetto di una riga restituita.The following example shows 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.Enterprise Library 6 (EntLib60) is a framework of .NET classes that helps you implement robust clients of cloud services, one of which is the SQL Database service. Gli argomenti dedicati a ogni area per cui EntLib60 può risultare utile sono disponibili in Enterprise Library 6 - Aprile 2013.To locate topics dedicated to each area in which EntLib60 can assist, see Enterprise Library 6 - April 2013.

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. Per altre informazioni, vedere 4 - Perseveranza, il segreto di tutti i successi: uso del Blocco di applicazioni per la gestione degli errori temporanei.For more information, see 4 - Perseverance, secret of all triumphs: Use the Transient Fault Handling Application Block.

Nota

Il codice sorgente per EntLib60 è disponibile per il download pubblico nell'Area download.The source code for EntLib60 is available for public download from the Download Center. 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 classes are found in or 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 alcuni collegamenti alle informazioni relative a EntLib60:Here are some 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 you can use 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 altre informazioni, vedere 5 - Più facile che mai: uso del blocco applicazione di registrazione.For more information, see 5 - As easy as falling off a log: Use 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 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