294 lines
9.2 KiB
Transact-SQL
294 lines
9.2 KiB
Transact-SQL
USE [HCITools]
|
|
GO
|
|
|
|
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[bkp_Archive]') AND type in (N'P', N'PC'))
|
|
DROP PROCEDURE [dbo].[bkp_Archive]
|
|
GO
|
|
|
|
USE [HCITools]
|
|
GO
|
|
|
|
SET ANSI_NULLS ON
|
|
GO
|
|
|
|
SET QUOTED_IDENTIFIER ON
|
|
GO
|
|
|
|
|
|
CREATE PROCEDURE [dbo].[bkp_Archive]
|
|
@in_debug int = null,
|
|
@in_Recovery_Model varchar(25) = null
|
|
AS
|
|
/*=============================================================================
|
|
|
|
Explication du traitement realise par la SP
|
|
-------------------------------------------
|
|
Cette SP sert à archiver les backups des bases de données en fonction du paramètre BKP_FRQ contenu dans la table HCI_PARAMS
|
|
L'archivage se fait sur 3 jours glissant puis en fonction du choix, sur 30 jours et 60 jours
|
|
|
|
Contexte d'utilisation
|
|
----------------------
|
|
Cette SP est appelée par les jobs D91010 - Backup of several databases
|
|
D91040 - Backup of simple databases
|
|
D91050 - Backup of full databases
|
|
|
|
Parametres
|
|
----------
|
|
@in_debug : non utilisé pour le moment
|
|
|
|
Creation : 06.10.15 / FLA
|
|
|
|
Modifications : 14.09.16 / FLA Remplacement des xp_cmdshell par la CLR
|
|
Ajout de la gestion des erreurs de chaque step
|
|
Ajout de la gestion de l'archivage uniquement des bases backupées
|
|
15.09.16 / FLA Séléction uniquement des bases de données online
|
|
24.05.17 / FLA Ajout du choix du mode de recovery des bases pour archiver leur backup
|
|
17.03.22 / FLA Change DBA mail
|
|
=============================================================================*/
|
|
|
|
set nocount on;
|
|
|
|
declare @result_sp int,
|
|
@errno int,
|
|
@errmsg varchar(255)
|
|
|
|
/*------------------- Declaration des variables --------------------*/
|
|
|
|
declare @NbError int,
|
|
@TypeArchive int,
|
|
@BackupFolder varchar (4000),
|
|
@BackupFolderA varchar (4000),
|
|
@OldPath varchar (4000),
|
|
@NewPath varchar (4000),
|
|
@Path varchar (4000),
|
|
@messageError varchar (max),
|
|
@messageToSend varchar(8000),
|
|
@xml xml,
|
|
@delimiter varchar(1),
|
|
@param_group_counter_list nvarchar(3000),
|
|
@name varchar (255)
|
|
|
|
|
|
/*------------ Affectation des parametres aux variables ------------*/
|
|
|
|
SELECT @TypeArchive=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_FRQ'
|
|
;
|
|
SELECT @BackupFolder=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_DIR'
|
|
;
|
|
SELECT @BackupFolderA=HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_DIR_A'
|
|
;
|
|
SELECT @param_group_counter_list = HCIP_value FROM dbo.HCI_PARAMS WHERE HCIP_key = 'BKP_NOT_DB'
|
|
;
|
|
|
|
IF @in_Recovery_Model is null
|
|
SET @in_Recovery_Model = 'FULL,SIMPLE,BULK-LOGGED'
|
|
|
|
SET @delimiter = ','
|
|
SET @xml = CAST(('<X>'+REPLACE(@param_group_counter_list, @delimiter, '</X><X>')+'</X>'+'<Y>'+REPLACE(@in_Recovery_Model, @delimiter, '</Y><Y>')+'</Y>') AS XML)
|
|
set @NbError = 0
|
|
set @messageError = ''
|
|
|
|
if @TypeArchive is null or @BackupFolder is null or @BackupFolderA is null or @param_group_counter_list is null
|
|
begin
|
|
select @errno = 70003,
|
|
@errmsg = '(BKP) Paramètres BKP_FRQ ou BKP_DIR ou BKP_DIR_A ou BKP_NOT_DB non initialisé dans HCI_PARAMS !'
|
|
goto error_99
|
|
end
|
|
|
|
/*-------------------------- Traitement ---------------------------*/
|
|
|
|
IF @TypeArchive <> 0
|
|
BEGIN
|
|
|
|
/* ON PARCOURT TOUTES LES BASES */
|
|
declare c_databases cursor local forward_only static for
|
|
SELECT name
|
|
FROM sys.databases
|
|
WHERE LOWER(name) not in (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('X') AS X(C))
|
|
AND state = 0
|
|
AND recovery_model_desc IN (SELECT C.value('.', 'varchar(3000)') AS value FROM @xml.nodes('Y') AS X(C))
|
|
ORDER BY name
|
|
;
|
|
open c_databases
|
|
;
|
|
FETCH NEXT FROM c_databases
|
|
into @name
|
|
;
|
|
while @@fetch_status <> -1
|
|
begin
|
|
if @@fetch_status <> -2
|
|
begin
|
|
|
|
/* ARCHIVE */
|
|
/* MOVE LAST DUMP FOR ARCHIVING */
|
|
BEGIN TRY
|
|
SET @OldPath = @BackupFolder + @name + '_Dump.bak'
|
|
SET @NewPath = @BackupFolderA + @name + '_Dump.bak'
|
|
|
|
exec dbo.aps_File_Move @OldPath, @NewPath
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
select @messageError = @messageError + 'Move last backup for archiving failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
|
|
SET @NbError = @NbError + 1
|
|
END CATCH
|
|
|
|
/* DELETE OLDEST DUMP, OR ARCHIVE AS MONTHLY DUMP */
|
|
if datepart (dd, getdate()) > 7
|
|
or datepart (weekday, getdate()) <> datepart (weekday, '2013-01-01') /* '2013-01-01' was a Tuesday */
|
|
begin
|
|
/* DELETE OLDEST ARCHIVED DUMP */
|
|
BEGIN TRY
|
|
SET @Path = @BackupFolderA + @name + '_Dump_3.bak'
|
|
|
|
exec dbo.aps_File_Delete @Path
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
select @messageError = @messageError + 'Delete oldest archived backup failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
|
|
SET @NbError = @NbError + 1
|
|
END CATCH
|
|
|
|
end
|
|
else
|
|
begin
|
|
|
|
/* IN THE FIRST TUESDAY OF THE MONTH, THE MONTHLY DUMP IS UPDATED */
|
|
IF @TypeArchive = 330
|
|
BEGIN
|
|
/* DELETE MONTHLY DUMP */
|
|
BEGIN TRY
|
|
SET @Path = @BackupFolderA + @name + '_Dump_30.bak'
|
|
|
|
exec dbo.aps_File_Delete @Path
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
select @messageError = @messageError + 'Delete monthly backup failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
|
|
SET @NbError = @NbError + 1
|
|
END CATCH
|
|
|
|
END
|
|
ELSE IF @TypeArchive = 33060
|
|
BEGIN
|
|
/* DELETE MONTHLY DUMP 60 */
|
|
BEGIN TRY
|
|
SET @Path = @BackupFolderA + @name + '_Dump_60.bak'
|
|
|
|
exec dbo.aps_File_Delete @Path
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
select @messageError = @messageError + 'Delete monthly backup 60 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
|
|
SET @NbError = @NbError + 1
|
|
END CATCH
|
|
|
|
/* RENAME TO MONTHLY DUMP 30 TO 60 */
|
|
BEGIN TRY
|
|
SET @OldPath = @BackupFolderA + @name + '_Dump_30.bak'
|
|
SET @NewPath = @BackupFolderA + @name + '_Dump_60.bak'
|
|
|
|
exec dbo.aps_File_Move @OldPath, @NewPath
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
select @messageError = @messageError + 'Rename to monthly backup 30 TO 60 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
|
|
SET @NbError = @NbError + 1
|
|
END CATCH
|
|
END
|
|
|
|
BEGIN TRY
|
|
SET @OldPath = @BackupFolderA + @name + '_Dump_3.bak'
|
|
SET @NewPath = @BackupFolderA + @name + '_Dump_30.bak'
|
|
|
|
exec dbo.aps_File_Move @OldPath, @NewPath
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
select @messageError = @messageError + 'Rename to monthly backup 3 to 30 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
|
|
SET @NbError = @NbError + 1
|
|
END CATCH
|
|
END
|
|
;
|
|
|
|
/* RENAME ARCHIVED DUMPS */
|
|
BEGIN TRY
|
|
SET @OldPath = @BackupFolderA + @name + '_Dump_2.bak'
|
|
SET @NewPath = @BackupFolderA + @name + '_Dump_3.bak'
|
|
|
|
exec dbo.aps_File_Move @OldPath, @NewPath
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
select @messageError = @messageError + 'Rename archived backup 2 to 3 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
|
|
SET @NbError = @NbError + 1
|
|
END CATCH
|
|
|
|
|
|
BEGIN TRY
|
|
SET @OldPath = @BackupFolderA + @name + '_Dump_1.bak'
|
|
SET @NewPath = @BackupFolderA + @name + '_Dump_2.bak'
|
|
|
|
exec dbo.aps_File_Move @OldPath, @NewPath
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
select @messageError = @messageError + 'Rename archived backup 1 to 2 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
|
|
SET @NbError = @NbError + 1
|
|
END CATCH
|
|
|
|
BEGIN TRY
|
|
SET @OldPath = @BackupFolderA + @name + '_Dump.bak'
|
|
SET @NewPath = @BackupFolderA + @name + '_Dump_1.bak'
|
|
|
|
exec dbo.aps_File_Move @OldPath, @NewPath
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
select @messageError = @messageError + 'Rename archived backup to 1 failed : ' + @name + ' ' + ERROR_MESSAGE() + CHAR(13)
|
|
SET @NbError = @NbError + 1
|
|
END CATCH
|
|
|
|
end /* if @@fetch_status <> -2 */
|
|
;
|
|
FETCH NEXT FROM c_databases
|
|
into @name
|
|
;
|
|
end /* while @@fetch_status <> -1 */
|
|
;
|
|
close c_databases
|
|
;
|
|
deallocate c_databases
|
|
;
|
|
|
|
if @NbError > 0
|
|
BEGIN
|
|
|
|
SET @messageToSend = SUBSTRING(@messageError,0,8000);
|
|
|
|
exec aps_Send_Mail_with_template
|
|
@in_param_varchar_2 = 'DBA_operator;',
|
|
@in_job_type = 3, /* 3 = warning */
|
|
@in_param_varchar_3 = @messageError
|
|
;
|
|
|
|
select @errno = 70003,
|
|
@errmsg = '(BKP) Erreur lors du job d''archivage'
|
|
END
|
|
|
|
END
|
|
;
|
|
|
|
/*------------------ Retour au programme appelant -----------------*/
|
|
|
|
return(@@error);
|
|
|
|
/*---------------------- Traitement des erreurs ----------------------*/
|
|
error_99:
|
|
raiserror (@errmsg, 16, 1);
|
|
return(@errno);
|
|
|
|
GO
|
|
|
|
|