Lançons une SAVE21 !

Vous avez besoin de centraliser toutes les données de votre système IBM i en une seule fois par une seule sauvegarde ? Facile : lançons une SAVE21 !

Toute la communauté IBM i connait ce terme issu d’une option de menu : On se connecte au menu natif de gestion des sauvegardes (GO SAVE), on sélectionne l’option n°21, et on n’a plus qu’à suivre les instructions affichées à l’écran. 

En revanche, vous n’avez pas de ressource pour rester devant un écran toute une nuit ? Facile : soumettez cette sauvegarde en batch ! Comment ? Facile ! Suivez cet article et on vous montrera comment préparer sa SAVE21 en batch.

 

Que sauvegarde la SAVE21 ?

Celle-ci comprend le microcode, le système (dont les données de sécurité et de configuration), toutes les bibliothèques et tout l’IFS (dont le répertoire QDLS, les fameux « DLO »). On entend aussi parler de « sauvegarde de TOUT le système », par opposition à la simple « sauvegarde système », qui renvoie en fait à une SAVSYS, ou à l’option 22 du menu SAVE. 

Les deux termes ne sont pas non plus entièrement indépendants. En effet, la SAVE21 inclue une SAVSYS, à laquelle elle ajoute une sauvegarde intégrale des données utilisateur, équivalente de l’option 23 du menu SAVE.

Pour toutes les commandes listées dans cet article, <device> se réfère au lecteur dans lequel <volume>, le support de sauvegarde utilisé, est inséré. Les commandes de sauvegarde qui sont incluses dans la SAVE21 sont les suivantes :

 

  • Sauvegarde du microcode et du système :

SAVSYS DEV(<device>)

       VOL(<volume>)

       ENDOPT(*LEAVE)

 

  • Sauvegarde du reste des bibliothèques (bibliothèques « non-système ») :

SAVLIB LIB(*NONSYS)

       DEV(<device>)

       VOL(<volume>)

       ENDOPT(*LEAVE)

 

  • Sauvegarde des « DLO » (contenu de /QDLS) :

SAVDLO DLO(*ALL)

       DEV(<device>)

       VOL(<volume>)

       ENDOPT(*LEAVE)

 

  • Sauvegarde de tout l’IFS (sauf /QDLS et /QSYS.LIB qui ont déjà été sauvegardées) :

SAV    DEV('/qsys.lib/<device>.devd')

       OBJ(('/*')

           ('/QSYS.LIB' *OMIT)

           ('/QDLS' *OMIT))

       VOL(<volume>)

       ENDOPT(*REWIND)

 

Quand soumettre ma SAVE21 ?

La SAVE21 doit TOUT sauvegarder. Donc tous les objets présents sur le système doivent être disponibles pour le travail de sauvegarde. Pour s’en assurer, IBM a réduit l’accès à la SAVE21 à la période où le système est en mode restreint, c’est-à-dire que tous les travaux et sous-systèmes sont arrêtés. 

Seulement, ce mode restreint a des conséquences lourdes : l’IBM i est alors inaccessible, et seul un travail peut tourner sur votre système : le travail de sauvegarde. Toutes vos applications seront donc à l’arrêt, et le système sera inaccessible, uniquement gérable via une console (HMC ou LAN).

Le timing est donc primordial, il faut pouvoir trouver l’intervalle où une telle opération présente le moins d’impact possible. Par ailleurs, il faut vérifier dans le planificateur du système si des travaux sont prévus pendant la période de mode restreint, afin de les relancer (si besoin) en fin de sauvegarde.

 

Comment soumettre la sauvegarde ?

La question « comment ? » est en effet la plus complexe à laquelle répondre, dans le cadre de la SAVE21. Étant donné que le mode restreint empêche de réagir une fois la sauvegarde démarrée, il faut avoir prévu toute éventuelle cause d’interruption avant la soumission : Il faut bien vérifier que la cartouche de sauvegarde est dans le lecteur et utilisable :

CHKTAP DEV(<device>) ENDOPT(*REWIND)

 

Il faut toujours s’assurer au préalable que la bande est bien montée dans le lecteur. Cette commande permet également de libérer le message « CPC6778 », dans lequel le nom du volume monté dans le lecteur est récupérable via un RCVMSG.

Dans le cas d’une bandothèque ou d’une VTL, cela permet de ne pas avoir à renseigner le nom du volume de sauvegarde en dur dans le code source. Attention cependant, la commande CHKTAP ne fonctionne pas directement sur une bandothèque, le message CPF415A est émis. Dans ce cas, commencer par trouver la bande souhaitée. Vérifier avec l’option 5 la catégorie (et le système le cas échéant) de cette cartouche. Monter la cartouche, et utiliser ensuite la commande :

SETTAPCGY DEV(<device>) OPTION(*MOUNTED) CGY(<catégorie> <système>)

 

<système> n’est à renseigner que si la catégorie est *NOSHARE. Il renvoie généralement au nom affiché dans le DSPNETA. Il faudra également être vigilant de bien initialiser la bande avant de l’utiliser :

INZTAP DEV(<device>) CHECK(*NO)

 

Ensuite, il faut s’assurer que le job sera soumis correctement et que le mode restreint soit possible.

 

Pendant le mode restreint, seul le sous-système de contrôle sera actif, avec un seul travail dedans. D’ailleurs, l’entrée en mode restreint se fait par l’arrêt de tous les sous-systèmes, et la sortie de ce mode se fait par le redémarrage du sous-système de contrôle, ce qui déclenche un travail d’exécution du programme de démarrage.

Le sous-système de contrôle est indiqué dans la valeur système QCTLSBSD. Sur la plupart des systèmes, le sous-système de contrôle est QSYS/QCTL, et la session qui tourne dedans QSYS/DSP01. Il faut s’assurer que ceux-ci soient démarrés. Le programme de démarrage est indiqué dans la valeur système QSTRUPPGM. Celui-ci peut être personnalisé à volonté. Il faut donc s’assurer qu’il démarre bien tout l’applicatif. Par ailleurs, il faut s’assurer que la JOBQ qui est rattachée au sous-système de contrôle est bien libérée et si la session à laquelle se connecte le travail soit bien libre. 

Enfin, il faut prendre en compte les performances du système sur lequel on travaille. Il ne faut pas hésiter à insérer des DLYJOB qui permettront, par exemple, de ne pas lancer le SAVSYS avant que le mode restreint ne soit atteint. On peut également attendre que le message CPF0968 soit libéré pour démarrer la sauvegarde.

Par ailleurs, certaines commandes peuvent attendre un résultat avant de laisser le travail se poursuivre à la prochaine commande. Ce temps d’attente d’un résultat peut être modifié si les performances sont faibles :

CHGJOB DFTWAIT(<durée_en_secondes>)

 

Enfin, les performances globales du travail sont même à prendre en compte dans la commande de démarrage en batch du mode restreint du système :

ENDSBS SBS(*ALL) OPTION(*IMMED) BCHTIMLMT(<durée_max_du_mode_restreint_en_minutes>)

 

En effet, la valeur indiquée dans le paramètre BCHTIMLMT définit la durée maximale pendant laquelle le mode restreint durera, et ce même si le travail se retrouve bloqué d’une manière ou d’une autre. 

Il faut bien veiller à ne pas prévoir ce délai trop court pour que le travail se termine normalement, mais ne pas le prévoir trop long non plus, car on risque alors de ne pas pouvoir récupérer le système quand les utilisateurs doivent se connecter.

Une fois ce délai atteint, le sous-système de contrôle redémarrera que le travail soit terminé ou non. Si vous avez prévu de créer un programme qui fonctionne aussi bien en interactif qu’en batch, il faudra conditionner cette commande : si *NOMAX est indiqué (ou le paramètre est laisse à sa valeur par défaut), alors la commande ne fonctionnera pas en batch. Si une autre valeur que *NOMAX est indiquée, alors la commande ne fonctionnera pas en interactif. 

 

Autres paramètres de sauvegarde :

Les commandes de sauvegarde peuvent être effectuées dans n’importe quel ordre, sauf le SAVSYS qui doit être réalisé en premier afin d’avoir le microcode au début de la sauvegarde pour pouvoir lancer un IPL à partir de cette source.

Le paramètre ENDOPT doit alors être adapté selon cet ordre pour indiquer *LEAVE pour les sauvegardes successives et *REWIND ou *UNLOAD (selon le besoin) en fin de sauvegarde. En effet, *LEAVE permettre de gagner beaucoup de temps sur le rembobinage de la bande.

Votre sauvegarde fonctionne bien, mais aucun spool n’est présent après restauration d’une file d’attente ? Si les spools sont importants pour votre applicatif, il est primordial de spécifier un paramètre supplémentaire dont la valeur par défaut ne permet pas de sauvegarder les fichiers spools. Dans ce cas, il faut bien spécifier SPLFDTA(*ALL). La même remarque peut être faite pour le contenu des *DTAQ : QDTA(*DTAQ).

Enfin, si l’état des sauvegardes doit être suivi par une équipe, il peut être avantageux de modifier le paramètre OUTPUT.

*PRINT permet de récupérer un fichier spool, que l’on peut par la suite « classer » dans une OUTQ spécifique.

*OUTFILE permet de stocker le résultat d’une sauvegarde dans un fichier externe. OUTFILE et OUTMBR doivent alors être indiqués avec *OUTFILE pour spécifier la localisation du fichier. Il est par exemple possible d’avoir un membre horodaté par sauvegarde pour garder un historique. Les informations en sortie sont alors fixées au niveau du paramètre INFTYPE. Pour la commande SAV de sauvegarde de l’IFS, l’option *OUTFILE n’est pas disponible pour le paramètre OUTPUT.

Attention, pour la commande SAVLIB LIB(*NONSYS) […] OUTPUT(*OUTFILE) OUTFILE(<bibliothèque>/<outfile>), la SAVE21 comptera systématiquement un objet non sauvegardé, le fameux fichier en sortie <bibliothèque>/<outfile>. Le travail de sauvegarde peut se terminer avec un code fin différent de 0, ce qui peut poser problème pour le monitoring et le reporting.

 

Comment tirer avantage d’une SAVE21 ?

L’inconvénient principal d’une SAVE21 est la mise en mode restreint du système. Mais tout inconvénient peut être exploité pour devenir une force. En effet, on peut tirer avantage de la nécessité du mode restreint pour soumettre des commandes qui ne sont pas possible en « mode normal ».

Par exemple, on peut profiter du mode restreint pour lancer un « reclaim storage » (RCLSTG), une opération hardware, ou des opérations qui fonctionnent mieux sans activité (arrêt de la journalisation, modification d’un sous-système, modification de la mire de connexion, « réorganisation » des fichiers les plus utilisés, application de PTFs…).

 

Vous avez des questions concernant un sujet particulier autour de l'IBM i ? Alors contactez-nous au 04 30 96 97 32, ou via le formulaire de contact.