Antonio "tdj"

(C'è sempre un modo migliore)
posts - 294, comments - 285, trackbacks - 17

My Links

News







Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

Articoli

Blogs

Controlli WinForm free

Guide

Siti vari

Sviluppo

SQL: Backup automatici con Nant

Chi utilizza la versione Express di SQL Server sa bene che una delle differenze rispetto alle versioni “Full” è l’assenza del SQL Server Agent, un processo fondamentale per schedulare le diverse attività sul server. Una di queste è il backup di uno o più database che non dovrebbe mai mancare su un server!

Naturalmente esistono dei tools sia a pagamento che gratuiti per colmare questa lacuna ma si può ovviare al problema anche utilizzando strumenti non direttamente ricollegabili al mondo SQL.
Uno di questi è NAnt, un Build Tool ossia un framework per la creazione di script di build (in questo caso per .NET).
Senza entrare troppo nel dettaglio, si tratta di creare uno script che esegue una serie di task (chiamati Target) in maniera più o meno strutturata.
Nel nostro caso vogliamo creare uno script di backup di un database compattato in un archivio ZIP.

Installazione di Nant
Per prima cosa scarichiamo NAnt dal Download NAnt. Non esiste un setup automatico ma bisogna semplicemente scompattare il contenuto del file .ZIP in una cartella qualunque.

Creazione dello script
NAnt è basato su file script chiamati Build File che non sono altro che file xml con estensione .build. Ecco il nostro file db.backup.build:

 

<?xml version="1.0"?>
<project default="backup">
    <property name="backup.path" value="E:\Backup" />
    <property name="backup.name" value="" />
    <property name="backup-date" 
                    value="${datetime::get-year(current-date)}${string::pad-left(datetime::get-month(current-date),2,'0')}${string::pad-left(datetime::get-day(current-date),2,'0')}" />
    <property name="filename" value="${backup.name}_${backup-date}" />
	
    <target name="backup">
	<echo message="Running backup... ${datetime::now()}" failonerror="False" />
	<exec program="sqlcmd" 
                          commandline="-S .\sqlexpress -i &quot;E:\backup\sql\database.backup.sql&quot;  
                          -v dbname=${backup.name} filename=${filename} path=&quot;${backup.path}&quot;
                          -o &quot;${backup.path}\${filename}.log&quot;" />
	<call target="zip" />
    </target>
	
     <target name="zip">
	<property name="backup.file" value="${backup.path}\${filename}.bak" />
	<if test="${file::exists(backup.file)}">
		<echo message="Compressing..." failonerror="False" />
		<zip zipfile="${backup.path}\${filename}.zip">
			<fileset basedir="${backup.path}">
    			    <include name="${filename}.bak" />
			</fileset>
		</zip>
		<delete file="${backup.path}\${filename}.bak" />
	</if>
    </target>
</project>

 

Lo script definisce, all’inizio, delle varibili identificate dall’elemento <property> utilizzate nei vari task con la sintassi ${nome_variabile}. Da notare la variabile filename che identifica il nome del file finale composto dal nome del database e la data corrente calcolata dalla variabile backup-date nel formato yyyymmdd.

I task sono due. Il primo, “backup”, esegue il backup del database utilizzando l’utility sqlcmd per eseguire il file script database.backup.sql:

declare @filename nvarchar(500)
set @filename='$(path)\$(filename).bak' 

declare @dbname varchar(255)
set @dbname = '$(dbname)'

BACKUP DATABASE @dbname
	TO  DISK = @filename
WITH 
	NOFORMAT, 
	NOINIT,  
	NAME = @dbname,
	SKIP, 
	STATS = 10;
GO

 

Si tratta di un semplice comando BACKUP che sfrutta le variabili identificate da $(nome_variabile) che sono valorizzate sternamente utilizzando l’opzione –v variabile=valore del comando sqlcmd.

Il secondo task, “zip”, è lo zip del backup utilizzando un task predefinito di NAnt chiamato <zip> nel quale si specificano i file da includere nell’archivio mediante l’uso dell’elemtno <fileset>…</fileset>.
L’ultima operazione è eliminare il backup con la funzione <delete />.

Ora non ci resta che provare lo script eseguendo questo comando utilizzando la shell di Windows (cmd):

 

c:\> nant.exe -buildfile:E:\Backup\db.backup.build -D:backup.name=Northwind

 

I parametri specificati sono due:

1) buildfile: il path del nostro script (in questo esempio in E:\backup);

2) D: valorizza le <property> definite dello script. Nell’esempio specifichiamo il nome del database valorizzando la property backup.name.

 

Se tutto ha funzionato bene avremo il nostro backup zippato. A questo punto possiamo schedulare il tutto con il Task Scheduler di Windows Smile

Print | posted on lunedì 23 gennaio 2012 22.44 | Filed Under [ Tools/Utilities ]

Feedback

No comments posted yet.

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 8 and 6 and type the answer here:

Powered by:
Powered By Subtext Powered By ASP.NET