Etiqueta: SQL Express

Backup automático programado en MS SQL Express

Cuando uno necesita utilizar el motor de base de datos SQL de Microsoft sobre un servidor Windows puede comprar las licencias, instalarlo ilegal o utilizar la versión SQL Server Express 2012 o SQL Server Express 2008. Esta última versión tiene como limitación no utilizar todos los núcleos del procesador (en procesadores multi nucleo), solo soporta 5 usuarios logueados en simultaneo y no tiene administrador de trabajos programados (SQL Server Agent). Esta última limitación dio origen a esta nota.

En la última implementación de un servidor que realicé me encontré con la necesidad configurar el backup de las bases de datos. Como se usó la versión Express del motor de base de datos, no podía configurar el backup de todas las bases para que se realice de forma automática todos los días. por eso comencé a investigar como realizar el backup en forma automatizada sin necesidad de realizarlo en forma manual (teniendo que depender de acordarme de hacerlo). Otra necesidad que tenía es guardar solo un grupo de los últimos backup para evitar que se llene el disco donde se guardan los archivos de backup.

Vamos por partes, para realizar el backup vamos a utilizar 3 archivos Batch (los .bat de toda la vida). El primero de los archivos necesarios que vamos a preparar contiene las instrucciones necesarias para generar los archivos de backup individuales por cada base de datos a respaldar.
La instrucción utiliza el comando sqlcmd de SQL que viene con el motor de bases de datos para scripts de ventana de comandos o archivos Batch.

La instrucción tiene el siguiente formato (en una misma línea):

SqlCmd -E -S Server_Name –Q “BACKUP DATABASE [Nombre_de_BaseDatos] TO DISK=’X:DirectorioBackup[Name_of_Database].bak’”

Como ejemplo podemos ver la siguiente instrucción:

SqlCmd -E -S SQLServer –Q “BACKUP DATABASE [TestDB] TO DISK=’D:TestDB.bak’”

Con esta instrucción, podemos crear un archivo .bak por cada base de datos que necesitemos. Esta instrucción debe ser incluida dentro de un archivo BAT para utilizarlo al final de este instructivo.

El problema con el que nos encontramos es que el nombre del archivo de backup es siempre el mismo. Esto tiene como inconveniente que si necesitamos volver a el estado de la base de datos a un determinado día solo tendremos el día en el que hicimos el backup (por lo general, en caso de una base de datos de un sistema en uso diario, la noche anterior).

Para solucionar este problema, debemos preparar otro archivo BAT que copie el archivo con diferente nombre cada día. Prefiero separarlo en archivos BAT individuales para que quede más claro.

Las instrucciones necesarias para copiar el archivo de base de datos con el nombre modificado con la fecha del día son las siguientes:

set DD=%date:~0,2%
set MM=%date:~3,2%
set AA=%date:~8,2% 
SET fecha=%DD%%MM%%AA% 
copy X:\BACKUP\BASE.BAK X:\BACKUP\BASE-%fecha%.BAK /Y

Hay que reemplazar la X por la letra (y la ubicación del backup). El parámetro /Y permite que si se ejecuta varias veces el proceso de copia se sobrescriba dejando siempre la última versión (sin consultar).

Ahora nos encontramos con el problema que si dejamos que se ejecute por varios días ambos procesos terminaran por llenar el disco. Para eso comencé a buscar una solución que me permita borrar los archivos basándose en la antigüedad y dejar por ejemplo los últimos 30 archivos, que si lo ejecutamos todos los días equivalen a los últimos 30 días.

Buscando en Internet encontré con la nota de davidboticario.com en el que explica como borrar automáticamente archivos dependiendo de la fecha del archivo. Este proceso necesita del archivo forfiles.exe que está publicado en el Kit de recursos de Microsoft Technet.

El archivo se puede bajar del siguiente link: forfiles.exe

C:\ubicacion del exe\forfiles -pC:\carpeta que contiene los archivos a borrar\ -m*.bak -d-30 -c”CMD /C del @FILE”

En el caso del ejemplo, se borrarán todos los archivos con extensión .bak (la extensión de los backup), si necesitamos podemos utilizar el *.* .
Si necesitamos conocer el resto de los parámetros del programa, debemos ejecutar forfiles.exe/?

Si colocamos esta instrucción en un archivo bat, debemos repetir estas instrucciones por cada ubicación donde se encuentran los archivos.

Este último backup debe ejecutarse como tercer paso, para esto podemos anidar el procedimiento entre de un solo BAT o ejecutarlo como tercer paso y anidarlo al programar la tarea programada utilizando el sistema de Tareas programadas o Programador de tareas (así se llama en Windows 7 y 2008). Esto nos permitirá que este grupo de instrucciones se ejecute con la frecuencia y horario que necesitemos.

Por lo general el backup se ejecuta todos los días (o solo los laborales) fuera del horario de trabajo (por lo general de madrugada).

Así, con un poco de maña y búsquedas en internet podemos solucionar esta necesidad.

Fuente: http://www.davidboticario.com/2008/09/como-borrar-ficheros-en-funcion-de-su-fecha-de-creacion/

Hasta la próxima.
Hernán

[sam id=»2″ codes=»true»]