How to Be an Azure SQL DBA: Skills, Practices, And A Hands On Workshop

How to Be an Azure SQL DBA: Skills, Practices, and a Hands-On Workshop – SQLYARD

How to Be an Azure SQL DBA: Skills, Practices, and a Hands-On Workshop


If you are already a SQL Server DBA, Azure SQL feels familiar and completely different at the same time. You still care about concurrency, indexing, locking, and query plans, but now you also own things like service tiers, vCores, firewall rules, Azure Monitor alerts, and cost optimization for a platform you do not patch or reboot yourself.

This guide walks through what it actually means to be an Azure SQL DBA today, how the role differs from a traditional on-premises DBA, and includes a detailed step-by-step workshop you can follow to build a real-world environment from scratch.

Throughout this guide, “Azure SQL DBA” means the person responsible for Azure SQL Database (single and elastic pool), Azure SQL Managed Instance, and often SQL Server on Azure VMs as part of the same portfolio.

The Azure SQL Family

Before doing anything in the portal, you need a clear mental model of the three Azure SQL offerings:

Azure SQL Database

Fully managed PaaS. Microsoft handles OS, SQL engine patching, backups, and built-in HA. You choose service tier and compute model.

Cloud-native apps, SaaS, microservices, APIs, small to medium LOB apps

Azure SQL Managed Instance

PaaS with near-full engine compatibility. Supports SQL Agent, cross-database queries, linked servers, and CLR.

Lift-and-shift migrations from on-premises without heavy refactoring

SQL Server on Azure VMs

IaaS — you manage the VM and SQL instance. Azure provides infrastructure, images, and guidance.

Features not yet in PaaS, complex custom configurations, legacy dependencies

DTU model and hardware retirement: The DTU purchasing model is still available for Azure SQL Database but the vCore model is strongly preferred for new deployments — it offers more transparency, flexibility, and reserved capacity pricing. Gen4 hardware has been retired. Fsv2-series hardware can no longer be created and is being retired October 1, 2026. For new databases, use Standard-series (Gen5) or Premium-series hardware on the vCore model.

What an Azure SQL DBA Actually Does

You Spend Less Time On

  • OS installs and patching
  • Manual backups and restores for routine operations
  • Configuring Windows Failover Clusters
  • Storage provisioning and SAN configuration
  • High availability topology wiring

You Spend More Time On

  • Choosing the right Azure SQL offer for each workload
  • Sizing and re-sizing service tiers for performance and cost
  • Network design, firewalls, private endpoints, Entra ID
  • Performance monitoring via Azure Monitor and Query Store
  • Backup retention, geo-redundancy, and failover groups
  • Infrastructure as Code, DevOps pipelines, automation
  • Cost optimization — you own the bill now

If you already know SQL Server internals, you are ahead of the game. The next step is becoming fluent in Azure’s platform features and building habits around security, monitoring, and cost control. Classic DBA skills do not go away — they get applied in a new context.

Core Skills Matrix

Azure Foundations

  • Resource groups, subscriptions, naming conventions
  • Virtual networks, subnets, NSGs
  • Private endpoints and service endpoints
  • Managed identities and Entra ID roles

Azure SQL Platform

  • Service tiers, vCore model, Hyperscale, serverless
  • Built-in HA and backup model for Database and MI
  • Single database vs elastic pool vs Managed Instance
  • DTU migration path to vCore

Security and Compliance

  • Firewall rules and private endpoints
  • Entra ID integration and managed identities
  • TDE, Always Encrypted, auditing
  • Defender for SQL, vulnerability assessment

Performance and Monitoring

  • Azure Monitor metrics, alerts, Log Analytics
  • Query Store and Query Performance Insight
  • Database Watcher (GA — centralized monitoring)
  • DMVs and intelligent performance features

Backup, DR, and Availability

  • Backup retention, PITR, Long-term retention (LTR)
  • Active geo-replication and auto-failover groups
  • RPO, RTO design and testing

Automation and DevOps

  • ARM templates, Bicep, Terraform, Azure CLI
  • DMA, DMS for migrations
  • DACPAC, Flyway for schema deployment
  • Azure DevOps / GitHub Actions pipelines

Cost Management

  • Right-sizing compute and storage
  • Reserved capacity for predictable workloads
  • Serverless auto-pause for bursty low duty-cycle DBs
  • Tagging for cost visibility by team or workload

Hybrid and Modern Integration

  • Azure Arc for on-premises SQL Server management
  • Fabric Mirroring for analytics integration
  • Microsoft Entra managed identity for passwordless auth

Creating Your First Azure SQL Database

Every Azure SQL DBA should be able to provision and connect to a new database with best-practice defaults from memory. The pattern you establish with your first database is the one that tends to repeat across your environment.

Portal Provisioning Flow

  1. Go to Azure SQL in the portal → SQL Database → Create
  2. Select subscription, resource group, database name, and logical server
  3. For compute: choose vCore-based General Purpose for most workloads. Start at 2–4 vCores and scale based on metrics — do not guess high
  4. For networking: use a Private endpoint for production. Avoid “Allow Azure services and resources to access this server” for sensitive environments
  5. For security: set Microsoft Entra admin at server creation. Use contained database users for applications. Enable Defender for SQL and auditing to Log Analytics

If your first database is public endpoint only, SQL login only, wide-open firewall rules — that pattern will spread quickly across your environment. Get the defaults right from the start.

Security: Make Secure by Default Your Habit

Identity and Logins

Use Microsoft Entra ID for admin and human access — not plain SQL logins. Use role-based access control at the server and database level. Map applications to contained database users via managed identities or Entra groups.

ApproachRecommended?Why
Microsoft Entra admin + managed identities for appsYes — defaultCentralized identity, MFA, conditional access, easy offboarding, better auditing
Contained database users with Entra groupsYesApps get least-privilege access without SQL logins in connection strings
SQL logins for legacy compatibilityLimited use onlyHard to secure, easy to leak, no MFA, often embedded in scripts
sa-style SQL admin logins everywhereNoWeak security, terrible auditability, no MFA support

Network Isolation

  • Use private endpoints for production — traffic stays in your virtual network
  • Use NSGs and controlled peering to restrict where traffic originates
  • Avoid wide-open firewall rules — especially 0.0.0.0 – 255.255.255.255
  • Public endpoint only is acceptable for dev/test, not for sensitive production workloads

Data Protection

  • Transparent Data Encryption (TDE) is on by default — keep it that way
  • Consider customer-managed keys in Key Vault for strict compliance scenarios
  • Use Always Encrypted for highly sensitive columns where the application model supports it
  • Enable auditing (to Log Analytics or storage) and Defender for SQL per your organization’s requirements

Performance and Monitoring in Azure SQL

You cannot RDP into the box and stare at PerfMon anymore. You use Azure Monitor plus in-engine telemetry — Query Store, DMVs, and Query Performance Insight.

Key Azure Monitor Metrics to Watch

  • cpu_percent — compute utilization (vCore model)
  • data_io_percent and log_write_percent — I/O pressure
  • storage_percent — storage headroom
  • connection_failed — connection errors
  • dtu_consumption_percent — if still on DTU model (migrate to vCore)

Query Store Workflow

Confirm Query Store is enabled in Read-Write mode for all user databases. Use Query Performance Insight in the portal for quick analysis, then drop to T-SQL for deeper investigation:

-- Top 20 queries by total CPU consumption from Query Store
SELECT TOP 20
    qsq.query_id,
    SUM(rs.avg_duration        * rs.count_executions) AS total_duration_ms,
    SUM(rs.avg_cpu_time        * rs.count_executions) AS total_cpu_ms,
    SUM(rs.avg_logical_io_reads * rs.count_executions) AS total_reads,
    OBJECT_NAME(qt.object_id)                          AS object_name,
    qt.query_sql_text
FROM sys.query_store_query       qsq
JOIN sys.query_store_plan        qsp ON qsq.query_id     = qsp.query_id
JOIN sys.query_store_runtime_stats rs  ON qsp.plan_id      = rs.plan_id
JOIN sys.query_store_query_text  qt  ON qsq.query_text_id = qt.query_text_id
GROUP BY qsq.query_id, qt.query_sql_text, qt.object_id
ORDER BY total_cpu_ms DESC;

Tune the worst offenders first with indexing, parameterization, or code fixes. Consider automatic tuning features — automatic index management and plan correction — where they fit your environment. Do not accept all automated recommendations blindly; review each one.

Database Watcher

Database Watcher is Microsoft’s centralized monitoring solution for Azure SQL, now generally available. It collects a rich dataset of performance, wait stats, active sessions, and storage metrics and stores it in a Fabric or Log Analytics workspace for long-term analysis and alerting. For larger Azure SQL portfolios it provides a single pane of glass across all databases and managed instances.

Backup, HA, and DR: What You Get and What You Still Own

Azure SQL PaaS gives you built-in backups, high availability, and recovery options — but you still set policies, configure geo-redundancy, and most importantly, test your DR procedures.

FeatureWhat Azure ProvidesWhat You Still Own
Automated backupsFull, differential, and log backups — 7 to 35 days PITR configurable per databaseSet the right retention period, verify it matches your RPO
Long-term retention (LTR)Weekly backups stored in Azure storage for yearsConfigure LTR policies for compliance requirements
Built-in HAHigh availability built into the service — no Windows clusters to configureChoose Business Critical for lower RTO failovers
Geo-replication and failover groupsActive geo-replication and auto-failover availableConfigure, document, and test failover procedures regularly

Many DBAs assume PaaS backup and HA are “magic” and do not need testing. They do. Backups cover many scenarios but do not give you low-RTO regional failover. Configure geo-replication or failover groups, write the runbook, and trigger a planned failover in non-production before you need it in a real incident.

Cost Management: You Are the Performance and Cost Owner

Azure SQL lets you scale with a slider — powerful and dangerous. Your job is to balance performance with cost.

  • Right-size compute — start reasonable, use Azure Monitor and Query Store to justify scaling, do not guess high
  • Serverless — for bursty, low duty-cycle workloads, serverless databases with auto-pause can cut costs significantly
  • Reserved capacity — pre-buy 1 or 3 years for predictable workloads to lower cost substantially
  • Elastic pools — consolidate small noisy databases when the workload pattern fits
  • Tagging — consistent tags on all resources are essential for cost visibility by team, environment, or workload

Scaling up hides bad queries and schema design until the cost becomes unacceptable. Use Query Store and DMVs to tune the workload, then use scale as a complement — not a substitute for tuning.

Best Practices Checklist

  • Choose the right Azure SQL offer for each workload (Database vs MI vs VM)
  • Consistent naming conventions for servers, databases, resource groups, and tags
  • Dev, test, and prod separated into different resource groups or subscriptions
  • vCore model used for new databases — plan migration away from DTU
  • Microsoft Entra ID for all admin and human access — minimal SQL logins
  • Private endpoints for production workloads
  • TDE on — consider customer-managed keys for strict compliance
  • Auditing and Defender for SQL configured according to organization standards
  • No wide-open firewall rules (0.0.0.0–255.255.255.255)
  • Query Store on and in Read-Write mode for all user databases
  • Baseline metrics captured with Azure Monitor and Log Analytics
  • Top queries and index recommendations reviewed regularly — not blindly accepted
  • Azure Monitor alerts set for CPU, IO, and storage thresholds
  • Backup retention set according to RPO and compliance requirements
  • LTR configured where compliance requires long-term backup storage
  • Geo-replication or failover groups for critical workloads
  • Failover tested and runbook documented before production deployment
  • Provisioning and configuration are scripted or templated — not hand-built
  • Schema changes deployed via pipelines (DACPAC, Flyway, or similar)
  • Common DBA tasks documented and automated
  • Consistent tagging on all resources for cost management

Common Mistakes and Why Nots

Treating Azure SQL Database Like a Full SQL Server Instance

Azure SQL Database is a database-scoped PaaS service. You cannot rely on cross-database queries the same way, SQL Agent jobs on the “same server,” or instance-level settings. If you need those capabilities, Azure SQL Managed Instance is the right choice — not workarounds in Azure SQL Database.

Public Endpoint with Wide-Open Firewall Rules

Massive attack surface, difficult compliance story, and you will eventually face pressure to redesign from scratch. Private endpoints and secure network design early save considerable pain later.

Scaling Up Instead of Tuning

Scaling up hides bad queries and schema design until the cost becomes unacceptable. You want to use Query Store and DMVs to tune the workload, then use scale as a complement — not a replacement for analysis.

No Tagging or Cost Visibility

Without consistent tags you cannot answer “what are we paying for environment X or department Y.” Azure Cost Management depends heavily on good tagging. Apply tags at provisioning time — retrofitting them later is painful.

Assuming Backups Mean DR Is Solved

Backups cover many scenarios but do not give you low-RTO regional failover. You still need geo-replication, failover groups, tested failover procedures, and documented runbooks.

Hands-On Workshop: Build a Production-Ready Azure SQL Environment

Work through this workshop in a dev subscription. The goal is to behave like an Azure SQL DBA from requirements through to a working system with monitoring, security, and DR.

Scenario: You are given a web application called “Contoso Orders” that needs a secure Azure SQL backend, separate dev and prod environments, monitoring, and basic DR. RPO: 15 minutes. RTO: 1 hour. Max size year 1: 100 GB. Concurrent users: 200. PII present — encrypted at rest and in transit, MFA for admins required.

1

Capture Requirements

Document before opening the portal: RPO, RTO, expected database size, concurrent users, compliance requirements, and network topology. This drives every choice that follows.

Why not skip this: Without requirements you will pick random tiers, backup settings, and may massively under- or over-provision. The requirements from this step directly determine Step 5 choices.
2

Choose the Right Azure SQL Offer

The Contoso Orders app is cloud-native and does not depend on cross-database queries or SQL Agent. Choose Azure SQL Database rather than Managed Instance.

Why not Managed Instance: You pay more and introduce extra complexity when you do not need full instance compatibility. Choose MI only when you need it.
3

Design Your Resource Layout

Resource Groups:      rg-contoso-dev-sql      rg-contoso-prod-sql
Logical Servers:      sql-contoso-dev-01      sql-contoso-prod-01
Databases:            contosoorders-dev       contosoorders-prod
Why separate resource groups: Clear separation of dev and prod for access control, cost tracking, and lifecycle management. Much easier to clean up dev without touching prod.
4

Networking and Security Design

For production: application runs in an App Service or VM inside the same VNet. Azure SQL Database uses a private endpoint in the same VNet. For this lab, a simple single VNet is fine.

Why private endpoints: Reduces public exposure, simplifies firewall management, and gives you future options for VPN or ExpressRoute. Relying on public endpoint + IP allowlists is brittle and weaker security.
5

Provision Dev and Prod Databases

Use the portal or Azure CLI. Create dev first — smaller and cheaper. Then create prod with stronger backup guarantees:

-- Dev: General Purpose, 2 vCore, 32 GB storage, 7-day backup retention
-- Prod: General Purpose, 4 vCore, 128 GB storage, 14-35 day retention

# Azure CLI — create prod database
az sql db create \
  --resource-group rg-contoso-prod-sql \
  --server sql-contoso-prod-01 \
  --name contosoorders-prod \
  --service-objective GP_Gen5_4 \
  --storage-size 131072 \
  --backup-storage-redundancy Geo
Why not clone prod settings to dev: You waste money and sometimes create accidental dependencies between environments.
6

Configure Identity and Access

Set a Microsoft Entra admin group for the server (e.g. sqldb-admins). Connect using SSMS or Azure Data Studio with your Entra identity. Create a database role for app access:

-- Inside contosoorders-prod
-- Create a contained database user for the app's managed identity
CREATE USER [ContosoAppProd] FROM EXTERNAL PROVIDER;

-- Grant least-privilege permissions through roles
ALTER ROLE db_datareader ADD MEMBER [ContosoAppProd];
ALTER ROLE db_datawriter ADD MEMBER [ContosoAppProd];

-- For stored procedure execute access only (preferred over direct table access):
-- GRANT EXECUTE ON SCHEMA::Sales TO [ContosoAppProd];
Why not SQL logins for everyone: Weak security, terrible auditability, no MFA support, credentials end up in connection strings and scripts.
7

Deploy Schema and Seed Data

Use a repeatable deployment method — DACPAC via Azure DevOps, or migration scripts via Flyway. For the workshop, create a baseline schema:

CREATE SCHEMA Sales;
GO

CREATE TABLE Sales.Orders
(
    OrderID      INT            IDENTITY(1,1) PRIMARY KEY,
    CustomerID   INT            NOT NULL,
    OrderDate    DATETIME2(2)   NOT NULL DEFAULT SYSUTCDATETIME(),
    OrderTotal   DECIMAL(18,2)  NOT NULL,
    OrderStatus  NVARCHAR(50)   NOT NULL,
    CreatedBy    NVARCHAR(50)   NOT NULL,
    CreatedAtUtc DATETIME2(2)   NOT NULL DEFAULT SYSUTCDATETIME()
);

CREATE INDEX IX_Orders_OrderDate   ON Sales.Orders (OrderDate);
CREATE INDEX IX_Orders_CustomerID  ON Sales.Orders (CustomerID);
Why not manually build schema in prod: No repeatability, no versioning, high chance of drift between dev and prod.
8

Enable and Configure Query Store

-- Confirm Query Store is on and in Read-Write mode
ALTER DATABASE [contosoorders-prod]
SET QUERY_STORE = ON;

ALTER DATABASE [contosoorders-prod]
SET QUERY_STORE (
    OPERATION_MODE          = READ_WRITE,
    CLEANUP_POLICY          = (STALE_QUERY_THRESHOLD_DAYS = 30),
    DATA_FLUSH_INTERVAL_SECONDS = 900,
    MAX_STORAGE_SIZE_MB     = 1024,
    QUERY_CAPTURE_MODE      = AUTO
);
Why not leave it off: Query Store is your built-in time machine for query performance regression analysis. You lose all visibility into query history and make troubleshooting significantly harder.
9

Configure Azure Monitor Alerts

In the Azure portal, open the contosoorders-prod database → Monitoring → Metrics. Pin key metrics to a dashboard and set alert rules:

  • CPU percent over 80% for 15 minutes → email DBA team
  • Data IO percent over 80% for 15 minutes → email DBA team
  • Storage used over 80% of maximum → email DBA team
  • Deadlocks > 0 → immediate email
Why not rely on user complaints as alerting: By the time users complain, your RTO and SLA are already at risk and you are in reactive mode.
10

Enable Auditing and Defender for SQL

In the prod database settings, enable auditing to Log Analytics or storage according to your organization’s standards. Enable Defender for SQL if licensed. In Log Analytics, verify you can query audit logs:

-- In Log Analytics workspace — query recent Azure SQL audit events
AzureDiagnostics
| where Category == "SQLSecurityAuditEvents"
| where TimeGenerated > ago(24h)
| project TimeGenerated, LogicalServerName_s, DatabaseName_s,
          action_name_s, client_ip_s, server_principal_name_s
| order by TimeGenerated desc
| take 100
Why not postpone until later: It is very hard to rebuild an audit trail for an incident that has already happened. Configure auditing at deployment time, not after a security event.
11

Configure Auto-Failover Group for Prod

# Create an auto-failover group between prod and a paired region
az sql failover-group create \
  --name "contoso-fog-prod" \
  --partner-server sql-contoso-prod-secondary \
  --resource-group rg-contoso-prod-sql \
  --server sql-contoso-prod-01 \
  --failover-policy Automatic \
  --grace-period 60

# Application connection string should use the listener, not the server name:
# Server=tcp:contoso-fog-prod.database.windows.net,1433;
# -- Always routes to current primary after failover
Why not rely only on PITR across regions: PITR across regions is possible but often too slow for a low RTO requirement and requires manual work under stress. Auto-failover provides automatic replication and managed failover.
12

Test Failover and Write the Runbook

In non-production, trigger a manual failover of the auto-failover group. Validate that the application reconnects using the listener endpoint and that performance is acceptable in the secondary region. Document your runbook: who triggers failover, under what conditions, and how to fail back.

# Trigger a planned failover (non-production test)
az sql failover-group set-primary \
  --name "contoso-fog-prod" \
  --resource-group rg-contoso-prod-sql \
  --server sql-contoso-prod-secondary
Why not assume “Azure will handle it”: Azure provides the tools. Your app logic, connection strings, and operational process still determine how well the failover actually goes.
13

Review Costs and Performance After One Week

After some time under load, review Azure Monitor and cost data. Ask: Are we under or over-utilized on CPU and IO? Are there obvious heavy queries in Query Store? Are there noisy test workloads that should be moved to a cheaper tier? Adjust vCores, storage, and consider serverless for dev.

Why not set and forget service tiers: Workloads grow and change, and so do Azure pricing and options. Being an Azure SQL DBA means you are a cost and performance owner. Periodic review of sizing is part of the job.

Final Thoughts

Being an Azure SQL DBA is not about giving up classic DBA skills — it is about applying them in a cloud context where the platform handles backups, patching, and core high availability, but you still own design, security, performance, and cost.

If you already know SQL Server internals, you are ahead of the game. Build the habits around security, monitoring, and cost control. Work through the workshop above in a dev subscription, take notes, and turn those notes into your own runbooks and internal documentation. Over time you become the person who can translate between developers, security teams, and cloud architects so that the data tier is secure, fast, and affordable. That is exactly what a modern Azure SQL DBA should be.

References


Discover more from SQLYARD

Subscribe to get the latest posts sent to your email.

Leave a Reply

Discover more from SQLYARD

Subscribe now to keep reading and get access to the full archive.

Continue reading