Řešení problémů s ovladačem go-mssqldb

Tento článek nabízí řešení běžných chyb a problémů s připojením ovladače go-mssqldb .

Začněte s nejjednoduššími kontrolami

Než povolíte verbose logging nebo změníte nastavení poolu, projděte si následující seznam:

  1. Ověřte základní dostupnost: název serveru, port, pravidla firewallu a zda SQL Server nebo Azure SQL přijímá připojení.
  2. Ověřte autentizační vstupy: název ovladače, uživatelské jméno, heslo, formát domény nebo fedauth konfiguraci.
  3. Ověřte nastavení TLS: encrypt, certifikační cesty, hostnameincertificate, a zda TrustServerCertificate je vhodné pro dané prostředí.
  4. Teprve poté, co je připojení správně nastaveno, prověřte vyčerpání poolu, zastaralá připojení, logiku opakování a pomalou nebo blokovanou diagnostiku dotazů.

Použijte rané části tohoto článku pro případy selhání připojení. Pozdější části používejte pouze poté, co připojení alespoň někdy uspěje a pak selže při zátěži, po nečinnosti nebo při přepínaní v záloži.

Chyby připojení

Následující sekce se věnují běžným chybovým hlášením souvisejícím s připojením a jejich řešením.

Nelze otevřít TCP spojení

Chybová zpráva: 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.

Příčiny a jejich řešení:

  • SQL Server neběží. Spusť službu SQL Server.
  • TCP/IP není zapnuté. Otevřete SQL Server Configuration Manager a povolte TCP/IP v rámci SQL Server Network Configuration>Protocols.
  • Špatný port. Ověřte port v SQL Server Configuration Manager nebo použijte SQL Server Browser pro pojmenované instance.
  • Firewall blokuje port. Přidejte příchozí pravidlo pro port 1433 (nebo váš nakonfigurovaný port).

Přihlášení uživatele se nezdařilo.

Chybová zpráva: mssql: login error: Login failed for user '<user>'.

Příčiny a jejich řešení:

  • Nesprávné uživatelské jméno nebo heslo. Ověřte si přihlašovací údaje.
  • Autentizace SQL Server je deaktivována. Povolte SQL Server a režim autentizace Windows ve vlastnostech serveru.
  • Přihlášení neexistuje. Vytvořte přihlášení v SQL Server.
  • Přihlášení nemá přístup k cílové databázi. Udělit přístup k databázi pomocí CREATE USER.

Chyby validace certifikátů

Chybová zpráva: TLS Handshake failed: x509: certificate signed by unknown authority

Příčiny a jejich řešení:

  • Server používá samopodepsaný certifikát. Zadejte certifikační cestu s parametrem certificate or serverCertificate nebo nastavte TrustServerCertificate=true pouze pro vývoj.
  • CA certifikát není v úložišti System Trust. Přidejte certifikát CA do úložiště OS trust nebo jej specifikujte parametrem certificate .
  • Nesoulad s názvem hostitele. Pomocí hostnameincertificate zadejte očekávaný název v certifikátu.

Pro více informací viz Šifrování a certifikáty.

Vypršel časový limit připojení

Chybová zpráva: unable to open tcp connection with host '<server>:1433': dial tcp: i/o timeout

Příčiny a jejich řešení:

  • Problémy s připojením k síti. Ověřte, že se můžete na server dostat pomocí telnet <server> 1433 nebo Test-NetConnection -ComputerName <server> -Port 1433.
  • Selhání rozlišení DNS. Ověřte, že se název hostitele správně vyřeší.
  • Zvyšte dial timeout nebo connection timeout v připojovacím řetězci.

Chyby ověřování

Následující části se věnují chybovým hlášením o autentizaci.

Selhání autentizace NTLM

Chybová zpráva: NTLM authentication failed

Příčiny a jejich řešení:

  • Nesprávný formát domény. Použijte DOMAIN\user v parametru user id. Ve formátu URL zakódujte zpětné lomítko jako %5C.
  • Špatné heslo. Ověřte heslo domény.

Selhání ověřování přes Kerberos

Chybová zpráva: krb5: cannot resolve KDC for realm

Příčiny a jejich řešení:

  • Chybí nebo je špatně nastavené /etc/krb5.conf. Ověřte, že sekce [realms] obsahuje správnou KDC adresu pro vaši doménu.
  • Žádná platná jízdenka. Běžte klist zkontrolovat platný lístek, nebo si ho kinit vyzvednout.
  • Soubor keytab nebyl nalezen. Ověřte cestu v parametru krb5-keytabfile .

Pro více informací viz SQL Server a Windows authentication.

Selhání ověřování Microsoft Entra ID

Chybová zpráva: clientCredentialFromCert: error reading certificate: ... nebo DefaultAzureCredential: failed to acquire a token

Příčiny a jejich řešení:

  • Nesprávné ID klienta, ID tenanta nebo tajemství klienta. Ověřte hodnoty v připojovacím řetězci nebo v proměnných prostředí.
  • Spravovaná identita není na hostiteli nastavená. Ověřte identitu v portálu Azure.
  • Chybí import balíčku azuread. Importujte github.com/microsoft/go-mssqldb/azuread a použijte název ovladače azuresql .

Další informace naleznete v tématu Ověřování Pomocí entra ID společnosti Microsoft.

Přihlášení pro uživatele selhalo (prázdné uživatelské jméno)

Chybová zpráva: mssql: login error: Login failed for user ''.

Příčina: Použil jsi sql.Open("sqlserver", ...) s parametrem fedauth. Autentizace Entra ID vyžaduje název ovladače azuresql, zaregistrovaný balíčkem azuread. U standardního sqlserver ovladače je parametr fedauth ignorován a ovladač se pokouší o SQL autentizaci bez uživatelského jména.

Řešení: Importovat azuread balíček a použít název ovladače 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)
}

Další informace naleznete v tématu Ověřování Pomocí entra ID společnosti Microsoft.

Chyby dotazů

Následující sekce se zabývají chybovými zprávami o provádění dotazu.

LastInsertId není podporováno

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

Řešení: Ovladač go-mssqldb nepodporuje LastInsertId(). Použijte klauzuli OUTPUT nebo dotaz SCOPE_IDENTITY() zvlášť.

Dočasná tabulka nenalezena

Chybová zpráva: mssql: Invalid object name '#TempTable'.

Příčina: Dočasné tabulky jsou pro každé připojení zvlášť. Pokud vytvoříte dočasnou tabulku v jednom hovoru a dotazujete ji v jiném, mohou použít jiné připojení z poolu.

Řešení: Použijte db.Conn(ctx), chcete-li připnout k jedinému připojení, nebo proveďte operace v rámci transakce.

Další informace naleznete v tématu Uložené procedury.

Azure SQL errors

Následující sekce se věnují chybám specifickým pro Azure SQL Database.

Čísla chyb přechodného spojení

Použijte následující sdílený seznam jako referenční seznam pro přechodné chyby při navazování spojení a selhání přenosu v cestě požadavku, u nichž je možné provést omezený počet opakování:

Následující chyby jsou přechodné, pokud k nim dojde během vytváření připojení nebo při odesílání požadavku na server. Opakujte pokus po krátké, omezené prodlevě. Chyby, které přetrvávají i po několika opakováních, obvykle ukazují na problém s konfigurací (nesprávný server, chybějící oprávnění, vyčerpaná kvóta), který opakování pokusu nevyřeší.

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.) Spojení TCP se přeruší uprostřed navazování spojení. Nejedná se o selhání přihlašovacích údajů. Pokud přetrvává, zkontrolujte nestabilitu sítě na straně klienta nebo přechodné zařízení, které ukončí částečně zřízená připojení.
233 The client was unable to establish a connection because of an error during connection initialization process before login. Přenos před přihlášením nebo selhání protokolu TLS Server ho obvykle vrací, když nemůže přijmout připojení (vyčerpání prostředků, dosažení maximálního počtu připojení nebo nepodporovaného klienta). Nejedná se o selhání přihlašovacích údajů. Ověřte stav serveru a zkontrolujte časový limit přihlášení klienta, nastavení protokolu TLS a kompatibilitu verzí protokolu TLS klienta/serveru.
4060 Cannot open database "%.*ls" requested by the login. The login failed. Přihlášení se ověří, ale požadovanou databázi nejde otevřít. Mezi přechodné příčiny patří stav, kdy se databáze nachází ve stavu přechodu (převzetí služeb při selhání, obnovení, škálování) nebo je automaticky pozastavená. Trvalé příčiny (databáze neexistuje, chybějící přístup k přihlášení) nebudou opraveny opakovaným pokusem; zkontrolujte název databáze, mapování přihlášení a stav databáze.
4221 Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'. Replika není k dispozici pro přihlášení, protože verze řádků chybí pro transakce, které byly v testovacím prostředí při recyklaci repliky. Vrácením zpět nebo potvrzením aktivních transakcí na primárním serveru problém vyřešíte. Riziko zmírníte tím, že se vyhnete dlouhým zápisovým transakcím na primárním uzlu.
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.) Místní strana přeruší připojení. Zkontrolujte stav sítě na straně klienta a případnou místní bránu firewall nebo klienta 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.) Vzdálená strana odešle resetování protokolu TCP. Běžné příčiny: partnerský proces selhal, brána firewall vynutila reset spojení nebo brána Azure SQL ukončila nečinné připojení. U resetování při nečinnosti povolte na klientovi mechanismus TCP keepalive nebo zkraťte časový limit nečinnosti fondu připojení.
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. Databáze překračuje limit zásad správného řízení prostředků Azure SQL. ID prostředku 1 označuje limit pracovních procesů; ID prostředku 2 označuje limit relací. Určete typ limitu z hlášení a pak snižte souběžnost, navyšte kapacitu databáze nebo zkraťte dlouhotrvající operace, které blokují prostředek.
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. Databáze překračuje své garantované minimum a podkladový server omezuje výkon. Opakování obvykle proběhne úspěšně při poklesu zatížení souseda. Trvalé výskyty značí, že potřebujete vyšší úroveň služby nebo méně hlučné prostředí.
40020, 40143, , 4016640540 Hlášeno v slotu Error code %d chyby 40197 během převzetí služeb při selhání. Dílčí kódy obsažené ve zprávě o převzetí služeb při selhání 40197 se v některých případech zobrazují jako chybový kód nejvyšší úrovně. Zachází s nimi stejně jako s 40197.
40197 The service has encountered an error processing your request. Please try again. Error code %d. Aktualizace softwaru, selhání hardwaru nebo jiná událost převzetí služeb při selhání ve službě Azure SQL. Po opětovném připojení budete přesměrováni na zdravou repliku. Obsažený kód chyby určuje typ přepnutí při selhání. Pokud chyba přetrvává, poznamenejte si ID trasování relace a obraťte se na podporu.
40501 The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d. Azure SQL omezování motoru. Doporučené minimum je prodleva 10 sekund. Dlouhodobé omezování výkonu znamená, že pracovní zátěž překročila přidělené prostředky databáze; přejděte na vyšší úroveň služby nebo snižte souběžnost.
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'. Databáze není dostupná, obvykle během převzetí služeb při selhání nebo krátce během škálování. Opakujte pokus s postupně prodlužovaným intervalem; pokud problém přetrvává déle než několik minut, zaznamenejte ID trasování relace a vytvořte požadavek na podporu.
42108 Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again. Vyhrazený fond SQL (Synapse) je pozastavený. Opakovaný pokus bude úspěšný až po opětovném spuštění poolu. Fond obnovte explicitně nebo naplánujte úlohu tak, aby se spustila po obnovení fondu.
42109 The SQL pool is warming up. Please try again. Vyhrazený fond SQL se obnovuje. Opakujte pokus se zvyšujícími se prodlevami, dokud nebude pool online; inicializace obvykle trvá několik minut.
49918 Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later. Server momentálně nemůže přidělit dostatek prostředků pro splnění požadavku. Zkuste to znovu po prodlevě. Pokud chyba přetrvává, vertikálně navyšte kapacitu databáze nebo elastického fondu.
49919 Cannot process create or update request. Too many create or update operations in progress for subscription "%ld". Limit souběžnosti operací správy na úrovni předplatného Omezte souběžná volání pro vytvoření nebo aktualizaci, nebo je rozložte v čase.
49920 Cannot process request. Too many operations in progress for subscription "%ld". Limit souběžnosti probíhajících operací na úrovni předplatného. Snižte míru paralelismu nebo počkejte, až probíhající operace doběhnou.

Chyby na úrovni příkazů SQL nejsou v tomto seznamu, protože nastávají až po navázání připojení a po selhání zůstane relace použitelná. Nejběžnější chyby příkazů, které lze opakovat, jsou 1205 (oběť uváznutí) a 1222 (časový limit požadavku na zámek vypršel). Zkuste zopakovat celou transakci, nikoli jen jednotlivý příkaz, který selhal.

Text chybové zprávy je převzat z přechodných chyb připojení Azure SQL. Jednotlivé ovladače udržují vlastní integrované seznamy opakování; tento katalog popisuje, u kterých chyb lze operaci opakovat v prostředích SQL Server, Azure SQL Database, Azure SQL Managed Instance, databáze SQL v Microsoft Fabric a vyhrazené fondy SQL v Azure Synapse Analytics.

Nelze otevřít server (firewall)

Chybová zpráva: 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.

Příčiny a jejich řešení:

  • IP adresa vašeho klienta není v pravidlech Azure SQL firewallu. Přidejte firewallové pravidlo v Azure portálu: SQL server>Networking>Přidejte firewallové pravidlo.
  • Pokud vaše aplikace běží v Azure, povolte Povolit službám a prostředkům Azure přístup k tomuto serveru.
  • Pro soukromé připojení nakonfigurujte privátní koncový bod.

Dosažení limitu prostředků

Chybová zpráva: mssql: Resource ID: 1. The session limit for the database is 300 and has been reached.

Příčiny a jejich řešení:

  • Příliš mnoho souběžných připojení pro úroveň služby Azure SQL. Snižte MaxOpenConns v konfiguraci fondu.
  • Úniky připojení (neuzavřené řádky nebo transakce). Zkontrolujte, zda nechybí volání defer rows.Close() nebo defer tx.Rollback().
  • Více aplikací sdílejících databázi. Rozdělte limit připojení mezi všechny klienty.

Pro omezení připojení Azure SQL podle úrovně viz Azure SQL Database.

Služba je momentálně obsazená (zpomalování)

Chybová zpráva: mssql: The service is currently busy. Retry the request after 10 seconds. Code: 40501.

Příčiny a jejich řešení:

  • Databáze je pod velkým zatížením. Implementujte logiku opakování s exponenciálním zpožděním.
  • Pracovní zátěž přesahuje kapacitu DTU nebo vCore dané úrovně. Zvažte větší škálování.

Pro vzory implementace opakovaných pokusů viz Zpracování chyb a vzory opakovaných pokusů.

Databáze momentálně není dostupná

Chybová zpráva: mssql: Database 'AdventureWorks2025' on server '<server>' is not currently available. Code: 40613.

Příčina: Azure SQL překonfiguruje databázi (failover, aktualizace nebo škálování). Tato podmínka je přechodná chyba.

Řešení: Zkusit operaci znovu. Databáze se obvykle stane dostupnou během několika sekund. Pro více informací viz Vzory zpracování chyb a opakovaných pokusů.

Chyby připojení

Chyba znamená, že ovladač zjistil, driver: bad connection že existující spojení již není použitelné. Pool automaticky znovu zkusí database/sql operaci na čerstvém spojení pro netransakční hovory, ale operace uvnitř aktivní transakce okamžitě selžou.

Nezačínejte touto částí, pokud se aplikace nikdy úspěšně nepřipojila. driver: bad connection obvykle ukazuje na opětovné použití připojení, failover, vypršení časového limitu nečinnosti nebo přerušení sítě poté, co původní připojení již fungovalo.

Běžné příčiny

Příčina Typický scénář Opravit
Časový limit nečinnosti brány Azure SQL Připojení je nečinné déle než 30 minut za bránou Azure. Nastavte db.SetConnMaxIdleTime(2 * time.Minute) tak, aby se nečinné připojení recyklovalo dříve, než je gateway vyřadí.
Přerušení sítě Přechodné selhání sítě mezi klientem a serverem. Implementujte logiku opakovaných pokusů pro netransakční operace. Viz Zpracování chyb.
Ukončení relace na straně serveru DBA ukončila relaci, nebo byl server restartován. Zkuste to znovu. Nastavte db.SetConnMaxLifetime pro otáčení spojů.
Rekonfigurace Azure SQL Událost failoveru, škálování nebo aplikace oprav způsobila přerušení spojení. Nastavte ConnMaxLifetime na 5 minut nebo méně. Implementujte logiku opakování.
Dlouhotrvající časový limit transakcí Azure SQL ukončil relaci (chyba 40549). Udržujte transakce krátké. Rozdělte velké operace na menší skupiny.

Jak databáze/SQL řeší špatné připojení

Pro volání mimo transakci (db.QueryContext, db.ExecContext) database/sql pool automaticky zkusí operaci na novém připojení, když ovladač hlásí špatné připojení. Tento pokus je transparentní pro váš kód.

Pro volání uvnitř transakce (tx.QueryContext, tx.ExecContext) pool nemůže zkusit znovu, protože stav transakce je ztracen. Váš kód musí chybu zachytit, vrátit zpět a zkusit celou transakci znovu.

Nakonfigurujte pool tak, aby dokázal zpracovat časové limity a přepnutí při selhání brány 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.

V případě místního serveru SQL Server je ConnMaxIdleTime méně důležitý, protože neexistuje časový limit nečinnosti brány. Jeho nastavení však zabrání neaktivním spojením po narušení sítě.

Pro podrobné pokyny k konfiguraci viz Azure SQL Database.

Vyčerpání bazénu

Vyčerpání bazénu nastává, když jsou všechna připojení v poolu obsazena a noví volající čekají na připojení.

Příznaky

  • Požadavky se zpomalují nebo při zátěži dochází k časovým limitům.
  • db.Stats().WaitCount roste neustále.
  • db.Stats().InUse rovná se MaxOpenConns.
  • K chybám „Context deadline exceeded“ dochází během špičkového provozu.

Diagnóza

Přidejte do své aplikace monitorování poolu:

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)

Běžné příčiny a jejich řešení

Příčina Jak identifikovat Opravit
rows.Close() nebylo voláno InUse Roste v průběhu času, nikdy neklesá. Přidávejte defer rows.Close() po každém QueryContext.
Dlouhotrvající transakce InUse zůstává vysoký během dávkového zpracování. Udržujte transakce krátké. Zpracovávejte velké dávky v menších kusech.
MaxOpenConns příliš nízko WaitCount Roste stabilně při normálním zatížení poté, co vyloučíte připnuté zdroje a úniky. Zvýšit MaxOpenConns.
MaxOpenConns nenastaveno Stovky otevřených připojení při špičkovém zatížení. Nastavte MaxOpenConns omezenou hodnotu.
Únik goroutine při volání db.Conn InUse roste bez odpovídajícího růstu požadavků. Ujistěte se, že každý výsledek db.Conn() je uzavřen značkou defer conn.Close().

Pro podrobné pokyny k konfiguraci poolu viz Connection pooling.

Pomalá nebo blokovaná diagnostika dotazů

Nastavte časové limity dotazů

Používejte kontextové termíny k identifikaci pomalých dotazů a zabránění blokovaným SQL hovorům, které by mohly připínat spojení a zdržovat volající:

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

Pro kompletní workflow pro vyšetřování výkonnosti, včetně Query Store, DMV, analýzy chybějících indexů a benchmarkingu, viz Performance tuning.

Diagnostika zablokování

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

Chybové číslo: 1205

Řešení: Slepé situace se vyskytují v souběžných systémech. Implementujte logiku automatického opakování při chybě 1205. Informace o obalové funkci pro opakování při uváznutí naleznete v části Transakce.

Preventivní strategie:

  • Přistupujte ke tabulkám ve stejném pořadí pro všechny dotazy.
  • Udržujte transakce krátké a vyhněte se interakci uživatelů během nich.
  • Používejte úroveň izolace READ COMMITTED SNAPSHOT, aby se omezily kolize zámků.

Opakované zablokování na stejném dotazu naznačuje problém v návrhu. Použijte graf uváznutí (zachycený prostřednictvím rozšířených událostí nebo relace stavu systému) k identifikaci kolidujících příkazů a typů zámků. Pro kompletní návod si přečtěte průvodce Deadlocks. Pro strategie řešení mrtvých situací v Go viz Řešení mrtvého bodu a Řešení mrtvých situací.

Chyby certifikátů u kontejnerů (verze Go 1.23 a novší)

Chybová zpráva: x509: negative serial number

Příčina: Go 1.23 přísně vynucuje RFC 5280. Samopodepsaný certifikát, který SQL Server generuje v Docker kontejnerech, používá záporné sériové číslo, které Go odmítá.

Řešení:

  • Pro testovací prostředí přidejte TrustServerCertificate=true možnost přeskočit validaci certifikátů nebo encrypt=disable zcela vypnout šifrování.
  • Pro CI/CD nastavte proměnnou GODEBUG=x509negativeserial=1 prostředí tak, aby obnovila chování před Go 1.23 bez změny připojovací řetězec.
  • V go.mod (verze Go 1.23 a pozdější) přidejte direktivu godebug x509negativeserial=1 pro aplikaci přepisu při sestavování.

Caution

Nepoužívejte TrustServerCertificate=true ani encrypt=disable v produkčním prostředí. Tyto možnosti deaktivují bezpečnostní kontroly. Pro produkci používejte správně podepsaný certifikát.

Chyby certifikátu SHA-1 (verze Go 1.24 a pozdější)

Chybová zpráva: tls: handshake failure nebo TLS Handshake failed: EOF při připojení ke starším instancím SQL Server.

Příčina: Go 1.24 ve výchozím nastavení zakazuje algoritmy podpisu SHA-1 v TLS certifikátech. Starší verze SQL Server a některé on-premises instalace používají certifikáty podepsané pomocí SHA-1.

Řešení:

  • Znovu vydat serverový certifikát s SHA-256 nebo novějším (doporučeno).
  • Nastavte proměnnou GODEBUG=tlssha1=1 prostředí tak, aby dočasně znovu povolila podporu SHA-1.
  • V go.mod (verze Go 1.23 a pozdější) přidejte direktivu godebug tlssha1=1 .

Kdy používat encrypt=disable a kdy TrustServerCertificate=true

Nastavení Jak funguje Kdy ho použít
TrustServerCertificate=true Šifruje provoz, ale vynechává validaci certifikátů. Lokální vývoj a testování, kde server používá samopodepsaný certifikát.
encrypt=disable Odesílá provoz nešifrovaně (bez TLS). Starší prostředí, kde TLS není dostupný. Nedoporučuje se.
encrypt=strict TDS 8.0 s plnou validací TLS z prvního bajtu. Produkční prostředí na SQL Serveru 2022 nebo Azure SQL.

Pro více informací viz Testování a šifrování a certifikáty.

Problémy s kódováním a tříděním

Varování před implicitní konverzí

Pokud předáte parametry (posílané string jako nvarchar) do varchar sloupců, SQL Server provede implicitní konverzi, která může zabránit použití indexu.

Tento příklad navazuje na dřívější nastavení database/sql a mssql z předchozích ukázek v tomto článku.

Řešení: Použijte mssql.VarChar pro varchar sloupce:

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

Chyba CharsetToUTF8 při zpracování nelatinských znaků

Chybová zpráva: CharsetToUTF8: ... při dotazování varchar sloupců obsahujících čínské, japonské nebo jiné nelatinské znaky uložené v kolaci jako SQL_Latin1_General_CP1_CI_AS.

Příčina: Ovladač se pokouší převést kódovou stránku sloupce na UTF-8, ale uložené bajty neodpovídají očekávanému kódování kolace.

Řešení:

  • Použijte nvarchar místo pro varchar sloupce, které ukládají nelatinský text. nvarchar ukládá data jako UTF-16 a vyhýbá se převodu mezi kódovými stránkami.
  • Pokud nemůžete změnit typ sloupce, ověřte, že kolekce databáze podporuje znakovou sadu, kterou ukládáte.

Povolit diagnostické protokolování

Použijte log parametr připojení k povolení logování na úrovni ovladače:

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

Logové příznaky jsou hodnoty bitové masky: 1 (chyby), 2 (zprávy), 4 (řádky), 8 (SQL), 16 (parametry), 32 (transakce), 64 (ladění). Hodnoty kombinujte jejich přičtením (například 63 = všechny kromě ladění, 127 = všechny).

Pro programové logování použijte SetLogger nebo SetContextLogger. Viz Protokolování a diagnostika.

Kontrolní seznam pro řešení potíží

Symptom První krok
Odmítnuté připojení Ověřte, že SQL Server běží a je TCP/IP povoleno.
Přihlášení se nezdařilo. Zkontrolujte přihlašovací údaje a autentizační režim.
Chyba certifikátu Zkontrolujte certifikát serveru nebo nastavte TrustServerCertificate=true (pouze pro vývoj).
Časový limit připojení vypršel Ověřte síťovou cestu pomocí Test-NetConnection. Zkontrolujte pravidla brány firewall.
Firewall Azure SQL Přidejte svou IP adresu do pravidel Azure SQL firewallu.
Chyby omezování Zkus to znovu s exponenciálním ústupem. Rozšiřte úroveň.
Špatné spojení Nastavte ConnMaxIdleTime na méně než 30 minut pro Azure SQL. Implementujte logiku opakování.
Vyčerpání bazénu Monitor db.Stats(). Opravte neuzavřené řádky/transakce. Zvýšit MaxOpenConns.
Pomalé dotazy Nastavte časové limity pro kontext. Dotazujte se na DMV kvůli drahým dotazům.
Deadlocks Zkusit to zopakovat při chybě 1205. Přistupujte ke tabulkám v konzistentním pořadí.
Implicitní konverze Použijte mssql.VarChar u sloupců varchar.