Last Geo-Backup in Azure Sql DW
DR in Azure Sql DW
Key component of Disaster Recovery Plan for Azure Sql DataWarehouse is a Geo-Backup Policy that must be enabled and working.
Geo-Backup
Azure Sql Datawarehouse uses simple recovery model and special storage level backups (consistent across multiple nodes) are taken every 4-8h. Backup history is stored in sys.pdw_loader_backup_runs DMV. Minimum once a day backup is copied to paired region so RPO is 24h assuming that Geo-Backup actually works. Regarding that - I had an issue with stalled, not refreshing geo-backup and had to raise support ticket. It was escalated to Product Team that fixed it quickly and I got full RCA (increased probability of race conditions related to recent change on Azure side). It has happened before so … trust no one. Untested backup is backup you can’t trust. I’ve prepared small PS runbook to get Geo-Backup Policy status and date of the latest available geo-backup. That’s a good start to end-to-end restore drill.
Gist to extract Azure Sql DW Last Available Geo Backup Date:
try | |
{ | |
# Built-in account | |
$servicePrincipalConnection = Get-AutomationConnection -Name "AzureRunAsConnection" | |
# Init variables (Automation Account variables) | |
$ResourceGroup = Get-AutomationVariable -Name 'ResourceGroup' | |
$SqlServerName = Get-AutomationVariable -Name 'SqlServerName' | |
$DatabaseName = Get-AutomationVariable -Name 'DatabaseName' | |
# Log into Azure with AzureRunAsConnection | |
$null = Add-AzureRmAccount -ServicePrincipal ` | |
-TenantId $servicePrincipalConnection.TenantId ` | |
-ApplicationId $servicePrincipalConnection.ApplicationId ` | |
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint | |
# Get GeoBackupPolicy State (Enabled?) | |
$state = (Get-AzureRmSqlDatabaseGeoBackupPolicy -ResourceGroupName $ResourceGroup ` | |
-ServerName $SqlServerName ` | |
-DatabaseName $DatabaseName).State | |
$state | |
# Get LastAvailableBackupDate | |
$lastAvailableBackupDate = (Get-AzureRmSqlDatabaseGeoBackup -ResourceGroupName $ResourceGroup ` | |
-ServerName $SqlServerName ` | |
-DatabaseName $DatabaseName).LastAvailableBackupDate | |
$lastAvailableBackupDate | |
} | |
catch { | |
throw $_.Exception | |
} |