Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
Şifresiz kimlik doğrulama kullanın (önerilir)
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.
Üretim için yönetilen kimlik (önerilir)
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:
- Azure portalında bir güvenlik duvarı kuralı ekleyin: SQL server>Ağ Oluşturma>Güvenlik duvarı kuralı ekle.
- Uygulamanız Azure'da çalışıyorsa Azure hizmetlerine ve kaynaklarına bu sunucuya erişim izni et.
- Ö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. |