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:
No hay comentarios:
Publicar un comentario