MSDE Altre istruzioni per l'uso (parte 8) - Salvare/Trasportare/Ripristinare un Database SQL Server
a cura di Sabrina Cosolo (requisiti: Livello intemedio di conoscenza generale)

Staccare un Database da un server per trasportarlo su un nuovo server
Nel comune uso dei database, una delle necessità dello sviluppatore può essere quella di installare un database già costruito presso un cliente anziché implementare complessi programmi per la sua generazione.
E' una pratica comune, però varrebbe la pena di evitarlo e costruire un programma di utilità che sia in grado di generare il database usato dalla nostra applicazione aggiornato all'ultima versione ed inserire in questo programma tutte le modifiche al database effettuate di versione in versione, in modo che possano essere applicate in modo automatico dai clienti a cui distribuiamo gli aggiornamenti del software.
In ogni caso, questo comando è utile anche quando dobbiamo spostare un DB da un server ad un altro (ad esempio in caso di crescita del cliente e conseguente passaggio da un MSDE ad un SQL Server su una macchina adibita solo all'uso di server dati), oppure quando dobbbiamo spostare il Database da un disco ad un disco diverso.

Di seguito il codice SQL per il distacco dal server del nostro database

  sp_detach_db 'MusicBox'

Riattaccare il database una volta spostato
Una volta staccato il database, dobbiamo riattaccarlo (o meglio riconnetterlo, se preferite) sul nuovo server oppure allo stesso server da una nuova locazione fisica.
In questo caso il comando è sempre eseguito da una stored procedure di sistema sp_attach_db:

  sp_attach_db @dbname = N'MusicBox'
    , @filename1 = N'f:\sql.dir\data\MusicBoxdat.mdf'
    , @filename2 = N'f:\sql.dir\data\MusicBoxlog.ldf'

a cui passiamo i seguenti parametri:

Effettuare il Backup di un Database SQL Server
Ogni Database di produzione dovrebbe essere corredato di un piano di manutenzione che effettui regolarmente il backup del database e del log delle transazioni. I Database SQL Server hanno due modalità principali di funzionamento che vengono predisposte alla loro creazione: la modalità SIMPLE - che corrisponde a dire all'RDBMS "TRUNCATE LOG ON CHECKPOINT" ovvero tronca il log delle transazioni ad ogni Checkpoint (il checkpoint è il momento in cui l'RDBMS conferma la chiusura di ogni transazione sul database). - e la modalità FULL - che corrisponde a dire all'RDBMS "il LOG delle transazioni è mio e me lo gestisco io!". Consiglio vivamente la modalità FULL su tutti i DB di produzione installati con una qualsiasi versione di SQL server a pagamento, ove è semplice impostare un piano di manutenzione che si occupi appunto della gestione del LOG delle transazioni, mentre se utilizzate MSDE (e quindi non avete installato l'enterprise manager) utilizzate la modalità SIMPLE (che è il default) per evitare di dover generare codice T-SQL complesso a mano per fare le manutenzioni. (Per carità! Non è vietato farlo, se vi piace lavorare con SQL ).
Detto questo, anche se lavoriamo su un piccolo Database con il nostro caro MSDE, dobbiamo predisporre un utilità di Backup quotidiana per i nostri utenti, affinché si possa procedere al salvataggio dei nostri dati, anche senza dover fermare SQL Server. Per far questo possiamo scrivere uno script da chiamare da VB oppure scrivere una stored procedure contenente lo stesso script (più sicura e veloce)
Ecco qui il comando per salvare il nostro DB di prova.

  BACKUP DATABASE [MusicBox] 
    TO  DISK = 'f:\sql.dir\backup\MusicBox.Bak' 
    WITH  INIT , NOUNLOAD 
    , name = 'MusicBox backup'
    , NOSKIP 
    , STATS = 10
    , Description 
    = 'Backup Full di MusicBox'
    , NOFORMAT

Vediamo il significato della sintassi:

Per chi Volesse utilizzare la modalità FULL, una volta effettuato il Backup FULL del database, è necessario fare un Backup del Transaction Log troncandolo in modo da ridimensionare la sua lunghezza.
Il comando per eseguire questo tipo di operazione è il seguente:

  BACKUP LOG [4uahr] TO 
    DISK =  'f:\sql.dir\backup\MusicBox.Bak' 
    WITH  NOINIT ,  
    NOUNLOAD ,  
    NAME = N'4uahr backup',  
    NOSKIP ,  
    STATS = 10,  
    NOFORMAT

Come si può vedere, la sintassi è praticamente la stessa del Backup del database. Ricordo che se volete davvero che il Log venga ridotto, cosa che viene automaticamente effettuata dopo un BACKUP LOG dovete farlo dopo aver eseguito un BACKUP DATABASE, in quanto il server segna sul log fino a quale transazione è stato effettuato il backup del database e tronca il log all'ultima transazione salvata. Se non fate il backup FULL, il Log rimarrà uguale a prima...

Effettuare il Restore di un Database SQL Server:
Ovviamente una volta effettuato il backup di un database può essere necessario effettuarne il restore (solitamente, ad esempio, per verificare perché sui dati di un cliente il nostro programma non funziona mentre sui nostri dati di prova si).

  RESTORE DATABASE MusicBox FROM DISK = 'f:\sql.dir\backup\MusicBox.Bak'

La sintassi è semplice (per i parametri fate riferimento a quanto scritto per il backup):

  RESTORE DATABASE NomeDatabase FROM DISK = 'pathcompleto'

Ovviamente, può essere necessario che noi facciamo il Restore di un database salvato su una macchina con configurazione diversa, oppure possiamo voler duplicare il nostro database di produzione su un altro, per fare prove e test, prima di applicarli sul database di produzione. In questo caso, possiamo farlo senza problemi utilizzando qualche parametro in più:

  RESTORE DATABASE MusicBox2 
    FROM DISK = 'f:\sql.dir\backup\MusicBox.Bak' 
    WITH RECOVERY, 
    MOVE 'MusicBoxDat' 
    TO 'f:\sql.dir\data\MusicBoxdat2.mdf',
    MOVE 'MusicBoxLog' 
    TO 'f:\sql.dir\data\MusicBoxlog2.ldf'

Vediamo quali sono le istruzioni diverse:

Anche per questi comandi SQL si può utilizzare OSQL.EXE (vedi, anche per i parametri).

La sintassi per chiamare un comando SQL usando OSQL è la seguente:

  osql -S Localhost -U SA -P as -i backup.sql

un possibile file di input da utilizzare per realizzare uno degli esempi backup.sql è un file di testo contenente il comando da eseguire che è leggermente diverso da quello sopra descritto, riporto la sintassi per il backup del database:

  USE MusicBox
  GO
 
  BACKUP DATABASE [MusicBox] 
    TO  DISK = 'f:\sql.dir\backup\MusicBox.Bak' 
    WITH  INIT , NOUNLOAD 
    , name = 'MusicBox backup'
    , NOSKIP 
    , STATS = 10
    , Description 
    = 'Backup Full di MusicBox'
    , NOFORMAT 
 
  GO
 
  QUIT

Il comando USE MUSICBOX serve a dire al server che dobbiamo lavorare sul Database Musicbox (database di esempio creato nel precedente articolo), Il comando GO esegue i comandi richiesti, il comando QUIT esce da OSQL.EXE che altrimenti si comporta come un Interprete comandi e rimane attivo all'interno della finestra console.

La sintassi da usare con OSQL per trasportarvi tutti gli script da noi generati in questa pagina è la seguente:

  USE Musicbox
  GO 
 
  script da eseguire
 
  GO
 
QUIT
<<< Creare/Eliminare Stored Procedure