Azure SQL Veritabanı ile go-mssqldb kullanın

Sürücügo-mssqldb, Microsoft Fabric'te Azure SQL Veritabanı, Azure SQL Yönetilen Örneği ve SQL veritabanına bağlanmayı destekler. Bu makale, Azure'a özgü yapılandırma, kimlik doğrulama, bağlantı sınırları ve on-premises SQL Server'dan farklı sorun giderme konularını ele alır.

Azure SQL Veritabanı’na bağlanma

Azure SQL Veritabanı varsayılan olarak şifrelenmiş bağlantıları gerektirir. Bağlantının TLS kullanmasını ve sunucu sertifikasını doğrulamasını açıkça belirtin encrypt=trueTrustServerCertificate=false :

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

Uyarı

Atladığınızdaencrypt, sürücü otomatik olarak Azure'a özgü TLS ayarları eklemez. Azure SQL bağlantı dizelerinde encrypt=true&TrustServerCertificate=false öğesini koruyun.

Microsoft Entra ID doğrulaması, bağlantı dizisindeki şifreleri ortadan kaldırır. ActiveDirectoryDefault Ortam için en iyi mevcut kimlik bilgisini otomatik olarak seçer ve bu da geliştirme için pratik hale getirir:

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 geliştirme için kullanışlıdır, ancak birden fazla kimlik kaynağını incelediği için bağlantı gecikmesi ekleyebilir. Üretim hizmetleri için, örneğin ActiveDirectoryManagedIdentity veya ActiveDirectoryServicePrincipalgibi açık bir yöntemi tercih edin.

ActiveDirectoryDefault kimlik bilgilerini nasıl çözer?

ActiveDirectoryDefault Aşağıdaki kimlik kaynağını sırayla dener ve ilk başarılı olanı kullanır:

Order Kimlik kaynağı Tipik ortam
1 Ortam değişkenleri (AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET) CI/CD boru hatları, Docker konteynerleri
2 İş yükü tanımlayıcı Azure Workload Identity kullanan Kubernetes pod'ları
3 İdare edilen kimlik Azure VMs, App Service, Container Apps, Azure İşlevleri
4 Azure CLI (az login) Yerel kalkınma
5 Azure Geliştirici CLI'sı (azd auth login) Yerel kalkınma

Bu kimlik bilgisi zinciri, geliştirme sırasında ActiveDirectoryDefault için kolaylık sağlar, ancak ardışık yoklama her yeni bağlantıda gecikmeye neden olur. Üretim için, sürücünün gereksiz kontrolleri atlaması için tam kimlik doğrulama yöntemini (örneğin ActiveDirectoryManagedIdentity) belirtin.

Azure'da barındırılan uygulamalar (App Service, Container Apps, Azure İşlevleri veya Azure VM'ler) açık bir değere sahip yönetilen bir kimlik fedauth kullanmalıdır. Bu yaklaşım, kimlik zinciri yükünü önler ve ortam değişkenlerine veya CLI durumuna olan bağımlılığı ortadan kaldırır.

Sistem tarafından atanan yönetilen kimlik:

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

Kullanıcı tarafından atanan yönetilen kimlik (istemci kimliğini belirtin):

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

Veritabanında kimlik erişimi verin

Azure kaynağında yönetilen kimlik yapılandırıldıktan sonra, kapalı bir veritabanı kullanıcısı oluşturun:

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];

Sistem tarafından atanan kimlikler için Azure kaynak adını kullanın. Kullanıcı tarafından atanan kimlikler için kimlik adını kullanın.

Otomasyon için hizmet sorumlusu

CI/CD boru hatları veya hizmet-hizmet kimlik doğrulama için:

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

Tüm kimlik bilgileri türleri için bkz. Microsoft Entra ID doğrulaması.

Azure firewall'u configure

Azure SQL Veritabanı sunucu seviyesinde bir firewall kullanır. Müşterinizin genel IP adresine izin vermeniz veya özel bir uç nokta kullanmanız gerekir.

Hata: Sunucu açılamıyor

Bu hata mesajı, Azure güvenlik duvarının istemci IP adresinizi engellediğini gösteriyor:

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

Çözümler:

  1. Azure portalında bir güvenlik duvarı kuralı ekleyin: SQL server>Ağ Oluşturma>Güvenlik duvarı kuralı ekle.
  2. Uygulamanız Azure'da çalışıyorsa Azure hizmetlerine ve kaynaklarına bu sunucuya erişim izni et.
  3. Özel bağlantı için özel uç noktası yapılandırın.

Hata: Bağlantı zamanı doldu

Bağlantı, belirgin bir hata vermeden zaman aşımına uğrarsa, güvenlik duvarı büyük olasılıkla bağlantıyı sessizce engelliyor olabilir. Önce güvenlik duvarı kurallarını doğrulayın.

Hizmet katmanına göre bağlantı sınırları

Azure SQL Veritabanı, hizmet seviyesine göre veritabanı için bağlantı sınırlarını uygular. Sınırın aşılması yeni bağlantılarda kimlik doğrulama hatalarına neden olur. Tam limit tabloları için DTU tek veritabanı kaynak sınırları ve vCore tek veritabanı kaynak sınırları bkz.

MaxOpenConns'u kendi seviyenize göre ayarlayın

Azure SQL seviyeniz için bağlantı sınırının altında her zaman bir değer ayarlayınMaxOpenConns:

// 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

Birden fazla uygulama aynı veritabanını paylaşıyorsa, bağlantı sınırını tüm uygulamalar arasında böl. Örneğin, üç hizmet bir S2 veritabanını paylaşıyorsa (maksimum 60 çalışan), her servis için 15-20 bağlantı ayırın.

Azure SQL kısıtlamasını yönetme

Azure SQL Veritabanı, veritabanı kaynak sınırlarına (CPU, IO, bellek veya oturum sayısı) yaklaştığında bağlantıları ve sorguları kısıtlayabilir. Kısıtlama, belirli hata kodlarıyla kendini gösterir.

Yaygın kısıtlama hataları

Hata numarası İleti düzeni Cause
10928 Resource ID: %d. The %s limit for the database is %d and has been reached. Oturum veya çalışan sınırına ulaşıldı.
10929 Resource ID: %d. The %s minimum guarantee is %d, maximum limit is %d. Kaynak Yöneticisi daraltması.
40501 The service is currently busy. Genel gaz tuşlama. Yeniden deneyin.
40544 The database has reached its size quota. Veritabanı boyut sınırına ulaşıldı. Tekrar denemeden önce kapasiteyi veya boş alanı artırın.
40549 Session is terminated because you have a long-running transaction. İşlem zaman sınırını aştı.
40550 Session is terminated because of too many locks. Aşırı kilit edinme.
40551 Session is terminated because of excessive tempdb usage. Aşırı tempdb kullanımı.
40552 Session is terminated because of excessive transaction log usage. İşlem günlüğü alanı doldu.
40553 Session is terminated because of excessive memory usage. Aşırı hafıza tüketimi.
40613 Database '%.*ls' on server '%.*ls' is not currently available. Veritabanı taşınıyor veya yeniden yapılandırılıyor.
49918 Cannot process request. Not enough resources to process request. Kaynak tükenmesi.
49919 Cannot process create or update request. Çok fazla eşzamanlı oluşturma/güncelleme işlemi var.
49920 Cannot process request. Too many operations in progress. Eşzamanlı çalışma sınırına ulaşıldı.

Hızı sınırlandırılmış istekleri yeniden deneyin

Önceki tablodaki Azure SQL kısıtlama ve kullanılabilirlik hatalarının çoğu geçicidir ve üstel geri çekilme uygulanarak yeniden denenmelidir. Hata 40544 geçici değildir. Bu, veritabanının büyüklük kotasına ulaştığı anlamına gelir, bu yüzden işlem veritabanını ölçeklendirene veya veri silene kadar başarılı olmayacak.

Tam bir yeniden deneme uygulaması için Hata işleme ve tekrar deneme kalıpları bölümlerine bakınız.

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
}

Bağlantı dayanıklılığı

Azure SQL Veritabanı zaman zaman güncellemeler, failoverlar ve yük dengeleme için sunucuları yeniden yapılandırır. Bu olaylar mevcut bağlantıları keser; bu da driver: bad connection hataları olarak görünür. Havuzunuzu otomatik olarak geri kazanacak şekilde ayarlayın:

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.

Uyarı

Azure SQL gateway, yaklaşık 30 dakika boşta kalan bağlantıları kapatır. Bir boş dönemden sonra ilk sorguda hata yaşanmaması ConnMaxIdleTime için bu eşiğin çok altına ayarlayındriver: bad connection. İşlemsel olmayan çağrılar için, database/sql yeni bir bağlantı üzerinden otomatik olarak yeniden dener. İşlemsel çağrılar için, kodunuz hatayı yakalamalı ve tüm işlemi yeniden denemelidir.

Failover sonrası yeniden bağlantı

İşlemler dışında, sürücü bağlantıyı kullanılamaz olarak işaretlediğinde database/sql, hatalı bir bağlantı üzerinden başlayan bir çağrıyı saydam biçimde yeniden deneyebilir. Bu davranış, throttling, failover veya diğer tekrar denenebilir SQL hataları için tam bir geçici hata yeniden deneme politikası değildir. Veritabanı çağrılarınızı bu senaryoları yönetmek için bir yeniden deneme fonksiyonuna sarın:

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

Uygulama için Hata işleme ve tekrar deneme kalıplarınaRetryFunc bakınız.

Azure SQL Yönetilen Varlık

Azure SQL Yönetilen Örneği, on-premises SQL Server ile aynı sürücü özelliklerini destekler, ancak birkaç fark vardır:

Özellik Azure SQL Veritabanı Azure SQL Yönetilen Varlık
SQL Server Aracısı Mevcut değil Available
Veritabanları arası sorgular Mevcut değil Available
Bağlı sunucular Mevcut değil Available
Adlandırılmış kanallar Mevcut değil Mevcut değil (sadece TCP)
Paylaşılan bellek Mevcut değil Mevcut değil (sadece TCP)
Windows kimlik doğrulaması (SSPI) Mevcut değil Yönetilen VNet içinde mevcut

Bir Managed Instance'a Bağlanın:

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

Microsoft Fabric'da SQL veritabanı

Important

Fabric'te SQL veritabanı için Microsoft Entra ID doğrulaması gereklidir. SQL Server doğrulaması desteklenmiyor.

Üretim iş yüklerinde, yeni bağlantılarda kimlik bilgisi zinciri yoklama ek yükünü önlemek için ActiveDirectoryDefault yerine açık fedauth modunu tercih edin.

Fabric'teki SQL veritabanı, Microsoft Entra ID kimlik doğrulama ile sürücüyü desteklergo-mssqldb:

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

Azure SQL performans ipuçları

Tip Ayrıntılar
Bağlantı havuzunu kullanın Azure SQL, her açık bağlantıyı tier limitine sayar. MaxOpenConns sınırlı tutun.
encrypt=strict öğesini etkinleştirin En güçlü güvenlik için TDS 8.0 şifrelemesini kullanın: encrypt=strict. Azure SQL Veritabanı strict modu destekler.
ApplicationIntent=ReadOnly komutunu kullanma Okuma ağırlıklı sorguları okuma replikalarına yönlendirin: ApplicationIntent=ReadOnly. Premium, Business Critical ve Hyperscale katmanlarında mevcuttur.
DTU/vCore kullanımını izleme Yüksek CPU, IO veya işçi kullanımı, seviyenizin küçük olabileceğini gösterir. Kaynak kullanımını izlemek için Azure İzleyici’ü kullanın.
İşlemleri kısa tutun Azure SQL, kaynak eşiklerini aşan işlemlerle oturumları sonlandırır (error 40549).
Bölgesel uç noktaları kullanma Gecikmeyi en aza indirmek için uygulamanızı veritabanıyla aynı Azure bölgesine yerleştirin.

Azure SQL sorun giderme denetim listesi

Belirti Olası neden Çözüm
Cannot open server Güvenlik duvarı kuralı eksik IP'nizi ekleyin veya Azure hizmetlerine erişimi etkinleştirin.
Login failed Yanlış kimlik bilgileri veya eksik veritabanı kullanıcısı Girişin var olduğunu ve veritabanına erişimi olduğunu doğrulayın.
Bağlantılar zaman zaman zaman aşımına uğruyor Sunucu yeniden yapılandırması veya yedek sunucuya geçiş Yeniden deneme mantığı ve bağlantı döndürme uygulayın.
Resource limit reached Çok fazla eşzamanlı bağlantı MaxOpenConns sayısını azaltın ve bağlantıları derhal kapatın.
The service is currently busy Azure SQL throttling Üstel geri çekilme ile yeniden deneyin. Ölçeklendirmeyi düşün.
Daha önce düzgün çalışırken sorguların yavaşlaması DTU/vCore tükenmesi Azure İzleyici ölçümlerini denetleyin. Sorguları ölçeklendirin veya optimize edin.