Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
Používejte autentizaci bez hesla (doporučeno)
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.
Spravovaná identita pro produkci (doporučeno)
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í:
- Přidejte firewallové pravidlo v Azure portálu: SQL server>Networking>Přidejte firewallové pravidlo.
- Povolte přístup Azure služeb a zdrojů k tomuto serveru, pokud vaše aplikace běží v Azure.
- 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. |