SQL Server Backup “Mirror To” Local y Azure
Nos encontramos en unos tiempos en los que muchas empresas están migrando a Azure, ya sea total o parcialmente. Uno de los primeros elementos que se aventuran a probar es el almacenamiento y más en concreto el Backup a Azure, ya que sobretodo las empresas pequeñas no tienen un método seguro de poder conservar sus copias.
Si disponéis de una edición Enterprise de SQL Server, podéis hacer un Backup Mirror To, o lo que es lo mismo, un backup copiado en varias localizaciones (no confundirse con un backup dividido en varios ficheros).
Si os aventuráis a probar la funcionalidad MIRROR TO, pronto os encontraréis que no se puede realizar un backup a disco On Premise y hacer un mirror a una URL de Azure:
Mirroring applies both to disk and tape (disks do not support continuation tapes). All backup devices for a single backup or restore operation must be of the same type, disk or tape.
https://msdn.microsoft.com/en-us/library/ms175053.aspx
Por lo que hay que buscar una alternativa para que SQL Server crea que las dos localizaciones son del mismo tipo.
Lo primero que vamos a tener que hacer es crear un Azure File Share, si no sabéis como crearlo, mi compañero Nacho Cotanda hizo una entrada al respecto hace unas semanas Creando una ruta compartida en Azure en 5 minutos.
Una vez tengamos creado el File Share, tenemos que habilitar en la configuración de SQL Server xp_cmdshell:
-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1;
GO
-- To update the currently configured value for advanced options.
RECONFIGURE;
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1;
GO
-- To update the currently configured value for this feature.
RECONFIGURE;
GO
Mas información sobre xp_cmdshell en https://msdn.microsoft.com/en-us/library/ms190693.aspx
Una vez esté habilitado ya podemos crear nuestro pequeño script, que constará de tres partes:
- Crear la unidad compartida en tiempo de ejecución
- Realizar el backup
- Borrar la unidad compartida
EXEC xp_cmdshell 'net use Z: \\<YOUR_STORAGE_ACCOUNT_NAME>.file.core.windows.net\<YOUR_FILE_SHARE> /u:<YOUR_STORAGE_ACCOUNT_NAME> <YOUR_ACCESS_KEY>'
BACKUP DATABASE <DATABASE_NAME> TO DISK = 'C:\Backup\<BACKUP_NAME>.bak' MIRROR TO DISK = 'Z:\Backup\<BACKUP_NAME>.bak' WITH FORMAT
EXEC xp_cmdshell 'net use Z: /delete'
Con esto ya podremos tener de una manera simple nuestro backup en Local y copiado en Azure.
BONUS TRACK
Si para realizar vuestros backups utilizáis los famosos scripts de Ola Hallengren (si no lo hacéis, deberíais empezar a hacerlo) , podréis utilizar el siguiente script:
EXEC xp_cmdshell 'net use Z: \\<YOUR_STORAGE_ACCOUNT_NAME>.file.core.windows.net\<YOUR_FILE_SHARE> /u:<YOUR_STORAGE_ACCOUNT_NAME> <YOUR_ACCESS_KEY>'
EXEC xp_cmdshell 'sqlcmd -E -S <YOUR_SERVER_NAME> -d master -Q "EXECUTE [dbo].[DatabaseBackup] @Databases = ''ALL_DATABASES'', @Directory = N''C:\Backup'', @MirrorDirectory = N''Z:\Backup'', @BackupType = ''FULL'', @Verify = ''Y'', @CleanupTime = 336, @MirrorCleanupTime = 336, @CheckSum = ''Y'', @LogToTable = ''Y''" -b'
EXEC xp_cmdshell 'net use Z: /delete'
Ya sabéis, si os ha servido.. ¡Compartidla!
Consultor Senior SQL Server & BI con 9 años de experiencia, MCSE Data Platform con conocimientos de toda la herramienta y enfocado principalmente a la detección y mejora de problemas de rendimiento en Base de Datos. En mi tiempo libre soy un gran aficionado a la fotografía de estilo urbano y de lugares abandonados.