Copiar SQL Azure Database entre Subscripciones

Hace poco recibí un requerimiento de un cliente que deseaba copiar una de sus bases de datos PaaS de Azure de una subscripción hacia otra. Esta base de datos pesa alrededor de 50 GB y se encuentra en un “tier” Standard S2. Esta tarea por más sencilla que parezca no lo es tanto así, y a continuación vamos a explorar la solución que se implementó para completar el requerimiento.

La forma de copiar una base de datos Azure SQL Database, es a través de un proceso “Copy”, el cual puede lanzarse desde el portal, desde powershell o desde el mismo T-SQL. Este proceso es bastante simple ya que solo debemos configurar un par de cosas y el servicio PaaS se encargará de hacer la copia. Desde el portal, incluso nos permitirá hacer una copia de la base de datos a un punto en el tiempo, esta copia se creara en pocos minutos dependiendo del tamaño de la base de datos. Esto nos hace suponer que por detrás se utilizan backups nativos full y de log de estas bases de datos. El procedimiento para hacer esta copia esta detallado en el siguiente link.

2018-06-12_12-27-33
Copia de Base de Datos desde el Portal Azure

Este proceso está disponible para copiar bases de datos dentro de la misma subscripción, sin embargo para lograr lo solicitado por el cliente, lo cual es copiar una base de datos de una subscripción hacia otra, hay dos alternativas, la primera es generar un “bacpac” desde la subscripción origen y luego importarlo en la subscripción destino, esta alternativa en la práctica es viable, pero su implementación es lenta dependiendo del tamaño de base de datos, y muy propensa al error ya que, al menos en mi experiencia personal, los archivos “bacpac” son algo… especiales en el sentido que si encuentran algún error o algo que no tienen el proceso completo de importación falla, y requieren algunas iteraciones para lograrlo. La segunda alternativa es hacerlo por T-SQL siguiendo los pasos que voy a detallar a continuación, no he encontrado forma aún de hacerlo desde el portal o desde Powershell.

Para realizar una copia de una Azure SQL Database de una subscripción hacia otra se debe tener los siguientes requerimientos:

Servidor Origen:

  • Tener un “login” creado en la base de datos “master”:
CREATE LOGIN CopyLogin WITH PASSWORD = 'My$ecurePa$$w0rd'
GO

  • En la base de datos que deseamos copiar, debemos crear un usuario enlazado a ese “login”, y a ese usuario se le debe asignar el rol de “db_owner”.
CREATE USER CopyLogin FOR LOGIN CopyLogin
GO
ALTER ROLE db_owner ADD MEMBER CopyLogin
GO

Servidor Destino:

  • Crear un “login” con el mismo nombre y contraseña que en el servidor origen, y asignarle el rol de “dbmanager” para que sea capaz de crear la base de datos.
En la base de datos master
CREATE LOGIN CopyLogin WITH PASSWORD = 'My$ecurePa$$w0rd'
GO
CREATE USER CopyLogin FOR LOGIN CopyLogin
GO
ALTER ROLE dbmanager ADD MEMBER CopyLogin;
GO

Procedimiento:

Ingresar al servidor destino con el “login” recientemente creado, y sobre la base de datos master ejecutar la siguiente sentencia, donde se especifica que se desea copiar la base de datos desde otro servidor, el cual está en otra subscripción. Por favor notar que en el nombre del servidor origen no se está considerando el sufijo “.database.windows.net”, ya que si se coloca dicho sufijo la sentencia fallará.

CREATE DATABASE [MyUserDB]
AS COPY OF [ServidorFuente].[MyUserDB]
GO

view raw
copydb_createdb.sql
hosted with ❤ by GitHub

Una vez terminado este proceso, tendremos una copia exacta de nuestra base de datos, y en ella podremos hacer los ajustes necesarios ya sea de permisos o cualquier otro que se requiera.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s