Backup All Your SQL Server Databases to the Cloud with SQL 2012
SQL 2012 SP1 CU2 has introduced support for backup to Azure Cloud storage right in the database engine. This is cool because Azure storage is low-cost, offsite and optionally geo-redundant. So this can be a simple way to protect your data against a variety of failures. If your database is running on-premises backup to the cloud should not replace local backup. Local backup is much faster, and can be performed much more often than cloud backup. But you might consider a secondary job to take full backups to the cloud on a less frequent basis.
The BOL for backup to Azure is here Server Backup and Restore with Windows Azure Blob Storage Service. This covers the basic syntax, the Azure setup and billing considerations.
Here’s the SQL team blog on this: Backup and Restore to Cloud Simplified in SQL Server 2012 SP1 CU2
I just wanted to add a simple script to take a full, compressed, copy_only database backup of multiple databases to your Azure storage account (and note also the new text functions FORMAT and CONCAT that make this script much cleaner than it would have been before):
/* create a credential to store your secret Azure key create credential AzureBackupCredential with identity = 'por...wtq7rlyhd', --your storage account secret = 'jskl...daflvn3489723u4p==' --your storage account key */ declare @credentialName sysname = 'AzureBackupCredential'; declare @containerName nvarchar(1000) = 'backup'; declare @storageAccount nvarchar(4000) = (select credential_identity from sys.credentials where name = @credentialName) declare @name sysname; declare dbc cursor local for select d.name from sys.databases d where d.name not in( 'tempdb' ) open dbc; fetch next from dbc into @name while @@FETCH_STATUS = 0 begin declare @url nvarchar(max) = concat( 'https://', @storageAccount, '.blob.core.windows.net/' , @containerName,'/', replace(@@SERVERNAME,'\','-'), '/' , @name, '/', year(getdate()), '/' , format(month(getdate()),'00'),'/' , @name, '.', format(getdate(),'yyyy-MM-dd.HHmmss') , '.bak'); declare @sql nvarchar(max) = concat(' backup database [', @name, '] to url=''', @url, ''' with compression, copy_only, stats=10, credential=''' , @credentialName, ''';'); print @sql exec (@sql); fetch next from dbc into @name; end; close dbc; deallocate dbc;
One thing to note is if you abort a backup, you will see a BLOB for the failed backup in Azure Storage that you won’t be able to delete it through the Azure portal. It looks like it’s a 1TB blob in the Azure portal, but you’re only charged for the blocks actually written to the blob. To delete the failed backup see Deleting Backup Blob Files with Active Leases.