¿Restaurar la copia de seguridad de SQL Server 2012 en una base de datos de SQL Server 2008?

41

¿Hay alguna manera de restaurar una copia de seguridad de la base de datos de SQL Server 2012 en un SQL Server 2008?

Intenté adjuntar un archivo, no funciona.

Aaron Bertrand
fuente
Hay otra pregunta igual a esta y está muy bien respondida: superuser.com/questions/468578/…
Cavaleiro
1
Aquí hay una gran respuesta funcional a este problema (migración, no copia de seguridad / restauración): stackoverflow.com/questions/19837886/…
Don Jewett

Respuestas:

30

Tienes un par de opciones:

Opción A : base de datos de secuencia de comandos en modo de compatibilidad utilizando la opción Generar secuencia de comandos:

Nota: Si realiza un script de base de datos con esquema y datos, dependiendo del tamaño de sus datos, el script será masivo y SSMS, sqlcmd u osql no lo manejará (también puede estar en GB).

ingrese la descripción de la imagen aquí

Opcion B:

Primero, escriba primero las tablas con todos los índices, FK, etc. y cree tablas en blanco en la base de datos de destino, opción con SÓLO ESQUEMA (sin datos).

Use BCP para insertar datos

  1. bcp fuera de los datos usando el script de abajo configure SSMS en modo de texto y copie la salida generada por el siguiente script en un archivo bat.

    -- save below output in a bat file by executing below in SSMS in TEXT mode
    
    -- clean up: create a bat file with this command --> del D:\BCP\*.dat 
    
    select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" ' /* path to BCP.exe */
        +  QUOTENAME(DB_NAME())+ '.' /* Current Database */
        +  QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'            
        +  QUOTENAME(name)  
        +  ' out D:\BCP\'  /* Path where BCP out files will be stored */
        +  REPLACE(SCHEMA_NAME(schema_id),' ','') + '_' 
        +  REPLACE(name,' ','') 
        + '.dat -T -E -SServerName\Instance -n' /* ServerName, -E will take care of Identity, -n is for Native Format */
    from sys.tables
    where is_ms_shipped = 0 and name <> 'sysdiagrams'                       /* sysdiagrams is classified my MS as UserTable and we dont want it */
    /*and schema_name(schema_id) <> 'unwantedschema'    */                             /* Optional to exclude any schema  */
    order by schema_name(schema_id)
  2. Ejecute el archivo bat que generará los archivos .dat en la carpeta que ha especificado.

  3. Ejecute la secuencia de comandos siguiente en el servidor de destino con SSMS en modo de texto nuevamente.

    --- Execute this on the destination server.database from SSMS.
    
    --- Make sure the change the @Destdbname and the bcp out path as per your environment.
    
    declare @Destdbname sysname
    set @Destdbname = 'destinationDB' /* Destination Database Name where you want to Bulk Insert in */
    select 'BULK INSERT ' 
    /*Remember Tables must be present on destination database */ 
    + QUOTENAME(@Destdbname) + '.' 
    + QUOTENAME(SCHEMA_NAME(SCHEMA_ID)) 
    + '.' + QUOTENAME(name) 
    + ' from ''D:\BCP\' /* Change here for bcp out path */ 
    + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') 
    + '.dat'' with ( KEEPIDENTITY, DATAFILETYPE = ''native'', TABLOCK )' 
    + char(10) 
    + 'print ''Bulk insert for ' + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') + ' is done... ''' 
    + char(10) + 'go'
       from sys.tables
       where is_ms_shipped = 0
    and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
    and schema_name(schema_id) <> 'unwantedschema' /* Optional to exclude any schema */
        order by schema_name(schema_id) 
  4. Ejecute la salida utilizando SSMS para insertar datos nuevamente en las tablas.

Este es un método bcp muy rápido, ya que utiliza el modo nativo.

Kin Shah
fuente
Muy útil: el método B funcionó para mí (el SQL generado por el método A era de 7 GB y SSMS no tenía ninguno). Algunos SSID y servidores vinculados no funcionaron correctamente, pero ¿cuándo funciona algo relacionado con los servidores vinculados por primera vez? No estoy seguro de que me gustaría usar esto en producción, pero para obtener un entorno de prueba con un 95% de rapidez, fue perfecto.
aucuparia
@aucuparia Some SSIDs and linked servers didn't go across properly. Los servidores vinculados deben ser programados manualmente. Los SSID se pueden probar utilizando sp_helprevlogin. Los trabajos de SQLAgent, los paquetes de ssis, etc., se deben mover según sus necesidades. El objetivo de este método es obtener los datos lo más rápido posible cuando esté degradando o fusionando 2 bases de datos.
Kin Shah
La opción B fue el único método que funcionó para mí, ya que las secuencias de comandos generadas eran demasiado grandes en otras formas
JumpingJezza
23

No, no puedes retroceder, solo avanzar. Puede crear una base de datos vacía en 2008 y luego usar el asistente Generar guiones en Management Studio para guiar el esquema y los datos (o herramientas de comparación de terceros de Red Gate y otros). Asegúrese de establecer la versión de destino correcta como 2008, y tendrá que desarrollar cosas incompatibles (por ejemplo, DESPLAZAMIENTO o FORMATO) que podría haber utilizado en 2012.

Aaron Bertrand
fuente
8

No hay una forma compatible de hacerlo porque SQL Server no permite este tipo de compatibilidad.

Lo que puedes hacer es

  1. restaurar la base de datos en SQL 2012

  2. generar scripts para objetos y datos

  3. limpiar scripts de todos los detalles que son únicos para SQL 2012
  4. ejecutar scripts en 2008

Si no tiene SQL Server 2012, puede usar herramientas de terceros para leer copias de seguridad y extraer datos y estructura.

En este caso, simplemente cree una base de datos vacía en SQL 2008 y use herramientas como ApexSQL Diff y ApexSQL Data Diff para sincronizar objetos y datos. También puede encontrarlos en otros proveedores importantes, como Red-Gate o Idera.

David Smithers
fuente