Backups con Winrar de Bases de Datos

Utilizar Winrar para los Backups

Tengo un script que escribí hace tiempo con el cual hago una copia de seguridad completo o full backup de una base de datos y automaticamente lo comprimo con el Winrar, para luego hacer una copia en una ubicación de respaldo. De ese modo tenemos dos copias de seguridad en lugares diferentes, en caso haya algún desastre. El nombre se genera según la fecha y hora del sistema.

Previos: Hay que tener iniciado el Agente Sql Server e instalado Winrar.

El script lo tienen que ejecutar en el analizador de consultas, ahora también pueden crear un trabajo en el Agente Sql Server para programarlo y que se ejecute según lo crean conveniente.

Lo que tienen que cambiar para su entorno especifico, es la ruta del Winrar, y la carpeta donde se realiza el backup o copia de seguridad y donde se copia.


/*INICIO DEL SCRIPT*/
/*CARLOS MAYANGA

16-10-2004
ESTE TRABAJO REALIZA LA COPIA DE SEGURIDAD COMPLETA,
COLOCANDO COMO NOMBRE LA BASE DE DATOS
LA FECHA Y LA HORA
LUEGO COMPRIME EL BACKUP EN UN ARCHIVO RAR
PARA TERMINAR COPIA EL ARCHIVO HACIA OTRA UBICACION
SIRVE PARA BASE DE DATOS PEQUEÑAS
*/

/*HACER LA COPIA DE SEGURIDAD*/
DECLARE @NombreRAR varchar(8000)
DECLARE @NombreCompleto varchar(8000)
DECLARE @Ruta varchar(8000)
/*NombreBackup SE REFIERE AL NOMBRE DE LA COPIA DE SEGURIDAD, PODRIA SER EL MISMO DE LA BASE DE DATOS PARA QUE LA PUEDAN IDENTIFICAR, NO ES NECESARIO CREAR EL DISPOSITIVO DE BACKUP ANTES.*/
SET @NombreRAR='D:\Backup\NombreBackup' + + RTRIM(CONVERT(CHAR(16),GETDATE(),112)) + REPLACE(RTRIM(CONVERT(CHAR(16),GETDATE(),114)),':','') + '.rar'
SET @NombreCompleto='D:\Backup\NombreBackup' + RTRIM(CONVERT(CHAR(16),GETDATE(),112)) + REPLACE(RTRIM(CONVERT(CHAR(16),GETDATE(),114)),':','') + '.bak'
SET @Ruta='D:\Backup\'
/*AQUI SE REALIZA LA COPIA DE SEGURIDAD*/
BACKUP DATABASE [SHIOL_DATOS] TO DISK=@NombreCompleto
WITH INIT, NOUNLOAD, NAME = N'Admin - Nombre Backup backup', SKIP, STATS = 10, FORMAT

/*COMPRIMIR LA COPIA DE SEGURIDAD*/

DECLARE @Orden varchar(8000)
/*CON ESTA ORDEN SE COMPRIME LA COPIA DE SEGURIDAD Y LUEGO SE ELIMINA EL ARCHIVO ORIGINAL*/
SET @Orden ='c:\archiv~1\winrar\rar.exe a -m5 -df ' + @NombreRAR + ' ' + @NombreCompleto

EXEC master.dbo.xp_cmdshell @Orden

/*ESTA ES LA RUTA DE OTRA MAQUINA PARA HACER UNA COPIA DE ESE MODO TENEMOS DOS COPIAS DEL MISMO BACKUP*/
SET @Ruta = '\\maquina2\backup\'

/*COPIAR EL ARCHIVO COMPRIMIDO*/

SET @Orden ='copy ' + @NombreRar + ' ' + @Ruta
EXEC master.dbo.xp_cmdshell @Orden

Eso seria todo, no olviden de adaptar el script según su entorno.

Autor: Carlos Mayanga
Sitio: Programación Visual Basic con Sql Server


Actualización: Con la liberación de Google Knol, he creado un knol (una unidad de conocimiento), extendiendo un poco la explicación acá proporcionada. Visita mi Knol aquí.

7 comentarios:

Debianus dijo...

Muy buen articulo felicitaciones

Ikanus dijo...

Gracias por tu comentario y por tu visita!

Unknown dijo...

Hola, excelente articulo, pero tengo un problema... no me ejecuta el winrar dice:
"C:\Program" no se reconoce como un comando interno o externo

ya agregue el winrar a las variables del sistema y nada...

Alguien sabe de ese error

Gracias

Ikanus dijo...

Karito: El error se produce porque estás colocando espacios en el nombre de la ruta, te sugiero utilizar el nombre DOS de la carpeta, que está en formato 8.3 (8 caracteres para el nombre, 3 para la extensión).

Para que sepas el nombre DOS de la carpeta basta que escribas en la línea de comandos dir /X desde un nivel superior en carpetas. Cualquier duda me dejas otor comentario. Saludos.

Unknown dijo...

Hola, ya verifique el nombre en DOS pero igual me sigue saliendo un error:

El sistema no puede encontrar la ruta especificada.

Tambien me doy cuenta que no me deja utilizar el exec xp_cmdshell con parametros por referencia, y pues quiero comprimir cada una de las copias con diferentes nombres y para eso tengo que pasarle @name por referencia al comando de la compresion.
Muchas Gracias por responder tan pronto...
=)

Reinaldo dijo...
Este comentario ha sido eliminado por el autor.
Reinaldo dijo...

Aun en 2022 funciona como anillo al dedo con SQL Server 2019. Excelente aporte, te felicito.