@@ERROR y BackUp Database

07/04/2006 - 01:37 por Gabo77 | Informe spam
Hola amigos, entre varias actividades que estoy realizando, estoy
creando un proceso que genera BackUps de manera automatica, y que al
agregar una nueva BD sea facilmente agregada a este procedimiento, así
que cree un proceso que lee de una BD de configuración las BD's que
deberá respaldar (no lo hago desde sysdatabases por que no todas las
que existen debieran pasar por este proceso), el proceso debe informar
de errores en el BackUp, enviar comunicados y registrar incidencias,
así que hice algo como esto:

CREATE PROCEDURE SPM_BACKUPDATABASES
AS
SET NOCOUNT ON

/*PROCESO DE BACKUPS DE LAS BASES DE DATOS, LEE DE LA TABLA DE
CONFIGURACION EN BUSCA DE TABLAS A RESPALDAR*/

DECLARE @DBNAME AS VARCHAR(300)
DECLARE @BKPNAME AS VARCHAR(300)
DECLARE @BKPFECHA AS VARCHAR(13)
DECLARE @BKPPATH AS VARCHAR(1000)
DECLARE @BODY AS VARCHAR(2000)
DECLARE @ERROR AS INTEGER
DECLARE @PATH AS VARCHAR(500)
DECLARE @FORCEMAIL AS BIT
DECLARE @COSTO AS INTEGER
DECLARE @FECHAINICIA AS DATETIME
DECLARE @FETCH AS INTEGER
DECLARE @BASES AS INTEGER
DECLARE @BASESERROR AS INTEGER
DECLARE @BASESOK AS INTEGER
DECLARE @BKPGUID AS VARCHAR(100)

/*GENERAMOS UN IDENTIFICADOR UNICO PARA REGISTRAR LOS EVENTOS COMO UNO
SOLO*/
SET @BKPGUID = '{' + CAST(NEWID() AS VARCHAR(100)) + '}'

/*BUSCAMOS EN LA CONFIGURACION EL PATH DESTINO DE LOS BAKCUP'S*/
SELECT
@PATH = VALOR
FROM
TB_PARAMETROS
WHERE
IDPARAMETRO = 'BackUpPath'

/*BUSCAMOS EN LA CONFIGURACION SI AÚN CUANDO CADA BACKUP SE REALICE
OK SE ENVIEN MAILS DE CADA UNO*/
SELECT
@FORCEMAIL = VALOR
FROM
TB_PARAMETROS
WHERE
IDPARAMETRO = 'ForceMail'

/*CONTAMOS LAS BASES DE DATOS QUE SE VAN A RESPALDAR*/
SELECT
@BASES = COUNT(*)
FROM
TB_PARAMETROS
WHERE
IDPARAMETRO LIKE 'BackUpDataBase%'

/*CREAMOS UN CURSOR PARA RECORRER TODAS LAS BASES CONFIGURADAS*/
DECLARE BKPCUR CURSOR FOR
SELECT
VALOR
FROM
TB_PARAMETROS
WHERE
IDPARAMETRO LIKE 'BackUpDataBase%'

OPEN BKPCUR

FETCH NEXT FROM BKPCUR INTO @DBNAME
SET @FETCH = @@FETCH_STATUS

SET @BASESOK = 0
SET @BASESERROR = 0
SET @ERROR = 0

WHILE @FETCH = 0 BEGIN

/*INICIAMOS EL CICLO, CADA BASE DEBE SER RESPALDADA*/

SET @ERROR = NULL

/*PARA DETERMINAR LOS SEGUNDOS QUE LE TOMO POR BASE*/
SET @FECHAINICIA = GETDATE()

/*FIJAMOS EL NOMBRE DEL BACKUP*/
SET @BKPNAME = 'Copia de seguridad ' + @DBNAME

/*ESTABLECEMOS UN SUFIJO QUE ACOMPAÑARÁ AL NOMBRE DEL ARCHIVO
DESTINO*/
SET @BKPFECHA = 'd' + REPLICATE('0', 2 - LEN(CAST(DAY(GETDATE()) AS
VARCHAR))) + CAST(DAY(GETDATE()) AS VARCHAR) +
'_m' + REPLICATE('0', 2 - LEN(CAST(MONTH(GETDATE()) AS VARCHAR))) +
CAST(MONTH(GETDATE()) AS VARCHAR) +
'_a' + CAST(YEAR(GETDATE()) AS VARCHAR)

/*ESTABLECEMOS EL PATH DESTINO CON EL NOMBRE DEL ARCHIVO*/
SET @BKPPATH = @PATH + @DBNAME + '\' + @DBNAME + '_Backup_' +
@BKPFECHA + '.bak'

/*NOTIFICAMOS QUE SE INICIA CON UNA BD, FORCE MAIL = 0 POR QUE NON SE
REQUIERE MAIL PARA ESTO*/
SET @BODY = 'Se procesará otra BD; ' + @DBNAME + '; ' + @BKPPATH +
'; ' + @BKPNAME + '; El id del evento es: ' + @BKPGUID
EXEC SCHEDULE.DBO.SPM_NOTIFICAEVENTO 'BackUp Proccess', @BODY, 0,
@BKPGUID, 0
PRINT @BODY

/*CORREMOS EL PROCESO DE BACKUP PARA LA BD ACTUAL*/
BACKUP DATABASE @DBNAME TO DISK = @BKPPATH WITH NOINIT, NAME @BKPNAME, NOSKIP, NOFORMAT

PRINT @DBNAME

/*VALIDAMOS SI HUBIERON ERRORES*/
SET @ERROR = @@ERROR

/*HAYA TERMINADO BIEN O NO, EL PROCESO YA FINALIZÓ*/
SET @BODY = 'Se procesó otra BD; ' + @DBNAME + '; ' + CAST(@ERROR AS
VARCHAR) + '; El id del evento es: ' + @BKPGUID
EXEC SCHEDULE.DBO.SPM_NOTIFICAEVENTO 'BackUp Proccess', @BODY, 0,
@BKPGUID, 0

/*DETERMINAMOS LOS SEGUNDOS DE PROCESO*/
SET @COSTO = DATEDIFF(SECOND, @FECHAINICIA, GETDATE())

SET @BODY = 'Se ha ejecutado el BackUp de: ' + @DBNAME

IF @ERROR = 0 BEGIN
/*NO HUBO ERROR*/
SET @BODY = @BODY + ' sin errores. El BackUp se llama: ' + @BKPNAME
+ ' y fué colocado en: ' + @BKPPATH + '; Costo del proceso: ' +
CAST(@COSTO AS VARCHAR) + ' Segundos; El id del evento es: ' + @BKPGUID
SET @BASESOK = @BASESOK + 1
END
ELSE BEGIN
/*OCURRIERON ERRORES, SE DEBEN REPORTAR*/
SET @BODY = @BODY + ' y se han reportado errores durante la
operación' + '; El id del evento es: ' + @BKPGUID
SET @BASESERROR = @BASESERROR + 1
END

/*REPORTAMOS LA CONDICION ACTUAL DEL PROCESO*/
EXEC SCHEDULE.DBO.SPM_NOTIFICAEVENTO @BKPNAME, @BODY, @ERROR,
@BKPGUID, @FORCEMAIL

/*SIGUIENTE BASE*/
FETCH NEXT FROM BKPCUR INTO @DBNAME

SET @FETCH = @@FETCH_STATUS

END

/*CERRAMOS NUESTRO CURSOR*/
CLOSE BKPCUR
DEALLOCATE BKPCUR

/*DETERMINAMOS LA CANTIDAD DE BASES PROCESADAS, CUANTAS OK Y CUANTAS
CON ERROR*/
SET @BODY = 'Se han procesado: ' + CAST(@BASES AS VARCHAR) + ' Bases
de datos, ' + CAST(@BASESOK AS VARCHAR) + ' fueron con éxito y ' +
CAST(@BASESERROR AS VARCHAR) + ' fueron con error; El id del evento es:
' + @BKPGUID

EXEC SCHEDULE.DBO.SPM_NOTIFICAEVENTO 'BackUp DataBases', @BODY, 0,
@BKPGUID, 1

SET NOCOUNT OFF

/*FIN DE PROCESO*/
GO

El tema con esto, es que si una BD me da un error, no continua con las
demás, tengo entendido que cachando error con el @@ERROR podemos
controlarlo para seguir con el proceso por otro lado, pero esto no
ocurre.

Alguna idea? Muchas Gracias!!
 

Leer las respuestas

#1 Antonio Royo
07/04/2006 - 10:25 | Informe spam
Hola:
Un problema que he visto es que siempre vas a tener el error a 0 ya que lo
capturas así:
BACKUP DATABASE @DBNAME TO DISK = @BKPPATH WITH NOINIT, NAME =@BKPNAME,
NOSKIP, NOFORMAT

PRINT @DBNAME

/*VALIDAMOS SI HUBIERON ERRORES*/
SET @ERROR = @@ERROR

y te llevas los posibles errores del PRINT. Prueba a alternar la posicion de
las lineas de forma que la captura del error vaya inmediatamente despues del
backup:

BACKUP DATABASE @DBNAME TO DISK = @BKPPATH WITH NOINIT, NAME =@BKPNAME,
NOSKIP, NOFORMAT

/*VALIDAMOS SI HUBIERON ERRORES*/
SET @ERROR = @@ERROR

PRINT @DBNAME

Saludos,
Antonio

"" wrote:

Hola amigos, entre varias actividades que estoy realizando, estoy
creando un proceso que genera BackUps de manera automatica, y que al
agregar una nueva BD sea facilmente agregada a este procedimiento, así
que cree un proceso que lee de una BD de configuración las BD's que
deberá respaldar (no lo hago desde sysdatabases por que no todas las
que existen debieran pasar por este proceso), el proceso debe informar
de errores en el BackUp, enviar comunicados y registrar incidencias,
así que hice algo como esto:


El tema con esto, es que si una BD me da un error, no continua con las
demás, tengo entendido que cachando error con el @@ERROR podemos
controlarlo para seguir con el proceso por otro lado, pero esto no
ocurre.

Alguna idea? Muchas Gracias!!


Preguntas similares