2 votes

Nettoyer les fichiers de sauvegarde sans xp_cmdshell ni plan de maintenance

Contexte :

Nous avons un script de sauvegarde qui a besoin de xp_cmdshell pour fonctionner. J'ai décidé que sur les nouveaux serveurs, nous n'allions pas activer xp_cmdshell. J'ai activé xp_cmdshell au début du travail et je l'ai désactivé à la fin. Le problème est que si une sauvegarde complète démarre et que la sauvegarde horaire du journal s'exécute et se termine, xp_cmdshell sera désactivé et la sauvegarde horaire échouera.

Cela m'a conduit à essayer de détecter si un travail est en cours, etc. Mais n'y a-t-il pas une meilleure façon de nettoyer ?

La question réelle :

Comment puis-je supprimer d'anciens fichiers de sauvegarde après l'exécution d'une tâche de sauvegarde réussie ?

Il doit être programmable, ce qui exclut les plans de maintenance si j'ai bien compris.

Il n'utiliserait pas xp_cmdshell pour éviter toute cette histoire d'interaction des tâches et suivre les bonnes pratiques.

Le meilleur scénario serait de le laisser s'exécuter à partir du script de sauvegarde, de manière à ce qu'il supprime les fichiers de sauvegarde après une sauvegarde réussie. En cas d'erreur dans une sauvegarde, quelle qu'en soit la raison, cela permet à la sauvegarde de se poursuivre pour les autres bases de données.

Spéculation : Peut-être qu'un script powershell script ferait l'affaire ? Cela pourrait être scripté dans une étape de travail et exécuté conditionnellement en cas de succès... mais alors tout se passe à la fin, laissant des sauvegardes si nous échouons à mi-chemin - le disque de sauvegarde devrait alors être nettoyé manuellement si nous sommes à court d'espace.

Peut-être devrais-je simplement vérifier si le travail horaire est en cours d'exécution lorsque je vais désactiver xp_cmdshell dans le travail horaire. C'est ce que je vais probablement faire, mais que feriez-vous ? ?

0voto

Jason Cumberland Points 1559

J'ajoute une étape à mon job de sauvegarde après l'étape de sauvegarde et j'exécute une version du code ci-dessous. Cela supprimerait tous les fichiers BAK datant de plus d'un jour.

declare
    @Ext NVARCHAR(4)
    ,@DelDt VARCHAR(19)
    ,@BackupPath VARCHAR(800)

select
    @Ext = 'bak'
    ,@BackupPath = 'D:\SQLBAK'

SELECT
    @DelDt = CONVERT(VARCHAR(19), DATEADD(hh, -24, GETDATE()), 126)

EXEC master.dbo.xp_delete_file 0, @BackupPath, @Ext, @DelDt

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X