Come migrare un database di SQL Server ad una versione più recente

I DBA sono ben consapevoli del fatto che retrocedere un database di SQL Server non può essere fatto alla cieca. Anche quando il livello di compatibilità del database che si vuole migrare ad una versione precedente di SQL Server corrisponde con quella versione, non ci si può semplicemente limitare a fare il restore del backup. Quello che però probabilmente non ci si aspetta è che anche il passaggio ad una versione superiore possa essere un problema.

Ripristinare il backup di un database creato in SQL Server 2008 R2 su una istanza di SQL server 2012, fila liscio. Ma, se si prova a replicare un backup di SQL Server 2000 su SQL Server 2012, si ottiene il seguente errore:

Una delle possibili soluzioni è:

  1. Fare il restore del backup di SQL Server 2000 su SQL Server 2008
  2. Impostare il livello di compatibilità a 100
  3. Creare un backup del database su SQL Server 2008
  4. Ripristinare il backup di SQL Server 2008 su SQL Server 2012
  5. Impostare il livello di compatibilità a 110

L’aspetto negativo di questa soluzione è che ci devono essere 3 versioni di SQL Server installate e che le funzionalità di T-SQL deprecate o non più supportate, devono essere rimosse a mano.

Se non si ha accesso al database di produzione dal quale il backup è stato preso:

  1. Avviare SQL Server Management Studio e collegarsi all’istanza che contiene il database
  2. Nel menu contestuale del database navigare fino a Tasks | Generate Scripts…. Questo comando lancia il wizard Generate and Publish Scripts
  3. Nello step Introduction del wizard cliccare Next
  4. Nello step Choose Objects del wizard assicurarsi che l’opzione Script entire database and all database objects sia selezionata e cliccare Next
  5. Nello step Set Scripting options:
    1. Selezionare l’opzione Save scripts to a specific location
    2. Selezionare se gli oggetti del database ed i dati saranno scritti in un file singolo o multiplo, così come il percorso e la codifica del degli scripts da generare
    3. Cliccare Advanced
    4. Nella finestra di dialogo Advanced Scripting Options che appare:
      • Per l’opzione Script for Server Version, specificare Schema and data
      • Impostare le seguenti opzioni a True:
        • Script Logins
        • Script Full-Text Indexes
        • Script Triggers
      • CliccareOK
  • Cliccare Next
  • Nello step Summary del wizard cliccare Next
  • Nello step Save or Publish Scripts cliccare Finish
  • Eseguire lo script appena generato nell’istanza più vecchia di SQL Server

La procedura sopra indicata dovrebbe funzionare, ma:

  1. Le funzionalità di T-SQL deprecate o non più supportate, devono essere rimosse a mano
  2. Potrebbe fallire se il database contiene dipendenze che SQL Server non riesce a riconoscere (per esempio dipendenze a database localizzati su linked servers).

Se per qualsiasi motivo non si ha accesso al database originale (per esempio per migrare un database in una sede off-line senza connettività) la procedura sopra descritta non si può applicare.

Qui è dove ApexSQL Diff e ApexSQL Data Diff possono venire in aiuto

ApexSQL Diff è uno strumento per la per la comparazione e la sincronizzazione dei database di SQL Server, che individua le differenze tra gli oggetti e le risolve senza errori. Esso produce un’ampia reportistica sulle differenze riscontrate e può automatizzare il processo di sincronizzazione tra produzione e database versionati, backup, snapshots e cartelle di script.

ApexSQL Data Diff è uno strumento per la comparazione e la sincronizzazione dei dati di SQL Server, che individua le differenze e le risolve senza errori. Può comparare e sincronizzare database in linea e backup nativi o nativamente compressi e produrre un’ampia reportistica sulle differenze rilevate

Per fare il restore del backup su una versione più aggiornata di SQL server

  1. Sull’istanza target creare un database vuoto per contenere i dati e gli oggetti ripristinati dal backup
  2. Avviare ApexSQL Diff
  3. Cliccare Newnella finestra di dialogo Project management

    Project management dialog

  4. Nel pannello Source pane:
    • Scegliere Backup dalla elenco a discesa Type
    • Cliccare Add file(s) e navigare fino alla cartella dove il file di backup è posizionato
    • Selezionare il backup e cliccare Open
  5. Nel pannello Destination:
    • Scegliere Database dall’elenco a discesa Type
    • Dall’elenco a discesa Server specificare l’istanza di SQL Server dove c’è il database nel quale copiare gli oggetti da ripristinare
    • Specificare il metodo di autenticazione per l’istanza di SQL Server (ed un valido set di credenziali se si è scelto autenticazione di SQL Server)
    • Specificare il nome del database nel quale gli oggetti verranno ripristinati dal menu a discesa Database
  6. Cliccare Compare
  7. Selezionare tutti gli oggetti elencati nella Main grid

    ApexSQL Diff - Main grid

  8. Cliccare Synchronize nella sezione Actions della tab Home
  9. Cliccare Next nello step Synchronization direction del Synchronization wizard
  10. Cliccare Next nello step Dependencies del Synchronization wizard

    Synchronization wizard - Dependencies

  11. Verificare il sommario per la sincronizzazione e gli avvisi, se ce ne sono, e cliccare Next

    Synchronization wizard - Summary

  12. Nello step Output options del Synchronization wizard, selezionare Synchronize a database
  13. Cliccare Finish
  14. Avviare ApexSQL Data Diff
  15. Cliccare New nella finestra di dialogo Project management

    ApexSQL Diff - Project management dialog

  16. Nel pannello Source:
    • Selezionare Backup dal menu a discesa Type
    • Cliccare Add file(s) e scorrere fino alla cartella dove il file di backup è posizionato
    • Selezionare il backup e clicca Open
  17. Nel pannello Destination:
    • Selezionare Database dal menu a discesa Type
    • Indicare l’istanza di SQL Server dove si trova il database con i dati da recuperare, dal menu a discesa Server
    • Specificare il metodo di autenticazione per l’istanza di SQL Server (ed un valido set di credenziali se si è scelto autenticazione di SQL Server)
    • Indicare il nome del database nel quale ripristinare i dati dal menu a discesa Database
  18. Cliccare Compare

    Click Compare

  19. Nella Main grid, selezionare le tabelle del database da ripristinare
  20. Nel pannello Data difference pane, scegliere le righe da ripristinare
  21. Cliccare Synchronize nella sezione Actions della tab Home
  22. Cliccare Next nello step Synchronization direction del Synchronization wizard
  23. Nello step Output options del Synchronization wizard, selezionare Synchronize a database
  24. Cliccare Next

    Preview the impact of the synchronization script

  25. Verificare il sommario per la sincronizzazione e gli avvisi, se ce ne sono, e cliccare Finish

In questo modo, la migrazione di una vecchia versione di un database SQL Server ad una versione nuova è fatta inizialmente attraverso la sincronizzazione degli schema tra il backup del database originale ed un database vuoto in linea e successivamente attraverso la sincronizzazione dei dati ApexSQL Diff ed ApexSQL Data Diff si occuperanno al posto vostro delle caratteristiche non più supportate o deprecate.

July 25, 2017