Backup de DB2 sous Windows

Une base de données c’est très bien mais il est toujours souhaitable de réaliser très régulièrement des sauvegardes de ses données. Pour cela 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.

Ce petit article vous explique comment réaliser ce fichier de commandes windows (.bat ou .cmd) en essayant de rester simple et relativement adaptable.

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 nous utilisons 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

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.

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 ;
QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS;
CONNECT RESET;
 
BACKUP DATABASE sample TO "C:\db2_backup" WITH 2 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING;
 
CONNECT TO sample;
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).

@echo off
REM +----------------------------------------------------------+
REM +   Script de sauvegarde DB2 avec gestion de delete        +
REM +----------------------------------------------------------+
REM + Ver. + Auteur   + Remarques                              +
REM +------+----------+----------------------------------------+
REM + 1.00 + RBerthou +                                        +
REM +----------------------------------------------------------+
REM +-- Attention les numeriques de la forme 01 .. 0999 sont  -+
REM +--   considérés comme des nb octal donc prb de calcul    -+
REM +-- d ou l ajout du 1 devant certaines variables          -+
 
REM +- Attention la date est au considéré au format français  -+
REM +- Format de la date "dd/mm/yyyy"                         -+
REM +-  a modifier suivant vos paramètres                     -+
for /f "tokens=1-4 delims=/-\ " %%a in ('date /t') do (
  set mjour=%%a
  set mmois=%%b
  set mannee=%%c
)
set mydate=%mannee%%mmois%%mjour%
set nbhisto=07
 
if /I "%mjour%" GTR "%nbhisto%" (
   set /a mjour=1%mjour%-1%nbhisto%
) else (
   if /I "%mmois%" == "01" (
         set /a mannee=%mannee%-1
         set /a mmois=12
   ) else (
       set /a mmois=%mmois%-1
   )
   set /a mjour=1%mjour%+30-1%nbhisto%
)
if %mmois% LSS 10 ( set mmois=0%mmois%)
if %mjour% LSS 10 ( set mjour=0%mjour%)
set delmax=%mannee%%mmois%%mjour%
REM +- Fin initialisation    -+
 
set destdir=c:/db2_backup
set db2backupdir=%destdir%/SAMPLE.0/DB2/NODE0000/CATN0000
 
echo "DB2 Backup du %mydate%"
db2cmd /c /w /i db2 -v -t -f%destdir%/sample_backup.db2 -z%destdir%/sample_backup.log
 
if not %errorlevel% == 0 (
  echo "ERROR: Backup Error backupDB2, RC=%errorlevel% "
  goto fin
)
 
echo "Compression du Backup DB2"
del /S %destdir%/db2_zip.jar
jar.exe -cvf %destdir%/db2_zip.jar %db2backupdir%/%mydate%
 
if not %errorlevel% == 0 (
  echo "ERROR: Backup Error zipDB2, RC=%errorlevel% "
  goto fin
)
 
echo "DB2 delete catclogue Backup précédent le %delmax%"
db2cmd /c /w /i db2 -v CONNECT TO sample
db2cmd /c /w /i db2 -v prune history %delmax% and delete
db2cmd /c /w /i db2 -v CONNECT RESET
db2cmd /c /w /i db2 -v TERMINATE
if not %errorlevel% == 0 (
  echo "ERROR: Backup Error, deleteDB2 RC=%errorlevel% "
  goto fin
)
 
echo "DB2 delete fichier Backup précédent le %delmax%"
for /f "skip=%nbhisto%" %%i in ('dir %db2backupdir% /b /o:-n') do (
   rmdir /Q/S %%i
   if not %errorlevel% == 0 (
     echo "ERROR: Backup Error, deleteHisto  RC=%errorlevel% "
   )
)
 
:fin
if %errorlevel% == 0 (
   echo " Fin de la sauvegarde du %mydate% "
) else (
   echo " Erreur de la sauvegarde du %mydate% "
)

Remarques

  • Je vous conseille bien évidemment de valider ce script sur une base de test 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 a ce script n’hesitez pas a me les proposer

Voir aussi

Be Sociable, Share!