Scripting sobre Backup de SQL y subida a FTP

Alternativa para Backup en SQL Server


El siguiente bat permite realizar backup de una o más bases de datos dentro de un servidor SQL SERVER. Está validado sobre un servidor con SQL 2008 R2. No es tan genial como el SQLandBackupFTP, pero es una forma de hacer lo mismo sin la necesidad de pagar licencias en un entorno empresarial.

El script se guarda como un archivo .BAT y se ejecuta en Windows. Se puede agregar una tarea programada que lo ejecute diariamente y así mantenemos los backups de nuestras bases de datos aseguradas. Esto está pensado para un entorno donde realizamos respaldos full de la base de datos.

El script creará archivos utilizando 7-zip, y el backup nativo de SQL. Los archivos creados tendrán incrustado en el nombre la fecha y hora de creación. Por ejemplo, un archivo zip puede ser: MYSQLBKP_2013_01_11_1700.ZIP Este es un archivo creado a las 17:00hrs del día 11 de Enero de 2013.

El prefijo del archivo es customizable a lo que quieran. Es un script muy simple y lo pueden usar como base para agregarle las mejoras que quieran. La última versión está disponible en el siguiente LINK:


https://www.dropbox.com/s/grj58eaftn597u0/Backup_SQL_v3.bat

@echo off
SETLOCAL EnableDelayedExpansion
REM Creado por JM (11-ene-2013)

REM -------------------------------------------------------------------
REM VARIABLES CUSTOMIZABLES
REM -------------------------------------------------------------------

set dbname_1=BD_Cliente1
set dbname_2=BD_SAP
set dbname_3=BD_LOGS
set dbname_4=bdtesting
set zipname=BACKUPSQL
set bkpfolder=C:\tools
set instancia=%COMPUTERNAME%
set ftpserver=ftp3.misitioweb.cl
set ftpuser=jmartinez
set ftppass=jm2013
set path=%path%;C:\Program Files\7-Zip

REM -------------------------------------------------------------------
REM VARIABLES DEL SCRIPT
REM -------------------------------------------------------------------
REM COMANDO PARA CREAR EL SUFIJO DEL ARCHIVO AAAA_MM_DD_HHHH
set hour=%time: =0%
set fechahora=%date:~-4%_%date:~4,2%_%date:~7,2%_%hour:~,2%%hour:~3,2%
REM -------------------------------------------------------------------
REM (Alternativa)PARA CREAR EL SUFIJO DEL ARCHIVO AAAA_MM_DD_HHHH
REM set hour=%time: =0%
REM set fechahora=%date:~-4%_%date:~3,2%_%date:~,2%_%hour:~,2%%hour:~3,2%
REM -------------------------------------------------------------------

REM NOMBRE DEL ARCHIVO ZIP
set zipfile=%bkpfolder%\%zipname%_%fechahora%.zip

REM ARCHIVO TEMPORAL
set ftp_backup=%bkpfolder%\ftp_backup.txt


REM CAMBIAR NRO 4, POR LA CANTIDAD DE BASES DE DATOS
for /L %%i IN (1,1,4) DO (

set bakfile=%bkpfolder%\!dbname_%%i!_%fechahora%.bak
echo ******************************************************************
echo ** Script para subir a FTP los archivos de backup SQL **
echo ******************************************************************
echo.
echo -Base de datos: !dbname_%%i!
echo -Instancia : %instancia%
echo -Servidor FTP : %ftpserver%
echo.
echo.
echo.
echo Realizando backup...
echo.
sqlcmd -E -S %instancia% -d master -Q "BACKUP DATABASE [!dbname_%%i!] TO DISK = N'!bakfile!' WITH NOFORMAT, NOINIT, NAME = N'Backup_!dbname_%%i!_%fechahora%', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10"
echo.
)

REM COMPRIMIR LOS ARCHIVOS BAK CON 7ZIP
echo Comprimiendo backup...
echo.

7z a -tzip %zipfile% %bkpfolder%\*%fechahora%.bak


REM -------------------------------------------------------------------

REM Subir archivos a FTP
echo open %ftpserver%>%ftp_backup%
echo %ftpuser%>>%ftp_backup%
echo %ftppass%>>%ftp_backup%
echo lcd %bkpfolder%>>%ftp_backup%
echo put %zipfile%>>%ftp_backup%
echo close>>%ftp_backup%
echo bye>>%ftp_backup%

ftp -s:%ftp_backup%

REM BORRAR TEMPORALES
del %ftp_backup%
del %bakfile%

REM ELIMINAR ARCHIVOS ANTIGUOS DE LA CARPETA
forfiles -p %bkpfolder% -m %dbname%*.zip -d "-1" -c "cmd /c del @path"

echo.
echo TAREA FINALIZADA!
echo.

A continuación pasaré a explicar las secciones editables de este script.

set dbname_N

La primera sección es para escribir el nombre de cada base de datos.

set dbname_1=Base de Datos Uno
set dbname_2=Base de datos dos
set dbname_...
set dbname_N=xxsql

Por ejemplo, si tengo que hacer respaldo de 3 bases de datos llamadas mydb01, sap y sqlcliente, debería dejar esta sección así:

set dbname_1=mydb01
set dbname_2=sap
set dbname_3=sqlcliente

set zipname

Este parámetro define el sufijo del archivo zip que se sube al servidor. Por ejemplo, si quiero crear archivos que se guarden como MYSQLBKP_2013_01_11_1700.zip, se deja seteado así:

set zipname=MYSQLBKP

Lo ideal es cambiar este valor por uno que identifique claramente el cliente al cual le estamos haciendo un backup, o la plataforma a la cual corresponde.

set bkpfolder

Esta variable es para definir la carpeta temporal en la cual se generan los archivos. Se puede cambiar por cualquier carpeta sobre la cual tengamos privilegios de escritura. Yo, por ejemplo, siempre uso una carpeta llamada c:\tools

set bkpfolder=c:\tools

set instancia

La variable instancia es para definir la instancia del servidor SQL en la cual están las bases de datos. Si es un servidor SQL con la instancia por default, simplemente basta con dejarla como %COMPUTERNAME%. Si es un servidor con muchas instancias diferentes, o si tiene una instancia nombrada, hay que cambiarlo.

Ejemplos:
set instancia=%COMPUTERNAME%

set instancia=%COMPUTERNAME%\NET

set instancia=SQLSERVER01\SQLHOSTED

set ftpserver


Esta variable define el servidor FTP sobre el cual subiremos nuestros respaldos. Puede ser definido con una IP, o con el FQDN del server. En este caso estoy utilizando el FQDN de mi hosting.

set ftpserver=ftp3.misitioweb.cl

set ftpuser y ftppass

Estas variables, como dice el nombre, son para definir el usuario y password del FTP. No es muy seguro guardar estos valores en un archivo de texto, pero en ocasiones es mejor tener un scritp simple que haga el trabajo, en vez de no tener los respaldos en ningún lugar.

 

set path=%path%;C:\Program Files\7-Zip

Esta variable define en qué lugar está instalado el 7-zip. Esta herramienta libre es la que realiza la compresión de los archivos bak generados por sql. En un servidor en inglés esta variable no cambia, pero si tu sistema operativo está en español, tendrás que modificarla para que agregue la ruta correcta hacia la carpeta de 7-zip.

REM CAMBIAR NRO 4, POR LA CANTIDAD DE BASES DE DATOS
for /L %%i IN (1,1,4) DO (


Esta línea es muy importante, porque hay que modificar un valor, dependiendo de la cantidad de bases de datos que quieres hacer respaldo. Es un elemento que puedo automatizar, pero se los dejo de tarea a ustedes jeje..

En esta línea se cambia el número "4", y se reemplaza por la cantidad de bases de datos que escribí en la primera sección. Siguiendo el ejemplo, si voy a hacer backup a 3 bases de datos (llamadas mydb01, sap y sqlcliente), debo cambiar por un número "3"

for /L %%i IN (1,1,3) DO (

Una vez modificados estos elementos, estás listo para probar tu script.

PROBANDO EL SCRIPT

Yo te recomiendo que antes de ejecutar, pruebes si el parámetro %fechahora% está siendo generado en forma correcta. Hasta ahora he encontrado dos formatos de fecha/hora en los servidores.

Para hacer la prueba, simplemente abres una ventana de CMD y ejecutas estas líneas del script:


REM COMANDO PARA CREAR EL SUFIJO DEL ARCHIVO AAAA_MM_DD_HHHH
set hour=%time: =0%
set fechahora=%date:~-4%_%date:~4,2%_%date:~7,2%_%hour:~,2%%hour:~3,2%
A continuación ejecuta

echo %fechahora%

Si el resultado es la fecha y hora con caracteres incorrectos, por ejemplo, "2013_1/ _01_1815", significa que tu server utiliza otro formato. En el scritp dejé comentada una sección

REM -------------------------------------------------------------------
REM (Alternativa)PARA CREAR EL SUFIJO DEL ARCHIVO AAAA_MM_DD_HHHH
REM set hour=%time: =0%
REM set fechahora=%date:~-4%_%date:~3,2%_%date:~,2%_%hour:~,2%%hour:~3,2%


Descomenta estas líneas y prueba con ese formato de fecha y hora. De seguro tendrás éxito.

Constantemente voy actualizando este script. Si agrego alguna mejora importante, lo publicaré.

saludos,
JM

-----------------------------------------------------------------------------
Actualizaciones:

Versión_2 Se agregó log del proceso (2013-Ene-25)

Comments

Popular posts from this blog

Update DNS static servers in your local Network

Error 'General access denied error' (0x80070005). Starting SCVMM Resource

Powershell Scritp for Inventory VMS in Hyper-V and VMware