Restauration de DB2 sous Linux

Restore DB2
Suite à l’exemple de script de sauvegarde DB2 j’ai eu diverses questions au sujet de la « restauration ». Je vous propose donc dans ce petit article divers exemples pour aborder de ce « problème ».

Le but de ces scripts étant de traiter deux cas simples de restauration :

  • Restaurer la base backuper (le classique)
  • faire un « redirect » pour les tablespaces)
  • Appliquer les journaux de logs

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).

De plus ne pas oublier de TESTER vos backups avant de passer cela en production.. (faire des backups c’est bien mais il est préférable que la restauration fonctionne).


Recherche du fichier de backup

Avant de restaurer vous devez bien avoir en votre possession un backup valide de la base en question.
Le nom de ce fichier a pour format :
NOMBASE.0.db2inst.NODE0000.CATN0000.TIMESTAMP.001
Attention : Les informations « NOMBASE » et « TIMESTAMP » sont utiles dans le script de restauration.

Les commandes DB2

Les commandes QUIESCE et UNQUIESCE permettent d’effectuer la « fermeture » et « l’ouverture » de la base de données, la commande RESTORE DATABASE effectuera la restauration et enfin nous utilisons
ROLLFORWARD pour appliquer les logs.

La restauration simple

C’est le cas classique, on souhaite restaurer la totalité de la base de données suite à un incident.

 db2 -v CONNECT TO sample USER myuser USING mypassword 
 db2 -v QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS
 db2 -v CONNECT RESET
 
 db2 -v RESTORE DATABASE SAMPLE USER myuser USING mypassword     \
        FROM "/tmp/backup"                                       \
        TAKEN AT 20090506034005                                  \
        WITH 2 BUFFERS BUFFER 1024 PARALLELISM 1 WITHOUT PROMPTING
 
 # ON applique les logs
 db2 -v "ROLLFORWARD DATABASE sample USER myuser USING mypassword COMPLETE" 
 
 db2 -v CONNECT TO sample USER myuser USING mypassword
 db2 -v UNQUIESCE DATABASE
 db2 -v CONNECT RESET
 
 db2 -v TERMINATE

Attention le caractère « \ » en fin de chaine est uniquement un caractère de continuation en shell unix.

Restauration dans une nouvelle base de données

Nous pouvons également restaurer cela dans une nouvelle base (très utile pour des tests ou pour restaurer qu’un sous ensemble de la base de données).

Dans le cas de restauration dans une nouvelle base, je préfère toujours dire qu’elle n’existe pas (je la supprime avant) et utiliser l’option REDIRECT pour redéfinir l’emplacement des tablespaces.

# Suppression de la base existante (en OPTION)
 db2 DROP DATABASE BASETMP
 
# restoration de SAMPLE dans BASETMP que l'on crée
 db2 -v RESTORE DATABASE SAMPLE USER myuser USING mypassword     \
        FROM "/tmp/backup"                                       \
        TAKEN AT 20090506034005                                  \
        TO "/mesdata/db2/data/BASETMP"                           \
        INTO BASETMP                                             \
        NEWLOGPATH "/mesdata/db2/logs/BASETMP"                   \
        WITH 2 BUFFERS BUFFER 1024                               \
        REDIRECT                                                 \
        PARALLELISM 1 WITHOUT PROMPTING
 
# Affectation des tablespaces
db2 "set tablespace containers for 0 using (path '/mesdata/db2/DATA/BASETMP/ts_sys')"
db2 "set tablespace containers for 1 using (path '/mesdata/db2/DATA/BASETMP/ts_temp')"
db2 "set tablespace containers for 2 using (path '/mesdata/db2/DATA/BASETMP/ts_user')"
db2 "set tablespace containers for 3 using (path '/mesdata/db2/DATA/BASETMP/ts_data1')"
db2 "set tablespace containers for 4 using (path '/mesdata/db2/DATA/BASETMP/ts_data2')"
 
# On termine le restore
db2 -v restore db SAMPLE continue
 
# on applique les logs
db2 -v "ROLLFORWARD DATABASE BASETMP COMPLETE"

L’option redirect permet principalement de résoudre les problèmes du style
SQL0294N The container is already in use. SQLSTATE=42730 .

Dans ce cas vous devez uniquement redefinir le container posant problème (personnellement je préfère les redéfinir tous)


Identifier les tablespaces

L’option REDIRECT implique que vous connaissez le nombre et les numéros des tablespaces utilisés. Pour trouver cela vous pouvez passer par un ordre sql en étant connecté à la base de données backupée.

SELECT TBSPACEID, TBSPACE, DATATYPE, DEFINER, CREATE_TIME FROM syscat.tablespaces

ou utiliser la commande DB2 (en etant toujours connecté à la base de données souhaitée)

db2 -v list tablespaces
Be Sociable, Share!