Come spostare un database da SQL Server 2012 a SQL Server 2005


30

Quali sono le mie opzioni se devo spostare un database da SQL Server 2012 (32 bit) a SQL Server 2005 (64 bit)?

So di non poter:

  • ripristinare un backup del database su SQL Server 2005
  • staccare e allegare

Io so che posso:

  • usa la procedura guidata di importazione dei dati e l'ho provato su un database, ma sposta solo i dati e anche questo è stato problematico in quanto avevo bisogno di fare molto lavoro creando tabelle temporanee per mantenere colonne di identità, ricreare tutti gli FK, gli indici ecc.

C'è un'opzione più semplice?


12
L'opzione più semplice sarebbe quella di aggiornare la destinazione al 2012, a dire il vero.
Aaron Bertrand

Risposte:


40

Puoi seguire qualsiasi metodo di seguito:

Nota: se si utilizzano nuove funzionalità come nuovi tipi di dati, ecc., È necessario eseguire il test poiché genererà errori.

METODO 1: utilizzo degli strumenti nativi

  1. Eseguire lo script del database SCHEMA_ONLY e ricreare un database vuoto sul server di destinazione. Di seguito sono riportati gli screenshot:

    inserisci qui la descrizione dell'immagine

    inserisci qui la descrizione dell'immagine

    inserisci qui la descrizione dell'immagine

  2. Utilizzare BCP OUT e BULK INSERT per inserire i dati.

Di seguito è riportato lo script che ti aiuterà 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)

Metodo 2: utilizzo di strumenti di terze parti

Creare un database vuoto sul server di destinazione. Utilizzare il confronto dello schema di Redgate e il confronto dei dati per creare e caricare i dati nel server di destinazione.

Nota: ho utilizzato lo schema e il confronto dei dati di Redgate e sono gli strumenti migliori per questo tipo di attività e quindi se si utilizzano strumenti di terze parti, la mia raccomandazione sarebbe Redgate.


7
+1, ma tieni presente che ci sono alcune cose che semplicemente non funzioneranno nella destinazione (e non sono sicuro di come strumenti di terze parti graziosi gestiranno tutto ciò). Oggetti come SEQUENCE, codice come OFFSET / FETCH, LAG / LEAD, ecc.
Aaron Bertrand

1
Una volta creato lo schema tramite script ed esecuzione di tali script sul database precedente, un'altra opzione per il trasferimento dei dati è quella di copiare direttamente da un'istanza all'altra impostando un server collegato. Non dovrebbe essere difficile scrivere un ciclo che fa tutto il lavoro. Per gestire i vincoli FK dovrai assicurarti di copiare le tabelle in un ordine appropriato, altrimenti potresti rimuovere temporaneamente gli FK e riattivarli dopo la copia. Allo stesso modo ti consigliamo di disabilitare eventuali trigger nella destinazione durante la copia.
David Spillett,

4

Oltre ai metodi già suggeriti qui, puoi anche provare a creare un file BACPAC e importarlo nella tua destinazione. Questo è simile a come Microsoft consiglia di migrare i database da database cloud locali a Azure.

Il vantaggio è che è una combinazione dell'esportazione dello schema e dei dati e non dipende dalla versione del database, quindi in teoria è possibile importare database da qualsiasi versione a qualsiasi versione.

Il rovescio della medaglia è che prima di generare il file BACPAC alla fonte, esegue una sorta di rigoroso processo di convalida che può facilmente fallire se si hanno riferimenti a oggetti esterni al database (sia esso database utente o di sistema), o se si dispone di oggetti crittografati. Ma se sei fortunato e non fallisce, allora può essere una soluzione piuttosto semplice.

Tutto ciò che serve è una delle versioni SSMS più recenti (17 o 18): https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

Per iniziare a creare un file BACPAC, fai clic con il pulsante destro del mouse su un database e seleziona "Esporta applicazione livello dati ..." (assicurati di non essere confuso con "Estrai applicazione livello dati ..." che è qualcosa di diverso):

Esporta applicazione livello dati ...

Ti verrà presentato un semplice mago che ti guiderà attraverso i passaggi. Al termine, è possibile utilizzare "Importa applicazione livello dati ..." nel server di destinazione, che è possibile visualizzare facendo clic con il pulsante destro del mouse sul nodo "Database" (di nuovo, non essere confuso con "Distribuisci dati -tier Application ... "):

Importa applicazione livello dati ...

Anche questo ti mostrerà una semplice procedura guidata per guidarti attraverso i passaggi.


-1

Diminuire la versione di SQL Server è un duro lavoro.
Ci sono alcune opzioni per diminuire come;
Prima di tutto, crea tutto lo script dell'oggetto database ed eseguilo sul server di destinazione.
Dopodiché puoi usare;

  • SSIS,
  • Strumento di importazione dei dati,
  • Strumento di terze parti come RedGate o altro.

Ma per lo strumento RedGate Data Compare ,

devi considerare che confronta solo le tabelle che hanno chiavi primarie. Quindi, se le tue tabelle che non hanno la chiave primaria, devi usare altri modi


8
Non credo che questa risposta migliori sulla risposta di Kins
James Anderson,

-3

È impossibile eseguire il downgrade di un database su SQL Server. Tuttavia, una soluzione alternativa consiste nello script di tutti gli oggetti DB e applicare lo script sul database di destinazione. SSIS è un ottimo modo per aiutarti a farlo.


4
Pensi che questo aggiunga qualcosa di importante alla risposta di Kin ?
dezso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.