Pianificare backup su SQL Server Express

martedì 01 marzo 2011 - 10.45
Tag Elenco Tags  Windows Server 2008  |  SQL Server 2008

dandi.box Profilo | Junior Member

Ciao a tutti, ho un Server Windows 2008 con SQL Server Express 2008

Vorrei pianificare un backup periodico dei miei DB, potreste indicarmi una soluzione ?

Mi basterebbe salvare i backup dei DB in una specifica cartella ... ad esempio ogni 4 giorni, salvando il DB con:

NOMEDB AAAAMMGG

Grazie infinite a tutti!!

lbenaglia Profilo | Guru

>Ciao a tutti, ho un Server Windows 2008 con SQL Server Express
>2008
>
>Vorrei pianificare un backup periodico dei miei DB, potreste
>indicarmi una soluzione ?

Ciao,

Come saprai SQL Server Express viene distribuito senza il SQL Server Agent (a dire il vero c'è ma non è utilizzabile), quindi puoi schedulare le tue attività sfruttando il Task Scheduler di Windows.

>Mi basterebbe salvare i backup dei DB in una specifica cartella
>... ad esempio ogni 4 giorni, salvando il DB con:
>
>NOMEDB AAAAMMGG

Prepara uno script .sql simile a:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

A questo punto crea un nuovo Task che esegua lo script mediante l'utility command line sqlcmd.exe passando come argomenti il nome del file ed un file di log:

sqlcmd -i "Full Backup.sql" -o "Logs\Full Backup.log"

>Grazie infinite a tutti!!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Grazie mille!!! Solo un dubbio, devo crare un task con questo comando:

sqlcmd -i "Full Backup.sql" -o "Logs\Full Backup.log"

ma in Windows 2008 come posso creare un task pianificato?



in sintesi nel mio script dovrei inserire solo:

USE mioDB; GO DECLARE @Device varchar(100); BEGIN TRY /* Eseguo il full backup di mioDB */ PRINT N'Backup database mioDB in corso...'; SET @Device = '<percorso>\mioDB_Full_' + CONVERT(char(10), CURRENT_TIMESTAMP, 120) + '.bak'; BACKUP DATABASE mioDB TO DISK = @Device; PRINT N'Backup database mioDB eseguito correttamente.'; PRINT N''; END TRY BEGIN CATCH PRINT N''; PRINT N'Durante il backup si è verificato il seguente errore:'; PRINT N'Codice: ' + CAST(ERROR_NUMBER() AS nvarchar(10)); PRINT N'Descrizione: ' + ERROR_MESSAGE(); END CATCH


Senza Model e Master

corretto??

Grazie ancora!!!!

lbenaglia Profilo | Guru

>ma in Windows 2008 come posso creare un task pianificato?
Control Panel\System and Security\Administrative Tools\Task Scheduler

>in sintesi nel mio script dovrei inserire solo:
<SNIP>
>Senza Model e Master
>
>corretto??
No. E' consigliabile eseguire un full backup anche dei database di sistema.

>Grazie ancora!!!!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Scusa se scrivo ancora..... ma fare il solo DB che mi interessa che problemi mi porterebbe???

Per semplicità preferivo solo concentrarmi sul DB da backuppare

lbenaglia Profilo | Guru

>Scusa se scrivo ancora..... ma fare il solo DB che mi interessa
>che problemi mi porterebbe???
Che se ti si corrompe un db di sistema (ad esempio il master) rischi di dover reinstallare l'intera istanza quando invece puoi eseguire il restore solo di quello per ripristinare il corretto funzionamento.

>Per semplicità preferivo solo concentrarmi sul DB da backuppare
Che difficoltà ti comporta eseguire il backup di qualche db invece di 1 solo quando il lavoro lo fa un task schedulato?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Scusa ma ingenuamente non mi ero posto il problema.... non pensavo si potesse corrompere il Master, io pensavo ad un backup per casi di guasti HDW ... mi confermi che in alcuni casi si potrebbe guastare i Master??

Altro dubbio: il tuo script crea un unico file finale?? io vorrei avere un unico file (compresso) con tutti i DB backuppati

Grazie ancora!!!

lbenaglia Profilo | Guru

>Scusa ma ingenuamente non mi ero posto il problema.... non pensavo
>si potesse corrompere il Master, io pensavo ad un backup per
>casi di guasti HDW ... mi confermi che in alcuni casi si potrebbe
>guastare i Master??
SQL Server è un software eseguito su un dispositivo hardware.
Bugs, guasti, gesta inconsulte dell'utente possono "scassare tutto" facendo perdere giorni, settimane o mesi di lavoro.
Come mettersi al riparo da questi inconvenienti? L'hai detto tu stesso, facendo un backup.
Tieni però presente che fintanto che un db è in uso, lo stato dei files che lo costituiscono può essere incoerente dato che alcuni dati sono su disco, altri in memoria, ed altri ancora sono in corso di modifica, quindi l'unico modo per rendere consistente un db è quello di arrestare l'istanza, chiudere il db o se vuoi evitare tutti questi disservizi eseguire un bel backup con gli strumenti nativi offerti da SQL Server.

>Altro dubbio: il tuo script crea un unico file finale?? io vorrei
>avere un unico file (compresso) con tutti i DB backuppati
No, uno per ogni database ma volendo puoi creare un unico Media Set anche se te lo sconsiglio in quanto rischieresti di fare confusione in fase di restore.
SQL Server 2008 ha introdotto la compressione dei backup con la Enterprise Edition (o la Developer), SQL Server 2008 R2 ha reso disponibile la compressione anche per la Standard Edition ma se usi l'Express dovrai affidarti ad una utility esterna per la compressione a posteriori del backup (ottimo 7zip che puoi richiamare nello stesso task al termine del backup).
Per esperienza le cose semplici sono quelle che funzionano sempre e ti agevolano la vita quando sei con l'acqua alla gola nel tentativo di ripristinare un servizio critico

>Grazie ancora!!!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Hai ragione!!! seguirò i tuoi suggerimenti!!

avevo sottovalutato la cosa

per qunato riguarda 7Zip, una volta scaricato, come potrei integrare la compressione nel tuo script? (intendo il comando)

Grazie infinte

lbenaglia Profilo | Guru

>per qunato riguarda 7Zip, una volta scaricato, come potrei integrare
>la compressione nel tuo script? (intendo il comando)
Qui trovi un po' di esempi:
http://www.dotnetperls.com/7-zip-examples

Preparta il comando che ti serve ed aggiungilo al Task subito dopo aver eseguito i backup.

>Grazie infinte
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

> Preparta il comando che ti serve ed aggiungilo al Task subito dopo aver eseguito i backup.

mmm non ho capito

creo il tuo script e lo inserisco nei task di windows

e poi zippo il file creato (inserendo il comando nei task)??

ma quindi dovrei anche cancellare il file non zippato ... come?? sempre nel task?


Grazie

lbenaglia Profilo | Guru

>creo il tuo script e lo inserisco nei task di windows
OK.

>e poi zippo il file creato (inserendo il comando nei task)??
>ma quindi dovrei anche cancellare il file non zippato ... come??
>sempre nel task?
Un task può essere costituito da più "actions" che puoi definire dall'omonimo tab.
Nel tuo caso ne avrai 3:

1) Esegue i backup
2) Comprime i files .bak in un unico file compresso
3) Elimina tutti i files .bak

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Scusa.... sto modificando il tuo script

SET @Device = '<percorso>\<nome db>_Full_' + CONVERT(char(10), CURRENT_TIMESTAMP, 120) + '.bak';

nome_db è il nome del DB che voglio backuppare

ma <percorso>??? il path alla cartella Data di SQL Server??? (al file mdf??)


SET @Device = 'D:\Arteco\Backup\master_Full_' + CONVERT(char(10), CURRENT_TIMESTAMP, 120) + '.bak';
in questo caso invece?? è la destinazione del backup??


non capisco perchè il caso avevo


'<percorso>\<nome db>_Full_'

e nell'altro

'D:\Arteco\Backup\master_Full_'


i miei DB sono tutti nella cartella C:\Programmi\SQLServer.....\Data...

Grazie infinite!!





lbenaglia Profilo | Guru

>nome_db è il nome del DB che voglio backuppare
OK

>ma <percorso>??? il path alla cartella Data di SQL Server???
>(al file mdf??)
No, è il percorso nel quale vuoi salvare il backup (il file .bak).

>SET @Device = 'D:\Arteco\Backup\master_Full_' + CONVERT(char(10),
>CURRENT_TIMESTAMP, 120) + '.bak';
>in questo caso invece?? è la destinazione del backup??
Mi è scappato nello script, ma si, è il percorso del backup

>Grazie infinite!!
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Perfetto! quindi

<nome db> è il nome del DB in Management Studio

e per ogni DB per il quale faccio il backup metterò

SET @Device = '<percorso_cartella_di_backup>\<nome db>_Full_' + CONVERT(char(10), CURRENT_TIMESTAMP, 120) + '.bak';

come posso fare in modo che ogni file di backup abbia il formato

<nome db> - aaaammgg

esempio

master - 20110411
mioDb - 20110411

Grazie mille!!!

lbenaglia Profilo | Guru

>Perfetto! quindi
>
><nome db> è il nome del DB in Management Studio
>
>e per ogni DB per il quale faccio il backup metterò
>
>SET @Device = '<percorso_cartella_di_backup>\<nome db>_Full_'
>+ CONVERT(char(10), CURRENT_TIMESTAMP, 120) + '.bak';
>
>come posso fare in modo che ogni file di backup abbia il formato
>
><nome db> - aaaammgg
>
>esempio
>
>master - 20110411
>mioDb - 20110411

Gulp?!
Ma hai capito cosa fa quel SET che hai riportato?!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

gsflash80 Profilo | Junior Member

infatti, quel SET che fa portare il nome+data di oggi in formato aaammgg, è sicuro che abbia capito?

dandi.box Profilo | Junior Member

Sto provando ad eseguire lo script di backup, ottengo questo errore:

Il contesto di database è stato sostituito con 'master'.
Backup database NomeMioDB in corso...

Durante il backup si è verificato il seguente errore:
Codice: 3013
Descrizione: Interruzione anomala di BACKUP DATABASE in corso.

Secondo voi da cosa può dipendere??

Inoltre: è normale che nello script non ci siano user e psw per accesso ad SQL Server (anche se cmq ho una connessione Trusted)

Grazie

lbenaglia Profilo | Guru

>Secondo voi da cosa può dipendere??
Senza il comando che hai eseguito non possiamo saperlo

>Inoltre: è normale che nello script non ci siano user e psw per
>accesso ad SQL Server (anche se cmq ho una connessione Trusted)
Si.

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Ho usato il comando suggerito nel post precedenti

sqlcmd -i "Full Backup.sql" -o "Full Backup.log"

eseguito dal desktop ... ed anche il file log salvato sul desktop

grazie mille!!!!

dandi.box Profilo | Junior Member

Sono ancora bloccato :((( dove sbaglio??

Grazie

rbiagiola Profilo | Newbie

Non so se ti è utile, ma utilizzando un programmino di pianicazione backup come Uranium ad esempio, riesce ad avere tantissime opzioni in modo più semplice perchè hai a disposizone l'interfaccia grafica del programma!
Oltre a rinominare il file a tuo piacimento puoi addirittura salvarlo su una cartella FTP... Ricordati però che per un Backup SQL non ti serve a niente salvare i file mdf/ldf ma dovrai comunque lanciare un file bat che richiama un'istruzione SQL

Questa ad esempio:

1. Fai un bat di questo tipo:
----------
@ECHO OFF
ECHO Inizio backup SQL ...
SQLCMD -S.\sqlexpress -dnomedb -Usa -Psa -i"C:\Backup_Full\Backup_Full.sql" -o"C:\Backup_Full\Backup_Full.log"
ECHO Fine backup
----------

2. Crei in C:\Backup_Full un file .sql che ha per istruzione questa query:

-----------------------
ALTER DATABASE nomedb SET RECOVERY FULL
BACKUP DATABASE nomedb TO disk ='C:\Backup_full\Db_full.bak' WITH INIT
-----------------------

Ora devi ricordarti di lanciare il file bat prima di eseguire il backup da Uranium!!!

dandi.box Profilo | Junior Member

Grazie per le risposte!
ma la tua soluzione posso usarla anche senza Uranium? intendo lo script di backup??

1. Fai un bat di questo tipo:
----------
@ECHO OFF
ECHO Inizio backup SQL ...
SQLCMD -S.\sqlexpress -dnomedb -Usa -Psa -i"C:\Backup_Full\Backup_Full.sql" -o"C:\Backup_Full\Backup_Full.log"
ECHO Fine backup
----------

2. Crei in C:\Backup_Full un file .sql che ha per istruzione questa query:

-----------------------
ALTER DATABASE nomedb SET RECOVERY FULL
BACKUP DATABASE nomedb TO disk ='C:\Backup_full\Db_full.bak' WITH INIT
-----------------------

Ed eseguire il quindi il mio file BAT.... quando voglio fare il backup??


mmmmm perchè è tutto così semplice ora ???

rbiagiola Profilo | Newbie

Uranium ti permette solo di pianificare e specificare altre opzioni di salvataggio!!!

Il bat funziona già così... facci doppio clik sopra e te ne accorgi! :)

dandi.box Profilo | Junior Member



ma quindi perchè è tutto così semplice rispetto a prima???

cosa "perdo" con questa soluzione più easy?

Grazie

lbenaglia Profilo | Guru

>
>
>ma quindi perchè è tutto così semplice rispetto a prima???
>
>cosa "perdo" con questa soluzione più easy?
Il backup di n database, il nome dinamico dei backup con data e ora come suffisso e la gestione degli errori.
Io mi domando cosa ci sia di complesso nel copiare un codice funzionante modificando il nome dei db e dei path (secondo post del thread)...

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

rbiagiola Profilo | Newbie

Confermo il Tread di Lorenzo è molto più completo... e tra l'altro è già pronto!

dandi.box Profilo | Junior Member

Io ho provato a creare lo script (postato) ed ho eseguito il comando (postato) ma ottengo un errore (postato)

non capisco dove ho sbagliato

lbenaglia Profilo | Guru

>Io ho provato a creare lo script (postato) ed ho eseguito il
>comando (postato) ma ottengo un errore (postato)

Posta:

1) IL TUO SCRIPT
2) IL MODO CON IL QUALE LO ESEGUI
3) L'ERRORE CHE OTTIENI

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Prima di tutto grazie per l'aiuto!!

Script:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



ho salvato il file sul desktop ed eseguo

sqlcmd -i "Full Backup.sql" -o "Full Backup.log"


nel file di log trovo


Il contesto di database è stato sostituito con 'master'.
Backup database GestionaleAAAAAAAAA in corso...

Durante il backup si è verificato il seguente errore:
Codice: 3013
Descrizione: Interruzione anomala di BACKUP DATABASE in corso.



Grazie

lbenaglia Profilo | Guru

>Durante il backup si è verificato il seguente errore:
>Codice: 3013
>Descrizione: Interruzione anomala di BACKUP DATABASE in corso.

A prima vista sembra tutto corretto.
Verifica attentamente gli error log di SQL Server alla ricerca della causa nativa dell'errore (il 3013 è sicuramente successivo a qualcos'altro).

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Ma se fosse successivo dovei trovare almeno i backup??? o sbaglio??

Puoi dirmi dove posso trovare i log di SQL Server??

thanks

lbenaglia Profilo | Guru

>Ma se fosse successivo dovei trovare almeno i backup??? o sbaglio??
No se fallisce il backup stesso.

>Puoi dirmi dove posso trovare i log di SQL Server??
SSMS > Management > SQL Server Logs

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Trovo questo:

Messaggio
BackupDiskFile::CreateMedia: Backup device 'C:\Users\Administrator\Desktop\GestionaleAAAAAA_Full_2011-05-04.bak' failed to create. Operating system error 5(Accesso negato.).

Grazie

lbenaglia Profilo | Guru

>BackupDiskFile::CreateMedia: Backup device 'C:\Users\Administrator\Desktop\GestionaleAAAAAA_Full_2011-05-04.bak'
>failed to create. Operating system error 5(Accesso negato.).
Significa che l'utente con il quale viene eseguito SQL Server non ha diritti a sufficienza per creare il file .bak nel path C:\Users\Administrator\Desktop.
Modifica il percorso specificando la directory Backup di SQL Server (nel mio caso C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup) e non avrai problemi.

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Ho riprovato con una nuova installazione, ottengo questo errore:

HResult 0x2, Level 16, State 1
Named Pipes Provider: Could not open a connection to SQL Server [2].
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online..
Sqlcmd: Error: Microsoft SQL Server Native Client 10.0 : Login timeout expired.

boccia75 Profilo | Junior Member

"Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections."

Controlla di aver scritto in maniera corretta il nome dell'istanza sql alla quale cerchi di accedere e che la suddetta istanza accetti connessioni remote.

Ciao

dandi.box Profilo | Junior Member

Cercavo proprio quella, ma nello script SQL non trovo nessun riferimento alla mia istanza SQL

boccia75 Profilo | Junior Member

Dovresti avere un file .bat scritto piu' o meno in questo modo:
(ho copiato il tuo poco piu' su)

sqlcmd -i "Full Backup.sql" -o "Full Backup.log"

Se a questo aggiungi (copio sempre da post precedenti)

-S (e qui metti il nome server\istanza)
-U (e qui metti lo user che puo' accedere all'istanza)
-P (la sua password)

ecco risolto il problema relativo all'utente.

Ciao

dandi.box Profilo | Junior Member

Ho fatto altre prove ma nei log trovo questo:

Date 27/07/2011 21.58.26
Log SQL Server (Current - 26/07/2011 20.28.00)

Source Backup

Message
BACKUP failed to complete the command BACKUP DATABASE HRM. Check the backup application log for detailed messages





Date 27/07/2011 21.58.26
Log SQL Server (Current - 26/07/2011 20.28.00)

Source Backup

Message
Error: 3041, Severity: 16, State: 1.



Date 27/07/2011 21.58.26
Log SQL Server (Current - 26/07/2011 20.28.00)

Source spid52

Message
BackupDiskFile::CreateMedia: Backup device 'C:\HRM_Full_2011-07-27.bak' failed to create. Operating system error 5(Accesso negato.).



Date 27/07/2011 21.58.26
Log SQL Server (Current - 26/07/2011 20.28.00)

Source spid52

Message
Error: 18204, Severity: 16, State: 1.


lbenaglia Profilo | Guru

>Message
>BackupDiskFile::CreateMedia: Backup device 'C:\HRM_Full_2011-07-27.bak'
>failed to create. Operating system error 5(Accesso negato.).

SQL Server non ha le permission per scrivere in C:\ a meno di assegnare esplicitamente Full Control all'account utilizzato per eseguire il servizio MSSQLServerver oppure al gruppo SQLServerMSSQLUser$nome_host$nome_istanza (meglio la seconda).
In alternativa puoi semplicemente non specificare alcun path nel comando di BACKUP, nel qual caso verrà adottato il percorso di default per i backup (es: C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup).

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

dandi.box Profilo | Junior Member

Graaaaaazie!!! finalmente sono riuscito!!!

Grazie infinite!!

Antarctic Profilo | Newbie

Salve,
riesumo questo vecchio post perché l'ho utilizzato per schedulare un backup dei DB, ma non ne vuole sapere di partire da "Utilità di pianificazione":
Sistema operativo Windows server 2012, SQL express 2012.
Se lancio da una finestra dos il comando sqlcmd -i "path\script.sql" -o "path\script.log" funziona perfettamente, ma se lo lancio dalla Utilità di pianificazione non parte, e non mi da nessun errore nel log sql express..
Cosa potrebbe essere? ho già dato i permessi di backup operator all'utente "domain\admin" ma il problema non era quello altrimenti avrei dovuto trovare errori nei log, invece qui non trovo assolutamente niente, come se non partisse il comando sqlcmd...

help, grazie.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5