On utilise de plus en plus java dans les travaux de votre IBMi et on a parfois besoin d’avoir des informations d’exécution
Voici comment connaitre la version de la JVM d’un travail ?
2 solutions simples
==> WRKJWMJOB
Puis 5 puis 1
Ou en utilisant sql services par la vue QSYS2.JVM_INFO
exemple :
select JOB_NAME, JAVA_HOME from qsys2.JVM_INFO
plus d’informations ici
https://www.ibm.com/docs/en/i/7.3?topic=usage-java-system-properties
il faudra désormais une autorisation explicite pour utiliser Navigator for i
Jusqu’à présent les fonctions usage, QIBM_NAV_SERVICEABILITY et QIBM_NAV_ALL_FUNCTION étaient autorisées par défaut à partir de mai 2022, elles seront interdites par défaut seules les profils ayant les autorisations spéciales *secofr *allobj pourront accéder les autres devront être autorisées nommément.
Plus d’informations ici
https://www.ibm.com/support/pages/node/6485853
C’est une possibilité de contrôler les requêtes SQL sur le temps d’exécution estimée ou sur la mémoire temporaire , se base sur le plan d’accès créé par l’optimiseur pour votre requête.
C’est la commande CHGQRYA qui permet cette opération
paramètres QRYTIMLMT( ) et QRYSTGLMT( ) pour le temps et la mémoire
Exemple
CHGQRYA JOB(123456/PLB/QPADEV0001) QRYTIMLMT(45)
Vous exécutez votre requête, si elle dépasse 45 secondes un message CPA4259 qui nécessite une réponse est envoyé au travail
Si vous répondez I ca continue,
La requête excède la limite de durée ou de mémoire définie (C I)
? I
C si vous voulez arrêter la requête
La requête dépasse la limite de durée ou de mémoire définie.
? C
SQL query exceeds specified limit or threshold.
Vous pouvez estimer le temps d’exécution d’une requête
Mettre le temps maxi à zéro
CHGQRYA QRYTIMLMT(0)
Lancer la requêtes
Retrouvez le message CPA4259 et répondez C
Si vous faites sur le message vous avez le temps d’exécution estimée
ID message . . . . . . : CPA4259
Date d’envoi . . . . . : 26/04/22 Heure d’envoi . . . . : 14:23:33
Message . . . . : La requête excède la limite de durée ou de mémoire définie
(C I)
Cause . . . . . : La requête de base de données qui allait démarrer a une
durée d’exécution estimée à 12, ce qui excède la limite indiquée 0, ou son
utilisation de mémoire temporaire de 1 dépasse la limite spécifiée
- Les limites de durée de requête et de mémoire temporaire sont
définies via la commande CL CHGQRYA.
remettre la valeur par défaut
CHGQRYA QRYTIMLMT(*SYSVAL)
remarque
Attention si vous avez de requêtes sous forme de curseur dans un sqlrpgle par exemple
Le traitement ne s’arrête pas , mais votre open cursor va recevoir un SQLCODE -666, si vous avez des traitements dépendants ca peut être gênant. il est donc conseillé de rajouter le contrôle derrière cette opération
exemple
if sqlcode = -666 ;
dsply ‘Estimation requête excessive’ ;
*inlr = *on ;
return;
Endif;
Pour mettre une réponse automatique C
Utiliser la table de réponse de travaux
par exemple
ADDRPYLE SEQNBR(56) MSGID(CPA4259) CMPDTA(PLB 51) RPY(C)
puis indiquer que le travail est en réponse auto
CHGJOB INQMSGRPY(*SYSRPYL)
Vous pouvez également indiquer quel fichier qaqqini vous voulez utiliser
paramètre CHGQRYA QRYOPTLIB(PLB)
Vous devez indiquer la bibliothèque ou ce trouve votre fichier d’options
plus d’informations ici
https://www.ibm.com/docs/fr/i/7.5?topic=supervisor-query-example-exit-programs
https://www.ibm.com/docs/en/i/7.4?topic=governor-how-use
Comment transférer un job dans qctl
Il peut être important de lancer un job qui tourne même quand le système est en mode restreint
Nous supposerons bien sûr que le sous-système de contrôle est QCTL.
1) Un job batch
il suffit d’indiquer la jobq QCTL dans le SBMJOB
exemple :
Vous avez une commande qui fait une SAV21
SBMJOB CMD(SAV21)
JOB(SAV21)
JOBQ(QCTL)
2) Pour un interactif , si le job est actif
TFRJOB JOBQ(QCTL)
3) Pour un interactif, si le job n’est pas actif
Vous devrez anticiper ce risque dés à présent en créant un unité qui a une entrée nominative dans QCTL.
pour créer l’unité
Récupérer le dernier contrôleur *VWS créer
WRKCTLD
CRTDEVDSP DEVD(votre unité ) DEVCLS(VRT) TYPE(3477) MODEL(FC) ONLINE(NO) CTL(votre controleur) KBDTYPE(FAB) CHRID(697 297)
ALWBLN(YES) PRTDEV(SYSVAL) OUTQ(DEV) PRTFILE(LIBL/QSYSPRT)
TEXT(‘Unité SECOURS’) DEPLOCNAME(*NONE)
créer l’entrée écran dans QCTL
ADDWSE SBSD(QCTL)
WRKSTN(votre écran)
pour contrôler
DSPSBSD
puis option 4
Vous devez retrouver une entrée avec votre nom d’unité
Maintenant vous devez indiquer votre nom d’unité dans votre session
exemple sur ACS
A la mire la mire vous devez avoir ceci
Attention
Ça peut vous sauver de petites blague, mais ça ne doit pas être un mode fonctionnement systématique.
Un job à démarrage automatique, c’est un travail qui démarre en même temps que votre sous-système, soit pour initialiser quelque chose, soit pour se mettre en attente d’événements à traiter.
Vous en connaissez au moins 2
Le QSTRUP
C’est le programme indiqué dans la valeur système QSTRUPPGM et il est lancé par votre sous système de contrôle, le plus souvent QCTL .
et le second c’est QSTRRMTWTR
C’est Le démarrage des imprimantes qui est lancé en même temps que QSPL !
Vous pouvez créer vos propres travaux à démarrage automatique
Si vous devez créer un job à démarrage automatique pour vous faciliter l’administration de notre partition, voici les étapes à suivre
Création du sous système (s’il n’existe pas encore)
CRTSBSD SBSD(GAIA/GAIASBS) POOLS((1 *BASE)) TEXT(‘Sous systéme …’)
Ajouter une donnée de routage pour faire
Si elle n’existe pas le plus simple une seule, elle permettra de faire exécuter les jobs qui rentreront votre sous système
ADDRTGE SBSD(GAIA/GAIASBS)
SEQNBR(9999)
CMPVAL(*NONE)
PGM(QCMD)
CLS(QBATCH)
Vous avez intérêt à créer une jobq spécifique avec une entrée dédiée à votre job auto
CRTJOBQ JOBQ(GAIA/AUTO)
ADDJOBQE SBSD(GAIA/GAIASBS)
JOBQ(GAIA/AUTO)
MAXACT(1)
Vous pouvez créer une autre jobq qui permettra à d’autres travaux de s’exécuter soit les uns à la suite des autres
ADDJOBQE SBSD(GAIA/GAIASBS)
JOBQ(GAIA/GAIA)
MAXACT(1)
Ou tous ensemble
ADDJOBQE SBSD(GAIA/GAIASBS)
JOBQ(GAIA/GAIA)
MAXACT(*NOMAX)
Vous devez ensuite créer une jobd
CRTJOBD JOBD(GAIA/AUTO)
JOBQ(GAIA/AUTO)
TEXT(‘File pour job auto …’)
USER(QPGMR)
RTGDTA(‘QCMDB’)
RQSDTA(‘CALL GAIA/PGMAUTO’)
Cette jobd doit comporter 2 particularités , un utilisateur, paramètre USER ici QPGMR et un programme à lancer paramètre RQSDTA ici appel du programme PGMAUTO.
Vous pouvez maintenant ajouter votre travail à démarrage AUTO
ADDAJE SBSD(GAIA/GAIASBS)
JOB(AUTOJOB)
JOBD(GAIA/AUTO)
Quand vous ferez un STRSBS GAIA/GAIASBS votre job AUTOJOB sera exécuté.
Attention :
Les programmes à démarrage automatique ne doivent pas planter, pensez y également quand vous adaptez le programme QSTRUP
1) Pourquoi faire un Reclaim Storage
Pour corriger des erreurs sur des ressources, suite à des arrets intempestifs ou des dsyfonctionnements :
Les objets de QSYS
Les fichiers de l’IFS
Le catalogue Base de données
C’est la commande RCLSTG, elle nécessite de passer le système en mode restreint.
2) Date du dernier Reclaim Storage
Elle est indiquée dans la dtaara QRCLSTG de QUSRSYS
DSPDTAARA DTAARA(QRCLSTG)
position 1 date au format CYYMMDD
vous pouvez visualiser la date de dernière exécution par SQL
SELECT CASE
substr(DATA_AREA_VALUE , 1 , 1) WHEN ‘1’
THEN
substr(DATA_AREA_VALUE , 6 , 2) concat ‘:’ concat
substr(DATA_AREA_VALUE , 4 , 2) concat ‘:20’ concat
substr(DATA_AREA_VALUE , 2 , 2)
ELSE ’01:01:2001′
END
as datrclstg FROM QSYS2.DATA_AREA_INFO
WHERE DATA_AREA_LIBRARY = ‘QUSRSYS’
and DATA_AREA_NAME = ‘QRCLSTG’
3) Estimer le temps d’exécution
RCLSTG ESTIMATE(*YES)
Se base sur les informations contenues dans la dtaara QRCLSTG. Si vous n’avez pas encore exécuté la commande, vous n’avez rien
En gros vous pouvez estimer à minimum 1 heure.
4) Voici ce qui est à vérifier après exécutions
Les objets sans propriétaire
WRKOBJOWN QDFTOWN
Les objets endommagés
Dans QSYS
DSPLIB LIB(QRCL)
Dans L’IFS
WRKLNK OBJ(‘/QOpenSys/QReclaim’)
WRKLNK OBJ(‘/QReclaim’)
5) Avant de faire un RCLSTG
Vous avez certaines commandes qui peuvent permettre de corriger des erreurs sans être en mode restreint
Sur les bibliothèques
RCLLIB
Sur l’IFS
RCLLNK
RCLDLO
Sur la base de données
RCLDBXREF
Conclusion :
Même s’il est difficile de donner une fréquence, nous en conseillons un par an ..
et dans tous les cas il est recommandé d’en faire un avant une montée de version
Un lien à connaitre :
Vous installez de nouveaux PCs et vous désirez savoir les ports à ouvrir pour pouvoir accéder à vos partitions IBMi.
Voici une liste de ports à ouvrir en priorité
Pour ACS :
23 requis TELNET
449 requis arborescence du serveur IBM i
8470 à 8476 (voir RDI)
Pour RDi :
446 Requis (DRDA : connecteur base de données entre serveurs)
449 (as-srvmap) requis arborescence du serveur IBM i
3825 (Debugger) : débogage RDi
4300 (STRRSESVR) débogage via RDi (permet le rappel par l’IBM i du client RDi)
8470 (as-central) requis : Gestion des licences
8471 (as-database) requis base de données
8472 (as-dtaq) requis : serveur de file d’attente de données
8473 (as-file) requis : serveur de fichiers
8474 (as-netprt) serveur d’impression réseau
8475 (as-rmtcmd) requis : envoi de commandes
8476 (as-signon) requis : serveur ouverture de session
Merci à Jean-Marie pour son aide !
Une DTAQ est une solution qui permet de gérer des entrées empilées de manière asynchrone (un peu comme MQ series qui lui est en plus multi systèmes)
Pour définir une remote outq
Cette technologie se base sur DRDA, c’est la solution qui est utilisée par SQL quand vous faites un CONNECT sur une base de données distante.
Sur le système source
Vous devez définir votre base de données par la commande WRKDBDIRE
ADDRDBDIRE RDB(‘Nom_base_de donnees’)
RMTLOCNAME(‘nom ou adresse IP’ IP) RMTAUTMTH(USRID *NOALWLOWER)
Vous devez indiquer,
l’adresse IP ou le nom IP résolu
le mode de connexion qui sera négocié à l’établissement de celle ci
Vous devez créer une dtaq remote
CRTDTAQ DTAQ(Nom_bib_loc/Nom Dtaq)
TYPE(DDM) RMTDTAQ(nom_bib_dis/Nom_Dtaq) RMTLOCNAME(RDB)
RDB(‘Nom_base_de_donnees’)
Sur le système cible
Vous devez créer une dtaq locale
CRTDTAQ DTAQ(Nom_bib_dis/Nom Dtaq)
TYPE(*DDM)
MAXLEN(longueur_de_vos_données)
si vous avez choisi une solution de connexion à base de profil, vous devez l’enregistrer en créant un poste d’authentification
ADDSVRAUTE USRPRF(*CURRENT) SERVER(NEPTUNE) USRID(PLB) PASSWORD()
Vous devez indiquer l’utilisateur local qui servira à faire la requête d’écriture.
Pour voir les postes existants, vous avez une vue SQL
SELECT *
FROM QSYS2.DRDA_AUTHENTICATION_ENTRY_INFO
le service DDM doit être démarré
STRTCPSVR *DDM
Pour écrire dans votre DTAQ
Sur la source, vous devez écrire des postes à la demande
Par L’API
Call QSNDDTAQ
Par la procédure SQL service, depuis le niveau 4 de la TR en 7.4
QSYS2.SEND_DATA_QUEUE()
sur la cible,
Pour écrire lire votre DTAQ
Vous devez avoir un traitement qui boucle pour traiter vos entrées
par l’API
Call QRCVDTAQ
Par la fonction SQL service, depuis le niveau 4 de la TR en 7.4
QSYS2.RECEIVE_DATA_QUEUE()
Conclusions
Vous pouvez mettre en place une solution de remote outq, pour répliquer des changement de mots passe par exemple !
Si vous utilisez des DTAQ, vous aurez besoin d’une commande pour visualiser le contenu de celle ci, vous pouvez en trouver un ici c’est la commande DSPDTAQ
Vous avez plusieurs partitions et vous voulez toutes les mettre à jour quand vous changez votre mot de passe.
Voici une méthode qui peut vous aider
1) Extraction du hash du mot de passe
Vous pouvez utiliser l’API, QSYRUPWD.
Voici un exemple RTVUSRPWD
Vous pouvez trouver les sources ICI,
https://github.com/Plberthoin/PLB/tree/master/GTOOLS
2) Envoi des informations du hash
Réplication des informations de hash par exemple avec une remote dtaara, remote dtaq ou envoi de celle ci par SAVRSTOBJ dans une dtaara ou un fichier.
3) Application du hash sur le nouveau profil
Vous pouvez utiliser l’API, QSYSUPWD
Voici un exemple CHGUSRPWD
Vous pouvez trouver les sources ICI,
https://github.com/Plberthoin/PLB/tree/master/GTOOLS
4) Automatisation
Vous pouvez ensuite automatiser la détection de vos modifications en utilisant un programme d’exit ou les journaux d’audit.