Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Denna artikel ger lösningar på vanliga fel och anslutningsproblem med drivrutinen go-mssqldb .
Börja med de enklaste kontrollerna
Innan du aktiverar utförlig loggning eller ändrar poolinställningar, gå igenom följande lista:
- Verifiera grundläggande nådbarhet: servernamn, port, brandväggsregler och om SQL Server eller Azure SQL accepterar anslutningar.
- Verifiera autentiseringsinmatningar: drivrutinsnamn, användarnamn, lösenord, domänformat eller
fedauthkonfiguration. - Verifiera TLS-inställningar:
encrypt, certifikatvägar,hostnameincertificate, och om detTrustServerCertificateär lämpligt för miljön. - Först när anslutningsuppsättningen är korrekt, undersök poolutmattning, föråldrade anslutningar, återförsökslogik och långsam eller blockerad frågediagnostik.
Använd de tidiga delarna av denna artikel för anslutningsuppställningsfel. Använd följande avsnitt först efter att anslutningarna åtminstone ibland fungerar, men sedan fallerar under belastning, efter en tids inaktivitet eller vid redundansväxling.
Anslutningsfel
Följande avsnitt täcker vanliga anslutningsrelaterade felmeddelanden och deras lösningar.
Kan inte öppna TCP-anslutningen
Felmeddelande: 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.
Orsaker och lösningar:
- SQL Server körs inte. Starta SQL Server-tjänsten.
- TCP/IP är inte aktiverat. Öppna SQL Server Configuration Manager och aktivera TCP/IP under SQL Server Network Configuration>Protocols.
- Felaktig port. Verifiera porten i SQL Server Configuration Manager eller använd SQL Server Browser för namngivna instanser.
- Brandväggen blockerar porten. Lägg till en inkommande regel för port 1433 (eller din konfigurerade port).
Inloggningen misslyckades för användaren
Felmeddelande: mssql: login error: Login failed for user '<user>'.
Orsaker och lösningar:
- Fel användarnamn eller lösenord. Verifiera legitimationerna.
- SQL Server-autentisering är inaktiverad. Aktivera SQL Server och Windows-autentiseringsläge i serveregenskaper.
- Inloggningen finns inte. Skapa inloggningen i SQL Server.
- Inloggningen har inte tillgång till måldatabasen. Tilldela databasåtkomst med
CREATE USER.
Fel vid certifikatvalidering
Felmeddelande: TLS Handshake failed: x509: certificate signed by unknown authority
Orsaker och lösningar:
- Servern använder ett självsignerat certifikat. Ange sökvägen till certifikatet med parametern
certificateellerserverCertificate, eller angeTrustServerCertificate=trueendast för utveckling. - CA-certifikatet finns inte i systemets förtroendelager. Lägg till CA-certifikatet i operativsystemets förtroendelagring eller ange det med parametern
certificate. - Värdnamnsmissanpassning. Använd
hostnameincertificateför att ange det förväntade namnet i certifikatet.
För mer information, se Kryptering och certifikat.
Tidsgränsen för anslutningen gick ut
Felmeddelande: unable to open tcp connection with host '<server>:1433': dial tcp: i/o timeout
Orsaker och lösningar:
- Problem med nätverksanslutningen. Verifiera att du kan nå servern genom att använda
telnet <server> 1433ellerTest-NetConnection -ComputerName <server> -Port 1433. - DNS-upplösningsfel. Verifiera att värdnamnet löses korrekt.
- Öka
dial timeoutellerconnection timeouti anslutningssträngen.
Autentiseringsfel
Följande avsnitt täcker autentiseringsfelmeddelanden.
NTLM-autentiseringsfel
Felmeddelande: NTLM authentication failed
Orsaker och lösningar:
- Fel domänformat. Använd
DOMAIN\useri parameternuser id. I URL-format, koda backslashen som%5C. - Fel lösenord. Verifiera domänlösenordet.
Kerberos-autentiseringsfel
Felmeddelande: krb5: cannot resolve KDC for realm
Orsaker och lösningar:
- Saknas eller felkonfigurerades
/etc/krb5.conf. Kontrollera att[realms]avsnittet innehåller korrekt KDC-adress för din domän. - Ingen giltig biljett. Spring
klistför att kontrollera om biljetten är giltig, eller springkinitför att få tag på en. - Keytab-filen hittas inte. Verifiera vägen i parametern
krb5-keytabfile.
För mer information, se SQL Server och Windows authentication.
Microsoft Entra ID-autentiseringsfel
Felmeddelande:clientCredentialFromCert: error reading certificate: ... ellerDefaultAzureCredential: failed to acquire a token
Orsaker och lösningar:
- Felaktigt klient-ID, hyresgäst-ID eller klienthemlighet. Verifiera värdena i reťazec pripojenia eller miljövariabler.
- Den hanterade identiteten är inte konfigurerad på värddatorn. Verifiera identiteten i Azure-portalen.
-
azuread-paketimport saknas. Importeragithub.com/microsoft/go-mssqldb/azureadoch använd drivrutinsnamnetazuresql.
Mer information finns i Microsoft Entra ID-autentisering.
Inloggning misslyckades för användare '' (tomt användarnamn)
Felmeddelande: mssql: login error: Login failed for user ''.
Orsak: Du använde sql.Open("sqlserver", ...) med en fedauth parameter. Entra ID-autentisering kräver drivrutinsnamnet azuresql som registreras av paketetazuread. Med standarddrivrutinen sqlserver ignoreras parametern fedauth och drivrutinen försöker SQL-autentisering utan användarnamn.
Lösning: Importera paketet azuread och använd drivrutinsnamnet azuresql :
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)
}
Mer information finns i Microsoft Entra ID-autentisering.
Frågefel
Följande avsnitt täcker felmeddelanden för förfrågan.
LastInsertId stöds ej
Felmeddelande: LastInsertId is not supported. Please use the OUTPUT clause or add 'select ID = convert(bigint, SCOPE_IDENTITY())' to the end of your query.
Lösning: Drivrutinen go-mssqldb stöder LastInsertId()inte . Använd en OUTPUT klausul eller fråga SCOPE_IDENTITY() separat.
Tillfällig tabell ej hittad
Felmeddelande: mssql: Invalid object name '#TempTable'.
Orsak: Tillfälliga tabeller är kopplade till varje anslutning. Om du skapar en tillfällig tabell i ett anrop och frågar efter den i ett annat, kan de använda olika anslutningar från poolen.
Lösning: Använd db.Conn(ctx) för att låsa till en enda anslutning, eller omslut operationer i en transaktion.
Mer information finns i Lagrade procedurer.
Azure SQL-fel
Följande avsnitt täcker fel specifika för Azure SQL Database.
Felnummer för tillfälliga anslutningar
Använd följande delade lista som referens för tillfälliga anslutningsetableringsfel och transportfel på begäranarväg som är berättigade till begränsad återförsök:
Följande fel är tillfälliga när de inträffar under anslutningsetableringen eller när en begäran skickas till servern. Försök igen på en kort, begränsad backoff. Fel som kvarstår efter några återförsök indikerar vanligtvis ett konfigurationsproblem (fel server, saknade behörigheter, uttömd kvot) som inte korrigeras igen.
| 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.) |
TCP-anslutningen bryts mitt under handskakningen. Inte ett autentiseringsfel. Om det kvarstår, kontrollera om det finns instabilitet i nätverket på klientsidan eller en mellanliggande enhet som bryter halvetablerade anslutningar. |
233 |
The client was unable to establish a connection because of an error during connection initialization process before login. |
Transportfel före inloggning eller TLS-fel. Servern returnerar den ofta när den inte kan acceptera anslutningen (resursöverbelastning, maximalt antal anslutningar har nåtts eller en klient som inte stöds). Inte ett autentiseringsfel. Kontrollera serverns hälsotillstånd och kontrollera sedan tidsgränsen för klientinloggning, TLS-inställningar och kompatibiliteten för klient-/server-TLS-versionen. |
4060 |
Cannot open database "%.*ls" requested by the login. The login failed. |
Inloggningen autentiserar men kan inte öppna den begärda databasen. Tillfälliga orsaker kan vara att databasen är i en övergångsfas (redundansväxling, återställning, skalning) eller har pausats automatiskt. Beständiga orsaker (databasen finns inte, inloggningen saknar åtkomst) kommer inte att åtgärdas genom ett nytt försök. kontrollera databasnamnet, inloggningsmappningen och databastillståndet. |
4221 |
Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'. |
Repliken är inte tillgänglig för inloggning eftersom radversioner saknas för transaktioner som kördes när repliken återvanns. Återställ eller genomför de aktiva transaktionerna på primärservern för att lösa problemet. Minska risken genom att undvika långa skrivtransaktioner på primärnoden. |
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.) |
Den lokala sidan avbryter anslutningen. Kontrollera nätverkshälsa på klientsidan och eventuell lokal brandvägg eller VPN-klient. |
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.) |
Fjärrsidan skickar en TCP-återställning. Vanliga orsaker: peer-processen kraschade, en brandvägg injicerade en återställning eller Azure SQL gateway stängde en inaktiv anslutning. Vid återkommande återställningar efter inaktivitet aktiverar du TCP-keepalive på klienten eller förkortar anslutningspoolens tidsgräns för inaktivitet. |
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. |
Databasen överskrider en Azure SQL resursstyrningsgräns. Resurs-ID 1 anger arbetsgränsen. Resurs-ID 2 anger sessionsgränsen. Identifiera gränstypen från meddelandet och minska sedan samtidigheten, skala upp databasen eller förkorta långvariga åtgärder som innehåller resursen. |
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. |
Databasen överskrider sin garanterade miniminivå och den underliggande servern stryper prestandan. Återförsöket lyckas vanligtvis när grannbelastningen sjunker. Ihållande förekomster indikerar att du behöver en högre tjänstnivå eller en mindre bullrig miljö. |
40020, 40143, 40166, 40540 |
Rapporteras i platsen Error code %d för fel 40197 vid redundansväxling. |
Underkoder som är inbäddade i ett 40197-felväxlingsmeddelande och som vissa kodvägar visar som felnummer på översta nivån. Behandla dem på samma sätt som 40197. |
40197 |
The service has encountered an error processing your request. Please try again. Error code %d. |
En programvaruuppgradering, maskinvarufel eller annan redundanshändelse i Azure SQL. När du återansluter dirigeras du till en felfri replik. Den inbäddade felkoden identifierar redundanstypen. Om felet kvarstår samlar du in sessionsspårnings-ID:t och kontaktar supporten. |
40501 |
The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d. |
Begränsning i Azure SQL-databasmotorn Den rekommenderade miniminivån är en väntetid på 10 sekunder. Ihållande strypning indikerar att arbetsbelastningen har överskridit databasens resursallokering; skala upp tjänstnivån eller minska samtidigheten. |
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'. |
Databasen är inte tillgänglig, vanligtvis under en redundansväxling eller en kort stund under en skalningsåtgärd. Försök igen vid en backoff; Om det kvarstår efter några minuter samlar du in sessionsspårnings-ID:t och öppnar ett supportärende. |
42108 |
Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again. |
Den dedikerade SQL-poolen (Synapse) är i pausat tillstånd. Återförsöket lyckas först när poolen har återupptagits. Återuppta poolen uttryckligen, eller schemalägg arbetsbelastningen så att den körs efter att poolen har återupptagits. |
42109 |
The SQL pool is warming up. Please try again. |
Den dedikerade SQL-poolen håller på att återupptas. Försök igen vid en backoff tills poolen är online. uppvärmning tar vanligtvis några minuter. |
49918 |
Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later. |
Servern kan för närvarande inte allokera tillräckligt med resurser för att uppfylla begäran. Försök igen vid en backoff. Om felet kvarstår skalar du upp databasen eller den elastiska poolen. |
49919 |
Cannot process create or update request. Too many create or update operations in progress for subscription "%ld". |
Samtidighetsgräns på prenumerationsnivå för hanteringsoperationer. Minska antalet parallella anrop för att skapa eller uppdatera, eller fördela dem över tid. |
49920 |
Cannot process request. Too many operations in progress for subscription "%ld". |
Samtidighetsgräns på prenumerationsnivå för åtgärder under flygning. Minska graden av parallellism eller vänta tills pågående åtgärder har slutförts. |
Fel på instruktionsnivå finns inte i den här listan eftersom de utlöses när anslutningen har upprättats och felet lämnar sessionen användbar. De vanligaste återförsöksbara instruktionsfelen är 1205 (deadlock victim) och 1222 (tidsgräns för låsbegäran). Försök igen hela transaktionen i stället för den enda misslyckade instruktionen.
Felmeddelandetexten kommer från Azure SQL tillfälliga anslutningsfel. Enskilda drivrutiner underhåller sina egna inbyggda återförsökslistor. den här katalogen beskriver vilka fel som är berättigade till återförsök i SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL-databas i Microsoft Fabric och dedikerade SQL-pooler i Azure Synapse Analytics.
Kan inte öppna servern (brandvägg)
Felmeddelande: 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.
Orsaker och lösningar:
- Din klient-IP finns inte i Azure SQL-brandväggsreglerna. Lägg till en brandväggsregel i Azure-portalen: SQL Server>Networking>Lägg till en brandväggsregel.
- Om din applikation körs i Azure, aktivera Tillåt Azure-tjänster och resurser att komma åt denna server.
- För privat anslutning, konfigurera en privat endpoint.
Resursgränsen har nåtts
Felmeddelande: mssql: Resource ID: 1. The session limit for the database is 300 and has been reached.
Orsaker och lösningar:
- För många samtidiga anslutningar för Azure SQL-nivån. Sänk
MaxOpenConnsi din poolkonfiguration. - Anslutningsläckor (oavslutade rader eller transaktioner). Kolla efter saknade
defer rows.Close()ellerdefer tx.Rollback()samtal. - Flera applikationer delar databasen. Dela upp anslutningsgränsen mellan alla klienter.
För Azure SQL-anslutningsgränser per nivå, se Azure SQL Database.
Tjänsten är för närvarande upptagen (begränsning)
Felmeddelande: mssql: The service is currently busy. Retry the request after 10 seconds. Code: 40501.
Orsaker och lösningar:
- Databasen är under stor belastning. Implementera återförsökslogik med exponentiell reduktion.
- Arbetsbelastningen överstiger nivåns DTU- eller vCore-kapacitet. Överväg att skala upp.
För återförsöksimplementationsmönster, se Felhantering och återförsöksmönster.
Databas är för närvarande inte tillgänglig
Felmeddelande: mssql: Database 'AdventureWorks2025' on server '<server>' is not currently available. Code: 40613.
Orsak: Azure SQL omkonfigurerar databasen (failover, uppdatering eller skalningsoperation). Detta tillstånd är ett övergående fel.
Lösning: Försök operationen igen. Databasen blir vanligtvis tillgänglig inom några sekunder. För mer information, se Felhantering och återförsöksmönster.
Dåliga anslutningsfel
Ett driver: bad connection fel innebär att drivrutinen upptäckte att en befintlig anslutning inte längre är användbar. Poolen database/sql försöker automatiskt om operationen på en ny anslutning för icke-transaktionella anrop, men operationer inom en aktiv transaktion misslyckas omedelbart.
Börja inte med den här sektionen om applikationen aldrig anslutit sig framgångsrikt.
driver: bad connection pekar vanligtvis på återanvändning av anslutning, felväxling, inaktivitetstimeout eller nätverksstörningar efter att den ursprungliga anslutningen redan hade fungerat.
Vanliga orsaker
| Orsak | Typiskt scenario | Reparera |
|---|---|---|
| Azure SQL gateway inaktivitetstimeout | Anslutningen är inaktiv i 30+ minuter bakom Azure-gatewayen. | Ställ db.SetConnMaxIdleTime(2 * time.Minute) in att återanvända inaktiva anslutningar innan gatewayen tappar dem. |
| Nätverksavbrott | Tillfälligt nätverksfel mellan klient och server. | Implementera återprövningslogik för icke-transaktionella operationer. Se Felhantering. |
| Avslutning av session på serversidan | DBA avslutade sessionen, eller servern startades om. | Försök igen. Ställ db.SetConnMaxLifetime in för att rotera anslutningar. |
| Azure SQL-omkonfiguration | En redundansväxling, skalning eller korrigering avbröt anslutningen. | Ställ ConnMaxLifetime in på 5 minuter eller mindre. Implementera logik för återförsök. |
| Tidsgräns för långvarig transaktion | Azure SQL avslutade sessionen (fel 40549). | Håll transaktionerna korta. Dela upp stora åtgärder i mindre batchar. |
Hur databas/SQL hanterar dåliga anslutningar
Vid anrop utanför en transaktion (db.QueryContext, db.ExecContext) försöker database/sql-poolen automatiskt köra åtgärden igen på en ny anslutning när drivrutinen rapporterar en felaktig anslutning. Denna omprövning är transparent för din kod.
För anrop inom en transaktion (tx.QueryContext, tx.ExecContext), kan poolen inte försöka igen eftersom transaktionstillståndet går förlorat. Din kod måste fånga felet, rulla tillbaka och försöka om hela transaktionen.
Rekommenderade poolinställningar för Azure SQL
Konfigurera poolen för att hantera Azure-gateway-timeouts och failovers:
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.
För lokal SQL Server är ConnMaxIdleTime mindre kritiskt eftersom det inte finns någon timeout för inaktivitet i gatewayen. Men att ställa in den förhindrar föråldrade anslutningar efter nätverksavbrott.
För detaljerad konfigurationsguide, se Azure SQL Database.
Poolutmattning
Pooluttömning uppstår när alla anslutningar i poolen används och nya anrop blockeras i väntan på en anslutning.
Symptoms
- Förfrågningar saktar ner eller går ut under belastning.
-
db.Stats().WaitCountväxer kontinuerligt. -
db.Stats().InUseär lika medMaxOpenConns. - Kontextdeadline överskred fel under topptrafik.
Diagnos
Lägg till poolövervakning i din applikation:
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)
Vanliga orsaker och lösningar
| Orsak | Identifiera problemet | Reparera |
|---|---|---|
rows.Close() anropas inte |
InUse Växer över tid, minskar aldrig. |
Lägg till defer rows.Close() efter varje QueryContext. |
| Långvariga transaktioner |
InUse förblir hög under batchbearbetning. |
Håll transaktionerna korta. Processa stora satser i mindre bitar. |
MaxOpenConns för lågt |
WaitCount ökar stadigt under normal belastning efter att du har uteslutit låsta resurser och läckor. |
Öka MaxOpenConns. |
MaxOpenConns inte inställt |
Hundratals öppna anslutningar under spikbelastning. | Sätt MaxOpenConns till ett begränsat värde. |
Goroutine-läcka vid anrop av db.Conn |
InUse växer utan motsvarande ökning av begäranden. |
Se till att varje db.Conn() resultat är avslutat med defer conn.Close(). |
För detaljerad vägledning om poolkonfiguration, se anslutningspoolning.
Långsam eller blockerad frågediagnostik
Ställ in tidsgränser för frågor
Använd tidsgränser i kontexten för att identifiera långsamma frågor och förhindra att blockerade SQL-anrop binder upp anslutningar och blockerar anropande processer:
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()
För ett fullständigt arbetsflöde för prestandaundersökning, inklusive Query Store, DMV:er, analys av saknade index och benchmarking, se Performance tuning.
Deadlock-diagnostik
Felmeddelande: mssql: Transaction (Process ID 52) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Felnummer: 1205
Lösning: Dödlägen uppstår i samtidiga system. Implementera automatisk återförsökslogik för fel 1205. Information om en omslutande funktion för återförsök vid deadlock finns i Transaktioner.
Förebyggande strategier:
- Öppna tabeller i samma ordning i alla frågor.
- Håll transaktionerna korta och undvik användarinteraktion under transaktionerna.
- Använd
READ COMMITTED SNAPSHOTisolering för att minska låsstrid.
Upprepade deadlocks på samma fråga indikerar ett designproblem. Använd deadlock-grafen (fångad via Utökade Händelser eller systemets hälsosession) för att identifiera konkurrerande satser och låstyper. För en fullständig genomgång, se Deadlocks-guiden. För strategier för deadlockhantering i Go, se Deadlock-hantering och Hantera deadlocks.
Certifikatfel med containrar (Go 1.23 och senare versioner)
Felmeddelande: x509: negative serial number
Orsak: Go 1.23 upprätthåller strikt RFC 5280. Det självsignerade certifikatet som SQL Server genererar i Docker-containrar använder ett negativt serienummer, vilket Go avkastar.
Lösningar:
- För testmiljöer, lägg till
TrustServerCertificate=trueför att hoppa över certifikatvalidering ellerencrypt=disableför att stänga av kryptering helt. - För CI/CD, ställ in miljövariabeln
GODEBUG=x509negativeserial=1att återställa beteendet före Go 1.23 utan att ändra din reťazec pripojenia. - I
go.mod(Go 1.23 och senare versioner) lägger du till ettgodebug x509negativeserial=1-direktiv för att tillämpa åsidosättningen vid byggtillfället.
Försiktighet
Använd inte TrustServerCertificate=true eller encrypt=disable i produktion. Dessa alternativ inaktiverar säkerhetskontroller. För produktion, använd ett korrekt signerat certifikat.
SHA-1-certifikatfel (Go 1.24 och senare versioner)
Felmeddelande:tls: handshake failure eller TLS Handshake failed: EOF när man ansluter till äldre SQL Server-instanser.
Orsak: Go 1.24 tillåter som standard inte SHA-1-signaturalgoritmer i TLS-certifikat. Äldre SQL Server-versioner och vissa lokala installationer använder certifikat signerade med SHA-1.
Lösningar:
- Utfärda servercertifikatet igen med SHA-256 eller senare (rekommenderas).
- Ställ in miljövariabeln
GODEBUG=tlssha1=1för att tillfälligt återaktivera SHA-1-stödet. - I
go.mod(Go 1.23 och senare versioner), lägg till engodebug tlssha1=1direktiv.
När ska man använda encrypt=disable kontra TrustServerCertificate=true
| Inställning | Vad det gör | När det bör användas |
|---|---|---|
TrustServerCertificate=true |
Krypterar trafiken men hoppar över certifikatvalidering. | Lokal utveckling och testning där servern använder ett självsignerat certifikat. |
encrypt=disable |
Skickar trafik i klartext (utan TLS). | Äldre miljöer där TLS inte är tillgängligt. Rekommenderas inte. |
encrypt=strict |
TDS 8.0 med fullständig TLS-validering från första bytet. | Produktion på SQL Server 2022 eller Azure SQL. |
För mer information, se Testning och kryptering samt certifikat.
Kodnings- och sorteringsproblem
Varningar för implicit konvertering
Om du skickar string parametrar (skickade som nvarchar) till varchar kolumner utför SQL Server en implicit konvertering som kan förhindra indexanvändning.
Detta exempel fortsätter database/sql och mssql upplägg från tidigare utdrag i denna artikel.
Lösning: Använd mssql.VarChar för varchar kolumner:
db.QueryContext(ctx, "SELECT * FROM Production.Product WHERE ProductNumber = @p1",
mssql.VarChar("FR-R92B-58"))
CharsetToUTF8-fel med icke-latinska tecken
Felmeddelande: CharsetToUTF8: ... när man söker varchar kolumner som innehåller kinesiska, japanska eller andra icke-latinska tecken som lagras i en sortering som SQL_Latin1_General_CP1_CI_AS.
Orsak: Drivrutinen försöker konvertera kolumnens kodsida till UTF-8, men de lagrade bytena stämmer inte överens med den förväntade kodningen för sorteringen.
Lösningar:
- Använd
nvarcharistället förvarcharkolumner som lagrar icke-latinsk text.nvarcharlagrar data som UTF-16 och undviker kodbladskonvertering. - Om du inte kan ändra kolumntypen, kontrollera att databasens sammansättning stödjer teckenuppsättningen du lagrar.
Aktivera diagnostikloggning
Använd anslutningsparametern log för att aktivera loggning på drivrutinsnivå:
sqlserver://<user>:<password>@<server>?database=AdventureWorks2025&log=63
Loggflaggor är bitmaskvärden: 1 (fel), (meddelanden), 24 (rader), 8 (SQL), 16 (parametrar), 32 (transaktioner), 64 (felsökning). Kombinera värden genom att lägga till dem (till exempel, 63 = alla utom debug, 127 = alla).
För programmatisk loggning, använd SetLogger eller SetContextLogger. Se Loggning och diagnostik.
Checklista för felsökning
| Symptom | Första steget |
|---|---|
| Anslutningen nekades | Verifiera att SQL Server körs och att TCP/IP är aktiverat. |
| Inloggningen misslyckades | Kontrollera inloggningsuppgifter och autentiseringsläge. |
| Certifikatfel | Kontrollera servercertifikatet eller ange TrustServerCertificate=true (endast för utveckling). |
| Tidsgräns för anslutning | Verifiera nätverksväg med Test-NetConnection. Kontrollera brandväggsreglerna. |
| Azure SQL-brandvägg | Lägg till din IP i Azure SQL-brandväggsregler. |
| Strypningsfel | Implementera återförsök med exponentiellt ökande väntetid. Skala upp nivån. |
| Dålig anslutning | Ställ ConnMaxIdleTime in under 30 minuter för Azure SQL. Implementera logik för återförsök. |
| Poolutmattning | Bildskärm db.Stats(). Fixa oavslutade rader/transaktioner. Öka MaxOpenConns. |
| Långsamma frågor | Ange tidsgränser för kontexten. Fråga DMV:er om resurskrävande frågor. |
| Deadlocks | Implementera omförsök på fel 1205. Öppna tabeller i en konsekvent ordning. |
| Implicit konvertering | Använd mssql.VarChar för varchar kolumner. |