Trasferimento dei dati di backup da una nuova versione di MS SQL Server a una versione precedente

Sfondo

Una volta, per riprodurre un bug, avevo bisogno di un backup del database di produzione.

Con mia grande sorpresa, mi sono imbattuto nelle seguenti limitazioni:

  1. Il backup del database è stato eseguito sulla versione SQL Server 2016 e non era compatibile con il mio SQL Server 2014.
  2. Sul mio computer di lavoro, il sistema operativo utilizzato era Windows 7quindi non ho potuto aggiornare SQL Server fino alla versione 2016
  3. Il prodotto supportato faceva parte di un sistema più ampio con un'architettura legacy strettamente accoppiata e parlava anche con altri prodotti e basi, quindi potrebbe essere necessario molto tempo per implementarlo su un'altra stazione.

Alla luce di quanto sopra, sono giunto alla conclusione che è giunto il momento per le stampelle di soluzioni non standard.

Ripristino dei dati da un backup

Ho scelto di utilizzare una macchina virtuale Oracle VM VirtualBox con Windows 10 (puoi acquisire un'immagine di prova per il browser Edge quindi). SQL Server 2016 è stato installato sulla macchina virtuale e il database dell'applicazione è stato ripristinato dal backup (istruzione).

Configurazione dell'accesso a SQL Server su una macchina virtuale

Successivamente, è stato necessario eseguire alcuni passaggi per poter accedere a SQL Server dall'esterno:

  1. Per il firewall, aggiungi una regola per ignorare le richieste di porta 1433.
  2. È auspicabile che l'accesso al server non avvenga tramite l'autenticazione di Windows, ma tramite SQL utilizzando login e password (è più facile configurare l'accesso). Tuttavia, in questo caso, è necessario ricordare di abilitare l'autenticazione SQL nelle proprietà di SQL Server.
  3. Nelle impostazioni utente su SQL Server nella scheda Mappatura utente specificare il ruolo utente per il database ripristinato db_securityadmin.

Trasferimento dati

In realtà, il trasferimento dei dati stesso consiste in due fasi:

  1. Trasferimento di schemi di dati (tabelle, viste, stored procedure, ecc.)
  2. Trasferimento dei dati stessi

Trasferimento dello schema dei dati

Eseguiamo le seguenti operazioni:

  1. selezionare Attività -> Genera script per una base portatile.
  2. Seleziona gli oggetti che devi trasferire o lascia il valore predefinito (in questo caso, gli script verranno creati per tutti gli oggetti del database).
  3. Specificare le impostazioni per salvare lo script. È più conveniente salvare lo script in un singolo file Unicode. Quindi, in caso di errore, non è necessario ripetere nuovamente tutti i passaggi.

Una volta salvato lo script, può essere eseguito su SQL Server originale (vecchia versione) per creare la base richiesta.

Nota: Dopo aver eseguito lo script, è necessario verificare la corrispondenza tra le impostazioni del database dal backup e il database creato dallo script. Nel mio caso, non c'erano impostazioni per COLLATE nello script, il che ha portato a un errore durante il trasferimento dei dati e la danza con un tamburello per ricreare il database utilizzando lo script integrato.

Trasferimento dati

Prima di trasferire i dati, è necessario disabilitare il controllo di tutte le restrizioni sul database:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

Il trasferimento dei dati viene eseguito utilizzando la procedura guidata di importazione dei dati Attività -> Importa dati su SQL Server, dove si trova il database creato dallo script:

  1. Specificare le impostazioni di connessione all'origine (SQL Server 2016 su una macchina virtuale). Ho usato l'origine dati Client nativo SQL Server e la suddetta autenticazione SQL.
  2. Specificare le impostazioni di connessione per la destinazione (SQL Server 2014 sul computer host).
  3. Successivamente, imposta la mappatura. Tutti devono essere selezionati non di sola lettura oggetti (ad esempio, non è necessario selezionare le viste). Come opzioni aggiuntive, selezionare "Consenti inserimento nelle colonne Identity"se tali vengono utilizzati.
    Nota: if, quando si tenta di selezionare più tabelle e di impostarne la proprietà "Consenti inserimento nelle colonne Identity" la proprietà è già stata impostata per almeno una delle tabelle selezionate, la finestra di dialogo indicherà che la proprietà è già stata impostata per tutte le tabelle selezionate. Questo fatto può creare confusione e portare a errori di migrazione.
  4. Iniziamo il trasferimento.
  5. Ripristino del controllo dei vincoli:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

Se si verificano errori, controlliamo le impostazioni, cancelliamo il database creato con errori, lo ricreamo dallo script, apportiamo correzioni e ripetiamo il trasferimento dei dati.

conclusione

Questa attività è piuttosto rara e si verifica solo a causa delle limitazioni di cui sopra. La soluzione più comune consiste nell'aggiornare SQL Server o connettersi a un server remoto se l'architettura dell'applicazione lo consente. Tuttavia, nessuno è immune dal codice legacy e dalle mani storte di uno sviluppo di scarsa qualità. Spero che non avrai bisogno di queste istruzioni, ma se ne hai ancora bisogno, ti aiuterà a risparmiare molto tempo e nervi. Grazie per l'attenzione!

Elenco delle fonti utilizzate

Fonte: habr.com