SQL Server Express viene distribuito senza SQL Agent, quindi non è possibile schedulare internamente a SQL Server processi automatizzati, come ad esempio il backup. E’ però possibile aggirare questo ostacolo creando uno script ad-hoc, che si occupi dei vari job che vogliamo eseguire.
In questo articolo vedremo come creare uno script per il backup di SQL Express e, subito dopo, uno per la manutenzione dei backup, il cui compito sarà quello di tenere sempre le tre copie più recenti, cancellando di volta in volta quelli più vecchi.
Al termine dell’articolo è presente un link per scaricare un pacchetto già pronto con tutti gli script e la struttura dei file predefinita
Lo script per il backup di SQL Express
Portiamoci all’interno di C:\SQL_Backup\scripts e creiamo un file che chiameremo backupDB.sql con questo contenuto:
DECLARE @dateString CHAR(12), @dayStr CHAR(2), @monthStr CHAR(2), @hourStr CHAR(2), @minStr CHAR(2) --month variable IF (SELECT LEN(CAST(MONTH(GETDATE()) AS CHAR(2))))=2 SET @monthSTR=CAST(MONTH(GETDATE()) AS CHAR(2)) ELSE SET @monthSTR= '0' + CAST(MONTH(GETDATE()) AS CHAR(2)) --day variable IF (SELECT LEN(CAST(DAY(GETDATE()) AS CHAR(2))))=2 SET @daySTR=CAST(DAY(GETDATE()) AS CHAR(2)) ELSE SET @daySTR='0' + CAST(DAY(GETDATE()) AS CHAR(2)) --hour variable IF (SELECT LEN(DATEPART(hh, GETDATE())))=2 SET @hourStr=CAST(DATEPART(hh, GETDATE()) AS CHAR(2)) ELSE SET @hourStr= '0' + CAST(DATEPART(hh, GETDATE()) AS CHAR(2)) --minute variable IF (SELECT LEN(DATEPART(mi, GETDATE())))=2 SET @minStr=CAST(DATEPART(mi, GETDATE()) AS CHAR(2)) ELSE SET @minStr= '0' + CAST(DATEPART(mi, GETDATE()) AS CHAR(2)) --name variable based on time stamp SET @dateString=CAST(YEAR(GETDATE()) AS CHAR(4)) + @monthStr + @dayStr + @hourStr + @minStr --================================================================= DECLARE @IDENT INT, @sql VARCHAR(1000), @DBNAME VARCHAR(200) SELECT @IDENT=MIN(database_id) FROM SYS.DATABASES WHERE [database_id] > 0 AND NAME NOT IN ('TEMPDB') WHILE @IDENT IS NOT NULL BEGIN SELECT @DBNAME = NAME FROM SYS.DATABASES WHERE database_id = @IDENT /*Change disk location here as required*/ SELECT @SQL = 'BACKUP DATABASE '+@DBNAME+' TO DISK = ''C:\SQL_Backup\'+@DBNAME+'_db_' + @dateString +'.BAK'' WITH INIT' EXEC (@SQL) SELECT @IDENT=MIN(database_id) FROM SYS.DATABASES WHERE [database_id] > 0 AND database_id>@IDENT AND NAME NOT IN ('TEMPDB') END
Lo script andrà a creare tanti backup quanti sono i database all’interno di SQL Express, ed aggiungerà una sorta di “timestamp” alla fine del nome (vedi riga evidenziata), in modo da identificarli nel tempo, prima di terminare con l’estensione [cci].BAK[/cci].
Cancellazione dei backup vecchi
Sempre all’interno di C:\SQL_Backup\scripts creiamo un file deleteoldsqlbaks.vbs in cui scriveremo:
On Error Resume Next Dim fso, folder, files, sFolder, sFolderTarget Set fso = CreateObject("Scripting.FileSystemObject") 'location of the database backup files sFolder = "C:\SQL_Backup\" Set folder = fso.GetFolder(sFolder) Set files = folder.Files 'used for writing to textfile - generate report on database backups deleted Const ForAppending = 8 'you need to create a folder named ìscriptsî for ease of file management & 'a file inside it named ìLOG.txtî for delete activity logging Set objFile = fso.OpenTextFile(sFolder & "\Logs\cleanuplog.txt", ForAppending) objFile.Write "================================================================" & VBCRLF & VBCRLF objFile.Write " DATABASE BACKUP FILE REPORT " & VBCRLF objFile.Write " DATE: " & FormatDateTime(Now(),1) & "" & VBCRLF objFile.Write " TIME: " & FormatDateTime(Now(),3) & "" & VBCRLF & VBCRLF objFile.Write "================================================================" & VBCRLF 'iterate thru each of the files in the database backup folder For Each itemFiles In files 'retrieve complete path of file for the DeleteFile method and to extract 'file extension using the GetExtensionName method a=sFolder & itemFiles.Name 'retrieve file extension b = fso.GetExtensionName(a) 'check if the file extension is BAK If uCase(b)="BAK" Then 'check if the database backups are older than 3 days If DateDiff("d",itemFiles.DateCreated,Now()) >= 3 Then 'Delete any old BACKUP files to cleanup folder fso.DeleteFile a objFile.WriteLine "BACKUP FILE DELETED: " & a End If End If Next objFile.WriteLine "================================================================" & VBCRLF & VBCRLF objFile.Close Set objFile = Nothing Set fso = Nothing Set folder = Nothing Set files = Nothing
Il compito di questo script sarà quello di posizionarsi nella cartella in cui abbiamo salvato i backup (riga 6), “contare” i backup presenti e tenere i tre più recenti, cancellando gli altri (riga 36). Inoltre, scrive un log (riga 16) delle operazioni eseguite.
I file di log
Portiamoci in C:\SQL_Backup\Logs e creiamo due file vuoti, che chiameremo backuplog.txt e cleanuplog.txt
Esecuzione
Creiamo il file databasebackup.cmd
@echo off REM Lancio il backup e scrivo il log sqlcmd -S SERVER\SQLEXPRESS -E -i C:\SQL_Backup\scripts\backupDB.sql -o C:\SQL_Backup\Logs\backuplog.txt REM Lancio lo script di pulizia e aggiorno cleanuplog.txt C:\SQL_Backup\scripts\deleteoldsqlbaks.vbs
L’unica modifica da fare sarà l’inserimento del nome e della istanza del vostro server (riga evidenziata), sostituendo SERVER\SQLEXPRESS con i vostri dati corretti (presumibilmente, l’istanza si chiama sempre SQLEXPRESS ma cambia il nome del server)
Schedulazione
Non resta che creare una Operazione pianificata dal Pannello di controllo di Windows, il cui semplice compito consisterà nell’esecuzione di C:\SQL_Backup\scripts\databasebackup.cmd, impostando un orario ed una ricorrenza secondo le proprie necessità
Download “SQL Backup”
Via | mssqltips
Commenti recenti