Backup con sql server 2005

mercoledì 30 maggio 2007 - 15.41

stena Profilo | Junior Member

Vorrei impostare con sql server 2005 il seguente piano di manutenzione:
* backup completo una volta alla settimana con sovrascrittura (un unico file)
* backup differenziale una volta al giorno (con creazione di vari files)
* backup log transazioni ogni 2 ore (con creazione di vari files)

Il mio dubbio è che vorrei cancellare i files differenziali e delle transazioni ogni volta che viene eseguito il backup completo;
praticamente conservarli per una sola settimana, vale a dire nel periodo di tempo compreso tra i backup completi.

Vorrei chiedere quale strada conviene seguire.

grazie

lbenaglia Profilo | Guru

>Vorrei impostare con sql server 2005 il seguente piano di manutenzione:
>* backup completo una volta alla settimana con sovrascrittura
>(un unico file)

Ciao,

Attenzione che questa scelta è MOLTO pericolosa: cosa succede se fallisce il backup e contestualmente si corrompe il db (per un guasto fisico o per un errore logico)?
Ti perderesti TUTTO!

Ti suggerisco di eseguire una rotazione settimanale dei backup, ad esempio mantenendo in linea gli ultimi 4 full backup; in questo modo avrai sempre disponibile 1 mese di dati.

Io ho implementato tutto a manina tramite job e la rotazione la effettuo la domenica notte tramite un banalissimo batch direttamente nel job di backup:

@echo off Rem *********************************************************************************** Rem *** Batch di rotazione mediaset *** Rem *** *** Rem *** Sintassi: Rotate [mediapath] [mediaset] *** Rem *********************************************************************************** If dummy==dummy%1 Goto Help If -h==%1 Goto Help If ?h==%1 Goto Help If /h==%1 Goto Help Rem *********************************************************************************** Rem *** Inizializzazione *** Rem *********************************************************************************** Set MEDIAPATH=%1 Set MEDIASET=%2 If %MEDIASET%=="" Goto InvalidMediaset Rem *********************************************************************************** Rem *** Rotazione *** Rem *********************************************************************************** If Exist %MEDIAPATH%\%MEDIASET%.3.gz ( DEL %MEDIAPATH%\%MEDIASET%.3.gz echo File %MEDIAPATH%\%MEDIASET%.3.gz eliminato. ) Else ( echo File %MEDIAPATH%\%MEDIASET%.3.gz non trovato. ) If Exist %MEDIAPATH%\%MEDIASET%.2.gz ( REN %MEDIAPATH%\%MEDIASET%.2.gz %MEDIASET%.3.gz echo Il file %MEDIAPATH%\%MEDIASET%.2.gz e' stato rinominato in %MEDIASET%.3.gz. ) Else ( echo File %MEDIAPATH%\%MEDIASET%.2.gz non trovato. ) If Exist %MEDIAPATH%\%MEDIASET%.1.gz ( REN %MEDIAPATH%\%MEDIASET%.1.gz %MEDIASET%.2.gz echo Il file %MEDIAPATH%\%MEDIASET%.1.gz e' stato rinominato in %MEDIASET%.2.gz. ) Else ( echo File %MEDIAPATH%\%MEDIASET%.1.gz non trovato. ) If Exist %MEDIAPATH%\%MEDIASET%.bak ( REN %MEDIAPATH%\%MEDIASET%.bak %MEDIASET%.1 "%PROGRAMFILES%"\Rotate\gzip %MEDIAPATH%\%MEDIASET%.1 echo Il file %MEDIAPATH%\%MEDIASET%.bak e' stato rinominato in %MEDIASET%.1 e compresso. ) Else ( echo File %MEDIAPATH%\%MEDIASET%.bak non trovato. ) echo. echo Rotazione del mediaset "%MEDIASET%" terminata. Goto Exit :Help echo. echo Sintassi: Rotate [mediapath] [mediaset] (Es: Rotate S:\master master) echo Operazione annullata. Goto Exit :InvalidMediaset echo. echo Si è verificato il seguente errore: echo. echo Parametri MEDIAPATH "%MEDIAPATH%" o MEDIASET "%MEDIASET%" non validi. echo. echo Operazione annullata. :Exit echo.

Come puoi notare, dopo aver rinominato il file .bak in .1 provvedo a comprimerlo con gzip, risparmiando in questo modo un sacco di spazio su disco

>* backup differenziale una volta al giorno (con creazione di
>vari files)
>* backup log transazioni ogni 2 ore (con creazione di vari files)
Per semplicità ti consiglio di creare un unico mediaset per database contenente n backupset indipendentemente dal loro tipo (FULL, DIFFETENTIAL o LOG).
In questo modo in 1 unico file fisico avrai tutti i backup eseguiti nella settimana di un singolo db.
In caso di disaster recovery dovrai destreggiarti con un solo file

Infine i backup andrebbero SEMPRE eseguiti direttamente su una risorsa di rete ESTERNA al server (ad esempio un NAS), non salvati in locale e successivamente spostati su server di backup, altrimenti se il server "crasha" prima che il file sia stato copiato sulla share ti perderesti l'ultimo backup.

>grazie
Prego.

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

stena Profilo | Junior Member

Ti ringrazio per la risposta.

Ti vorrei chiedere se mi puoi spiegare due cose:

1)
<
Io ho implementato tutto a manina tramite job e la rotazione la effettuo la domenica notte tramite un banalissimo batch direttamente nel job di backup:
>
Come si riesce a far eseguire un file batch nel job di backup di sql ?


2)
<
Per semplicità ti consiglio di creare un unico mediaset per database contenente n backupset indipendentemente dal loro tipo (FULL, DIFFERENTIAL o LOG).
In questo modo in 1 unico file fisico avrai tutti i backup eseguiti nella settimana di un singolo db.
>
Io ho sempre eseguito backup in file separati; quale è la procedura per creare un unico mediaset comprendente i vari differenziali e log transazioni e quindi poter poi eseguire in seguito i vari ripristini ?
Anche perchè giustamente diventa più semplice gestire un unico file invece di avere enne file trn o delle transazioni che si verrebbero a creare.


ciao e grazie

lbenaglia Profilo | Guru

>Come si riesce a far eseguire un file batch nel job di backup
>di sql ?
Aggiungi un nuovo step di tipo "Operating System (CmdExec)" e digita il path, il nome del batch ed i suoi parametri.
Dietro le quinte SQL Server richiamerà il batch tramite la stored procedure di sistema xp_cmdshell.

>Io ho sempre eseguito backup in file separati; quale è la procedura
>per creare un unico mediaset comprendente i vari differenziali
>e log transazioni e quindi poter poi eseguire in seguito i vari
>ripristini ?
Non devi fare altro che eseguire il backup sul medesimo device.
Per il restore dovrai specificare il parametro "FILE = { backup_set_file_number | @backup_set_file_number }" specificando il numero del backupset che intendi ripristinare.

>Anche perchè giustamente diventa più semplice gestire un unico
>file invece di avere enne file trn o delle transazioni che si
>verrebbero a creare.
Eggià

>ciao e grazie
Prego.

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

stena Profilo | Junior Member

Ho creato il job come mi hai indicato, solo che eseguendolo mi da errore dicendomi
<
Impossibile creare il processo per il passaggio 1 del processo 0xE98A7C557557F44C9925EF0B431C7E2B (motivo: Accesso negato)
>
Come proprietario del processo ho provato sia ad impostare 'sa' che 'NT AUTHORITY\SYSTEM', ma con lo stesso risultato.

Per quanto poi riguarda il backup, se ho ben capito:
da manutenzione eseguo i vari backup sullo stesso file fisico utilizzando quindi il parametro accoda;
invece per il ripristino utilizzo il
"parametro "FILE = { backup_set_file_number | @backup_set_file_number }" se utilizzo uno script,
mentre se eseguo un ripristino dalla form di sql dovrebbe già indicarmi i vari backup da recuperare.

Corretto ?

ciao grazie ancora per la disponibilità.

lbenaglia Profilo | Guru

>Ho creato il job come mi hai indicato, solo che eseguendolo mi
>da errore dicendomi
><
>Impossibile creare il processo per il passaggio 1 del processo
>0xE98A7C557557F44C9925EF0B431C7E2B (motivo: Accesso negato)
Hai provveduto ad abilitare l'esecuzione della xp_cmdshell?
Lancia il SQL Server Surface Area Configuration, seleziona Surface Area Configuration for Features, dalla tree view di SX fai click su xp_cmdshell e seleziona la check box Enable xp_cmdshell.

>Per quanto poi riguarda il backup, se ho ben capito:
>da manutenzione eseguo i vari backup sullo stesso file fisico
>utilizzando quindi il parametro accoda;
>invece per il ripristino utilizzo il
>"parametro "FILE = { backup_set_file_number | @backup_set_file_number
>}" se utilizzo uno script,
>mentre se eseguo un ripristino dalla form di sql dovrebbe già
>indicarmi i vari backup da recuperare.
>
>Corretto ?
No, devi essere tu ad indicare quali backup set ripristinare.
Nella dialog box Restore Database, seleziona From Device specificando il mediaset (file .bak).
Una volta confermata la selezione, ti appariranno tutti i backup sets contenuti nel mediaset.
A questo punto devi decidere cosa fare

Ad esempio supponiamo che esegui un full backup a mezzanotte, un differenziale a mezzogiorno e un backup del t-log ogni ora.
Alle 15:34 schianta il disco che ospita il db. Putroppo il disco è rotto e non c'è modo di salvare l'ultimo troncone del transaction log (questo significa che tutte le transazioni successive alle 15:00 saranno irrimediabilmente perse).
Una volta sistemato il guasto HW, quali backup sets dovrai ripristinare?
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Soluzione: l'ultimo full, l'ultimo differenziale ed i backup del t-log delle 13:00, 14:00 e 15:00 (specificando l'argomento WITH NO RECOVERY).
Terminato l'ultimo restore potrai mettere online il db tramite l'argomento WITH RECOVERY.

>ciao grazie ancora per la disponibilità.
Prego.

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

stena Profilo | Junior Member

<
Impossibile creare il processo per il passaggio 1 del processo 0xE98A7C557557F44C9925EF0B431C7E2B (motivo: Accesso negato)
>
Ho abilitato l'esecuzione della xp_cmdshell; però continuo ad avere lo stesso errore; potrebbe essere un errore nella sintassi del comando ?

backup DB:
<mentre se eseguo un ripristino dalla form di sql dovrebbe già indicarmi i vari backup da recuperare. >
Mi sono spiegato male io, con "indicarmi" volevo dire visualizza e quindi funzionare nello stesso modo di averli salvati in file separati.
L'unica cosa è che io nelle mie prove utilizzo l'argomento WITH RECOVERY. Se invece utilizzo come argomento WITH NO RECOVERY sql alla fine mi indica nome_database(ripristino in corso..); quindi quando alla fine dici
<
l'ultimo restore potrai mettere online il db tramite l'argomento WITH RECOVERY
>
significa che devo effettuare un ultimo restore con WITH RECOVERY, però selezionando quali backup ?

ciao e grazie

lbenaglia Profilo | Guru

><
>Impossibile creare il processo per il passaggio 1 del processo
>0xE98A7C557557F44C9925EF0B431C7E2B (motivo: Accesso negato)
>>
>Ho abilitato l'esecuzione della xp_cmdshell; però continuo ad
>avere lo stesso errore; potrebbe essere un errore nella sintassi
>del comando ?
Eh boh, dovresi salire su quel server
Prova a definire un job con una banale:

DIR C:\*.* > Files.txt

Ottieni ancora lo stesso errore?
Con che account girano i servizi MSSQLServer e SQL Server Agent?

>L'unica cosa è che io nelle mie prove utilizzo l'argomento WITH
>RECOVERY. Se invece utilizzo come argomento WITH NO RECOVERY
>sql alla fine mi indica nome_database(ripristino in corso..);
>quindi quando alla fine dici
Esatto, questo ti permette di eseguire il restore del full backup + l'eventuale differenziale + gli eventuali t-log.

>l'ultimo restore potrai mettere online il db tramite l'argomento
>WITH RECOVERY
>>
>significa che devo effettuare un ultimo restore con WITH RECOVERY,
>però selezionando quali backup ?
Ehm, ti conviene studiare sui Books Online come funzonano i backup in SQL Server

>ciao e grazie
Prego.

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

stena Profilo | Junior Member

Risolto il problema del job; vi era un errore nel path, praticamente una "q" al posto di una "o"; solo che il messaggio
'Accesso negato' mi aveva spiazzato.

ciao e 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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5