miércoles, 25 de junio de 2008

Generacion automatica de backup en MSSQL 2005 Express con un Windows Service (Parte I)

La creación de backup de una base de datos es un proceso importante y al mismo tiempo monotomo para los que se encargan de hacerlos, en el caso de MSSQL 2005 este proceso puede ser realizado por tareas programadas, pero en el caso de MSSQL 2005 Express Edition que no posee este gestionador de tareas automaticas solo queda hacerlo manualmente cada cierto tiempo :(.

Para no tener que hacer esta tediosa tarea cada cierto periodo ( cosa que tenia que hacerlo yo :S ) , hice un pequeña aplicacion que en si es un Windows Service que genera un backup automaticamente cada dia.

1er paso: Crear un nuevo proyectollamado BackupServicio del tipo "Windows Service" con C#, esto creara 2 items por defecto el primero llamado Program.cs y Service1.cs lo renombramos BackupService.cs, ademas agregamos un item del tipo "InstallerClass" llamandolo InstallerService.cs. La clase BackupService.cs es donde ira la logica para generar el backup y en la clase InstallerService.cs ira la logica para la instalacion del servicio en el sistema.

2do paso: Agregamos 2 nuevas referencias a nuestro proyecto llamados Microsoft.SqlServer.Smo y Microsoft.SqlServer.ConnectionInfo, estos son importantes para poder hacer el backup de la base de datos y poder llamar a estas librerias.
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo
3er paso: Crearemos el metodo que realizara el trabajo de generar la base de datos, primero indicamos el nombre del archivo de backup para ello se toma como referencia la fecha actual. Segundo, indicamos el dispositivo donde se generara el backup por lo que indicamos "DeviceType.File" para crearlo como archivo, este se crea por defecto en la carpeta de backup del MSSQL. Por ultimo, indicamos la base de datos que queremos crearle su backup que esta representado por el valor de "this.database" y el nombre del servidor cuyo valor es representado por "this.server".
private void backupDB()
{
try
{
string fileBackup = "BACKUP_" + DateTime.Now.ToString("yyyyMMdd") + ".bak";

BackupDeviceItem bdi = new BackupDeviceItem(fileBackup, DeviceType.File);

Backup bu = new Backup();

bu.Database = this.database;
bu.Devices.Add(bdi);
bu.Initialize = true;

Server server = new Server(this.server);
bu.SqlBackup(server);
}
catch (Exception ex)
{
throw ex;
}
}
Este metodo solo se llamara cuando la hora señalada sea identica a la hora del sistema, para ello el servicio verifica cada segundo dicha condición.

4to paso: Creamos un Timer para que cada segundo verifique si la hora para generar el backup.
using System.Timers;

Timer timer = new Timer();

private void OnElapsedTime(object source, ElapsedEventArgs e)
{
try
{
String tm1 = DateTime.Now.Hour.ToString() + ':' + DateTime.Now.Minute.ToString() + ':' + DateTime.Now.Second.ToString();
String tm2 = this.hour + ':' + this.minute + ':' + this.second;

if (tm1.Equals(tm2))
{
this.backupDB();
EventLog.WriteEntry(this.ServiceName, "Se genero el backup con fecha " + DateTime.Now.ToShortDateString(), System.Diagnostics.EventLogEntryType.Information);
}
}
catch (Exception ex)
{
EventLog.WriteEntry(this.ServiceName, "Error: " + ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
}
}
5to paso: Inicializamos el Timer con la configuraciones para que valide cada segundo la condicion de la hora. Para ello usamos el metodo "OnStart" que es el metodo que se ejecuta al momento de inicial el servicio. Ademas, vemos que usamos ElapsedEventHandler este metodo no sirve para decirle que en cada intervalo de tiempo ejecute el metodo OnElapsedTime que contiene la condicion para verificar la hora de sistema.
protected override void OnStart(string[] args)
{
try
{
this.loadConfiguration();

timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);

timer.Interval = 1000;

timer.Enabled = true;
}
catch (Exception ex)
{
EventLog.WriteEntry(this.ServiceName, "Error: " + ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
this.Stop();
}
}
Con esta breve descripcion puedo definir el funcionamiento del programa que aunque ya esta terminado no se puede probar hasta que se intale el servicio en el sistema.

Para instalacion del servicio sigamos sigamo con la segunda parte Aqui

1 comentario:

Anónimo dijo...

Buena voz el Codigo ....