Felsök go-mssqldb-drivrutinen

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:

  1. Verifiera grundläggande nådbarhet: servernamn, port, brandväggsregler och om SQL Server eller Azure SQL accepterar anslutningar.
  2. Verifiera autentiseringsinmatningar: drivrutinsnamn, användarnamn, lösenord, domänformat eller fedauth konfiguration.
  3. Verifiera TLS-inställningar: encrypt, certifikatvägar, hostnameincertificate, och om det TrustServerCertificate är lämpligt för miljön.
  4. 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 certificate eller serverCertificate, eller ange TrustServerCertificate=true endast 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 hostnameincertificate fö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> 1433 eller Test-NetConnection -ComputerName <server> -Port 1433.
  • DNS-upplösningsfel. Verifiera att värdnamnet löses korrekt.
  • Öka dial timeout eller connection timeout i 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\user i parametern user 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 klist för att kontrollera om biljetten är giltig, eller spring kinit fö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. Importera github.com/microsoft/go-mssqldb/azuread och använd drivrutinsnamnet azuresql .

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 MaxOpenConns i din poolkonfiguration.
  • Anslutningsläckor (oavslutade rader eller transaktioner). Kolla efter saknade defer rows.Close() eller defer 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.

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().WaitCount växer kontinuerligt.
  • db.Stats().InUse är lika med MaxOpenConns.
  • 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 SNAPSHOT isolering 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=true för att hoppa över certifikatvalidering eller encrypt=disable för att stänga av kryptering helt.
  • För CI/CD, ställ in miljövariabeln GODEBUG=x509negativeserial=1 att å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 ett godebug 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=1 för att tillfälligt återaktivera SHA-1-stödet.
  • I go.mod (Go 1.23 och senare versioner), lägg till en godebug tlssha1=1 direktiv.

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 nvarchar istället för varchar kolumner som lagrar icke-latinsk text. nvarchar lagrar 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.