Copiar una base de datos SQLAzure a un servidor distinto -en otra suscripción- con T-SQL

Si tienes una base de datos en un entorno de desarrollo en Azure, es normal que cuando quieras pasar a producción desees copiar la base de datos con la que has estado trabajando a una suscripción en producción, sobre todo cuando la suscripción final es del cliente y la facturación de uso de Azure se debe facturar a éste.

Para ello podemos usar distintas herramientas para traspasar esquema y datos, como RedGate SQLCompare 9, SQL Azure Migration Wizard, o el mismo MS SQL Server Management Studio 2008 R2.

Sin embargo, hay una manera muy sencilla de copiar dicha base de datos entre distintos servidores, que no es otra que la de ejecutar un comando T-SQL. Sé que este post no es muy novedoso, pero lo hago para utilizarlo como chuleta propia, que siempre ando buscando estos scripts cada vez que tengo que hacer esta tarea.

NOTA: esta sintaxis tiene la limitación de que sólo se puede hacer entre servidores SQL Azure que se encuentren en la misma sub-región o Datacenter.

Cómo copiar la base de datos entre distintos servidores

1) Crear un login en el servidor destino, con el mismo nombre de usuario y contraseña que el DBO de la base de datos origen y asignarle el rol “dbmanager”

-- Ejecutar en la master del servidor destino
-- Crear el Login
CREATE LOGIN MiLogin WITH password='MiPassword';
GO
-- Crear el usuario
CREATE USER MiUsuario FROM LOGIN MiLogin
GO
-- Asignar Rol dbmanager
EXEC sp_addrolemember 'dbmanager', 'MiUsuario';
GO

2) Copiar la base de datos origen con el comando CREATE DATABASE, ejecutándolo en el servidor destino (es un proceso asíncrono y para ver el resultado debéis ejecutar las consultas del siguiente paso). Si el nombre del servidor es xxxxx.database.windows.net, el “NombreServidorOrigen” es “xxxxx”. No se admiten copias entre distintas regiones, sub-regiones o datacenters:

-- Ejecutar iniciando sesión en destino con el 
-- usuario que creamos en el paso anterior
-- Copiar base de datos
CREATE DATABASE NombreBDDestino AS COPY OF NombreServidorOrigen.NombreBDOrigen
GO

3) Monitorizar el estado del proceso de copia a través de las consultas siguientes. Cuando el estado de la base de datos pase de “COPYING” a “ONLINE”, podremos operar ya con la base de datos.

-- Obtener el estado de las bases de datos
SELECT name, state, state_desc 
FROM sys.databases

-- Obtener detalles de los procesos de copia
SELECT * 
FROM sys.dm_database_copies

 

Una vez realizadas estas operaciones, si lo deseamos podemos crear nuevos usuarios e inicios de sesión para la base de datos en el servidor de destino, para que tengan credenciales distintas que en el servidor origen.

Errores conocidos

1) CREATE DATABASE permission denied in database ‘<NombreDBOrigen>’.

Este error lo da si el usuario con el que estamos intentando realizar la copia no es el DBO de la base de datos origen. Aseguraos de que estáis ejecutando el comando con el usuario correcto.

2) “Cannot open server "<NombreServidorOrigen>" requested by the login.  The login failed.”

Aseguraos que el nombre de usuario con el que estáis ejecutando el comando en el servidor destino tiene el mismo nombre y contraseña en el servidor origen. También debéis aseguraos de que el servidor origen está dentro de la misma sub-región o Datacenter. NO SE PUEDEN COPIAR BASES DE DATOS ENTRE DISTINTOS DATACENTERS con esta sintaxis. Para ello hay que acudir a otro tipo de herramientas como las comentadas al inicio del post.

3) “A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 – An existing connection was forcibly closed by the remote host.)”

Este error se debe a un error de conexión por reglas del firewall. También debéis tener en cuenta que no se puede hacer copia entre servidores que estén en datacenters distintos –ver error anterior.

Referencias:

davidjrh

David Rodriguez, is a happy Spanish guy living and working in Tenerife (Canary Islands, Spain) where he was born. He is one of the lucky ones who has the opportunity to work with cutting edge technologies at Intelequia as CTO. He has more than 20 years development background mostly based on Microsoft technologies, designing and architecting highly scalable systems like reservation systems for airlines companies. He has been working with Microsoft Azure since it was on CTP, migrating on-premise systems to the cloud, co-founding the .NET User Group TenerifeDev as well as the CSV company Intelequia Software Solutions. He is also the author of different DNN-Azure open source projects available on GitHub such as caching providers, analytics and Azure Active Directory.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *