Automate native database backup of Azure SQL Managed instance to Azure blob storage

This post has been republished via RSS; it originally appeared at: Microsoft Tech Community - Latest Blogs - .

Introduction:

Database backups are an essential part of any business continuity and disaster recovery strategy because they protect your data from corruption or deletion.

 

Azure SQL Database and SQL Managed Instance use SQL Server technology to create full backups every week, differential backups every 12-24 hours, and transaction log backups every 5 to 10 minutes. The frequency of transaction log backups is based on the compute size and the amount of database activity. 

 

The exact timing of all database backups is determined by the SQL Database or SQL Managed Instance service as it balances the overall system workload. You cannot change the schedule of backup jobs or disable them.

 

Overview:

In case you have a different requirements rather than automated backup comes with Azure SQL Managed Instance PaaS offering, you can schedule copy_only backup for one/all databases in your Azure SQL managed instance.

 

In this article, we will take you through the steps on how to schedule SQL managed instance backup to Azure Blob storage using T-SQL script and SQL server agent job.

 

Note:- Azure SQL Managed Instance does not currently support exporting a database to a BACPAC file using the Azure portal or Azure PowerShell. To export a managed instance into a BACPAC file, use SQL Server Management Studio (SSMS) or SQLPackage.

 

Resolution:

  1. You would need to store credentials that would be used to access Azure Blob Storage. 

 

 

CREATE CREDENTIAL [https://myaccount.blob.core.windows.net/testcontainer/] 
WITH IDENTITY='SHARED ACCESS SIGNATURE' 
, SECRET = 'XXXXXXXXXXXXX'; 

 

 

The name of the credential should be the same as the URL of the target Azure Blob Storage container. In this case, this is myaccount account and testcontainer container stored on the URL: https://myacc.blob.core.windows.net/testcontainer

 

2. Once you create a credential, you can backup any database using the standard copy_only backup T-SQL command:

 

 

BACKUP DATABASE Mydb 
TO URL = 'https://myacc.blob.core.windows.net/testcontainer/Mydb.bak'
WITH COPY_ONLY 

 

 

3- To schedule the backup job, follow below screenshot from SSMS.

 

Expand the SQL server agent from SSMS and click on New Job and provide the jobname

Ahmed_S_Mahmoud_0-1642689821855.png

 

Click on new and provide the step name, select the Transact SQL and database name and paste the T-SQL command.

Ahmed_S_Mahmoud_2-1642689927742.png

 

In schedules, click on new and schedule it as suitable.

Ahmed_S_Mahmoud_0-1642691903085.png

 

You can get more information on the job runs from Job History.

Ahmed_S_Mahmoud_3-1642689941055.png

 

Hereunder you can find script to take one database or all databases backup.

-- Script to take the backup with timeformat(yyyy-mm-ddThh:mm:ss) by providing the dbname at @name

 

 

DECLARE @name VARCHAR(50) -- database name  
DECLARE @path VARCHAR(256) -- path for backup files  
DECLARE @fileName VARCHAR(256) -- filename for backup  
DECLARE @fileDate VARCHAR(20) -- dateformat
set @name = 'MI' --provide dbname here
-- specify database backup directory
SET @path = 'https://myacc.blob.core.windows.net/testcontainer/'  --required backslash at the end of the storage account
 
-- specify filename format
SELECT @fileDate = CAST(FORMAT(getdate(), N'yyyy-MM-ddThh:mm:ss') as nvarchar(max))
SET @fileName = @path + @name + '_' + @fileDate + '.BAK'  

BACKUP DATABASE @name TO URL = @fileName  with copy_only

 

 

--Script to take the backup of all the databases with the time stamp (here excluded system databases)

 

 

DECLARE @name VARCHAR(50) -- database name  
DECLARE @path VARCHAR(256) -- path for backup files  
DECLARE @fileName VARCHAR(256) -- filename for backup  
DECLARE @fileDate VARCHAR(20) -- used for filename
 
-- specify database backup directory
SET @path = 'https://myacc.blob.core.windows.net/testcontainer/'  --required backslash at the end of storage account
 -- specify filename format
SELECT @fileDate = CAST(FORMAT(getdate(), N'yyyy-MM-ddThh:mm:ss') as nvarchar(max))
DECLARE db_cursor CURSOR READ_ONLY FOR  
SELECT name 
FROM master.sys.databases 
WHERE name NOT IN ('master','model','msdb','tempdb')  -- exclude these databases
AND state = 0 -- database is online
AND is_in_standby = 0 -- database is not read-only for log shipping
 
OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @name   
 WHILE @@FETCH_STATUS = 0   
BEGIN   
   SET @fileName = @path + @name + '_' + @fileDate + '.BAK'  
   BACKUP DATABASE @name TO URL = @fileName  with copy_only
    FETCH NEXT FROM db_cursor INTO @name   
END   
 CLOSE db_cursor   
DEALLOCATE db_cursor

 

 

Limitations

  • Taking manual COPY-ONLY backup of a database encrypted by service-managed TDE is not supported in Azure SQL Managed Instance, since the certificate used for encryption is not accessible.

In case the database is encrypted with service managed key, you might receive an error like:

Msg 41922, Level 16, State 1, Line 29

The backup operation for a database with service-managed transparent data encryption is not supported on SQL Database Managed Instance.

 

You can use below PowerShell commands to know get more information regarding the database encryption either Service Managed Key (SMK) or Customer managed Key (CMK)

 

 

Get-AzSqlDatabaseTransparentDataEncryption -ServerName $AzureSQLServerName -ResourceGroupName $ResourceGroupName -DatabaseName $DatabaseName

Get-AzSqlServerTransparentDataEncryptionProtector  -ServerName $AzureSQLServerName -ResourceGroupName $ResourceGroupName | Select-Object ServerName,Type

 

 

You can still disable the encryption in case you want to proceed with manual backup, by running the command:

 

 

select name , is_encrypted from sys.databases where name = 'dbname'
Alter database dbname set encryption off
use dbname
go
drop database encryption key

 

 

For more information, see Transparent data encryption - Azure SQL Database & SQL Managed Instance & Azure Synapse Analytics | Microsoft Docs

 

Additional References

Native database backup in Azure SQL Managed Instance - Microsoft Tech Community

Automate exporting of azure sql database as .bacpac to blog storage. - Microsoft Tech Community

How to automate Export Azure SQL DB to blob storage use Automation account - Microsoft Tech Community

 

We hope you find this article helpful. If you have any feedback, please do not hesitate to provide it in the comment section below.

 

Durgaprasad Srikurmadasu (Author)

Ahmed Mahmoud (Co-Author)

Leave a Reply

Your email address will not be published. Required fields are marked *

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.