Backup de DB2 sous Linux

Suite à mon exemple de script de sauvegarde DB2 sous Windows, je vous propose dans ce petit article une solution pour réaliser facilement un script de sauvegarde DB2 en version Linux en essayant de rester simple et relativement adaptable.

Pour réaliser une sauvegarde de ses données IBM/DB2 offre une interface graphique parfaitement fonctionnelle dans le « Control-Center » mais si on désire inclure cette sauvegarde dans une procédure plus importante il faut revenir au script.

Nous considérons que la sauvegarde doit s’effectuer bases fermées ( il est possible de le faire en mode « online » mais cela implique d’inclure les fichiers de log) et que nous la base « sample ».

Le but de ces scripts étant de :

  • Fermer la base de données
  • Réaliser la sauvegarde
  • Ouvrir la base de données
  • Compresser le fichier de sauvegarde
  • Nettoyer la liste des sauvegardes obsolètes dans le catalogue DB2
  • Effacer les fichiers de sauvegardes obsolètes

Attention si vous désirez faire un backup / restore entre deux OS différents vous devez passer par l’utilitaire db2move (exemple un backup/restore entre Windows et Linux n’est pas possible directement).

Les commandes DB2

Pour exécuter en script une commande DB2 on doit initialiser son contexte de travail. Sous Windows cela se fait par la commande db2cmd alors que sous Unix/Linux cela se fait par l’exécution du db2profile. Normalement ce script est situé dans le répertoire sqllib du « home-directory » de l’instance DB2 (si mes souvenirs sont exacts cela doit être par défaut /home/db2inst/sqllib).

Les commandes QUIESCE et UNQUIESCE permettent d’effectuer la « fermeture » et « l’ouverture » de la base de données et la commande BACKUP DATABASE effectuera la sauvegarde.

Fichier sample_backup.db2

CONNECT TO sample USER myuser USING mypassword;
QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS;
CONNECT RESET;
 
BACKUP DATABASE sample USER myuser USING mypassword TO "/db2_backup" 
     WITH 2 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING;
 
CONNECT TO sample USER myuser USING mypassword;
UNQUIESCE DATABASE;
CONNECT RESET;
 
TERMINATE ;

Attention : si l’utilisateur qui exécute le script n’a pas les droits suffisants sur la base vous devez préciser un autre utilisateur.

CONNECT TO sample USER monuser USING monpassword;

DB2 mémorise dans son catalogue des informations spécifiques sur chaque sauvegardes réalisées. Il est conseillé de nettoyer cela régulièrement avec la commande PRUNE HISTORY .

PRUNE HISTORY 20071021 AND DELETE;

Cette commande supprimera du catalogue les informations sur les backups antérieurs au 21 Octobre 2007 (20071021) et supprimera les fichiers de log associés (and delete ).

Le fichier de script

Je ne pense pas être un spécialiste du langage script de windows (dos) et à mon avis le calcul de la date delmax de ce script peut être amélioré. Je proposerai prochainement un script équivalent pour les environnements Unix/Linux (qui est tout de même plus simple).

#!/bin/sh
 
# +----------------------------------------------------------+
# +   Script de sauvegarde DB2 avec gestion de delete        +
# +----------------------------------------------------------+
# + Ver. + Auteur   + Remarques                              +
# +------+----------+----------------------------------------+
# + 1.00 + RBerthou +                                        +
# +----------------------------------------------------------+
 
# definition de l environnement de travail DB2
. /home/db2inst/sqllib/db2profile
 
NBHISTO=12
MINDATE=`date --date "$NBHISTO days ago" +%Y%m%d`
REM +- Fin initialisation    -+
 
destdir=/db2_backup
db2backupdir=$destdir/SAMPLE.0/DB2/NODE0000/CATN0000
 
echo "DB2 Backup"
db2 -v -f$destdir/sample_backup.db2 -z$destdir/sample_backup.log
returnCode=$?
if [ "$returnCode" != "0" ]
then
   echo "Erreur BACKUP DB2 : $returnCode"
   exit $returnCode
fi
 
echo " Suppression historique backup DB2 PIB "
db2 -v CONNECT TO SAMPLE user myuser using mypassword
db2 -v prune history $MINDATE and delete
db2 -v connect reset
returnCode=$?
if [ "$returnCode" != "0" ]
then
   echo "Erreur BACKUP DB2 PRUNE : $returnCode"
   exit $returnCode
fi
 
# Suppression physique des anciens fichiers
DELTA=50
while [ $DELTA -gt $NBHISTO ]
do
      MAXDATE=`date --date "$DELTA days ago" +%Y%m%d`
      rm $destdir/SAMPLE.0.db2inst.NODE0000.CATN0000.$MAXDATE*
      DELTA=$((DELTA - 1))
done
 
echo "Fin BACKUP DB2 : $returnCode"
exit $returnCode

Remarques

  • Je vous conseille bien évidemment de valider ce script sur une base de tests et surtout d’essayer d’effectuer une restauration
  • Il est également possible d’effectuer des sauvegardes « online » de database complète ou de tablespace et si cela intéresse du monde j’en parlerai prochainement
  • Si vous voyez des améliorations à ce script n’hésitez pas à me les proposer
Be Sociable, Share!