Una de las preguntas que me hacen a diario es cómo se puede hacer un backup de una base de datos en SQL Azure. Y lo cierto es que hay muchas formas posibles de hacerlo cada una con sus ventajas e inconvenientes. Antes de entrar en ello, lo que sí que es importante señalar es que hagas o no backup, en SQL Azure tus datos están siempre seguros y disponibles gracias al mecanismo de replicas. Cada base de datos alojada en SQL Azure tiene siempre 3 réplicas: una réplica primaria y 2 réplicas secundarias. Todas las lecturas y escrituras se producen en la réplica primaria y luego se replican de forma asíncrona a las réplicas secundarias. En el caso de transacciones, no se dan por válidas hasta que la réplica principal y al menos una réplica secundaria confirman que la transacción se ha ejecutado con éxito. Esto es lo que se llama el quorum commit. Si quieres leer más sobre la infraestructura interna de SQL Azure te recomiendo este artículo.
A pesar de que todo lo anterior nos protege contra fallos de hardware, discos, etc. seguimos necesitando en la mayoría de los casos un sistema de copias de seguridad que nos proteja frente a errores de nuestra aplicación o de los usuarios y que nos permita restaurar una copia de nuestra base de datos en el hecha en el pasado. En el roadmap de SQL Azure está previsto disponer en el futuro inmediato de un mecanismo estándar de Backup & Restore accesible desde el portal de SQL Azure pero hasta que esto esté disponible mostraré las distintas alternativas que existen para hacer estas copias de seguridad.
Si no tienes tiempo para leer el post completo, mi resumen sería utilizar una combinación del método 1 y 3 para bases de datos siempre activas. Para bases de datos que pueden estar en offline, mi recomendación sería usar el método 3.
En SQL Azure puedo utilizar el siguiente comando T-SQL:
CREATE DATABASE nombre_bbdd_destino
AS COPY OF [servidor_origen].nombre_bbdd_origen
Me creará una copia exacta a la base de datos original en el momento que termina el proceso de copia.
Ver más información.
Ventajas:
Inconvenientes:
Mediante esta utilidad gratuita es posible extraer copias completas de la base de datos en SQL Azure en forma de ficheros que luego pueden ser restaurados de nuevo con el propio SQL Azure Migration Wizard. Esta utilidad tiene un interfaz gráfico pero además proporciona un ejecutable para realizar las copias por línea de comando y de estar forma poder automatizar nuestro proceso de backup. Creando un servicio Windows o una tarea programada, podría dejar programadas copias de seguridad desde un servidor local.
Mediante la nueva CTP de Microsoft SQL Server “Denali” DAC Framework 2.1 Feature Pack, ahora es posible exportar e importar el esquema y los datos de una base de datos en un único archivo con la extensión “.bacpac”. Hasta que no se lance “Denali” la nueva versión de SQL Server, será necesario instalarse estos componentes en el servidor desde el que vamos a lanzar el proceso para exportar los datos de SQL Azure. Es importante señalar que el fichero “.bacpac” generado no es transaccionalmente consistente ya que básicamente guarda un “SELECT *” de cada una de nuestras tablas. Si quiero utilizar DAC como mecanismo de backup, deberé primero crear una copia mediante el método 1) y posteriormente realizar la exportación desde esa copia. Una vez finalizada puedo ya eliminar la copia. Las exportaciones e importaciones se pueden realizar directamente desde el portal de gestión de Windows Azure en el menú de SQL Azure.
La exportación también puede realizarse por código utilizando la librería Microsoft.SQLServer.Management.DAC.dll o puedo utilizar directamente la utilidad de línea de comando DacImportExportCli.exe. Un ejemplo de exportación desde SQL Azure sería:
DacImportExportCli.exe -s nombre_servidor.datababase.windows.net -d nombre_bbdd -f C:\CopiasSeguridad\nombreficheroexportacion.bacpac -x -u usuario@nombre_servidor –p contraseña
Aunque no es propiamente un sistema de copias de seguridad, SQL Azure Data Sync permite mantener sincronizada una base de datos en SQL Azure con otra base de datos SQL Server o SQL Azure. Si queremos utilizar Data Sync como mecanismo de copia de seguridad se podría sincronizar la base de datos en SQL Azure con una base de datos SQL Server local en modo unidireccional. Data Sync se encargaría de mantener ambas sincronizadas con el intervalo que nosotros definamos (desde 5 minutos en adelante). Luego bastaría ir realizando backups periódicos de nuestro servidor SQL Server local de la forma habitual.
SQL Azure Backup es un sencillo programa que permite copiar el esquema y los datos de una base de datos SQL Azure a una instancia local de SQL Server o directamente al Storage de Azure. Una vez tengo la copia puedo, si quiero, realizar una copia de seguridad estándar y almacenarla. SQL Azure Backup sólo realiza copias de seguridad completas. El producto es gratuito. Si quiero realizar copias incrementales entonces Red Gate ofrece otros productos llamado SQL Compare y SQL Data Compare que ahora también soportan SQL Azure.
Cerebrata dispone de un producto llamado Azure Management Cmdlets que básicamente son un conjunto de Cmdlets de PowerShell con los que puedo automatizar la gestión de mis servicios en la Plataforma Windows Azure. Entre estos Cmdlets hay uno que permite realizar una copia de seguridad de de los datos de SQL Azure, almacenándolos en el servidor local y también, opcionalmente, permite posteriormente almacenar estos datos en un blob de Azure Storage.
Esta sencilla utilidad gratuita desarrollada por Solid.Q no es realmente una herramienta de copia de seguridad pero permite realizar cargas masivas de datos entre servidores SQL Server / SQL Azure. Básicamente funciona igual que BCP.EXE pero permite cifrar las contraseñas y configurar todo el proceso de copia mediante un XML. Al disponer del código fuente de la solución se puede integrar fácilmente en una solución existente o también automatizar cargas masivas programando la tarea.
Hasta ahora, salvo el método 1 y el 3,el resto requieren disponer de un servidor local que es el que realiza la copia de seguridad. Pero con algo de desarrollo, es posible crear una solución de backup en la que el proceso se desarrolle en Windows Azure, se pueda automatizar y las copias queden almacenadas en el Storage de Windows Azure para poder restaurarlas de manera sencilla.
Algunas opciones:
A) Utilizar Data-tier Application (DAC) Framework desde Azure
Utilizaremos la técnica descrita en el método 3 pero adaptada a funcionar 100% desde Windows Azure de forma automatizada. Más información en este ejemplo de MSDN.
B) Almacenar una copia serializada de la base de datos en el Storage
Podemos utilizar el método 1 y luego realizar una copia serializada de esa base de datos para almacenarla en el Storage de Windows Azure. Todo el proceso podría programarse para ejecutarse desde un Worker Role. Más información en este artículo.
C) Utilizar Enzo Backup for SQL Azure
Interesante utilidad de copia de seguridad de bases de datos SQL Azure. Este programa permite su despliegue en un Worker Role de forma que todo el proceso de backup se realiza en Windows Azure. Es posible también automatizarlo mediante línea de comando. Más información.
D) Copia de seguridad con BCP desde un Worker Role
Consistiría en desarrollar un proceso que se lance desde un Worker Role y exporte todos los datos de la base de datos en SQL Azure utilizando BCP.EXE. Alternativamente se podría utilizar la utilidad de línea de comandos del SQL Azure Migration Wizard (SQLAzureMWBatchBackup) para facilitar el desarrollo. También se podría utilizar el Cmdlet de Cerebrata. Es importante reseñar que para utilizar BCP desde un Worker Role, será necesario antes instalar esta herramienta mediante una Startup Task en el rol. Deberemos instalar estos componentes (en esta página están los instalables):
- Microsoft® SQL Server® 2008 R2 Command Line Utilities (x64)
- Microsoft® SQL Server® 2008 R2 Native Client (x64)
La instalación deberá ser en modo silencioso utilizando msiexec.exe con el parámetro /quiet o /q. Más información aquí. Es un proceso similar al ejemplo A).
Conforme se van obteniendo los datos por BCP, habría que programar otra tarea que los almacenara en el Storage de Windows Azure. Si tenemos el servidor SQL Azure, la instancia del Worker Role y la cuenta de Storage en el mismo data center, no habrá que pagar ningún coste de transferencia de datos y además el proceso será muchísimo más rápido.
Aquí podemos descargar un ejemplo de lo anterior.
Cómo siempre espero que haya sido de utilidad.
ACTUALIZACIÓN (24/10/2011): Incluido el nuevo SQL Azure Import/Export CTP
6) Backup por línea de comandos con la utilidad de Cerebrata:
Have you ever tried to restore this backup. I have not found a "Restore" cmdlet.
You are right Dan. There is no cmdlet for Restore. You can use standard BCP commands to restore the database from these files (you will need a copy of the database schema too) but it would be nice to have a more automatic approach.
You will find more information of restoring with BCP here:
social.technet.microsoft.com/.../overview-of-tools-to-use-with-sql-azure.aspx