Azure SQL Database Kurulumu ve Yapılandırması

Bulut altyapısına geçiş yapan ekiplerin karşılaştığı en kritik kararlardan biri veritabanı yönetimi. On-premise SQL Server’dan Azure’a taşınmak hem özgürlük hem de yeni sorumluluklar getiriyor. Azure SQL Database, Microsoft’un tam yönetilen PaaS veritabanı servisi olarak yedekleme, yüksek erişilebilirlik ve güvenlik yamalarını sizin yerinize hallediyor. Ama “tam yönetilen” demek “konfigürasyon gerektirmez” anlamına gelmiyor. Bu yazıda Azure SQL Database’i sıfırdan kurup production’a hazır hale getireceğiz.

Ön Gereksinimler

Başlamadan önce şunlara ihtiyacınız var:

  • Aktif bir Azure aboneliği
  • Azure CLI (az komut satırı aracı) kurulu olması
  • Yeterli izinlere sahip bir hesap (en azından Contributor rolü)
  • Temel SQL Server bilgisi

Azure CLI kurulu değilse şu komutla hızlıca kurabilirsiniz:

# Ubuntu/Debian
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

# Kurulum sonrası versiyon kontrolü
az --version

# Azure hesabınıza giriş
az login

Giriş yaptıktan sonra hangi subscription üzerinde çalıştığınızı doğrulayın:

# Mevcut subscription'ı görüntüle
az account show --output table

# Birden fazla subscription varsa doğru olanı seçin
az account set --subscription "Subscription-Adi-veya-ID"

Resource Group Oluşturma

Azure’da her şey bir resource group altında yaşıyor. Production ortamı için anlamlı bir isimlendirme stratejisi belirleyin. Biz bu yazıda bir e-ticaret uygulaması senaryosu üzerinden gideceğiz.

# Resource group oluşturma
az group create 
  --name rg-eticaret-prod 
  --location westeurope 
  --tags Environment=Production Project=Eticaret Owner=DBTeam

# Resource group'u doğrula
az group show --name rg-eticaret-prod --output table

Neden westeurope? Türkiye’deki kullanıcılar için şu an en yakın Azure datacenter’lardan biri Batı Avrupa bölgesi. 2024 itibariyle Azure Türkiye bölgesi de aktif, bunu da değerlendirebilirsiniz:

# Türkiye'deki datacenter için
az group create 
  --name rg-eticaret-prod 
  --location turkeycentral 
  --tags Environment=Production Project=Eticaret

SQL Server Mantıksal Sunucusu Oluşturma

Azure SQL Database, fiziksel bir sunucu değil, mantıksal bir sunucu kavramı üzerine kurulu. Bu mantıksal sunucu altında birden fazla veritabanı barındırabilirsiniz. Firewall kuralları, admin hesabı ve güvenlik politikaları bu sunucu seviyesinde yönetiliyor.

# SQL Server mantıksal sunucusu oluşturma
az sql server create 
  --name sql-eticaret-prod-001 
  --resource-group rg-eticaret-prod 
  --location westeurope 
  --admin-user sqladmin 
  --admin-password "P@ssw0rd_Guvli!2024" 
  --enable-public-network true

# Sunucu bilgilerini kontrol et
az sql server show 
  --name sql-eticaret-prod-001 
  --resource-group rg-eticaret-prod 
  --output json

Sunucu adı globally unique olmak zorunda. Yukarıdaki komut çalışmazsa farklı bir isim deneyin. Sunucu oluştuktan sonra FQDN adresiniz şu formatta olacak: sql-eticaret-prod-001.database.windows.net

Güvenlik notu: Admin şifresi bu şekilde komut satırına yazmak production’da uygun değil. Bunu environment variable olarak geçmek çok daha güvenli:

# Şifreyi environment variable olarak ayarla
export SQL_ADMIN_PASSWORD="P@ssw0rd_Guvli!2024"

az sql server create 
  --name sql-eticaret-prod-001 
  --resource-group rg-eticaret-prod 
  --location westeurope 
  --admin-user sqladmin 
  --admin-password "$SQL_ADMIN_PASSWORD"

Azure AD Authentication Etkinleştirme

SQL authentication yerine Azure Active Directory authentication kullanmak güvenlik açısından çok daha iyi. Özellikle ekip ortamında her kişiye ayrı SQL kullanıcısı oluşturmak yerine Azure AD grupları üzerinden yetkilendirme yapabilirsiniz.

# Azure AD admin ayarlama (kendi email adresinizi veya bir grup kullanın)
az sql server ad-admin create 
  --resource-group rg-eticaret-prod 
  --server-name sql-eticaret-prod-001 
  --display-name "DB Admins" 
  --object-id $(az ad group show --group "DB Admins" --query id -o tsv)

Veritabanı Oluşturma ve Service Tier Seçimi

Mantıksal sunucuyu oluşturduktan sonra asıl veritabanını oluşturma zamanı. Azure SQL Database’de üç farklı satın alma modeli var:

  • DTU tabanlı: Basit, tahmin edilebilir iş yükleri için. Basic, Standard, Premium seçenekleri
  • vCore tabanlı: Daha fazla kontrol, ayrı compute ve storage ölçeklendirmesi. General Purpose, Business Critical, Hyperscale seçenekleri
  • Serverless: Otomatik ölçeklendirme, kullanmadığınızda duraklatma imkanı

E-ticaret senaryomuz için General Purpose vCore modeli tercih edelim:

# Production veritabanı oluşturma (vCore - General Purpose)
az sql db create 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name db-eticaret 
  --edition GeneralPurpose 
  --family Gen5 
  --capacity 4 
  --zone-redundant true 
  --backup-storage-redundancy Geo 
  --max-size 100GB 
  --collation Turkish_CI_AS

# Veritabanı durumunu kontrol et
az sql db show 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name db-eticaret 
  --output table

Dikkat etmeniz gereken parametreler:

  • –zone-redundant true: Availability zone’lar arası replikasyon, yüksek erişilebilirlik için şart
  • –backup-storage-redundancy Geo: Yedekler coğrafi olarak ayrı bir bölgede tutulur
  • –collation Turkish_CI_AS: Türkçe karakter desteği için kritik, kurarken bunu atlamayın
  • –max-size 100GB: Depolama sınırı, ihtiyaca göre ayarlayın

Test ve geliştirme ortamı için çok daha ucuz bir konfigürasyon:

# Dev/Test veritabanı (serverless mod, maliyet optimize)
az sql db create 
  --resource-group rg-eticaret-dev 
  --server sql-eticaret-dev-001 
  --name db-eticaret-dev 
  --edition GeneralPurpose 
  --family Gen5 
  --capacity 1 
  --compute-model Serverless 
  --auto-pause-delay 60 
  --min-capacity 0.5 
  --max-size 32GB 
  --collation Turkish_CI_AS

--auto-pause-delay 60 parametresi, veritabanını 60 dakika kullanılmadığında otomatik durdurur. Dev ortamı için mükemmel bir maliyet tasarrufu yöntemi.

Firewall Kuralları Yapılandırma

Varsayılan olarak Azure SQL Database’e hiçbir IP erişemez. Firewall kurallarını dikkatli yapılandırmak gerekiyor.

# Kendi IP adresinizi ekleyin
MY_IP=$(curl -s ifconfig.me)
az sql server firewall-rule create 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name AllowMyIP 
  --start-ip-address $MY_IP 
  --end-ip-address $MY_IP

# Ofis IP aralığı için
az sql server firewall-rule create 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name AllowOfficeNetwork 
  --start-ip-address 85.100.50.0 
  --end-ip-address 85.100.50.255

# Azure servislerinin erişimine izin verme (App Service, Functions için)
az sql server firewall-rule create 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name AllowAllAzureIPs 
  --start-ip-address 0.0.0.0 
  --end-ip-address 0.0.0.0

# Mevcut kuralları listele
az sql server firewall-rule list 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --output table

Önemli uyarı: 0.0.0.0 - 0.0.0.0 kuralı tüm Azure IP adreslerinden erişime izin verir. Bu, başka bir Azure müşterisinin de teorik olarak bağlanabileceği anlamına gelir. Production’da bunu kullanmak yerine Private Endpoint tercih edin.

Private Endpoint ile Güvenli Bağlantı

Production ortamı için public internet üzerinden erişim yerine Azure VNet içinden private endpoint kullanmak en doğru yaklaşım:

# Önce bir VNet oluşturun
az network vnet create 
  --resource-group rg-eticaret-prod 
  --name vnet-eticaret-prod 
  --address-prefix 10.0.0.0/16 
  --subnet-name snet-app 
  --subnet-prefix 10.0.1.0/24

# Private endpoint için ayrı bir subnet
az network vnet subnet create 
  --resource-group rg-eticaret-prod 
  --vnet-name vnet-eticaret-prod 
  --name snet-private-endpoints 
  --address-prefix 10.0.2.0/24 
  --disable-private-endpoint-network-policies true

# SQL Server'ın resource ID'sini al
SQL_SERVER_ID=$(az sql server show 
  --name sql-eticaret-prod-001 
  --resource-group rg-eticaret-prod 
  --query id -o tsv)

# Private endpoint oluştur
az network private-endpoint create 
  --resource-group rg-eticaret-prod 
  --name pe-sql-eticaret-prod 
  --vnet-name vnet-eticaret-prod 
  --subnet snet-private-endpoints 
  --private-connection-resource-id $SQL_SERVER_ID 
  --group-id sqlServer 
  --connection-name conn-sql-eticaret-prod 
  --location westeurope

Private endpoint oluşturduktan sonra public network erişimini tamamen kapatabilirsiniz:

# Public network erişimini kapat
az sql server update 
  --resource-group rg-eticaret-prod 
  --name sql-eticaret-prod-001 
  --enable-public-network false

Bağlantı Testi ve Doğrulama

Kurulum tamamlandıktan sonra bağlantıyı test etmek için sqlcmd aracını kullanabilirsiniz:

# sqlcmd kurulumu (Ubuntu)
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
sudo apt-get update
sudo apt-get install -y mssql-tools unixodbc-dev

# Bağlantı testi
sqlcmd 
  -S sql-eticaret-prod-001.database.windows.net 
  -d db-eticaret 
  -U sqladmin 
  -P "$SQL_ADMIN_PASSWORD" 
  -Q "SELECT @@VERSION; SELECT DB_NAME();" 
  -l 30

# Veritabanı boyutu ve kullanım bilgisi
sqlcmd 
  -S sql-eticaret-prod-001.database.windows.net 
  -d db-eticaret 
  -U sqladmin 
  -P "$SQL_ADMIN_PASSWORD" 
  -Q "SELECT 
        name,
        size * 8 / 1024 AS SizeMB,
        max_size * 8 / 1024 AS MaxSizeMB
      FROM sys.database_files;" 
  -l 30

Yedekleme Politikası Yapılandırma

Azure SQL Database otomatik yedekleme yapıyor ama varsayılan saklama sürelerini ihtiyacınıza göre ayarlamanız gerekiyor:

# Point-in-time restore için yedek saklama süresini 35 güne çıkar
az sql db str-policy set 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name db-eticaret 
  --retention-days 35

# Mevcut politikayı görüntüle
az sql db str-policy show 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name db-eticaret

# Uzun vadeli yedekleme politikası (aylık/yıllık yedekler)
az sql db ltr-policy set 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name db-eticaret 
  --weekly-retention P4W 
  --monthly-retention P12M 
  --yearly-retention P5Y 
  --week-of-year 1

Uzun vadeli yedekleme parametreleri:

  • –weekly-retention P4W: Son 4 haftanın haftalık yedekleri tutulur
  • –monthly-retention P12M: Son 12 ayın aylık yedekleri tutulur
  • –yearly-retention P5Y: Son 5 yılın yıllık yedekleri tutulur
  • –week-of-year 1: Yıllık yedeğin yılın hangi haftasında alınacağı

Monitoring ve Alerting Kurulumu

Veritabanınızın sağlığını izlemek için Azure Monitor ile alert kuralları oluşturun:

# Log Analytics workspace oluştur
az monitor log-analytics workspace create 
  --resource-group rg-eticaret-prod 
  --workspace-name law-eticaret-prod 
  --location westeurope 
  --retention-time 90

# Workspace ID'yi al
WORKSPACE_ID=$(az monitor log-analytics workspace show 
  --resource-group rg-eticaret-prod 
  --workspace-name law-eticaret-prod 
  --query id -o tsv)

# SQL Database için diagnostics ayarla
DB_ID=$(az sql db show 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name db-eticaret 
  --query id -o tsv)

az monitor diagnostic-settings create 
  --name diag-sql-eticaret 
  --resource $DB_ID 
  --workspace $WORKSPACE_ID 
  --logs '[{"category":"SQLInsights","enabled":true},{"category":"AutomaticTuning","enabled":true},{"category":"QueryStoreRuntimeStatistics","enabled":true},{"category":"Errors","enabled":true},{"category":"DatabaseWaitStatistics","enabled":true}]' 
  --metrics '[{"category":"Basic","enabled":true},{"category":"WorkloadManagement","enabled":true}]'

# CPU yüksek kullanım için alert rule
az monitor metrics alert create 
  --name alert-sql-high-cpu 
  --resource-group rg-eticaret-prod 
  --scopes $DB_ID 
  --condition "avg cpu_percent > 80" 
  --window-size 5m 
  --evaluation-frequency 1m 
  --severity 2 
  --description "SQL Database CPU %80 ustunde"

Otomatik Tuning Etkinleştirme

Azure SQL Database’in en güzel özelliklerinden biri query performansını otomatik optimize edebilmesi:

# Server seviyesinde otomatik tuning
az sql server update 
  --resource-group rg-eticaret-prod 
  --name sql-eticaret-prod-001
  --auto-tuning-enabled true

# Veritabanı seviyesinde otomatik tuning seçenekleri
az sql db update 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name db-eticaret 
  --auto-tuning '{"forceLastGoodPlan":{"desiredState":"On"},"createIndex":{"desiredState":"On"},"dropIndex":{"desiredState":"On"}}'

Otomatik tuning seçenekleri:

  • forceLastGoodPlan: Kötü bir execution plan tespit edildiğinde önceki iyi plana geri döner
  • createIndex: Performansı artıracak eksik indexleri otomatik oluşturur
  • dropIndex: Kullanılmayan indexleri otomatik siler

Geo-Replication ve Disaster Recovery

Production ortamda farklı bir bölgede readable secondary replikasyon kurmak kritik:

# Hedef bölgede SQL Server oluştur
az sql server create 
  --name sql-eticaret-dr-001 
  --resource-group rg-eticaret-dr 
  --location northeurope 
  --admin-user sqladmin 
  --admin-password "$SQL_ADMIN_PASSWORD"

# Geo-replication kur
az sql db replica create 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name db-eticaret 
  --partner-resource-group rg-eticaret-dr 
  --partner-server sql-eticaret-dr-001 
  --secondary-type Geo

# Replikasyon durumunu kontrol et
az sql db replica list-links 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name db-eticaret 
  --output table

Failover Group da kurabilirsiniz, bu sayede connection string’de değişiklik yapmadan otomatik failover gerçekleşir:

# Failover group oluştur
az sql failover-group create 
  --name fog-eticaret 
  --partner-server sql-eticaret-dr-001 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --add-db db-eticaret 
  --failover-policy Automatic 
  --grace-period 1

Maliyet Yönetimi

Azure SQL Database maliyetlerini kontrol altında tutmak için birkaç pratik öneri:

# Kullanılmayan veritabanlarını listele (last activity check)
az sql db list 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --output table 
  --query "[].{Name:name, Status:status, Edition:sku.tier, MaxSize:maxSizeBytes}"

# Dev veritabanını pause et (serverless değilse bile)
az sql db pause 
  --resource-group rg-eticaret-dev 
  --server sql-eticaret-dev-001 
  --name db-eticaret-dev

# Tekrar başlatmak için
az sql db resume 
  --resource-group rg-eticaret-dev 
  --server sql-eticaret-dev-001 
  --name db-eticaret-dev

Elastic Pool da maliyet optimizasyonu için değerli bir seçenek. Aynı sunucu altında birden fazla veritabanınız varsa ve hepsi aynı anda yüksek yük almıyorsa, elastic pool’da kaynakları paylaşarak ciddi tasarruf sağlayabilirsiniz.

Gerçek Dünya Senaryosu: Mevcut Veritabanını Taşıma

On-premise SQL Server’dan Azure’a geçiş yapıyorsanız Azure Database Migration Service (DMS) kullanabilirsiniz. Hızlı bir yol olarak BACPAC export/import da çalışır:

# On-premise'den BACPAC export (sqlpackage ile)
sqlpackage /Action:Export 
  /SourceServerName:localhost 
  /SourceDatabaseName:eticaret_db 
  /TargetFile:eticaret_backup.bacpac 
  /SourceUser:sa 
  /SourcePassword:"OldPassword123"

# BACPAC'ı Azure Blob Storage'a yükle
az storage blob upload 
  --account-name stgmigrationprod 
  --container-name migrations 
  --name eticaret_backup.bacpac 
  --file ./eticaret_backup.bacpac

# Blob URL'ini al
BACPAC_URL="https://stgmigrationprod.blob.core.windows.net/migrations/eticaret_backup.bacpac"

# Azure SQL'e import et
az sql db import 
  --resource-group rg-eticaret-prod 
  --server sql-eticaret-prod-001 
  --name db-eticaret-migrated 
  --admin-user sqladmin 
  --admin-password "$SQL_ADMIN_PASSWORD" 
  --storage-key-type SharedAccessKey 
  --storage-key "?sv=2021-06-08&..." 
  --storage-uri $BACPAC_URL

Sonuç

Azure SQL Database kurulumu tek bir komuttan ibaret değil, doğru yapılandırılmış bir ekosistem kurma işi. Bu yazıda ele aldığımız temel adımlar şunlar oldu: mantıksal sunucu ve veritabanı oluşturma, güvenlik için firewall ve private endpoint yapılandırması, otomatik yedekleme politikaları, monitoring ve alerting, geo-replication ile disaster recovery planı.

Production ortamda mutlaka yapmanız gerekenler özetlenirse: public network erişimini kapatın ve private endpoint kullanın, Azure AD authentication’ı etkinleştirin, zone redundancy ve geo-backup’ı açın, uzun vadeli yedekleme politikası kurun, CPU ve DTU alertlerini ekleyin.

Dev ve production ortamları için ayrı mantıksal sunucular oluşturun. Dev’de serverless mod kullanmak ciddi maliyet tasarrufu sağlar. Otomatik tuning’i açık bırakın, Azure’un query optimize önerileri gerçekten işe yarıyor.

Failover group kurduysanız connection string’inizde sunucu adı olarak failover group FQDN’ini kullanmayı unutmayın. Böylece bir disaster durumunda uygulamanız minimum kesinti ile DR sunucusuna geçecek. Azure SQL Database, doğru yapılandırıldığında altyapı bakım yükünüzü ciddi ölçüde azaltıyor ve sizi asıl işinize, yani uygulamanızı geliştirmeye odaklanmaya bırakıyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir