viernes, 3 de junio de 2011

VBScript. Script para la realización diaria de copias de seguridad. Esquema Hijo-Padre-Abuelo.

Un método ideal para mantener diferentes versiones de copia de seguridad de nuestros códigos fuente durante el proceso de desarrollo.

El esquema de copia de seguridad Hijo-Padre-Abuelo permite mantener multitud de versiones diarias de copia de seguridad de una forma óptima. Los diferentes volúmenes de copia se identifican en 3 tipos: Hijo, Padre y Abuelo. Una implementación posible consta de la siguiente configuración de copias. Volumen Hijo: Copia de seguridad diaria (se realiza una copia de seguridad incremental). Volumen Padre: Copia semanal (se realiza una copia diferencial). Volumen Abuelo: Copia mensual (se realiza una copia completa).
Con este esquema se consigue mantener versiones diarias de todos los archivos, de forma que se pueda recuperar la copia de un día determinado mediante un máximo de dos pasos: 1º recuperación de copia completa (abuelo), 2º recuperación de copia incremental (padre) y 3º recuperación de copia diferencial (hijo). Por otra parte, este esquema hace un uso óptimo del espacio de almacenamiento, pudiéndose reutilizar o deshechar las cinco copias Hijo semanalmente, las cuatro copias Padre mensualmente, y las copias Abuelo anualmente, en función de la cantidad de versiones que deseemos mantener.

- Copia completa. Copia de todos los archivos.
- Copia incremental. Copia de los cambios realizados respecto de la última copia completa.
- Copia diferencial. Copia de los cambios realizados respecto de la última copia completa o incremental.

Otra implementación posible mantiene los siguientes tipos de copia. Volumen Hijo: Copia de seguridad diaria (se realiza una copia de seguridad diferencial). Volumen Padre: Copia semanal (se realiza una copia completa). Volumen Abuelo: Copia mensual (se realiza una copia completa). Esta implementación, aunque tiene mayores requerimientos de espacio, solo requiere dos pasos para la recuperación de cualquier copia. A continuación se muestra el código en vbScript que implementa este esquema.


Código en VBScript:
'Copias:
'    LUNES.         Copia HIJO. Incremental.
'    MARTES.        Copia HIJO. Completa.
'    MIERCOLES.    Copia HIJO. Incremental.
'    JUEVES.        Copia HIJO. Incremental.
'    PRIMER VIERNES DEL MES.    Copia ABUELO. Completa.
'    RESTO VIERNES DEL MES.    Copia PADRE. Completa.

option explicit

dim fso, ws
dim CarpetaOrigen, CarpetaDestino

'LECTURA DE ARGUMENTOS
if Wscript.Arguments.Count <> 2 then
    msgBox("Parámetros incorrectos")
    WScript.quit 1
end if
CarpetaOrigen = WScript.Arguments(0)
CarpetaDestino = WScript.Arguments(1)

set fso=CreateObject("Scripting.FileSystemObject")
set ws=CreateObject("WScript.Shell")

'Martes COPIA HIJO [COMPLETA]
if weekday(now)=3 then  
    if msgbox("¿Desea realizar la copia COMPLETA-HIJO del Martes para " & CarpetaOrigen & "?",4)=6 then
        'Borrar carpeta anterior
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & " /S /Q",1,True) then
             'OK
        end if
        'HACER COPIA COMPLETA
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & "\"" /C /Y /E /H",1,True) then
             'OK 
        end if        
    end if

'Viernes COPIA PADRE [COMPLETA]  
elseif weekday(now)=6 and not ((day(now)\7)+1)=1 then  
    if msgbox("¿Desea realizar la copia COMPLETA-PADRE del Viernes para " & CarpetaOrigen & "?",4)=6 then
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\PA_" & ((day(now)\7)+1) & " /S /Q",1,True) then
              'OK
        end if
        'HACER COMPLETA  
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\PA_" & ((day(now)\7)+1) & "\"" /C /Y /E /H",1,True) then
              'OK
        end if
    end if
  
'Primer viernes del mes COPIA ABUELO [COMPLETA]  
elseif weekday(now)=6 and ((day(now)\7)+1)=1 then      
    if msgbox("¿Desea realizar la copia COMPLETA-ABUELO del mes actual" & month(now) & " para " & CarpetaOrigen & "?",4)=6 then
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\AB_" & month(now) & " /S /Q",1,True) then
             'OK
        end if
        'HACER COPIA COMPLETA  
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\AB_" & month(now) & "\"" /C /Y /E /H",1,True) then
              'OK
        end if
    end if
  
'Lunes [INCREMENTAL], Miercoles [INCREMENTAL], Jueves [INCREMENTAL]
elseif weekday(now)=2 or weekday(now)=4 or weekday(now)=5 then  
    if msgbox("¿Desea realizar la copia INCREMENTAL-HIJO del día para " & CarpetaOrigen & "?",4)=6 then
        if ws.Run("cmd.exe /C rd " & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & " /S /Q",1,True) then
             'OK
        end if
        'HACER COPIA INCREMENTAL
        if ws.Run("xcopy """ & CarpetaOrigen & """ """ & CarpetaDestino & "\HI_" & weekdayname(weekday(now),true) & "\"" /M /C /Y /S",1,True) then
             'OK
        end if
    end if
end if
WScript.Quit