Transferencia de datos de copia de seguridad de una nueva versión de MS SQL Server a una versión anterior

Prehistoria

Una vez, para reproducir un error, necesitaba una copia de seguridad de la base de datos de producción.

Para mi sorpresa, me encontré con las siguientes limitaciones:

  1. La copia de seguridad de la base de datos se realizó en la versión SQL Server 2016 y no era compatible con mi SQL Server 2014.
  2. En mi computadora de trabajo, el sistema operativo utilizado fue Windows 7entonces no pude actualizar SQL Server hasta la versión 2016
  3. El producto compatible formaba parte de un sistema más grande con una arquitectura heredada estrechamente acoplada y también se comunicaba con otros productos y bases, por lo que podría llevar mucho tiempo implementarlo en otra estación.

Dado lo anterior, llegué a la conclusión de que ha llegado el momento de las muletas de soluciones no estándar.

Restauración de datos desde una copia de seguridad

Elegí usar una máquina virtual Oracle VM VirtualBox con Windows 10 (puede tomar una imagen de prueba para el navegador Edge por lo tanto). SQL Server 2016 se instaló en la máquina virtual y la base de datos de la aplicación se restauró desde la copia de seguridad (instrucción).

Configuración del acceso a SQL Server en una máquina virtual

A continuación, era necesario realizar algunos pasos para poder acceder a SQL Server desde el exterior:

  1. Para el firewall, agregue una regla para omitir las solicitudes de puerto 1433.
  2. Es deseable que el acceso al servidor no sea a través de la autenticación de Windows, sino a través de SQL utilizando un nombre de usuario y una contraseña (es más fácil configurar el acceso). Sin embargo, en este caso, debe recordar habilitar la autenticación de SQL en las propiedades de SQL Server.
  3. En la configuración de usuario en SQL Server en la pestaña Mapeo de usuario especificar el rol de usuario para la base de datos restaurada db_securityadmin.

Перенос данных

En realidad, la transferencia de datos en sí consta de dos etapas:

  1. Transferencia de esquemas de datos (tablas, vistas, procedimientos almacenados, etc.)
  2. Transferir los datos en sí

Transferencia de esquema de datos

Realizamos las siguientes operaciones:

  1. Elegir Tareas -> Generar scripts para una base portátil.
  2. Seleccione los objetos que necesita transferir o deje el valor predeterminado (en este caso, se crearán scripts para todos los objetos de la base de datos).
  3. Especifique la configuración para guardar el script. Lo más conveniente es guardar el script en un único archivo Unicode. Luego, en caso de falla, no necesita repetir todos los pasos nuevamente.

Una vez que se guarda el script, se puede ejecutar en el SQL Server original (versión anterior) para crear la base requerida.

Atencion: Después de ejecutar el script, debe verificar la correspondencia entre la configuración de la base de datos de la copia de seguridad y la base de datos creada por el script. En mi caso, no había una configuración para COLLATE en el script, lo que provocó un error al transferir datos y bailar con una pandereta para recrear la base de datos utilizando el script suplementado.

Перенос данных

Antes de transferir datos, debe deshabilitar la verificación de todas las restricciones en la base de datos:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

La transferencia de datos se realiza mediante el asistente de importación de datos Tareas -> Importar datos en SQL Server, donde se encuentra la base de datos creada por el script:

  1. Especifique la configuración de conexión al origen (SQL Server 2016 en una máquina virtual). Usé fuente de datos Cliente nativo de SQL Server y la autenticación SQL antes mencionada.
  2. Especifique la configuración de conexión para el destino (SQL Server 2014 en la máquina host).
  3. A continuación, configure la asignación. Todos deben ser seleccionados no de solo lectura objetos (por ejemplo, no es necesario seleccionar las vistas). Como opciones adicionales, seleccione "Permitir inserción en columnas de identidad"si se utilizan tales.
    Atencion: si, al intentar seleccionar varias tablas y establecer su propiedad "Permitir inserción en columnas de identidad" la propiedad ya se ha establecido para al menos una de las tablas seleccionadas, el cuadro de diálogo indicará que la propiedad ya se ha establecido para todas las tablas seleccionadas. Este hecho puede ser confuso y dar lugar a errores de migración.
  4. Iniciamos el traslado.
  5. Restauración de la comprobación de restricciones:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Si se produce algún error, verificamos la configuración, eliminamos la base de datos creada con errores, la volvemos a crear a partir del script, hacemos las correcciones y repetimos la transferencia de datos.

Conclusión

Esta tarea es bastante rara y ocurre solo debido a las limitaciones anteriores. La solución más común es actualizar SQL Server o conectarse a un servidor remoto si la arquitectura de la aplicación lo permite. Sin embargo, nadie es inmune al código heredado y las manos torcidas del desarrollo de baja calidad. Espero que no necesite esta instrucción, pero si aún la necesita, le ayudará a ahorrar mucho tiempo y nervios. ¡Gracias por su atención!

Lista de fuentes utilizadas

Fuente: habr.com