, , Nombre d’accès DB d’un travail

Vous voulez avoir une idée du nombre d’entrées-sorties que génère un travail sur votre base de données.

Pour ceci, vous pouvez par exemple utiliser la comptabilité des travaux.

Pour utiliser cette fonctionnalité, vous devez la mettre en œuvre voici comment :

1 ) Créer un récepteur de journal par exemple dans qusrsys ou une de vos bibliothèques
CRTJRNRCV JRNRCV(QUSRSYS/QACGJRN)
2) Créer le journal QACGJRN
CRTJRN JRN(QSYS/QACGJRN)
JRNRCV(QUSRSYS/QACGJRN)
3) Changer la valeur système QACGLVL
CHGSYSVAL SYSVAL(QACGLVL) VALUE(‘*JOB’)

Tous les jobs démarrés à partir de ce moment seront logués

Pour analyser vous avez des postes de type JB
Le plus simple est d’utiliser un fichier modèle
Le fichier modèle qui correspond est QSYS/QAJBACG4

dupliquez le

CRTDUPOBJ OBJ(QAJBACG4)
FROMLIB(QSYS)
OBJTYPE(*FILE)
TOLIB(PLB)
NEWOBJ(WAJBACG4)

Maintenant vous pouvez le remplir en faisant un DSPJRN

DSPJRN JRN(QACGJRN)
JRNCDE((A))
ENTTYP(JB)
OUTPUT(OUTFILE) OUTFILFMT(TYPE4)
OUTFILE(PLB/WAJBACG4)

Vous pouvez alors interroger votre fichier par sql

exemple ici en se limitant au jobs interactifs :

SELECT
JAJOBH as travail,
JAUSRH as utilisateur,
JANBRH as numero,
JADBPT as acces,
JADBGT as creation,
JADBUP as mise_à_jour
FROM PLB.WAJBACG4
WHERE JATYPE = ‘I’

Remarque :
N’oubliez pas supprimer les récepteurs quand vous les avez traité
Si vous voulez arrêter la collecte
CHGSYSVAL SYSVAL(QACGLVL) VALUE(‘*NONE’)

Vous pouvez également utiliser la comptabilité des travaux pour de nombreuses autres informations, pour par exemple estimer vos volumes d’impression.

, , Base64 en SQL avec les nouvelles fonctions de QSYS2 !

La 7.4 TR5 (et 7.3 TR11) ont apporté de nouvelles fonctions http dans QSYS2 en remplacement de celles fournies dans SYSTOOLS (cf https://www.volubis.fr/Pausecaf/PAUSECAF88.html).

Dans le même temps, nous avons droit à un refresh des fonctions utilitaires.

Parlons donc de l’encodage/décodage base64 !

Différences entre les fonctions fournies :

Les fonctions n’ont pas le même nom pour éviter toute ambiguïté :

Dans SYSTOOLS : BASE64ENCODE et BASE64DECODE

Dans QSYS2 : BASE64_ENCODE et BASE64_DECODE

L’implémentation des nouvelles fonctions (QSYS2) est basée sur Axis (en C natif), contrairement aux fonctions historiques de SYSTOOLS en Java. L’empreinte mémoire est donc bien meilleure avec les fonctions de QSYS2.

Surtout, les paramètres diffèrent : dans la version SYSTOOLS, la taille des paramètres est très limitée, et nous sommes donc sur du VARCHAR jusqu’à 4Ko maximum encodé. Les nouvelles versions utilisent des CLOB et BLOB jusqu’à 2Go !

Usages

Données caractères

On utilise régulièrement l’encodage base64 pour transmettre une authentification par profil/mot de passe, par exemple une authentification http basic.

Les deux fonctions renvoient bien sur le même résultat :

Si vous utilisez un convertisseur en ligne, vous n’obtenez pas le même résultat :

Par exemple sur https://simplycalc.com/base64-encode.php :

La raison est simple : l’encodage base64 a pour objectif d’exprimer sous forme de caractères une donnée binaire. Le paramètre en entrée des fonctions QSYS2.BASE64_ENCODE et SYSTOOLS.BASE64ENCODE sont donc un BLOB (Binary Large Object) ou un VARCHAR avec CCSID 65535 (signifie pas de conversion).

La chaine de caractères ‘toto’ est donc transmise ici en EBCDIC et c’est la valeur binaire correspondante qui est encodée en base64.

Pour être conforme au standard : convertissez les chaines de caractères en UTF-8 :

Pour décoder des données, on utilise SYSTOOLS.BASE64DECODE et QSYS2.BASE64_DECODE :

Le résultat affiché diffère.

La aussi c’est un effet de bord du changement de type de paramètre, ET de la configuration de ACS :

La fonction de SYSTOOLS étant en VARCHAR, elle est interprétée dans le CCSID du travail. La fonction de QSYS2 renvoyant un BLOB, il n’y a pas de conversion directe possible en caractères.

La valeur binaire renvoyée est bien la même. Si l’on teste en passant par un fichier :

Données binaires

L’objectif premier est tout de même de pouvoir travailler sur des valeurs binaires.

On utilise une image sur l’IFS en tant que donnée binaire à encoder. L’image fait 158Ko, une valeur très raisonnable.

Pour faciliter la démonstration, on travaille étape par étape avec des variables SQL.

Pour lire le fichier image en binaire :

Script de test :

Les résultats semblent concordants :

Mais :

C’est le problème de la longueur des paramètres des fonctions de SYSTOOLS !

Dans l’historique :

On a un SqlCode à 0 mais un SqlState en classe ‘01’ !

On décode notre image :

Les fichiers d’origine et le fichier encodé/décodé sont bien identiques !

Les nouvelles fonctions, au-delà de l’implémentation en C, nous apportent la possibilité d’encoder et décoder des « documents » (image, pdf …à) en base64. Très utile pour faire transiter des informations binaires dans nos web services par exemple !

Et la limite à 2Go semble raisonnable.

, , , , Mise à jour Produits Open source sur votre IBMi

Vous connaissez l’outil ACS de gestion des packages OPEN SOURCE

Si vous décidez d’utiliser l’Open source vous vous rendrez compte qu’il faudra sans doute automatiser la mise à jour des Packages RPM par YUM.

Voici donc quelques éléments pour réaliser cette opération !

D’abord vous devrez vérifier que vous avez bien Yum installé sur votre machine, normalement il est là, ACS l’utilise.

Les logiciels open source sont installés dans le répertoire

/QOpenSys/pkgs/bin

sous QSH

faire un cd /QOpenSys/pkgs/bin

puis ls yum*
yum yum-builddep yum-debug-dump yum-groups-manager
yumdownloader yum-config-manager yum-debug-restore

$ Vous devez avoir le fichier yum

il est conseillé de mettre ce répertoire dans votre Path.
Vous avez un fichier .profile éditer le pour ajouter ces 2 lignes par exemple à la fin de votre fichier .profile :
PATH=/QOpenSys/pkgs/bin:$PATH
export PATH

Il est également conseillé pour des questions d’homogénéisation de votre système d’utiliser un répertoire /home/votreprofil qui est la valeur par défaut de votre profil utilisateur (paramètre HOMEDIR de votre USER IBMi) et votre .profile devrait s’y trouver

Attention si vous voulez que ça fonctionne dans tous les environnements votre fichier .profile doit être en CCSID 819 !

Maintenant voyons comment procéder pour automatiser ces opérations de mise à jour
vous devrez planifier une tache qui lancera un QSH

la commande à passer pour voir si des mises à jour sont disponibles
c’est > yum check-update
Pour se faciliter la vie on mettra cette information dans un fichier txt
yum check-update > majpackage.txt
Ce fichier comporte l’intégralité des mises à jours et même les obsolescences
pour se limiter au logiciel qu’on veut mettre à jour on peut faire un cat avec un grep, par exemple nous on veut les mises à jour pour le logiciel NODEJS

cat majpackage.txt | grep « node »

nodejs14.ppc64 14.17.5-1 ibm
$

On voit qu’on a une mise à jour à faire, vous pouvez alors envoyer un mail par la commande sndsmtpemm pour indiquer la mise à jour à faire.

ou faire la mise à jour directement

yum update nodejs14.ppc64 -y –enablerepo=ibm
-y pour indiquer que vous allez installer en batch !

Il est conseillé de mettre un fichier de log exemple

Vous pourrez analyser ensuite la log en cas de problème en principe le nettoyage étant fait à la fin et votre version continu à fonctionner !

Il suffit de faire un ou 2 programmes CLP ou scripts Unix et d’y intégrer ce qu’on vient de voir !

Une des problématiques, quand on fait du SQL, est d’identifier rapidement une requête qui serait trop gourmande.

Dans un post précédent j’indiquais comment avoir ces éléments en utilisant le cache SQL, mais ça peut être long pour une première analyse !

La TR5 version 7/4, TR11 version 7/3 apporte une nouvelle fonction table (QSYS2.ACTIVE_QUERY_INFO( )) qui va nous permettre de répondre à cette problématique !

page de référence IBM

https://www.ibm.com/docs/en/i/7.4?topic=services-active-query-info-table-function

Pour l’utiliser, vous devez avoir *JOBCTL dans votre profil ou être ajouté dans la fonction USAGE QIBM_DB_SQLADM .

Exemple :


Une demande qui donne à un instant donné, les 10 requêtes les plus consommatrices de votre IBMi

SELECT QUALIFIED_JOB_NAME as travail , query_type as type_requete, File_Name as fichier , Library_name as bibliotheque,
current_runtime as temps_execution , CURRENT_TEMPORARY_STORAGE as memoire_utilisee
FROM
TABLE(QSYS2.ACTIVE_QUERY_INFO())
where current_runtime is not null
ORDER BY current_runtime desc
fetch first 10 row only

Vous pourrez alors agir en ayant le nom du travail, et utiliser la vue ACS prévue à cet effet par exemple !

On indique le premier fichier spécifié dans la requête (vue ou table), attention QSQPTABL indique que c’est une fonction table.

, , Comment suivre son plan de production quotidien ?

Supposons que vous utilisiez le job scheduler de l’IBMi, (WRKJOBSCDE), si vous utilisez AJS seul le fichier de départ change mais la démarche reste la même.

Notre méthode ne marche que pour le jour courant.
On va utiliser la date de prochaine soumission égale à la date du jour dans notre fichier SCHEDULED_JOB qui contient les jobs planifiés .

Vous devez planifier un job tous les matins à 0h et 2 minutes dans la file d’attente QCTL pour être sûr de le faire passer

Ce job aura une requête de ce type qui créera une table plandujour

create table plandujour as (
Select SCHEDULED_JOB_NAME, SCHEDULED_TIME,
ifnull(DESCRIPTION,  »  ») as description
from QSYS2.SCHEDULED_JOB_INFO
where NEXT_SUBMISSION_DATE = current date and
substr(SCHEDULED_JOB_NAME, 1, 1) <>  »Q »
and status <>  »HELD »
order by SCHEDULED_TIME ) with data +

Vous avez ainsi tous les jobs prévus pour la journée par heure de planification.

Maintenant nous allons voir comment suivre le déroulement des ces travaux

Pour suivre vos travaux on va utiliser la fonction table suivante HISTORY_LOG_INFO

exemple pour avoir les jobs du jour

SELECT * FROM TABLE(QSYS2.HISTORY_LOG_INFO(CURRENT DATE)) X

Chaque job qui tourne sur le système va générer au moins 2 messages

un CPF1124 Travail …/…/… démarré le
un CPF1164 Travail …/…/… arrêté le

donc
si votre travail n’a pas tourné vous n’avez aucun message
si votre travail tourne vous avez un CPF1124
si votre travail est terminé vous avez un CPF1164

Vous pouvez déjà suivre l’avancement grâce à la zone MESSAGE_TIMESTAMP et avoir une durée entre les 2 messages

Remarque :

pour savoir si votre travail c’est terminé normalement c’est un peu plus compliqué, vous devrez analyser le code fin par exemple dans la zone MESSAGE_TEXT.

code fin 0 indiquant une fin normale du traitement

Un exemple de requête (à améliorer)

pour les codes fin , pour les jobs qui débordent de la journée etc…

WITH logdujour (mgr_id, mgr_name, mgr_dept) AS(
SELECT * FROM TABLE(QSYS2.HISTORY_LOG_INFO(CURRENT DATE)) X)
select
a.SCHEDULED_JOB_NAME as nom_travail,
a.SCHEDULED_TIME as
HEURE_prev ,
ifnull(b.MESSAGE_TIMESTAMP,  »1911-11-11-00.00.00.00000 ») as Heure_debut ,
ifnull(c.MESSAGE_TIMESTAMP,  »1911-11-11-00.00.00.00000 ») as heure_fin,
ifnull(c.SEVERITY, »99 ») as code_sev ,
ifnull(b.FROM_JOB,  »  ») as name_JOB
from plandujour a
Left outer join logdujour b
on B.MESSAGE_ID = »CPF1124 » and B.FROM_JOB like( »% » concat
A.SCHEDULED_JOB_NAME concat  »% »)
Left outer join logdujour c
on C.MESSAGE_ID = »CPF1164 » and C.FROM_JOB like( »% » concat
A.SCHEDULED_JOB_NAME concat  »% »)

Vous pouvez planifier un job chaque soir qui vous envoie un récapitulatif de la journée, ou que les jobs en erreur par exemple.

Vous pouvez historiser ces données si vous avez besoin de consolider un suivi, etc …

Exemple d’un outil packagé utilisé dans notre centre de service pour suivre le planning quotidien:

https://github.com/Plberthoin/PLB/tree/master/DSPPLNPRD

, , SQL nom court / nom long

Rappel :

Pour les noms des objets collection, table, index, view, etc … le système maintient en double un nom SQL et un nom IBM i
Exemple :
SQL / bd_des_articles et IBMi / BD_DE00001
la règle est la suivante pour les noms supérieurs à 10 caractères le système prends les 5 premières positions et incrémente un compteur sur 5 positions, ce qui n’est pas forcément très lisible.

pour éviter ça, il est conseillé d’indiquer les 2 au moment de la création de votre objet SQL

Bien sur vous ne pourrez pas avoir des doublons ni sur le nom long ni sur le nom court

Voici quelques conseils

Création d’une base de données

Par un create schema par exemple

vous indiquez le nom SQL et vous pouvez forcer un nom court par la clause FOR SCHEMA nomcourt

exemple

CREATE SCHEMA BASE_DE_DONNEES_ARTICLES FOR SCHEMA DBARTICLE

Création d’une table

create table

vous indiquez le nom SQL et vous pouvez définir un nom court par la clause SYSTEM NAME nomcourt
il est conseillé pour les mêmes raisons de mettre sur un nom court, un nom long par la clause FOR nomcourt

EXEMPLE

CREATE TABLE DBARTICLE.Fichier_ARTICLES FOR SYSTEM NAME ARTICLES (
NUMERO_ARTICLE FOR COLUMN NUMART DEC ( 6) NOT NULL WITH DEFAULT,
NOMCLI_ARTICLE FOR COLUMN NOMART CHAR ( 30) NOT NULL WITH DEFAULT)

vous pouvez utiliser indifféremment les 2 syntaxes

select
NUMART ,
NOMART
from DBARTICLE.Fichier_ARTICLES
ou

select
NUMERO_ARTICLE ,
NOMART
from DBARTICLE.ARTICLES

pour la plupart des autres objets vous pouvez indiquer la clause FOR SYSTEM NAME nomcourt

Création d’un index

CREATE INDEX nomlong FOR SYSTEM NAME nomcourt
ON bd (long ou court)/ table (nom court ou long)
(nom de zone court ou long)

Exemple

CREATE index DBARTICLE.key_articles_numcli FOR SYSTEM NAME key_numli
on DBARTICLE.ARTICLES
(NUMERO_ARTICLE)

Création d’une vue

CREATE VIEW … FOR SYSTEM NAME nomcourt ()

exemple

CREATE VIEW DBARTICLE.articles_nom_b FOR SYSTEM NAME articleb (
NUMERO_ARTICLE , NOMART )
as
(select
NUMERO_ARTICLE , NOMART
from DBARTICLE.ARTICLES
where NUMART like(‘B%’))

Remarques :

Vous pouvez créer une table en faisant un create table as

exemple

CREATE table DBARTICLE.articles_nom_c FOR SYSTEM NAME articlec as
(select
NUMERO_ARTICLE , NOMART
from DBARTICLE.ARTICLES
where NUMART like(‘B%’))
With data

Ce qui permet de récupérer les attributs des zones de la table

Vous pouvez renommer une zone

exemple

CREATE table DBARTICLE.articles_nom_cbis FOR SYSTEM NAME article1 as
(select
NUMERO_ARTICLE , NOMART as nom_article_bis
from DBARTICLE.ARTICLES
where NUMART like(‘B%’))
With data

Mais c’est une nouvelle zone et le nom court est conservé, bien sur sauf si c’est une zone de travail substr par exemple ….

Si vous souhaitez utiliser vos tables en RPG, vous pouvez préciser un nom de format, ce qui vous evitera un renommage dans le programme RPGLE
c’est en utilisant la clause RCDDFMT
CREATE TABLE nomdb.nomtable ( ) RCDFMT nomfmt

Exemple

CREATE TABLE DBARTICLE.Fichier_ARTICLES FOR SYSTEM NAME ARTICLES (
NUMERO_ARTICLE FOR COLUMN NUMART DEC ( 6) NOT NULL WITH DEFAULT,
NOMCLI_ARTICLE FOR COLUMN NOMART CHAR ( 30) NOT NULL WITH DEFAULT)
RCDFMT ARTICLEF

Pour connaitre les correspondances sur les objets existants, vous pouvez utiliser les vues SQL

pour les tables
SELECT TABLE_NAME, SYSTEM_TABLE_NAME FROM systables
where …

pour les index

SELECT INDEX_NAME, SYSTEM_INDEX_NAME FROM SYSINDEXES
where

pour les vues

SELECT TABLE_NAME, SYSTEM_VIEW_NAME FROM sysviews
where

oui la vue s’appelle TABLE_NAME ?????????? ça sent le copier coller …

on peut renommer des noms systèmes sur des objets SQL

Exemples

RENAME TABLE GDATA.LONG_NOM_TABLE TO SYSTEM NAME LONG_NOM

RENAME index GDATA.LONG_INDEX_ZONE1 TO SYSTEM NAME I_ZONE1

RENAME index GDATA.LONG_VIEW_ALL TO SYSTEM NAME LONG_VIEW

Complément

Particularité pour renommer une table

Nous créerons la table suivante

CREATE TABLE gdata/nom_long_table FOR SYSTEM NAME nom_court (
NUMERO_ARTICLE FOR COLUMN NUMART DEC ( 6) NOT NULL WITH DEFAULT,
NOMCLI_ARTICLE FOR COLUMN NOMART CHAR ( 30) NOT NULL WITH DEFAULT)

rappel
Une table a un nom long et un nom court qui doivent être unique

on essaye de dupliquer la table dans la même bibliothèque

CRTDUPOBJ OBJ(NOM_COURT)
FROMLIB(GDATA)
OBJTYPE(FILE) TOLIB(GDATA) NEWOBJ(NOM_COURT2) DATA(YES)

duplication impossible dans la même bibliothèque, le probléme étant sur le nom long qui est dupliqué

Le message est le suivant
Le nom de remplacement attribué au fichier NOM_COURT2 n’est pas admis.

Pour dupliquer votre table vous devez donc passez par SQL

create table gdata/nom_long_table2 like gdata/nom_long_table

vous obtenez bien une 2éme table qui se nomme nom_long_table2

Mais le nom ibmi est fixé par le système ici NOM_L00001
est si vous voulez le renommer vous pouvez le faire par RNMOBJ

RNMOBJ OBJ(GDATA/NOM_L00001) OBJTYPE(*FILE) NEWOBJ(NOM_COURT2)

Vous avez nom long nom_long_table2
Vous avez nom court nom_court2

Vous devez bien faire les 2 opérations

Si vous voulez juste sauvegarder les données

Préférer un create table as en SQL ou un cpyf crtfile(*YES) en IBMI

, , Moderniser vos menus IBMi

Vous pouvez désormais accéder aux fichiers des messages par SQL grâce à la vue SQL QSYS2.MESSAGE_FILE_DATA.

Vos menus personnalisés utilisent des commandes qui sont stockés dans des fichiers messages.

Voici une idée pour améliorer vos menus : prendre la commande à exécuter et l’afficher, vous pouvez customizer l’affichage du texte

J’ai publié le code sur github l’adresse suivante : https://github.com/Plberthoin/PLB/tree/master/GTOOLS

Vous devez récupérer, un DDS , un SQLRPGLE et une CMD.

Voila qui peut vous donner des idées pour la gestion de vos fichiers messages

, , Authentification par JWT (Json Web Token)

Pour mettre en place une authentification par JWT sur IBMi, on utilise l’API Qc3VerifySignature.

Le JWT

Il est composé de trois partie :

  • Un entête (header)
  • Une charge utile (payload)
  • Une signature numérique

Pour obtenir la signature, il faut tout d’abord encoder séparément le header et le payload avec BaseURL64, ensuite, on les concatène en les séparant d’un point.

On calcule enfin une signature d’après le header et le payload afin de garantir que le jeton n’a pas été modifié, d’après l’algorithme défini dans le header (RS256, HS256, HS512, …). Cette signature binaire est elle-même encodée ensuite en Base64URL.

On obtient ainsi le JWT : { header }.{ payload }.{ signature }

Préparation

Afin de tester cette API, il faut dans un premier temps générer une clé au format PEM en suivant les étapes ci-dessous :

  • openssl req -new -out monserveur.csr

Pour créer une demande certificate (.csr = certificat signing request)

Cela crée deux fichiers : monserveur.csr et privkey.pem

  • openssl rsa -in privkey.pem -out monserveur.key

Cela crée le fichier monserveur.key (clé privée sans le mot de passe)

  • openssl x509 -in monserveur.csr -out monserveur.cert -req -signkey monserveur.key

Cela crée le fichier monserveur.cert, qui est le certificat.

Paramètres d’appels de Qc3VerifySignature

  • Signature

La signature est fournie en BASE64, il faut la convertir en binaire pour la fournir à l’API

  • Longueur de signature

La longueur de la signature fournie après sa conversion

  • Donnée à contrôler

{ header }.{ payload } en ASCII

  • Longueur de la donnée à contrôler
  • Format de la donnée à contrôler
  • Description de l’algorithme

C’ ‘est une Data Structure qui contient les paramètres de l’algorithme.

  • Format de la description de l’algorithme
  • Description de la clé

C’ ‘est une Data Structure qui contient les paramètres de la clé.

  • Format de la description de la clé
  • Fournisseur de service cryptographique (0, 1 ou 2)
  • Nom du périphérique de cryptographie (à blanc si fournisseur 1 ou 0)
  • Code Erreur

C’est une Data Structure qui indique le code retour de l’exécution

Cinématique

Pour mettre en place l’appel à Qc3VerifySignature, nous avons défini les formats suivants :

  • Données             DATA0100 : La donnée est contrôlée sur sa valeur et sa longueur
  • Algorithme         ALGD0400 : Paramètres pour une opération de vérification de signature
  • Clé                      KEYD0600 : Certificat PEM (voir paragraphe « Préparation »)

Données

On crée la donnée à contrôler en concaténant header et payload, séparés d’un point, comme expliqué au paragraphe précédent.

Exemple :

ATTENTION : Il faut, pour être utilisable, que celle-ci soit en ASCII. Pour ce faire on utilise le programme système QDCXLATE qui permet de faire de la conversion de chaines de caractères grâce à des tables système.

Data Structure du format ALGD0400 (algorithme) :

cipher   INT(10) inz(50)                  // Code secret pour RSA , initialisé à 50

PKA      CHAR(1) inz(1)                  // PKCS bloc 01

filler   CHAR(3) inz(x’000000’)      // Réservé : ce champ doit rester NULL

hash     INT(10) inz(3)                   // Signature Algorithme de Hash 3=SHA256

Data Structure du format KEYD0600 (clé) :

keylen INT(10)                                       // Longueur du certificat PEM

filler CHAR(4) inz(x’00000000′)           // Réservé : ce champ doit rester NULL

key CHAR(4096) CCSID(65535)           // Certificat PEM en ASCII

Code Retour

L’appel de l’API avec les paramètres choisis , retourne un Data Structure ErrorCode décrite ci-dessous :

bytesProv  INT(10) inz( %size( ErrorCode ) ); // ou 64 pour voir MSGID

bytesAvail INT(10) inz(0);

MSGID CHAR(7);

filler CHAR (1);

data  CHAR (48);

Dans le cas où la signature est vérifiée, les valeurs retour sont les suivantes

  • BYTESPROV = 64                                          
  • BYTESAVAIL = 0                                          
  • MSGID = ‘       ‘                                       
  • FILLER = ‘ ‘                                            
  • DATA = ‘                                                ‘

Si la signature n’est pas vérifiée, les valeurs retour seront  :

  • BYTESPROV = 64                                          
  • BYTESAVAIL = 15                                         
  • MSGID = ‘CPF9DEF’                                       
  • FILLER = ‘0’                                            
  • DATA = ‘                                                ‘
, , Comment repérer les requêtes SQL consommatrices sur votre IBMi

Comment voir à un instant donné, les requêtes les plus consommatrices de votre système ?

Vous êtes sans doute demandé comment connaitre les requêtes SQL qui consomment sur votre système, voici une solution.

Nous allons utiliser un dump du plan cache , vous pouvez aussi y accéder par ACS en quelques clics.

Voici une méthode qui va vous permettre d’automatiser et de trouver plus rapidement un problème.

Commencer par supprimer le fichier qui va servir à extraire le dump

Drop table gdata.dump_cache ;

Extrayez le cache dump dans votre fichier de travail

CALL QSYS2.DUMP_PLAN_CACHE (fileschema => ‘GDATA’, Filename => ‘DUMP_CACHE’) ;

Exécuter une requête sur ce fichier

Dans notre exemple, on sélectionne les jobs actifs sur le système, on sélectionne les requêtes SELECT et on trie par consommation descendante !

With job_act (JOB_NAME_SHORT, JOB_USER, JOB_NUMBER, JOB_USER_IDENTITY)
as (SELECT JOB_NAME_SHORT, JOB_USER, JOB_NUMBER,JOB_USER_IDENTITY
FROM TABLE (QSYS2.ACTIVE_JOB_INFO(DETAILED_INFO => ‘ALL’)) X
where substr(job_user_identity, 1, 1) <> ‘Q’)
Select qqjob, qquser, qvc102, qqjnum, qq1000, qqi6 as temps_execution
from gdata.dump_cache a join job_act b on
QQJOB = JOB_NAME_SHORT and QQUSER = JOB_USER and QQJNUM = JOB_NUMBER
where substr(QQ1000 , 1, 6) = ‘SELECT’
order by qqi6 desc

Vous pouvez changer vos critères de tri et de sélection, ici on est en mode pompier ?
Vous pouvez planifier cette requête et la faire tourner plusieurs fois par jour sur votre système en gardant le résultat ou les dump cache.

Nous avons packagé ce script pour faire une commande WRKSQLJOB que vous pouvez trouver ici !

https://github.com/Plberthoin/PLB/tree/master/GTOOLS


Vous retrouvez également une version un peu plus évoluée dans notre produit GODBC
https://www.gaia.fr/produits/

Les sites à connaitre, si vous voulez aller plus loin :

https://www.ibm.com/docs/en/i/7.4?topic=services-dump-plan-cache-procedure
https://www.ibm.com/docs/en/i/7.4?topic=cache-creating-snapshots

https://www.ibm.com/docs/api/v1/content/ssw_ibm_i_74/pdf/rzajqpdf.pdf

, , , Renommer votre serveur LDAP Pour EIM

Vous utilisez la solution de single signon sur IBMi à base de kerberos et EIM

Votre serveur LDAP change de nom

Voici la liste des opérations à effectuer

Sur le serveur LDAP, vous n’avez rien à faire

Sur le serveur Kerberos

Vous avez 2 modifications à faire

Changer le nom du KDC sur l’onglet principal

Changer le nom du serveur de mot de passe sur l’onglet Serveur de mot de passe

Sur le serveur EIM

Sur le domaine changer le registre kerberos

Créer un nouveau registre utilisateurs de type source kerberos

et vous devrez ensuite sur chaque inscription remplacer votre source par le nouveau serveur

Ca peut être long si vous n’avez pas d’outils pour le faire

Notre produit GEIM peut vous aider dans cette tache !