articolo di di Ermanno Goletto
Poichè SQL Server Express non ha il SQL Agent non è possibile schedulare internamente a SQL Server dei processi quali ad esempio il Backup.
E' possibile aggirare l'ostacolo utilizzando 3 diversi metodi:
- Creando uno script per eseguire il Backup da eseguire tramite un Bat utilizzando il tool a riga di comando SQLCMD ed avviando il Bat tramite le operazioni pianificate.
- Creando uno script WSH e avviandolo tramite le operazioni pianificate.
- Creando un'applicativo basato sul .NET Framework 2.0, ad esempio in VB.Net, mediante l'utilizzo delle librerie Microsoft.SqlServer.Smo.dll e Microsoft.SqlServer.ConnectionInfo.dll
Ovviamente questa tecnica può anche essere adattata per eseguire altre operazioni come ad esempio lo Skrink del database o di file.
Sommario
Tramite SQL Server Management Studio avviamo un task per l'esecuzione di un Backup del database sul file C:\Backup\MyDB.bak e dopo aver impostato le opzioni in base alle nostre esigenze salviamo il task sul file C:\Backup\BkpMyDB.sql invece di eseguirlo ottenendo uno script di questo tipo:
BACKUP DATABASE [MyDB] TO DISK = N'C:\Backup\Navision.bak' WITH NOFORMAT, INIT, NAME = N'MyDB-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10, CHECKSUM
GO
declare @backupSetId as int
select @backupSetId = position from msdb..backupset where database_name=N'MyDB' and backup_set_id=(select max(backup_set_id) from msdb..backupset where database_name=N'MyDB' )
if @backupSetId is null begin raiserror(N'Verify failed. Backup information for database ''MyDB'' not found.', 16, 1) end
RESTORE VERIFYONLY FROM DISK = N'C:\Backup\Navision.bak' WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO
Creiamo il file bat C:\Backup\BkpMyDB.bat con i seguenti comandi per avviare lo script di backup e rinominare il file MyDB.bak nel formato MyDB-Yeay-Month-Day-Hour-Minute-Second.bak in modo da conservare più versioni di backup:
SETLOCAL
SET BKPFILENAME=MyDB
SET BKPEXT=bak
SET MONTH=%DATE:~3,2%
SET DAY=%DATE:~0,2%
SET YEAR=%DATE:~6,4%
SET HOUR=%TIME:~0,2%
SET MINUTE=%TIME:~3,2%
SET SECOND=%TIME:~6,2%
SET BKPFILE=%BKPFILENAME%-%YEAR%-%MONTH%-%DAY%-%HOUR%-%MINUTE%-%SECOND%.%BKPEXT%
SQLCMD -S .\SQLEXPRESS -i BKP%BKPFILENAME%.sql
IF EXIST %BKPFILENAME%.%BKPEXT% RENAME %BKPFILENAME%.%BKPEXT% %BKPFILE%
A questo punto creiamo un'operazione pianificata per avviare il file C:\Backup il file BkpMyDB.bat quando intendiamo eseguire il backup in modo da automatizzare il processo. In ogni caso possiamo eseguire backup anche in specifici istanti semplicemente eseguendo il Bat dal prompt dei comadi.
Creiamo il file bat C:\Backup\BkpMyDB.vbs che tramite l'utilizzo della libreria COM SQLDMO esegue sul file C:\Backup\MyDB-Yeay-Month-Day-Hour-Minute-Second.bak il backup del database:
srvName = ".\SQLEXPRESS"
dbName = "MyDB"
bkpPath = "C:\Backup\"
Set srv = CreateObject("SQLDMO.SQLServer")
srv.LoginSecure = True
srv.Connect srvName
Set bkp = CreateObject("SQLDMO.Backup")
bkp.Database=dbName
bkp.Devices=Files
bkp.Action = SQLDMOBackup_Database
bkp.Files=bkpPath & dbName
bkp.Files=bkp.Files & "-" & Mid(FormatDateTime(Now, 2),7,4)
bkp.Files=bkp.Files & "-" & Mid(FormatDateTime(Now, 2),4,2)
bkp.Files=bkp.Files & "-" & Mid(FormatDateTime(Now, 2),1,2)
bkp.Files=bkp.Files & "-" & Mid(FormatDateTime(Now, 3),1,2)
bkp.Files=bkp.Files & "-" & Mid(FormatDateTime(Now, 3),4,2)
bkp.Files=bkp.Files & "-" & Mid(FormatDateTime(Now, 3),7,2)
bkp.Files=bkp.Files & ".bak"
bkp.SQLBackup srv
srv.Close()
SQL Server 2005 mette a disposizione delle nuove librerie in .NET per la gestione tramite applicazioni esterne che vanno a sostituire SQLDMO, in particolare è possibile utilizzare le Microsoft.SqlServer.Smo.dll e Microsoft.SqlServer.ConnectionInfo.dll aggiugendo le relative .NET Reference ad un progetto VB.NET 2005 per poter eseguire il backup del database.
Il seguente codice esegue semplicemente il backup del database è poi possibile avviare l'applicazione tramite le operazioni pianificate oppure integrare nel'applicazione stessa uno schedulatore tramite un timer per costruire di fatto una sorta di SQL Agent.
Dim srvName As String = ".\SQLEXPRESS"
Dim dbName As String = "MyDB"
Dim bkpPath As String = "C:\Backup\"
Dim srv As New Microsoft.SqlServer.Management.Smo.Server(srvName)
Dim bkp As New Microsoft.SqlServer.Management.Smo.Backup
bkp.Action = Microsoft.SqlServer.Management.Smo.BackupActionType.Database
bkp.Database = dbName
Dim filePath As String = bkpPath
filePath = System.IO.Path.Combine(bkpPath, dbName & "-" & Now.Year() & _
"-" & Now.Month.ToString("00") & _
"-" & Now.Day.ToString("00") & _
"-" & Now.Hour.ToString("00") & _
"-" & Now.Minute.ToString("00") & _
"-" & Now.Second.ToString("00"))
bkp.Devices.AddDevice(filePath, Microsoft.SqlServer.Management.Smo.DeviceType.File)
bkp.SqlBackup(srv)