Použití go-mssqldb s Azure SQL Database

Ovladač go-mssqldb podporuje připojení k Azure SQL Database, Azure SQL Managed Instance a SQL databázi v Microsoft Fabric. Tento článek se zabývá konfigurací, autentizací, limity připojení a řešením problémů Azure, které se liší od on-premises SQL Server.

Připojení ke službě Azure SQL Database

Azure SQL Database vyžaduje šifrovaná připojení jako výchozí hodnotu. Specifikujte encrypt=true a explicitně TrustServerCertificate=false , aby spojení používalo TLS a ověřovalo serverový certifikát:

db, err := sql.Open("sqlserver",
    "sqlserver://<user>:<password>@<server>.database.windows.net?database=<database>&encrypt=true&TrustServerCertificate=false")
if err != nil {
    panic(err)
}

Note

Když vynecháte encrypt, ovladač automaticky nepřidá specifická TLS nastavení pro Azure. Zachovejte encrypt=true&TrustServerCertificate=false v připojovacích řetězcích Azure SQL.

Autentizace Microsoft Entra ID odstraňuje hesla z vašich spojovacích řetězců. ActiveDirectoryDefault Automaticky vybírá nejlepší dostupné přihlašovací údaje pro prostředí, což jej činí pohodlným pro vývoj:

import (
    "database/sql"
    "log"

    _ "github.com/microsoft/go-mssqldb/azuread"
)

func main() {
    db, err := sql.Open("azuresql",
        "sqlserver://<server>.database.windows.net?database=<database>&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
}

Important

ActiveDirectoryDefault je vhodný pro vývoj, ale může přidat latenci spojení, protože zkoumá více zdrojů přihlašovacích údajů. Pro produkční služby upřednostněte explicitní metodu, například ActiveDirectoryManagedIdentity nebo ActiveDirectoryServicePrincipal.

Jak ActiveDirectoryDefault řeší přihlašovací údaje

ActiveDirectoryDefault zkouší následující zdroje přihlašovacích údajů v pořadí a používá první, který uspěje:

Order Zdroj kvalifikace Typické prostředí
1 Proměnné prostředí (AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET) CI/CD pipeline, Docker kontejnery
2 Identita úloh Pody Kubernetes s Azure Workload Identity
3 Spravovaná identita Azure VMs, App Service, Container Apps, Azure Functions
4 Azure CLI (az login) Místní rozvoj
5 Azure Developer CLI (azd auth login) Místní rozvoj

Tento řetězec přihlašovacích údajů je při vývoji pohodlný, ActiveDirectoryDefault ale sekvenční sondování přidává latenci ke každému novému spojení. Pro produkci specifikujte přesnou autentizační metodu (například ActiveDirectoryManagedIdentity), aby ovladač přeskočil zbytečné kontroly.

Aplikace hostované v Azure (App Service, Container Apps, Azure Functions nebo Azure VM) by měly používat spravovanou identitu s explicitní fedauth hodnotou. Tento přístup se vyhýbá reži přihlašovacího řetězce a odstraňuje jakoukoli závislost na proměnných prostředí nebo stavu CLI.

Spravovaná identita přiřazená systémem:

sqlserver://<server>.database.windows.net?database=<database>&fedauth=ActiveDirectoryManagedIdentity&encrypt=true&TrustServerCertificate=false

Uživatelem přiřazená spravovaná identita (zadejte ID klienta):

sqlserver://<server>.database.windows.net?database=<database>&fedauth=ActiveDirectoryManagedIdentity&user id=<client-id>&encrypt=true&TrustServerCertificate=false

Udělit identitě přístup do databáze

Po konfiguraci spravované identity na Azure zdroji vytvořte uzavřeného databázového uživatele:

CREATE USER [my-app-identity] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [my-app-identity];
ALTER ROLE db_datawriter ADD MEMBER [my-app-identity];

Pro systémově přiřazené identity použijte název zdroje Azure. U identit přiřazených uživatelem použijte název identity.

Hlavní princip služby pro automatizaci

Pro kanály CI/CD nebo ověřování mezi službami:

sqlserver://<server>.database.windows.net?database=<database>&fedauth=ActiveDirectoryServicePrincipal&user id=<client-id>&password=<client-secret>&encrypt=true&TrustServerCertificate=false

Pro všechny typy přihlašovacích údajů viz Microsoft Entra ID autentizace.

Konfigurujte Azure firewall

Azure SQL Database používá firewall na úrovni serveru. Musíte povolit veřejnou IP adresu klienta nebo použít soukromý koncový bod.

Chyba: Nelze otevřít server

Tato chybová zpráva naznačuje, že Azure firewall blokuje IP adresu vašeho klienta:

mssql: login error: Cannot open server '<server>' requested by the login.
Client with IP address '<client-ip>' is not allowed to access the server.

Řešení:

  1. Přidejte firewallové pravidlo v Azure portálu: SQL server>Networking>Přidejte firewallové pravidlo.
  2. Povolte přístup Azure služeb a zdrojů k tomuto serveru, pokud vaše aplikace běží v Azure.
  3. Pro soukromé připojení nakonfigurujte privátní koncový bod.

Chyba: Vypršel čas připojení

Pokud u připojení dojde k vypršení časového limitu, aniž by se zobrazila jasná chyba, firewall připojení pravděpodobně blokuje bez upozornění. Nejprve ověřte pravidla firewallu.

Limity připojení podle úrovně služby

Azure SQL Database vynucuje limity připojení na databázi podle úrovně služby. Překročení limitu způsobuje selhání autentizace u nových připojení. Pro kompletní tabulky limitů viz limity jednotlivých databázových zdrojů DTU a limity jednotlivých databázových zdrojů ve vCore.

Nastavte MaxOpenConn tak, aby odpovídaly vaší úrovni

Vždy nastavte MaxOpenConns hodnotu pod limitem připojení pro vaši Azure SQL úroveň:

// Example for S2 tier (60 max workers).
// Leave headroom for Azure management connections and other clients.
db.SetMaxOpenConns(20)
db.SetMaxIdleConns(10)
db.SetConnMaxLifetime(5 * time.Minute)

Tip

Pokud více aplikací sdílí stejnou databázi, rozdělte limit připojení mezi všechny aplikace. Například pokud tři služby sdílejí databázi S2 (maximálně 60 pracovníků), přidělte 15–20 spojení na službu.

Řešení omezování v Azure SQL

Azure SQL Database může omezit spojení a dotazy, když databáze dosahuje limitů zdrojů (CPU, IO, paměť nebo počet relací). Zpomalování se projevuje konkrétními chybovými čísly.

Běžné chyby při zpomalování

Číslo chyby Vzor zprávy Příčina
10928 Resource ID: %d. The %s limit for the database is %d and has been reached. Dosaženo limitu relace nebo pracovníka.
10929 Resource ID: %d. The %s minimum guarantee is %d, maximum limit is %d. Omezení výkonu nástrojem Resource Governor.
40501 The service is currently busy. Obecné omezení. Zkuste to znovu.
40544 The database has reached its size quota. Limit velikosti databáze byl dosažen. Zvyšte kapacitu nebo volné místo před dalším pokusem.
40549 Session is terminated because you have a long-running transaction. Transakce překročila časový limit.
40550 Session is terminated because of too many locks. Nadměrné získávání zámku.
40551 Session is terminated because of excessive tempdb usage. Nadměrné používání tempdb.
40552 Session is terminated because of excessive transaction log usage. Prostor v logu transakcí byl překročen.
40553 Session is terminated because of excessive memory usage. Nadměrná spotřeba paměti.
40613 Database '%.*ls' on server '%.*ls' is not currently available. Databáze se přesouvá nebo přenastavuje.
49918 Cannot process request. Not enough resources to process request. Vyčerpání prostředků
49919 Cannot process create or update request. Příliš mnoho současných operací vytváření/aktualizace.
49920 Cannot process request. Too many operations in progress. Dosaženo limitu současného provozu.

Opakovat omezené požadavky

Většina chyb souvisejících s omezením rychlosti a dostupností v Azure SQL v předchozí tabulce je přechodná a operaci je při nich vhodné opakovat s exponenciálně rostoucí prodlevou. Chyba 40544 není přechodná. To znamená, že databáze dosáhla své kvóty velikosti, takže operace nebude úspěšná, dokud databázi nerozšíříte nebo data nesmažete.

Pro kompletní implementaci opakovaného pokusu viz Zvládání chyb a vzory opakovaných pokusů.

import (
    "errors"

    mssql "github.com/microsoft/go-mssqldb"
)

func isAzureThrottling(err error) bool {
    var mssqlErr mssql.Error
    if !errors.As(err, &mssqlErr) {
        return false
    }
    switch mssqlErr.Number {
    case 10928, 10929, 40501, 40549, 40550, 40551, 40552, 40553,
        40613, 49918, 49919, 49920:
        return true
    }
    return false
}

Odolnost připojení

Azure SQL Database občas rekonfiguruje servery pro aktualizace, failovery a load balancing. Tyto události přerušují existující spojení, která se objevují jako driver: bad connection chyby. Nakonfigurujte svůj pool tak, aby se obnovoval automaticky:

db.SetConnMaxLifetime(5 * time.Minute)  // Rotate connections so stale ones are replaced.
db.SetConnMaxIdleTime(2 * time.Minute)  // Recycle before Azure gateway drops idle connections (30 min).
db.SetMaxIdleConns(10)                  // Keep warm connections for quick recovery.

Note

Azure SQL brána uzavírá spojení, která jsou nečinná asi 30 minut. Nastavte ConnMaxIdleTime výrazně pod tento limit, abyste se vyhnuli driver: bad connection chybám při prvním dotazu po nečinnosti. U netransakčních volání se database/sql automaticky zopakuje v rámci nového připojení. U transakčních volání musí váš kód chybu zachytit a zkusit celou transakci znovu.

Opětovné připojení po přepnutí při selhání

Mimo transakce může database/sql transparentně zopakovat volání, které začíná na vadném připojení, pokud ovladač označí připojení jako nepoužitelné. Toto chování není úplná politika opakovaného pokusu při přechodných chybách pro throttling, failover nebo jiné opakovatelné SQL chyby. Zabalte své databázové volání do funkce opakovaného pokusu, která zvládne tyto scénáře:

var count int
err := RetryFunc(ctx, DefaultRetryConfig, func(ctx context.Context) error {
    return db.QueryRowContext(ctx, "SELECT COUNT(*) FROM HumanResources.Employee").Scan(&count)
})

Viz vzory zpracování chyb a opakovaných pokusů pro implementaci.RetryFunc

Azure SQL Managed Instance

Azure SQL Managed Instance podporuje stejné funkce ovladačů jako on-premises SQL Server, s několika rozdíly:

funkce Azure SQL Database Azure SQL Managed Instance
Agent SQL Serveru Není k dispozici Available
Dotazy napříč databázemi Není k dispozici Available
Propojené servery Není k dispozici Available
Pojmenované kanály Není k dispozici Není dostupné (pouze TCP)
Sdílená paměť Není k dispozici Není dostupné (pouze TCP)
Ověřování systému Windows (SSPI) Není k dispozici Dostupné v rámci spravovaného VNetu

Připojte se k Managed Instance:

sqlserver://<user>:<password>@<instance>.database.windows.net?database=<database>&encrypt=true&TrustServerCertificate=false

Databáze SQL v rámci Microsoft Fabric

Important

SQL databáze ve Fabric vyžaduje autentizaci Microsoft Entra ID. Autentizace přes SQL Server není podporována.

Pro produkční pracovní zátěže preferujte explicitní fedauth režim místo ActiveDirectoryDefault toho, abyste se vyhnuli režii ověřování přihlašovacích řetězců u nových připojení.

SQL databáze ve Fabric podporuje ovladač go-mssqldb s ověřováním Microsoft Entra ID:

db, err := sql.Open("azuresql",
    "sqlserver://<server>.database.fabric.microsoft.com?database=<database>&fedauth=ActiveDirectoryDefault&encrypt=true&TrustServerCertificate=false")
if err != nil {
    panic(err)
}

Tipy pro výkon Azure SQL

Tip Podrobnosti
Používejte sdružování připojení Azure SQL započítává každé otevřené připojení do limitu úrovně služby. Udržujte MaxOpenConns v mezích.
Povolte encrypt=strict. Pro nejsilnější bezpečnost použijte šifrování TDS 8.0: encrypt=strict. Azure SQL Database podporuje přísný režim.
Použijte ApplicationIntent=ReadOnly Směrujte dotazy náročné na čtení na repliky pro čtení: ApplicationIntent=ReadOnly. Dostupné na úrovních Premium, Business Critical a Hyperscale.
Monitorování využití DTU/vCore Vysoké využití CPU, IO nebo pracovníků naznačuje, že vaše úroveň může být poddimenzovaná. Použijte Azure Monitor ke sledování využití zdrojů.
Udržujte transakce krátké Azure SQL ukončuje relace transacemi, které překračují prahové hodnoty zdrojů (chyba 40549).
Použití regionálních koncových bodů Umístěte svou aplikaci do stejné Azure oblasti jako databáze, abyste minimalizovali latenci.

Kontrolní seznam řešení problémů s Azure SQL

Symptom Pravděpodobná příčina Solution
Cannot open server Chybějící pravidlo firewallu Přidejte svou IP adresu nebo povolte přístup k Azure službám.
Login failed Špatné přihlašovací údaje nebo chybějící uživatel databáze Ověřte, že přihlášení existuje a má přístup do databáze.
Připojení se přerušuje Rekonfigurace serveru nebo failover Zaveďte logiku opakovaných pokusů a rotaci spojení.
Resource limit reached Příliš mnoho souběžných spojení Snižte MaxOpenConns a neprodleně ukončete připojení.
The service is currently busy Azure SQL – omezování výkonu Opakujte s exponenciálním zpožděním. Zvažte větší škálování.
Pomalé dotazy po bezproblémovém fungování Vyčerpání DTU/vCore Zkontrolujte metriky ve službě Azure Monitor. Zvětšit nebo optimalizovat dotazy.