Cómo mover una base de datos de SQL Server 2012 a SQL Server 2005

30

¿Cuáles son mis opciones si necesito mover una base de datos de SQL Server 2012 (32 bits) a SQL Server 2005 (64 bits)?

Sé que no puedo:

  • restaurar una copia de seguridad de la base de datos en SQL Server 2005
  • separar y adjuntar

Sé que puedo:

  • utilicé el asistente de importación de datos, y lo probé en una base de datos, pero solo mueve datos, e incluso eso fue problemático ya que necesitaba mucho trabajo creando tablas temporales para mantener las columnas de identidad, recreando todos los FK, índices, etc.

¿Hay una opción más fácil?

Greg Balajewicz
fuente
12
La opción más fácil sería actualizar el destino a 2012, para ser honesto.
Aaron Bertrand

Respuestas:

40

Puede seguir cualquier método a continuación:

Nota: Si está utilizando nuevas funciones, como nuevos tipos de datos, etc., debe probarlo, ya que arrojará errores.

MÉTODO 1: Usar herramientas nativas

  1. Script de la base de datos SCHEMA_ONLY y recrear una base de datos vacía en el servidor de destino. A continuación se muestran las capturas de pantalla:

    ingrese la descripción de la imagen aquí

    ingrese la descripción de la imagen aquí

    ingrese la descripción de la imagen aquí

  2. Use BCP OUT e BULK INSERT para insertar datos.

A continuación se muestra el script que lo ayudará con la Parte 2.

/************************************************************************************************************************************************
Author      :   KIN SHAH    *********************************************************************************************************************
Purpose     :   Move data from one server to another*********************************************************************************************
DATE        :   05-28-2013  *********************************************************************************************************************
Version     :   1.0.0   *************************************************************************************************************************
RDBMS       :   MS SQL Server 2008R2 and 2012   *************************************************************************************************
*************************************************************************************************************************************************/

-- 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_OUT\*.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_OUT\'                                           -- 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) <> 'some_schema_exclude'                     -- Optional to exclude any schema 
order by schema_name(schema_id)                         



--- 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 = 'destination_database_Name'               -- 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_OUT\'                             -- 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) <> 'some_schema_exclude'         -- Optional to exclude any schema 
order by schema_name(schema_id)

Método 2: uso de herramientas de terceros

Cree una base de datos en blanco en el servidor de destino. Utilice el esquema de comparación de Redgate y la comparación de datos para crear y cargar datos en el servidor de destino.

Nota: He utilizado el esquema y la comparación de datos de Redgate y son las mejores herramientas para ese tipo de tarea y, por lo tanto, si está utilizando herramientas de terceros, mi recomendación sería Redgate.

Kin Shah
fuente
77
+1 pero tenga en cuenta que hay ciertas cosas que simplemente no funcionarán en el destino (y no estoy seguro de cuán elegantes herramientas de terceros manejarán todo eso). Objetos como SECUENCIAS, código como OFFSET / FETCH, LAG / LEAD, etc.
Aaron Bertrand
1
Una vez que haya creado el esquema mediante secuencias de comandos y ejecutando esas secuencias de comandos en la base de datos anterior, otra opción para transferir los datos es copiar directamente de una instancia a otra configurando un servidor vinculado. No debería ser difícil crear un bucle que haga todo el trabajo. Para lidiar con las restricciones de FK, deberá asegurarse de copiar las tablas en un orden apropiado o puede eliminar las FK temporalmente y volver a habilitarlas después de la copia. Del mismo modo, querrá deshabilitar cualquier desencadenante en el destino durante la copia.
David Spillett
4

Además de los métodos ya sugeridos aquí, también puede intentar crear un archivo BACPAC e importarlo a su destino. Esto es similar a cómo Microsoft recomienda migrar sus bases de datos de las bases de datos locales a la nube de Azure.

El beneficio de esto es que es una combinación de exportación de esquema y datos, y no depende de la versión de la base de datos, por lo que teóricamente podría importar bases de datos de cualquier versión a cualquier versión.

La desventaja es que antes de generar el archivo BACPAC en la fuente, ejecuta algún tipo de proceso de validación estricto que puede fallar fácilmente si tiene referencias a objetos fuera de su base de datos (ya sea usuario o bases de datos del sistema), o si tiene objetos encriptados Pero si tiene suerte y no falla, puede ser una solución bastante fácil.

Todo lo que necesita es una de las versiones más nuevas de SSMS (17 o 18): https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

Para comenzar a crear un archivo BACPAC, haga clic derecho en una base de datos y seleccione "Exportar aplicación de nivel de datos ..." (asegúrese de no confundirlo con "Extraer aplicación de nivel de datos ...", que es algo diferente):

Exportar aplicación de nivel de datos ...

Se le presentará un asistente simple que lo guiará a través de los pasos. Cuando haya terminado, puede usar "Importar aplicación de nivel de datos ..." en su servidor de destino, que puede ver haciendo clic derecho en el nodo "Bases de datos" (nuevamente, no se confunda con "Implementar datos" -Tier Application ... "):

Importar aplicación de nivel de datos ...

Esto también le mostrará un asistente simple que lo guiará a través de los pasos.

Eitan Blumin
fuente
-1

Disminuir la versión de SQL Server es un trabajo muy duro.
Hay algunas opciones para disminuir como;
En primer lugar, cree todos los scripts de objetos de la base de datos y ejecútelos en el servidor de destino.
Después de eso puedes usar;

  • SSIS
  • Herramienta de importación de datos,
  • Herramienta de terceros como RedGate u otra.

Pero para la herramienta RedGate Data Compare ,

debe tener en cuenta que solo compara las tablas que tienen claves principales. Entonces, si sus tablas que no tienen clave primaria, debe usar otras formas

hasantatarli
fuente
8
No creo que esta respuesta mejore en la respuesta de Kins
James Anderson
-3

Es imposible degradar una base de datos en SQL Server. Sin embargo, una solución alternativa es realizar un script de todos los objetos de base de datos y aplicar el script en la base de datos de destino. SSIS es una excelente manera de ayudar a realizar esto.

Osama Waly
fuente
44
¿Crees que esto agrega algo importante a la respuesta de Kin ?
dezso