CorpXeno

1 Jan 2024

Automating Azure SQL Database Restore using Azure CLI

Azure SQL Database

This script can be executed using Windows powershell ISE once Az module in imported using below command:

Script to restore databases present in an elastic pool:

#Connect to the Azure account using login which has owner or contributor role of the subscriptions

Connect-AzAccount

#Set the Subscription ID of source SQL server to a variable

$SourceSubscriptionID = "xxxx-xxxx-xxxx-xxxx-xxxx"

#Set the context to source subscription

Set-AzContext -Subscription $SourceSubscriptionID

#Self explanatory variables

$SourceResourceGroupName = "rg-xxxx-xxxx-qa-db"

# without the FQDN .database.windows.net

$SourceServerName = "tlm-xx-xxxx-qa-azsql"

$SourceElasticPoolName = "elastic-pool-xx-qa"

#Get the list of databases in Elastic pool at source SQL server

$SourceDatabase = Get-AzSqlElasticPoolDatabase -ResourceGroupName $SourceResourceGroupName -ServerName $SourceServerName -ElasticPoolName $SourceElasticPoolName

#Set the Subscription ID of destination SQL server to a variable

$DestinationSubscriptionID = "xxxx-xxxx-xxxx-xxxx-xxxx"

#Set the context to destination subscription

Set-AzContext -Subscription $DestinationSubscriptionID

#Self explanatory variables

$DestinationResourceGroupName = "rg-xxxx-xxx-dev-db"

$DestinationServerName = "xxx-xx-xxxx-dev-azsql"

$DestinationElasticPoolName = "elastic-pool-xx-dev"

#Get the list of databases in Elastic pool at destination SQL server

$DestinationDatabase = Get-AzSqlElasticPoolDatabase -ResourceGroupName $DestinationResourceGroupName -ServerName $DestinationServerName -ElasticPoolName $DestinationElasticPoolName

#Write-Output $SourceDatabase.DatabaseName

#Write-Output $DestinationDatabase.DatabaseName

# Point int time to which destination DBs need to be restored with source copy YYYY-MM-DD

$pointInTime = "2024-01-24T12:00:00.000Z"

#This loop will restore each DB present in destination elastic pool from the source

foreach ($sdb in $SourceDatabase.DatabaseName)

{

foreach ($ddb in $DestinationDatabase.DatabaseName)

{

#This condition will ensure DBs present at destination with same name as source are only restored.

if ($sdb -eq $ddb)

{

#This variable is required to fetch resource ID of source database

$Database = Get-AzSqlDatabase -ResourceGroupName $SourceResourceGroupName -ServerName $SourceServerName -DatabaseName $sdb

#This statement will first delete the destination DBs before restoring

Remove-AzSqlDatabase -ResourceGroupName $DestinationResourceGroupName -ServerName $DestinationServerName -DatabaseName $ddb -Force

Restore-AzSqlDatabase -FromPointInTimeBackup `

-PointInTime $pointInTime `

-ResourceId $Database.ResourceID `

-ServerName $DestinationServerName `

-ResourceGroupName $DestinationResourceGroupName `

-TargetDatabaseName $ddb `

-ElasticPoolName $DestinationElasticPoolName

#break from if loop

break

}

}

}