Compatibilità con le versioni precedenti di SQL Server 2012 per i backup con 2008


14

Ho un numero di client con SQL Server 2008 ed è quello che ho anche qui sul mio server. Uso i file di backup per inviare database avanti e indietro tra i client e nel mio ufficio.

Ho letto che quando si crea un backup da SQL Server 2012 non è possibile ripristinarlo su un'istanza del 2008. Ho ipotizzato che il livello di compatibilità avrebbe risolto questo problema, ma non è così. Pertanto, sono in perdita su come aggiornare. Oltre a aggiornare contemporaneamente tutti i miei clienti, il che è impossibile, non riesco a pensare a un modo pulito per farlo.

Ho la necessità di inviare un database a un client e di ricevere un database da un client. Questo è il mio primo aggiornamento di versione su SQL Server, quindi sono nuovo a questo problema. Qualche idea su come procedere?


4
È possibile avere un'istanza di SQL Server 2008 e un'istanza di SQL Server 2012 installate contemporaneamente sul server con nomi di istanza diversi. Forse questo risolverebbe i tuoi problemi con i clienti su versioni diverse?
Mikael Eriksson,

Risposte:


16

Ci sono due cose coinvolte qui: il numero di versione del file e il livello di compatibilità. Quando si collega un database a una versione principale più recente (come dal 2008 al 2008R2 o dal 2008R2 al 2012), la versione del database viene modificata in modo permanente e non è possibile ricollegarlo a una versione precedente.

Il livello di compatibilità è per l'analisi di T-SQL obsoleto della vecchia scuola che funzionava nelle versioni precedenti di SQL Server. Non cambia il modo in cui i dati vengono archiviati sul disco.

Per dare il database a qualcuno su una versione precedente di SQL Server, dovrai esportare i dati e importarli in un altro database. Strumenti come il confronto dei dati di Red Gate sono utili per questo.


Sì, ho avuto lo stesso identico problema prima. Ho finito per eseguire lo scripting dell'intero database e quindi lo scripting di tutti i dati. Il confronto e il confronto dei dati SQL di Red Gate sono venuti in soccorso quel giorno.
DForck42

@ DForck42: Nel mio caso, il DB era troppo grande per eseguire lo scripting con i dati, quindi ho finito per eseguire lo scripting dello schema, quindi spostare i dati con bcp.
ivan_pozdeev,

@ivan_pozdeev stai dicendo che hai esportato usando SQL Server 2012 BCP e importato usando SQL Server 2008R2 BCP? Sii fantastico sapere che i formati di file sono compatibili, grazie.
Chris,

2
@ Chris msdn.microsoft.com/en-us/library/ms162802.aspx "In SQL Server 2014, i file compatibili con SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2008 R2, ed i dati nativi supporti utilità BCP SQL Server 2012. "
ivan_pozdeev,

Grazie @ivan_posdeev, questa è stata una rivelazione. Ho documentato i miei passaggi di seguito nel caso in cui aiuti qualcun altro.
Chris,

6

L'impostazione del livello di compatibilità è utilizzata da SQL Server per determinare come gestire alcune nuove funzionalità. In questo modo è possibile migrare un DB su una versione più recente di SQL senza problemi con l'applicazione. Il livello di compatibilità può essere modificato avanti e indietro.

Sfortunatamente, i file di backup non sono compatibili con le versioni precedenti. Un metodo potrebbe essere quello di utilizzare l'importazione / esportazione per spostare i dati dal DB corrente all'istanza della versione precedente.


3

Per le migrazioni SQL, utilizzare la Migrazione guidata database SQL gratuita e open source.

Avevo un database da 5 GB con circa 10 milioni di record e ho provato il percorso tramite Generate Script e poi l'ho eseguito con sqlcmd.exe. Prima di tutto, lo script generato non funzionava sempre correttamente. In secondo luogo, sqlcmd.exe può fallire anche su file di grandi dimensioni, lamentandosi della memoria disponibile. osql.exe funziona, ma richiede solo anni (e ha gli stessi argomenti della riga di comando).

Poi ho trovato uno strumento meraviglioso per la migrazione di SQL Server a database SQL Azure. Questo funziona anche per SQL Server su SQL Server, ad esempio se desideri migrare un database SQL 2012 su 2008 R2. Utilizza bcp.exe, che utilizza la copia bulk. Sono disponibili una versione della GUI e della riga di comando (Batch) ed è open source. Vedi http://sqlazuremw.codeplex.com/ . Nel mio caso, l'operazione ha richiesto 16 minuti.

In una schermata avanzata è possibile selezionare che la destinazione sia SQL Server, non SQL Azure.


2

Ho trovato BCP più efficace di alcuni degli strumenti per ottenere dati in una versione precedente di SQL Server e per estrarre dati da RDS. (Grazie @ivan_posdeev.)

In primo luogo ho generato lo schema facendo clic con il pulsante destro del mouse sul database in SQL Server Management Studio, Attività, Genera script. Spuntare tutti gli oggetti, negli oggetti avanzati assicurarsi che tutto il necessario sia scritto (statistiche, indici, ecc.), Deselezionare "USA database" se il database di destinazione ha un nome diverso, impostare la compatibilità con la versione del database di destinazione e generare un file che crea il tuo schema. Creare un database sulla destinazione ed eseguire il file su di esso (utilizzando osql, sqlcmdo la GUI).

Per spostare i dati, eseguire due volte la seguente query sul database di origine , commentando prima la seconda colonna per generare il file batch per estrarre i dati, quindi commentando la prima colonna per generare il file batch di importazione da eseguire sulla destinazione. (È necessario aggiungere i server di origine e destinazione, i nomi delle istanze, le directory dei file di output e di input, i nomi utente e le password. Per utilizzare la sicurezza integrata, sostituire le opzioni -Ue -Pcon semplicemente -T.)

Questo supporta Unicode, se non ti serve, cambia l' -Nopzione in entrambe le istruzioni -n.

SELECT 
   'bcp SOURCEDATABASE.' + s.Name + '.' + t.NAME  + ' out d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S SOURCESERVER\INSTANCE -UUSER -PPASSWORD'
--    'bcp DESTINATIONDATASE.' + s.Name + '.' + t.NAME  + ' in d:\dbdump\' + s.Name + '.' + t.NAME  + '.dat -N -S DESTINATIONSERVER\INSTANCE -UUSER -PPASSWORD -E -h TABLOCK -b 1000 -e d:\dbdump\' + s.Name + '.' + t.NAME  + '.ERRORS.dat'
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
ORDER BY 
    s.Name, t.NAME

Dopo aver eseguito i file di controllo denominati schema.tablename.ERRORS.dat - includerà tutte le righe non riuscite, vuota se non presente.

Riferimento MSDN per BCP qui , passeggiata più amichevole attraverso le opzioni BCP qui .

Ho trovato questo enormemente superiore alla generazione di script e uno qualsiasi degli strumenti che ho provato. Funziona anche su database RDS (che non consentono backup). I file di dati generati hanno una dimensione del 30% degli script SQL, eseguendoli richiede una frazione del tempo ed è molto più affidabile. (Gli script generati da SQL Server per i dati di scripting sono sempre scattati, a volte prevedibilmente a volte no, l'SQL generato non era compatibile con 2008R2 (ad esempio, utilizzato nvarchar(0), spesso non completato per nessun motivo riconoscibile, ecc. BCP replica anche eventuali violazioni dei vincoli , come l'integrità referenziale.).

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.