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:
- @dbname: Nome del Database N'MusicBox' è una notazione per cui SQL Server prende tutto ciò segue N' come una stringa anche se contiene apici o altri caratteri riservati.
- @filename1: Path completo del file dati contenente il database.
- @filename2: Path completo del file contenente il log delle transazioni.
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' , NOFORMATVediamo il significato della sintassi:
- BACKUP DATABASE [Nomedatabase]: Indichiamo che database salvare
- TO DISK = 'pathcompleto': Salviamo il database su disco e diamo il path completo del file di destinazione che poi ovviamente salveremo su CD o copieremo su Nastro o sul disco di un altro PC in rete (se no non serve a molto).
- WITH INIT: Sovrascrivi il Backup precedente.
- WITH NO INIT: Accoda al Backup precedente (occhio allo spazio su disco in questo caso).
- NOUNLOAD: Comando riservato all'uso di nastri, per il backup su disco va sempre posto a questo valore stesso vale per NOSKIP.
- name = 'Nome backup': nome descrittivo del Backup
- STATS = 10: Indicatore per l'esecuzione batch, visualizza la barra di scorrimento ogni volta che avanzi del 10% nell'operazione di Backup.
- Description ='Descrizione del backup': Descrizione di cosa contiene il nostro Backup.
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, NOFORMATCome 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:
- WITH RECOVERY: si può usare anche con il restore semplice, serve ad avvisare l'RDBMS che il database deve essere reso operativo e non dobbiamo effettuare ulteriori operazioni di restore da backup differenziale o backup del LOG (questo fa parte delle operazioni complesse e non è trattato in questi articoli).
- MOVE 'Nomefiledati' TO 'PathDestinazione': Indica come deve essere chiamato e dove deve essere riposto il file dati contenuto nel Backup
- MOVE 'Nomefilelog' TO 'PathDestinazione': Indica come deve essere chiamato e dove deve essere riposto il file di log contenuto nel Backup
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.sqlun 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 QUITIl 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