Ripristinare il backup di SQL Server 2012 in un database di SQL Server 2008?


41

Esiste un modo per ripristinare un backup del database di SQL Server 2012 su SQL Server 2008?

Ho provato ad allegare il file, non funziona.



C'è un'altra domanda uguale a questa e ha un'ottima risposta: superuser.com/questions/468578/…
Cavaleiro,

1
C'è un'ottima risposta funzionante a questo problema qui (migrazione, non backup / ripristino): stackoverflow.com/questions/19837886/…
Don Jewett,

Risposte:


30

Hai un paio di opzioni:

Opzione A : script di database in modalità compatibilità utilizzando l'opzione Genera script:

Nota: se si esegue lo scripting del database con schema e dati, a seconda della dimensione dei dati, lo script sarà enorme e non sarà gestito da SSMS, sqlcmd o osql (potrebbe anche essere in GB).

inserisci qui la descrizione dell'immagine

Opzione B:

Prima esegui lo script delle tabelle prima con tutti gli indici, gli FK, ecc. E crea tabelle vuote nel database di destinazione - opzione con SOLO SCHEMA (Nessun dato).

Utilizzare BCP per inserire dati

  1. bcp i dati usando lo script di seguito. imposta SSMS in modalità testo e copia l'output generato dallo script seguente in un file 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. Esegui il file bat che genererà i file .dat nella cartella che hai specificato.

  3. Eseguire di nuovo lo script di seguito sul server di destinazione con SSMS in modalità testo.

    --- 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. Eseguire l'output utilizzando SSMS per reinserire i dati nelle tabelle.

Questo è un metodo bcp molto veloce in quanto utilizza la modalità nativa.


Molto utile - il metodo B ha funzionato per me (l'SQL generato dal metodo A era 7 GB e SSMS non ne aveva nessuno). Alcuni SSID e server collegati non hanno funzionato correttamente, ma quando ha mai funzionato per la prima volta qualcosa che ha a che fare con i server collegati? Non sono sicuro che sarei felice di usarlo in produzione, ma per ottenere un ambiente di prova rapidamente al 95% è stato perfetto.
aucuparia,

@aucuparia Some SSIDs and linked servers didn't go across properly. I server collegati devono essere scritti manualmente. Gli SSID possono essere trasferiti usando sp_helprevlogin. I lavori SQLAgent, i pacchetti ssis ecc. Devono essere spostati in base alle proprie esigenze. Il punto di questo metodo è quello di ottenere i dati il ​​più velocemente possibile durante il downgrade o l'unione di 2 database.
Kin Shah,

L'opzione B è stato l'unico metodo che ha funzionato per me, poiché gli script generati erano troppo grandi negli altri modi
JumpingJezza

23

No, non puoi andare indietro, solo avanti. È possibile creare un database vuoto nel 2008 e quindi utilizzare la procedura guidata Genera script in Management Studio per eseguire lo script dello schema e dei dati (o strumenti di confronto di terze parti di Red Gate e altri). Assicurati di impostare la versione di destinazione corretta come 2008 e dovrai mettere a punto cose incompatibili (ad esempio OFFSET o FORMAT) che potresti aver usato nel 2012.


8

Non esiste un modo supportato per farlo perché SQL Server non consente questo tipo di compatibilità.

Quello che puoi fare è farlo

  1. ripristinare il database su SQL 2012

  2. generare script per oggetti e dati

  3. ripulire gli script da tutti i dettagli che sono univoci per SQL 2012
  4. eseguire script nel 2008

Se non si dispone di SQL Server 2012, è possibile utilizzare strumenti di terze parti per leggere il backup ed estrarre dati e struttura.

In questo caso basta creare un database vuoto su SQL 2008 e usare strumenti come ApexSQL Diff e ApexSQL Data Diff per sincronizzare oggetti e dati. Puoi trovarli anche da altri principali fornitori come Red-Gate o Idera.

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.