Problemen met de go-mssqldb-driver oplossen

Dit artikel biedt oplossingen voor veelvoorkomende fouten en verbindingsproblemen met de go-mssqldb driver.

Begin met de eenvoudigste controles

Voordat je verbose logging inschakelt of poolinstellingen verandert, werk je door de volgende lijst:

  1. Controleer de basisbereikbaarheid: servernaam, poort, firewallregels en of SQL Server of Azure SQL verbindingen accepteert.
  2. Controleer authenticatie-invoer: drivernaam, gebruikersnaam, wachtwoord, domeinformaat of fedauth configuratie.
  3. Controleer TLS-instellingen: encrypt, certificaatpaden, hostnameincertificate, en of TrustServerCertificate deze geschikt zijn voor de omgeving.
  4. Pas nadat de verbindingsconfiguratie correct is, onderzoek je pooluitputting, verouderde verbindingen, retrylogica en diagnostiek van trage of geblokkeerde query’s.

Gebruik de vroege secties van dit artikel voor verbindingsopstellingsfouten. Gebruik de latere secties alleen nadat verbindingen ten minste soms tot stand komen, maar vervolgens falen onder belasting, na een periode van inactiviteit of tijdens een failover.

Verbindingsfouten

De volgende secties behandelen veelvoorkomende foutmeldingen met betrekking tot verbindingen en hun oplossingen.

TCP-verbinding niet kunnen openen

Foutbericht: 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.

Oorzaken en oplossingen:

  • SQL Server draait niet. Start de SQL Server-service.
  • TCP/IP is niet ingeschakeld. Open SQL Server Configuration Manager en schakel TCP/IP in onder SQL Server Network Configuration>Protocols.
  • Verkeerde poort. Controleer de poort in SQL Server Configuration Manager of gebruik SQL Server Browser voor benoemde instanties.
  • Firewall blokkeert de poort. Voeg een inkomende regel toe voor poort 1433 (of je geconfigureerde poort).

Aanmelden is mislukt voor de gebruiker

Foutbericht: mssql: login error: Login failed for user '<user>'.

Oorzaken en oplossingen:

  • Onjuiste gebruikersnaam of wachtwoord. Controleer de gegevens.
  • SQL Server-authenticatie is uitgeschakeld. Schakel SQL Server en Windows Authenticatiemodus in in servereigenschappen.
  • De login bestaat niet. Maak de login aan in SQL Server.
  • De login heeft geen toegang tot de doeldatabase. Geef database-toegang met CREATE USER.

Fouten bij certificaatvalidatie

Foutbericht: TLS Handshake failed: x509: certificate signed by unknown authority

Oorzaken en oplossingen:

  • De server gebruikt een zelfondertekend certificaat. Geef het certificaatpad op met de parameter certificate of serverCertificate, of stel TrustServerCertificate=true alleen voor ontwikkeling in.
  • Het CA-certificaat staat niet in het vertrouwensarchief van het systeem. Voeg het CA-certificaat toe aan de OS-trustopslag of specificeer het met de certificate parameter.
  • Hostnaam komt niet overeen. Gebruik hostnameincertificate deze om de verwachte naam in het certificaat te specificeren.

Voor meer informatie, zie Versleuteling en certificaten.

Time-out voor de verbinding is overschreden

Foutbericht: unable to open tcp connection with host '<server>:1433': dial tcp: i/o timeout

Oorzaken en oplossingen:

  • Netwerkverbindingsproblemen. Controleer of je de server kunt bereiken door gebruik te maken van telnet <server> 1433 of Test-NetConnection -ComputerName <server> -Port 1433.
  • DNS-resolutie mislukt. Controleer of de hostnaam correct wordt opgelost.
  • Verhoog dial timeout of connection timeout in de verbindingsreeks.

Authenticatiefouten

De volgende secties behandelen authenticatiefoutmeldingen.

Mislukte NTLM-verificatie

Foutbericht: NTLM authentication failed

Oorzaken en oplossingen:

  • Verkeerd domeinformaat. Gebruik DOMAIN\user in de user id parameter. In URL-formaat codeer je de backslash als %5C.
  • Verkeerd wachtwoord. Controleer het domeinwachtwoord.

Kerberos-verificatiefouten

Foutbericht: krb5: cannot resolve KDC for realm

Oorzaken en oplossingen:

  • Ontbreekt of is verkeerd geconfigureerd /etc/krb5.conf. Controleer of de [realms] sectie het juiste KDC-adres voor jouw domein bevat.
  • Geen geldig ticket. Ren klist om te controleren of een geldig ticket is, of ren kinit om er een te verkrijgen.
  • Keytab-bestand niet gevonden. Controleer het pad in de krb5-keytabfile parameter.

Voor meer informatie, zie SQL Server en Windows authentication.

Microsoft Entra ID-verificatiefouten

Foutmelding: clientCredentialFromCert: error reading certificate: ... of DefaultAzureCredential: failed to acquire a token

Oorzaken en oplossingen:

  • Onjuiste client-ID, tenant-ID of client secret. Controleer de waarden in de verbindingsreeks of omgevingsvariabelen.
  • De beheerde identiteit is niet geconfigureerd op de host. Controleer de identiteit in het Azure-portaal.
  • Pakketimport ontbreekt azuread . Importeer github.com/microsoft/go-mssqldb/azuread en gebruik de naam van het stuurprogramma azuresql.

Zie Microsoft Entra ID-verificatie voor meer informatie.

Login mislukt voor gebruiker '' (lege gebruikersnaam)

Foutbericht: mssql: login error: Login failed for user ''.

Oorzaak: Je gebruikte sql.Open("sqlserver", ...) met een fedauth parameter. Entra ID-authenticatie vereist de azuresql bestuurdersnaam die door het azuread pakket is geregistreerd. Bij de standaarddriver sqlserver wordt de fedauth parameter genegeerd en probeert de driver SQL-authenticatie zonder gebruikersnaam.

Oplossing: Importeer het azuread pakket en gebruik de azuresql drivernaam:

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)
}

Zie Microsoft Entra ID-verificatie voor meer informatie.

Zoekfouten

De volgende secties behandelen foutmeldingen voor de uitvoering van een query (query execution error).

LastInsertId wordt niet ondersteund

Foutbericht: LastInsertId is not supported. Please use the OUTPUT clause or add 'select ID = convert(bigint, SCOPE_IDENTITY())' to the end of your query.

Oplossing: Het go-mssqldb stuurprogramma ondersteunt geen LastInsertId(). Gebruik een OUTPUT clausule of zoek SCOPE_IDENTITY() apart.

Tijdelijke tabel niet gevonden

Foutbericht: mssql: Invalid object name '#TempTable'.

Oorzaak: Tijdelijke tabellen zijn per verbinding. Als je in het ene gesprek een tijdelijke tabel aanmaakt en die in een andere oproep opvraagt, kunnen ze verschillende verbindingen uit de pool gebruiken.

Oplossing: Gebruik db.Conn(ctx) het om aan één enkele verbinding vast te pinnen, of om bewerkingen in een transactie te wikkelen.

Zie Opgeslagen procedures voor meer informatie.

Azure SQL-fouten

De volgende secties behandelen fouten die specifiek zijn voor Azure SQL Database.

Foutnummers voor tijdelijke verbindingen

Gebruik de volgende gedeelde lijst als referentie voor tijdelijke verbindingsoprichtingsfouten en verzoekpadtransportfouten die in aanmerking komen voor begrensde herkansing:

De volgende fouten zijn tijdelijk wanneer ze optreden tijdens het tot stand komen van de verbinding of tijdens het verzenden van een aanvraag naar de server. Probeer het na een korte, begrensde wachttijd opnieuw. Fouten die zich na enkele nieuwe pogingen voordoen, geven meestal een configuratieprobleem aan (verkeerde server, ontbrekende machtigingen, uitgeput quotum) die opnieuw proberen niet worden opgelost.

Fout Message Probleemoplossingsproces
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.) De TCP-verbinding valt halverwege de handshake weg. Geen referentiefout. Als dit zich blijft voordoen, controleert u op instabiliteit van het netwerk aan de clientzijde of een tussenliggend apparaat dat half tot stand gebrachte verbindingen afneemt.
233 The client was unable to establish a connection because of an error during connection initialization process before login. Transportfout vóór het aanmelden of TLS-fout. De server retourneert deze meestal wanneer deze de verbinding niet kan accepteren (resourceuitputting, max-connections bereikt of een niet-ondersteunde client). Geen referentiefout. Controleer de status van de server en controleer vervolgens de time-out voor clientaanmelding, de TLS-instellingen en de compatibiliteit van de TLS-versies van client en server.
4060 Cannot open database "%.*ls" requested by the login. The login failed. De aanmelding wordt geverifieerd, maar kan de aangevraagde database niet openen. Tijdelijke oorzaken zijn onder andere dat de database bezig is met een overgang (failover, herstel, schalen) of automatisch is gepauzeerd. Aanhoudende oorzaken (database bestaat niet, login heeft geen toegang) worden niet opgelost door opnieuw te proberen; controleer de databasenaam, de loginkoppeling en de status van de database.
4221 Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'. De replica is niet beschikbaar voor aanmelden omdat voor transacties die nog in uitvoering waren toen de replica werd gerecycled, rijversies ontbreken. Draai de actieve transacties op de primaire server terug of leg ze vast om het probleem op te lossen. Beperk dit door lange schrijftransacties op de primaire schijf te voorkomen.
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.) De lokale kant breekt de verbinding af. Controleer de netwerkstatus aan de clientzijde en een lokale firewall of VPN-client.
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.) De externe zijde verzendt een TCP-reset. Veelvoorkomende oorzaken: het peerproces is vastgelopen, een firewall heeft een reset geïnjecteerd of de Azure SQL-gateway heeft een niet-actieve verbinding gesloten. Schakel voor patronen van resets door inactiviteit TCP-keepalive in op de client of verkort de inactiviteitstime-out van de connectionpool.
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. De database overschrijdt een Azure SQL limiet voor resourcebeheer. Resource-id 1 geeft de werkrollimiet aan; Resource-id 2 geeft de sessielimiet aan. Identificeer het limiettype van het bericht en verminder de gelijktijdigheid, schaal de database omhoog of verkort langlopende bewerkingen die de resource bevatten.
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. De database zit boven de minimumgarantie en de onderliggende server beperkt de prestaties. Het opnieuw proberen slaagt meestal wanneer de load van de buur afneemt. Aanhoudende incidenten geven aan dat u een hoger serviceniveau of een minder rumoerige omgeving nodig hebt.
40020,40143,40166,40540 Gerapporteerd in de Error code %d sleuf van fout 40197 tijdens de failover. Subcodes die zijn ingebed in een 40197-failoverbericht en die sommige paden weergeven als foutnummer op topniveau. Behandel ze hetzelfde als 40197.
40197 The service has encountered an error processing your request. Please try again. Error code %d. Een software-upgrade, een hardwarefout of een andere failovergebeurtenis in Azure SQL. Opnieuw verbinden leidt u naar een gezonde replica. De ingesloten foutcode identificeert het failovertype. Als de fout zich blijft voordoen, legt u de sessietracerings-id vast en neemt u contact op met de ondersteuning.
40501 The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d. Azure SQL motorbeperking. De aanbevolen ondergrens is een wachttijd van 10 seconden. Aanhoudende throttling geeft aan dat de belasting de aan de database toegewezen resources heeft overschreden; schaal het serviceniveau op of verminder het aantal gelijktijdige aanvragen.
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'. De database is niet beschikbaar, meestal halverwege een failover of kort tijdens een schaalbewerking. Probeer het na enige wachttijd opnieuw; als het probleem na enkele minuten aanhoudt, leg dan de sessietracerings-id vast en maak een supportticket aan.
42108 Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again. De toegewezen SQL-pool (Synapse) is onderbroken. Opnieuw proberen lukt pas nadat de pool is hervat. Hervat de pool expliciet of plan de workload zodanig dat deze wordt uitgevoerd nadat de pool is hervat.
42109 The SQL pool is warming up. Please try again. De toegewezen SQL-pool wordt hervat. Blijf het opnieuw proberen met steeds langere tussenpozen totdat de pool online is; het opstarten duurt meestal een paar minuten.
49918 Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later. De server kan momenteel onvoldoende resources toewijzen om aan de aanvraag te voldoen. Opnieuw proberen na een wachttijd. Als de fout zich blijft voordoen, schaalt u de database of elastische pool omhoog.
49919 Cannot process create or update request. Too many create or update operations in progress for subscription "%ld". Gelijktijdigheidslimiet op abonnementsniveau voor beheerbewerkingen. Verminder parallelle aanroepen voor maken of bijwerken, of spreid ze in de tijd.
49920 Cannot process request. Too many operations in progress for subscription "%ld". Gelijktijdigheidslimiet op abonnementsniveau voor bewerkingen in vlucht. Verminder het parallelisme of wacht tot de lopende bewerkingen zijn voltooid.

Fouten op instructieniveau staan niet in deze lijst, omdat ze optreden nadat de verbinding tot stand is gekomen en de sessie na de fout bruikbaar blijft. De meest voorkomende fouten in opnieuw uit te voeren instructies zijn 1205 (deadlockslachtoffer) en 1222 (time-out bij een vergrendelingsaanvraag). Voer de hele transactie opnieuw uit in plaats van de enkele mislukte instructie.

De tekst van het foutbericht is afkomstig van Azure SQL tijdelijke verbindingsfouten. Afzonderlijke stuurprogramma's onderhouden hun eigen ingebouwde lijsten voor nieuwe pogingen; in deze catalogus wordt beschreven welke fouten in aanmerking komen voor nieuwe pogingen in SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL-database in Microsoft Fabric en toegewezen SQL-pools in Azure Synapse Analytics.

Kan server niet openen (firewall)

Foutbericht: 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.

Oorzaken en oplossingen:

  • Je client IP staat niet in de Azure SQL firewallregels. Voeg een firewallregel toe in het Azure-portaal: SQL server>Networking>Voeg een firewallregel toe.
  • Als uw toepassing wordt uitgevoerd in Azure, schakel dan Azure-services en -resources toegang tot deze server geven in.
  • Voor private connectiviteit configureer je een privé endpoint.

Resourcelimiet bereikt

Foutbericht: mssql: Resource ID: 1. The session limit for the database is 300 and has been reached.

Oorzaken en oplossingen:

  • Te veel gelijktijdige verbindingen voor de Azure SQL-tier. Verlaag MaxOpenConns in uw poolconfiguratie.
  • Verbindingslekken (niet-gesloten rijen of transacties). Controleer op ontbrekende defer rows.Close()- of defer tx.Rollback()-aanroepen.
  • Meerdere applicaties die de database delen. Verdeel de verbindingslimiet over alle klanten.

Voor Azure SQL-verbindingslimieten per tier, zie Azure SQL Database.

De dienst is momenteel overbelast (snelheidsbeperking)

Foutbericht: mssql: The service is currently busy. Retry the request after 10 seconds. Code: 40501.

Oorzaken en oplossingen:

  • De database staat onder zware belasting. Implementeer logica voor opnieuw proberen met exponentiële terugval.
  • De werklast overschrijdt de DTU- of vCore-capaciteit van het niveau. Overweeg om op te schalen.

Voor hertelingsimplementatiepatronen, zie Foutbehandeling en herproefpatronen.

Database momenteel niet beschikbaar

Foutbericht: mssql: Database 'AdventureWorks2025' on server '<server>' is not currently available. Code: 40613.

Oorzaak: Azure SQL herconfigureert de database (de failover, update of schaalbewerking). Deze voorwaarde is een tijdelijke fout.

Oplossing: probeer de operatie opnieuw. De database wordt meestal binnen enkele seconden beschikbaar. Voor meer informatie, zie Foutafhandeling en herkansingspatronen.

Slechte verbindingsfouten

Een driver: bad connection fout betekent dat de driver heeft gedetecteerd dat een bestaande verbinding niet langer bruikbaar is. De database/sql-pool probeert de bewerking bij niet-transactionele aanroepen automatisch opnieuw uit te voeren via een nieuwe verbinding, maar bewerkingen binnen een actieve transactie mislukken direct.

Begin niet met dit gedeelte als de applicatie nooit succesvol is verbonden. driver: bad connection wijst meestal op hergebruik, failover, idle timeout of netwerkonderbrekingen nadat de initiële verbinding al werkte.

Veelvoorkomende oorzaken

Oorzaak Typisch scenario Repareren
Azure SQL-gateway time-out bij inactiviteit Verbinding 30+ minuten inactief achter de Azure gateway. Stel db.SetConnMaxIdleTime(2 * time.Minute) zo in dat inactieve verbindingen worden hergebruikt voordat de gateway ze verbreekt.
Netwerkonderbreking Tijdelijke netwerkstoring tussen client en server. Implementeer herhalingslogica voor niet-transactionele bewerkingen. Zie Foutafhandeling.
Sessiebeëindiging aan serverzijde DBA beëindigde de sessie, of de server werd opnieuw opgestart. Probeer het opnieuw. Stel db.SetConnMaxLifetime in om verbindingen af te wisselen.
Herconfiguratie van Azure SQL Een failover-, schaal- of patchgebeurtenis heeft de verbinding verbroken. Stel ConnMaxLifetime in op 5 minuten of minder. Implementeer logica voor opnieuw proberen.
Time-out bij langlopende transacties Azure SQL beëindigde de sessie (fout 40549). Houd transacties kort. Splits grote bewerkingen op in kleinere batches.

Hoe database/sql omgaat met slechte verbindingen

Voor oproepen buiten een transactie (db.QueryContext, db.ExecContext), probeert de database/sql pool automatisch opnieuw de bewerking op een nieuwe verbinding wanneer de driver een slechte verbinding meldt. Deze herpoging is transparant voor je code.

Voor aanroepen binnen een transactie (tx.QueryContext, tx.ExecContext), kan de pool niet opnieuw proberen omdat de transactiestatus verloren gaat. Je code moet de fout opvangen, terugrollen en de hele transactie opnieuw proberen.

Configureer de pool zo dat deze kan omgaan met time-outs van de Azure-gateway en 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.

Voor on-premises SQL Server, ConnMaxIdleTime is dit minder kritisch omdat er geen time-out bij inactiviteit van de gateway is. Als u dit echter instelt, voorkomt u verouderde verbindingen na netwerkstoringen.

Voor gedetailleerde configuratierichtlijnen, zie Azure SQL Database.

Uitputting van de pool

Pool-uitputting treedt op wanneer alle verbindingen in de pool in gebruik zijn en nieuwe bellers het wachten op een verbinding blokkeren.

Symptomen

  • Verzoeken worden traag of krijgen een time-out onder belasting.
  • db.Stats().WaitCount groeit voortdurend.
  • db.Stats().InUse is MaxOpenConnsgelijk aan .
  • De context van de deadline overschreed de fouten tijdens piekverkeer.

Diagnose

Voeg poolmonitoring toe aan je applicatie:

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)

Veelvoorkomende oorzaken en oplossingen

Oorzaak Instructies voor identificeren Repareren
rows.Close() niet aangeroepen InUse groeit in de loop van de tijd, neemt nooit af. Voeg defer rows.Close() toe na elke QueryContext.
Langlopende transacties InUse blijft hoog tijdens batchverwerking. Houd transacties kort. Verwerk grote hoeveelheden in kleinere stukken.
MaxOpenConns te laag WaitCount groeit gestaag onder normale belasting nadat je vastgezette grondstoffen en lekken hebt uitgesloten. Verhoog MaxOpenConns.
MaxOpenConns niet ingesteld Honderden open verbindingen onder piekbelasting. Stel MaxOpenConns in op een begrensde waarde.
Goroutine lek roept db.Conn InUse groeit zonder overeenkomstige groei van verzoeken. Zorg ervoor dat elk db.Conn() resultaat wordt gesloten met defer conn.Close().

Voor gedetailleerde richtlijnen voor poolconfiguratie, zie Connection pooling.

Diagnostiek van trage of geblokkeerde query's

Stel time-outs voor query's in

Gebruik contextdeadlines om trage queries te identificeren en te voorkomen dat geblokkeerde SQL-aanroepen verbindingen vastpinnen en bellers vertragen:

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()

Voor een volledige prestatie-onderzoeksworkflow, inclusief Query Store, DMV's, ontbrekende indexanalyse en benchmarking, zie Performance tuning.

Deadlock-diagnostiek

Foutbericht: mssql: Transaction (Process ID 52) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Foutnummer: 1205

Oplossing: Deadlocks treden voor in gelijktijdige systemen. Implementeer automatische herkansingslogica voor fout 1205. Voor een deadlock retry wrapper-functie, zie Transacties.

Preventiestrategieën:

  • Toegangstabellen in dezelfde volgorde voor alle zoekopdrachten.
  • Houd transacties kort en vermijd interactie van gebruikers tijdens transacties.
  • Gebruik READ COMMITTED SNAPSHOT-isolatie om lockconflicten te verminderen.

Herhaalde deadlocks op dezelfde query wijzen op een ontwerpprobleem. Gebruik de deadlock-grafiek (vastgelegd via Extended Events of de systeemgezondheidssessie) om concurrerende statements en locktypes te identificeren. Voor een volledige rondleiding, zie de Deadlocks-gids. Voor deadlock-afhandelingsstrategieën in Go, zie Deadlock-afhandeling en Afhandelen van deadlocks.

Certificaatfouten met containers (Go 1.23 en latere versies)

Foutbericht: x509: negative serial number

Oorzaak: Go 1.23 handhaaft strikt RFC 5280. Het zelfondertekende certificaat dat SQL Server genereert in Docker-containers gebruikt een negatief serienummer, dat Go afwijst.

Oplossingen:

  • Voor testomgevingen voeg je TrustServerCertificate=true toe om certificaatvalidatie over te slaan, of encrypt=disable om versleuteling volledig uit te schakelen.
  • Voor CI/CD stel je de GODEBUG=x509negativeserial=1 omgevingsvariabele zo in dat het gedrag van vóór Go 1.23 wordt hersteld zonder je verbindingsreeks te veranderen.
  • Voeg in go.mod (Go 1.23 en latere versies) een godebug x509negativeserial=1-richtlijn toe om de overschrijving toe te passen tijdens het bouwen.

Let op

Gebruik TrustServerCertificate=true of encrypt=disable niet in productie. Deze opties schakelen beveiligingscontroles uit. Voor productie gebruik je een correct ondertekend certificaat.

SHA-1 certificaatfouten (Go 1.24 en latere versies)

Foutmelding: tls: handshake failure of TLS Handshake failed: EOF bij het verbinden met oudere SQL Server-instanties.

Oorzaak: Go 1.24 staat standaard geen SHA-1 handtekeningalgoritmen toe in TLS-certificaten. Oudere SQL Server-versies en sommige on-premises installaties gebruiken certificaten die met SHA-1 zijn ondertekend.

Oplossingen:

  • Geef het servercertificaat opnieuw uit met SHA-256 of later (aanbevolen).
  • Stel de GODEBUG=tlssha1=1 omgevingsvariabele in om SHA-1-ondersteuning tijdelijk weer in te schakelen.
  • In go.mod (Go 1.23 en latere versies) voeg een godebug tlssha1=1 richtlijn toe.

Wanneer te gebruiken encrypt=disable versus wanneer TrustServerCertificate=true

Configuratie Wat het doet Wanneer gebruiken
TrustServerCertificate=true Versleutelt het verkeer maar slaat certificaatvalidatie over. Lokale ontwikkeling en testen waarbij de server een zelfondertekend certificaat gebruikt.
encrypt=disable Verzendt verkeer in platte tekst (geen TLS). Legacy-omgevingen waar TLS niet beschikbaar is. Niet aanbevolen.
encrypt=strict TDS 8.0 met volledige TLS-validatie vanaf de eerste byte. Productieomgeving op SQL Server 2022 of Azure SQL.

Voor meer informatie, zie Testen en Encryptie en certificaten.

Problemen met codering en collatie

Waarschuwingen voor impliciete conversie

Als je string-parameters (verzonden in de vorm van nvarchar) doorgeeft aan varchar-kolommen, voert SQL Server een impliciete conversie uit die het gebruik van indexen kan verhinderen.

Dit voorbeeld bouwt voort op de database/sql en mssql-configuratie uit eerdere codefragmenten in dit artikel.

Oplossing: Gebruik mssql.VarChar voor varchar kolommen:

db.QueryContext(ctx, "SELECT * FROM Production.Product WHERE ProductNumber = @p1",
    mssql.VarChar("FR-R92B-58"))

CharsetToUTF8-fout met niet-Latijnse tekens

Foutmelding: CharsetToUTF8: ... bij het opvragen van varchar kolommen met Chinese, Japanse of andere niet-Latijnse karakters die zijn opgeslagen in een rangatie zoals SQL_Latin1_General_CP1_CI_AS.

Oorzaak: De driver probeert de codepagina van de kolom om te zetten naar UTF-8, maar de opgeslagen bytes komen niet overeen met de verwachte codering van de collatie.

Oplossingen:

  • Gebruik nvarchar in plaats van varchar voor kolommen die niet-Latijnse tekst opslaan. nvarchar slaat data op als UTF-16 en voorkomt codepaginaconversie.
  • Als je het kolomtype niet kunt veranderen, controleer dan of de database-collatie de tekenset ondersteunt die je opslaat.

Diagnostische logboekregistratie inschakelen

Gebruik de log verbindingsparameter om driver-level logging in te schakelen:

sqlserver://<user>:<password>@<server>?database=AdventureWorks2025&log=63

Logvlaggen zijn bitmaskwaarden: 1 (fouten), 2 (berichten), 4 (rijen), 8 (SQL), 16 (params), 32 (transacties), 64 (debug). Combineer waarden door ze op te tellen (bijvoorbeeld, 63 = alle behalve debug, 127 = alle).

Voor programmatische logging gebruik SetLogger of SetContextLogger. Zie Logboekregistratie en diagnostische gegevens.

Controlelijst voor probleemoplossing

Symptoom Eerste stap
Verbinding geweigerd Controleer of SQL Server draait en TCP/IP is ingeschakeld.
Aanmelden is mislukt Controleer de inloggegevens en authenticatiemodus.
Certificaatfout Controleer het servercertificaat of stel TrustServerCertificate=true in (alleen voor ontwikkeling).
Verbindingstijdoverschrijding Verifieer het netwerkpad met Test-NetConnection. Controleer de firewallregels.
Azure SQL-firewall Voeg je IP toe aan Azure SQL firewallregels.
Beperkingsfouten Voer herpoging uit met exponentiële backoff. Schaal de tier op.
Slechte verbinding Zet ConnMaxIdleTime onder de 30 minuten voor Azure SQL. Implementeer logica voor opnieuw proberen.
Uitputting van de pool Monitor db.Stats(). Herstel niet-gesloten rijen/transacties. Verhoog MaxOpenConns.
Trage queries Stel context-time-outs in. Vraag DMV's om dure vragen.
Deadlocks Voer opnieuw proberen uit bij fout 1205. Open tabellen in een consistente volgorde.
Impliciete conversie Gebruik mssql.VarChar voor varchar kolommen.