Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo fornisce soluzioni per errori comuni e problemi di connettività con il go-mssqldb driver.
Inizia con i controlli più semplici
Prima di abilitare il verbose logging o cambiare le impostazioni del pool, segui la seguente lista:
- Verifica la raggiungibilità di base: nome del server, porta, regole del firewall e se SQL Server o Azure SQL accettano connessioni.
- Verifica gli input di autenticazione: nome del driver, nome utente, password, formato del dominio o
fedauthconfigurazione. - Verifica le impostazioni TLS:
encrypt, i percorsi dei certificati,hostnameincertificate, e seTrustServerCertificateè appropriato per l'ambiente. - Solo dopo aver verificato che la configurazione della connessione sia corretta, analizzare l'esaurimento del pool, le connessioni non più valide, la logica di retry e la diagnostica delle query lente o bloccate.
Usa le prime sezioni di questo articolo per i guasti di configurazione della connessione. Usa le sezioni successive solo dopo che le connessioni hanno avuto successo almeno a volte e poi si guastano sotto carico, dopo il tempo di inattività o durante il failover.
Errori di connessione
Le sezioni seguenti trattano i messaggi di errore comuni legati alla connessione e le loro soluzioni.
Impossibile aprire la connessione TCP
Messaggio di errore: unable to open tcp connection with host 'localhost:1433': dial tcp 127.0.0.1:1433: connectex: No connection could be made because the target machine actively refused it.
Cause e soluzioni:
- SQL Server non è in esecuzione. Avviare il servizio SQL Server.
- TCP/IP non è abilitato. Apri Gestione configurazione SQL Server e abilita TCP/IP sotto SQL Server Network Configuration>Protocols.
- Porta sbagliata. Verifica la porta in Gestione configurazione SQL Server o usa SQL Server Browser per le istanze nominate.
- Firewall che blocca la porta. Aggiungi una regola in entrata per la porta 1433 (o la porta configurata da te).
Accesso non riuscito per l'utente
Messaggio di errore: mssql: login error: Login failed for user '<user>'.
Cause e soluzioni:
- Nome utente o password errati. Verifica le credenziali.
- L'autenticazione di SQL Server è disabilitata. Abilita SQL Server e modalità di autenticazione Windows nelle proprietà del server.
- Il login non esiste. Crea l'account di accesso in SQL Server.
- Il login non dispone dell'accesso al database di destinazione. Concedere l'accesso al database con
CREATE USER.
Errori di convalida del certificato
Messaggio di errore: TLS Handshake failed: x509: certificate signed by unknown authority
Cause e soluzioni:
- Il server utilizza un certificato autofirmato. Fornisci il percorso del certificato con il
certificateparametro oserverCertificate, oppure impostaTrustServerCertificate=truesolo per lo sviluppo. - Il certificato CA non è nel system trust store. Aggiungi il certificato CA allo store di trust del sistema operativo o specificalo con il
certificateparametro. - Il nome host non corrisponde. Usalo
hostnameincertificateper specificare il nome atteso nel certificato.
Per maggiori informazioni, vedi Crittografia e certificati.
Il timeout della connessione è scaduto
Messaggio di errore: unable to open tcp connection with host '<server>:1433': dial tcp: i/o timeout
Cause e soluzioni:
- Problemi di connettività di rete. Verifica di poter raggiungere il server usando
telnet <server> 1433oppureTest-NetConnection -ComputerName <server> -Port 1433. - Fallimento della risoluzione DNS. Verifica che il nome host si risolva correttamente.
- Aumenta
dial timeoutoconnection timeoutnella stringa di connessione.
Errori di autenticazione
Le sezioni seguenti trattano i messaggi di errore di autenticazione.
Fallimenti dell'autenticazione NTLM
Messaggio di errore: NTLM authentication failed
Cause e soluzioni:
- Formato di dominio errato. Usa
DOMAIN\userneluser idparametro. Nel formato URL, codifica la barra inversa come%5C. - Password sbagliata. Verifica la password del dominio.
Errori di autenticazione Kerberos
Messaggio di errore: krb5: cannot resolve KDC for realm
Cause e soluzioni:
- Mancante o configurato
/etc/krb5.confmale. Verifica che la[realms]sezione contenga l'indirizzo KDC corretto per il tuo dominio. - Nessun biglietto valido. Corri
klista controllare un biglietto valido, o corrikinitper ottenerlo. - File keytab non trovato. Verifica il percorso nel
krb5-keytabfileparametro.
Per ulteriori informazioni, consulta SQL Server e autenticazione di Windows.
Fallimenti nell'autenticazione dell'Microsoft Entra ID
Messaggio di errore: clientCredentialFromCert: error reading certificate: ... oppure DefaultAzureCredential: failed to acquire a token
Cause e soluzioni:
- ID client, ID tenant o segreto client non validi. Verifica i valori nelle variabili di stringa di connessione o di ambiente.
- L'identità gestita non è configurata sull'host. Verifica l'identità nel portale Azure.
- Importazione del pacchetto
azureadmancante. Importagithub.com/microsoft/go-mssqldb/azureade usa il nome del driverazuresql.
Per altre informazioni, vedere Autenticazione dell'ID di Microsoft Entra.
Accesso fallito per l'utente '' (nome utente vuoto)
Messaggio di errore: mssql: login error: Login failed for user ''.
Causa: Hai usato sql.Open("sqlserver", ...) con un fedauth parametro. L'autenticazione Entra ID richiede il nome del driver azuresql registrato dal pacchetto azuread. Con il driver standard sqlserver , il fedauth parametro viene ignorato e il driver tenta l'autenticazione SQL senza nome utente.
Soluzione: Importa il azuread pacchetto e usa il nome del azuresql driver:
import _ "github.com/microsoft/go-mssqldb/azuread"
db, err := sql.Open("azuresql",
"sqlserver://<server>.database.windows.net?database=AdventureWorks2025&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false")
if err != nil {
panic(err)
}
Per altre informazioni, vedere Autenticazione dell'ID di Microsoft Entra.
Errori di query
Le sezioni seguenti trattano i messaggi di errore nell'esecuzione delle query.
LastInsertId non è supportato
Messaggio di errore: LastInsertId is not supported. Please use the OUTPUT clause or add 'select ID = convert(bigint, SCOPE_IDENTITY())' to the end of your query.
Soluzione: il go-mssqldb driver non supporta LastInsertId(). Usa una clausola o un'interrogazione OUTPUTSCOPE_IDENTITY() separatamente.
Tabella temporanea non trovata
Messaggio di errore: mssql: Invalid object name '#TempTable'.
Causa: Le tabelle temporanee sono specifiche della connessione. Se crei una tabella temporanea in una chiamata e la interroghi in un'altra, potrebbero usare connessioni diverse dal pool.
Soluzione: Usa db.Conn(ctx) per vincolare a un'unica connessione oppure racchiudi le operazioni in una transazione.
Per altre informazioni, vedere Stored procedure.
Errori di Azure SQL
Le sezioni seguenti trattano errori specifici di database SQL di Azure.
Numeri di errore di connessione transitoria
Usa il seguente elenco condiviso come riferimento per gli errori transitori di instaurazione della connessione e gli errori di trasporto nel percorso della richiesta idonei a un numero limitato di tentativi di ripetizione:
Gli errori seguenti sono temporanei quando si verificano durante la connessione o durante l'invio di una richiesta al server. Riprova dopo un breve backoff limitato. Gli errori che persistono dopo alcuni tentativi indicano in genere un problema di configurazione (server errato, autorizzazioni mancanti, quota esaurita) che non verranno risolti.
| Error | Message | Troubleshooting |
|---|---|---|
64 |
A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 - The specified network name is no longer available.) |
La connessione TCP si interrompe durante l'handshake. Non si è verificato un errore di credenziale. Se il problema persiste, controlla la presenza di instabilità della rete lato client o di un dispositivo intermedio che interrompe le connessioni parzialmente stabilite. |
233 |
The client was unable to establish a connection because of an error during connection initialization process before login. |
Errore di trasporto o TLS prima dell'accesso. Il server lo restituisce in genere quando non può accettare la connessione (esaurimento delle risorse, numero massimo di connessioni raggiunto o client non supportato). Non si è verificato un errore di credenziale. Verificare l'integrità del server, quindi controllare il timeout di accesso client, le impostazioni TLS e la compatibilità della versione TLS client/server. |
4060 |
Cannot open database "%.*ls" requested by the login. The login failed. |
L'accesso viene autenticato, ma non può aprire il database richiesto. Le cause temporanee includono il database in fase di transizione (failover, ripristino, ridimensionamento) o sospeso automaticamente. Le cause persistenti (il database non esiste, il login non dispone delle autorizzazioni necessarie) non si risolvono riprovando; verificate il nome del database, il mapping del login e lo stato del database. |
4221 |
Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'. |
La replica non è disponibile per l'accesso perché mancano versioni delle righe per le transazioni ancora in corso quando la replica è stata reinizializzata. Eseguire il rollback o il commit delle transazioni attive nel database primario per risolvere il problema. Attenuare evitando transazioni di scrittura lunghe nel database primario. |
10053 |
A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine.) |
Il lato locale interrompe la connessione. Controllare lo stato della rete lato client e l'eventuale firewall locale o il client VPN. |
10054 |
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.) |
La parte remota invia un reset TCP. Cause comuni: il processo peer si è arrestato in modo anomalo, un firewall ha inserito una reimpostazione o il gateway Azure SQL ha chiuso una connessione inattiva. Per gli schemi di reset dovuti all'inattività, abilitare il keepalive TCP sul client o ridurre il timeout di inattività del pool di connessioni. |
10928 |
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. |
Il database supera un limite di governance delle risorse Azure SQL. L'ID risorsa 1 indica il limite di lavoro; L'ID risorsa 2 indica il limite di sessione. Identificare il tipo di limite dal messaggio, quindi ridurre la concorrenza, aumentare le prestazioni del database o abbreviare le operazioni a esecuzione prolungata che contengono la risorsa. |
10929 |
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. |
Il database sta superando la soglia minima garantita e il server sottostante sta limitando le prestazioni. La ripetizione dei tentativi ha in genere esito positivo quando il carico adiacente scende. Le occorrenze sostenute indicano che è necessario un livello di servizio superiore o un ambiente meno rumoroso. |
40020, 40143, 4016640540 |
Segnalato nel slot Error code %d dell'errore 40197 durante il failover. |
Sottocodici incorporati in un messaggio di failover 40197 che alcuni percorsi espongono come codice di errore di livello superiore. Trattarli come 40197. |
40197 |
The service has encountered an error processing your request. Please try again. Error code %d. |
Un aggiornamento software, un errore hardware o un altro evento di failover in Azure SQL. La riconnessione ti indirizza a una replica integra. Il codice di errore incorporato identifica il tipo di failover. Se l'errore persiste, acquisire l'ID di traccia della sessione e contattare il supporto tecnico. |
40501 |
The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d. |
Limitazione del motore di Azure SQL Il valore minimo consigliato per il backoff è di 10 secondi. Il throttling prolungato indica che il carico di lavoro ha superato le risorse allocate al database; passare a un livello di servizio superiore o ridurre il livello di concorrenza. |
40613 |
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'. |
Il database non è disponibile, in genere durante un failover o per breve tempo durante un'operazione di scalabilità. Riprovare dopo un intervallo di attesa; se il problema persiste per più di qualche minuto, annotare l'ID di tracciamento della sessione e aprire un caso di supporto. |
42108 |
Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again. |
Il pool SQL dedicato (Synapse) si trova in uno stato sospeso. Il nuovo tentativo ha esito positivo solo dopo la ripresa del pool. Riprendi esplicitamente il pool oppure pianifica il carico di lavoro affinché venga eseguito dopo che il pool è stato ripreso. |
42109 |
The SQL pool is warming up. Please try again. |
Il pool SQL dedicato riprende. Riprovare su un backoff fino a quando il pool non è online; il riscaldamento richiede in genere alcuni minuti. |
49918 |
Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later. |
Il server non è attualmente in grado di allocare risorse sufficienti per soddisfare la richiesta. Riprova dopo un intervallo di attesa. Se l'errore persiste, aumentare le prestazioni del database o del pool elastico. |
49919 |
Cannot process create or update request. Too many create or update operations in progress for subscription "%ld". |
Limite di concorrenza a livello di sottoscrizione per le operazioni di gestione. Ridurre le chiamate parallele di creazione o aggiornamento oppure scaglionarle. |
49920 |
Cannot process request. Too many operations in progress for subscription "%ld". |
Limite di concorrenza a livello di sottoscrizione per le operazioni in corso. Ridurre il parallelismo o attendere che le operazioni in corso vengano completate. |
Gli errori a livello di istruzione non sono inclusi in questo elenco perché vengono attivati dopo la connessione e l'errore lascia utilizzabile la sessione. Gli errori ripetibili delle istruzioni più comuni sono 1205 (vittima di deadlock) e 1222 (timeout della richiesta di blocco). Ritentare l'intera transazione anziché la singola istruzione non riuscita.
Il testo del messaggio di errore proviene da Azure SQL errori di connessione temporanei. I singoli driver mantengono i propri elenchi di tentativi predefiniti; questo catalogo descrive quali errori sono idonei per la ripetizione dei tentativi in SQL Server, database SQL di Azure, Istanza gestita di SQL di Azure, database SQL in Microsoft Fabric e pool SQL dedicati in Azure Synapse Analytics.
Non è possibile aprire il server (firewall)
Messaggio di errore: mssql: login error: Cannot open server '<server>' requested by the login. Client with IP address '203.0.113.42' is not allowed to access the server.
Cause e soluzioni:
- L'IP del tuo client non è nelle regole del firewall Azure SQL. Aggiungi una regola firewall nel portale Azure: SQL Server>Networking>Aggiungi una regola firewall.
- Se la tua applicazione gira su Azure, abilita Permette ai servizi e alle risorse Azure di accedere a questo server.
- Per la connettività privata, configura un endpoint privato.
Limite di risorse raggiunto
Messaggio di errore: mssql: Resource ID: 1. The session limit for the database is 300 and has been reached.
Cause e soluzioni:
- Troppe connessioni concorrenti per il livello Azure SQL. Riduci
MaxOpenConnsnella configurazione del pool. - Perdite di connessione (righe o transazioni non chiuse). Controlla se mancano le chiamate
defer rows.Close()odefer tx.Rollback(). - Più applicazioni che condividono il database. Dividere il limite di connessione tra tutti i client.
Per i limiti di connessione Azure SQL per livello, vedi database SQL di Azure.
Il servizio è al momento occupato (limitazione della velocità)
Messaggio di errore: mssql: The service is currently busy. Retry the request after 10 seconds. Code: 40501.
Cause e soluzioni:
- Il database è sotto forte carico. Implementa la logica di ripetizione dei tentativi con backoff esponenziale.
- Il carico di lavoro supera la capacità del livello in termini di DTU o vCore. Valuta la scalabilità.
Per i modelli di implementazione dei tentativi ripetuti, vedere Gestione degli errori e modelli di tentativi ripetuti.
Database attualmente non disponibile
Messaggio di errore: mssql: Database 'AdventureWorks2025' on server '<server>' is not currently available. Code: 40613.
Causa: Azure SQL sta riconfigurando il database (failover, aggiornamento o operazione di scalabilità). Questa condizione è un errore transitorio.
Soluzione: riprovare l'operazione. Il database di solito diventa disponibile in pochi secondi. Per altre informazioni, vedere Gestione degli errori e modelli di tentativi ripetuti.
Errori di connessione difettosi
Un errore significa che il driver ha driver: bad connection rilevato che una connessione esistente non è più utilizzabile. Il database/sql pool ritenta automaticamente l'operazione su una connessione nuova per chiamate non transazionali, ma le operazioni all'interno di una transazione attiva falliscono immediatamente.
Non iniziare con questa sezione se l'applicazione non si è mai collegata con successo.
driver: bad connection di solito indica riutilizzo della connessione, failover, timeout inattivo o interruzioni di rete dopo che la connessione iniziale era già funzionante.
Cause comuni
| Cause | Scenario tipico | Correzione |
|---|---|---|
| Timeout di inattività del gateway di Azure SQL | Connessione inattiva per 30+ minuti dietro il gateway Azure. | Imposta db.SetConnMaxIdleTime(2 * time.Minute) in modo da ricreare le connessioni inattive prima che il gateway le chiuda. |
| Interruzione della rete | Guasto transitorio della rete tra client e server. | Implementa la logica di retry per operazioni non transazionali. Vedi Gestione degli errori. |
| Terminazione della sessione lato server | Il DBA ha chiuso la sessione, oppure il server è stato riavviato. | Nuovo tentativo. Imposta db.SetConnMaxLifetime per ruotare le connessioni. |
| Riconfigurazione di Azure SQL | Un failover, un'operazione di scaling o l'applicazione di patch hanno interrotto la connessione. | Imposta ConnMaxLifetime su 5 minuti o meno. Implementare la logica di ripetizione dei tentativi. |
| Timeout per transazioni di lunga durata | Azure SQL ha terminato la sessione (errore 40549). | Mantieni le transazioni brevi. Suddividere le operazioni di grandi dimensioni in batch più piccoli. |
Come database/sql gestisce le connessioni difettose
Per le chiamate al di fuori di una transazione (db.QueryContext, db.ExecContext), il database/sql pool ritenta automaticamente l'operazione su una nuova connessione quando il driver segnala una connessione cattiva. Questo nuovo tentativo è trasparente per il codice.
Per le chiamate all'interno di una transazione (tx.QueryContext, tx.ExecContext), il pool non può riprovare perché lo stato della transazione è perso. Il tuo codice deve rilevare l'errore, tornare indietro e riprovare l'intera transazione.
Impostazioni consigliate per il pool di Azure SQL
Configura il pool per gestire i timeout e i failover del gateway Azure:
db.SetConnMaxLifetime(5 * time.Minute) // Rotate connections to recover from failovers.
db.SetConnMaxIdleTime(2 * time.Minute) // Recycle before Azure gateway drops idle connections (30 min).
db.SetMaxIdleConns(10) // Keep warm connections for quick recovery.
db.SetMaxOpenConns(20) // Stay below your tier's connection limit.
Per SQL Server locale, ConnMaxIdleTime è meno critico perché non esiste alcun timeout di inattività del gateway. Tuttavia, impostarla previene connessioni obsolete dopo interruzioni di rete.
Per indicazioni dettagliate sulla configurazione, vedi database SQL di Azure.
Esaurimento in piscina
L'esaurimento del pool di connessioni si verifica quando tutte le connessioni nel pool sono in uso e le nuove richieste restano bloccate in attesa di una connessione.
Symptoms
- Le richieste rallentano o vanno in timeout sotto carico.
-
db.Stats().WaitCountcresce continuamente. -
db.Stats().InUseè uguale aMaxOpenConns. - La scadenza contestuale superava gli errori durante i picchi di traffico.
Diagnosi
Aggiungi il monitoraggio dei pool alla tua applicazione:
stats := db.Stats()
log.Printf("Pool: open=%d inUse=%d idle=%d waitCount=%d waitDuration=%v",
stats.OpenConnections, stats.InUse, stats.Idle,
stats.WaitCount, stats.WaitDuration)
Cause comuni e soluzioni
| Cause | Come identificare il problema | Correzione |
|---|---|---|
rows.Close() non chiamato |
InUse cresce nel tempo, non diminuisce mai. |
Aggiungi defer rows.Close() dopo ogni QueryContext. |
| Transazioni a esecuzione prolungata |
InUse rimane alto durante l'elaborazione in batch. |
Mantieni le transazioni brevi. Processa grandi quantità in blocchi più piccoli. |
MaxOpenConns troppo basso |
WaitCount Cresce costantemente sotto carico normale dopo aver escluso risorse bloccate e perdite. |
Aumentare MaxOpenConns. |
MaxOpenConns non impostato |
Centinaia di connessioni aperte durante picchi di carico. | Imposta MaxOpenConns su un valore compreso entro limiti. |
Perdita di goroutine durante la chiamata di db.Conn |
InUse cresce senza la corrispondente crescita delle richieste. |
Assicurati che ogni db.Conn() risultato sia chiuso con defer conn.Close(). |
Per indicazioni dettagliate sulla configurazione del pool, vedi Connection pooling.
Diagnostica delle query lente o bloccate
Imposta i timeout delle query
Usa le scadenze contestuali per identificare query lente e prevenire che le chiamate SQL bloccate blocchino le connessioni e blocchino i chiamanti:
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
rows, err := db.QueryContext(ctx, "SELECT * FROM LargeTable WHERE Status = @s",
sql.Named("s", "active"))
if err != nil {
// Check if the error was a timeout.
if ctx.Err() == context.DeadlineExceeded {
log.Println("Query exceeded 5-second timeout")
}
return err
}
defer rows.Close()
Per un flusso di lavoro completo di indagine sulle prestazioni, inclusi Query Store, DMV, analisi degli indici mancanti e benchmarking, vedi Performance tuning.
Diagnostica del deadlock
Messaggio di errore: mssql: Transaction (Process ID 52) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Numero errore: 1205
Soluzione: I deadlock si verificano nei sistemi concorrenti. Implementa la logica dei ritenti automatici per l'errore 1205. Per una funzione wrapper per i nuovi tentativi in caso di deadlock, vedi Transazioni.
Strategie di prevenzione:
- Accedere alle tabelle nello stesso ordine su tutte le query.
- Mantieni le transazioni brevi ed evita l'interazione dell'utente durante le transazioni.
- Usare l'
READ COMMITTED SNAPSHOTisolamento per ridurre la contesa dei lock.
I deadlock ripetuti sulla stessa query indicano un problema di progettazione. Usa il grafo dei deadlock (acquisito tramite Extended Events o la sessione Integrità sistema) per identificare le istruzioni in conflitto e i tipi di blocco. Per una guida completa, consulta la guida Deadlocks. Per strategie di gestione dello sblocco in Go, vedi Gestione del blocco e Gestione degli sblocchi.
Errori di certificato con container (Go 1.23 e versioni successive)
Messaggio di errore: x509: negative serial number
Causa: Go 1.23 applica rigorosamente la RFC 5280. Il certificato autofirmato che SQL Server genera nei container Docker utilizza un numero di serie negativo, che Go rifiuta.
Soluzioni:
- Per gli ambienti di test, aggiungi
TrustServerCertificate=truesaltare la validazione dei certificati oencrypt=disabledisattivare completamente la crittografia. - Per CI/CD, imposta la
GODEBUG=x509negativeserial=1variabile ambiente per ripristinare il comportamento pre-Go 1.23 senza cambiare la stringa di connessione. - In
go.mod(Go 1.23 e versioni successive), aggiungi unagodebug x509negativeserial=1direttiva per applicare l'override durante la compilazione.
Attenzione
Non utilizzare TrustServerCertificate=true o encrypt=disable in produzione. Queste opzioni disattivano i controlli di sicurezza. Per la produzione, usa un certificato firmato correttamente.
Errori nei certificati SHA-1 (Go 1.24 e versioni successive)
Messaggio di errore: tls: handshake failure o TLS Handshake failed: EOF quando si connette a istanze di SQL Server più vecchie.
Causa: Go 1.24 non consente di default gli algoritmi di firma SHA-1 nei certificati TLS. Le versioni più vecchie di SQL Server e alcune installazioni on-premises utilizzano certificati firmati con SHA-1.
Soluzioni:
- Riomettere il certificato del server con SHA-256 o versione successiva (consigliato).
- Imposta la
GODEBUG=tlssha1=1variabile di ambiente per riabilitare temporaneamente il supporto SHA-1. - In
go.mod(Go 1.23 e versioni successive), aggiungi unagodebug tlssha1=1direttiva.
Quando usare encrypt=disable vs. TrustServerCertificate=true
| Setting | Funzionamento | Quando utilizzare |
|---|---|---|
TrustServerCertificate=true |
Cripta il traffico ma salta la validazione dei certificati. | Sviluppo locale e test in cui il server utilizza un certificato autofirmato. |
encrypt=disable |
Invia traffico in testo chiaro (senza TLS). | Ambienti legacy dove TLS non è disponibile. Non consigliato. |
encrypt=strict |
TDS 8.0 con validazione TLS completa dal primo byte. | Produzione su SQL Server 2022 o Azure SQL. |
Per maggiori informazioni, vedi Test e Crittografia e certificati.
Problemi di codifica e collazione
Avvertenze di conversione implicita
Se passi string parametri (inviati come nvarchar) alle varchar colonne, SQL Server esegue una conversione implicita che può impedire l'uso dell'indice.
Questo esempio riprende la configurazione database/sql e mssql dai frammenti precedenti di questo articolo.
Soluzione: Usa mssql.VarChar per le colonne varchar:
db.QueryContext(ctx, "SELECT * FROM Production.Product WHERE ProductNumber = @p1",
mssql.VarChar("FR-R92B-58"))
Errore di CharsetToUTF8 con caratteri non latini
Messaggio di errore: CharsetToUTF8: ... quando si interrogano varchar colonne contenenti caratteri cinesi, giapponesi o altri non latini memorizzati in una collazione come SQL_Latin1_General_CP1_CI_AS.
Causa: Il driver tenta di convertire la code page della colonna in UTF-8, ma i byte memorizzati non corrispondono alla codifica prevista per la collazione.
Soluzioni:
- Usa
nvarcharinvece divarcharper colonne che memorizzano testo non latino.nvarcharmemorizza i dati come UTF-16 ed evita la conversione della code page. - Se non puoi cambiare il tipo di colonna, verifica che la collazione del database supporti il set di caratteri che stai memorizzando.
Abilitare la registrazione diagnostica
Usa il parametro log di connessione per abilitare la registrazione a livello di driver:
sqlserver://<user>:<password>@<server>?database=AdventureWorks2025&log=63
I flag di log sono i valori della bitmask: 1 (errori), 2 (messaggi), 4 (righe), 8 (SQL), 16 (parametri), 32 (transazioni), 64 (debug). Combinare i valori sommandoli (ad esempio, 63 = tutti tranne il debug, 127 = tutti).
Per la registrazione programmatica, usare SetLogger o SetContextLogger. Vedere Registrazione e diagnostica.
Elenco di controllo per la risoluzione dei problemi
| Sintomo | Primo passaggio |
|---|---|
| Connessione rifiutata | Verifica che SQL Server sia in esecuzione e che TCP/IP sia abilitato. |
| Accesso non riuscito | Controlla le credenziali e la modalità autenticazione. |
| Errore del certificato | Controlla il certificato o il set TrustServerCertificate=true del server (solo sviluppatori). |
| Timeout della connessione | Verifica il percorso di rete con Test-NetConnection. Controlla le regole del firewall |
| Firewall SQL di Azure | Aggiungi il tuo IP alle regole del firewall Azure SQL. |
| Errori di limitazione | Implementare il retry con un backoff esponenziale. Scala il livello. |
| Connessione difettosa | Imposta ConnMaxIdleTime sotto i 30 minuti per Azure SQL. Implementare la logica di ripetizione dei tentativi. |
| Esaurimento in piscina | Monitor db.Stats(). Correggi righe/transazioni non chiuse. Aumentare MaxOpenConns. |
| Query lente | Imposta i timeout del contesto. Consulta i DMV per richieste costose. |
| Deadlock | Implementa il retry sull'errore 1205. Accesso alle tabelle in ordine costante. |
| Conversione implicita | Usare mssql.VarChar per le colonne varchar. |