Vous pourrez améliorer ce script en utilisant un mot de passe que vous récupérez à l’exécution, pensez bien à supprimer le fichier script FTP même dans QTEMP.
Vous pouvez également demander la log, en re-routant le stdout
Si vous utilisez le mail, l’utilisateur doit être inscrit à smtp.
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2020-09-11 11:30:252022-04-13 18:35:39Utiliser un script SQL pour faire du FTP
*JOBEND L’historique du travail sera généré par le travail lui-même. Si l’historique du travail ne peut pas générer son propre historique du travail, celui-ci sera généré par un serveur d’historique du travail.
*JOBLOGSVR L’historique du travail sera généré par un serveur d’historique du travail.
*JOBEND est la valeur historique, cette valeur est beaucoup moins performante sur les nouveaux systèmes que *JOBLOGSVR.
Il est donc conseillé de mettre en place la valeur *JOBLOGSVR.
la deuxième valeur système est QJOBMSGQFL *NOWRAP La file d’attente de messages du travail ne fait pas l’objet d’un bouclage.
*WRAP La file d’attente de messages du travail fait l’objet d’un bouclage.
*PRTWRAP La file d’attente de messages du travail fait l’objet d’un bouclage et les messages écrasés sont imprimés.
il est conseillé pour éviter d’avoir des messages bloquants de mettre *WRAP, ce qui permettra d’avoir les dernières informations loguées.
2) Choisir le niveau de log adapté
C’est les paramètres LOG() LOGCLPGM() du travail. ils sont fixés par JOBD ou par les paramètres de la commande SBMJOB.
On divise généralement en trois les types les travaux de votre IBM i :
Les travaux sensibles qui devront avoir le niveau de log maximum
LOG(4 00 SECLVL) LOGCLPGM(YES)
Les travaux communs , batchs traditionnels sessions interactives
LOG(3 00 SECLVL) LOGCLPGM(NO)
Les travaux qui ne doivent pas avoir de log, pour des questions de sécurité, ou des travaux trop nombreux et souvent très courts
LOG(0 99 NOLIST) LOGCLPGM(NO)
le niveau peut être ajusté par programme, CHGJOB LOG( ) LOGCLPGM( )
3) Choix du mode d’épuration
La meilleur solution est d’utiliser le cleanup standard de la machine.
Vous pouvez voir les paramètres par la commande ==> go cleanup
par l’option 1 vous voyez le paramétrage si le ménage est possible, l’heure de démarrage et la durée. Le plus souvent on est réglé à 30 jours.
Pour démarrer le ménage c’est la commande STRCLNUP , il est conseillé de la mettre dans le programme STRUP de votre partition.
Les spools de log sont placés dans l’outq QEZJOBLOG, vous pouvez éventuellement épurer des spools particuliers, le mieux étant de ne pas les produire.
4) Nouveautés de SQL AS A Service
Il y a plusieurs vues, et fonction table qui peuvent, vous aidez, voici les 2 principales :
La fonction table QSYS2.JOBLOG_INFO() permet de voir le contenu d’une joblog.
Exemple :
SELECT * FROM TABLE(QSYS2.JOBLOG_INFO(‘378809/QUSER/QZDASOINIT’)) A
pour voir la log du job identifié
La vue QSYS2.OUTPUT_QUEUE_ENTRIES permet de voir la liste des spools d’une OUTQ.
Exemple
select * from QSYS2.OUTPUT_QUEUE_ENTRIES where OUTPUT_QUEUE_NAME = ‘QEZJOBLOG’
pour voir les spools de l’outq des joblogs
5) Remarques générales
Il est souvent inutile de sauvegarder des spools de log, sauf à avoir une réelle raison … et un moyen de suivi !
Un surveillance quotidienne est plus efficace qu’une recherche hypothétique dans un spool de 10 mois
Attention, un spool qui reste est une place de travail occupé dans la table des travaux.
Vous pouvez décorréler les spools des travaux mais ce n’est pas culturel et ça peut compliquer vos recherches futures.
Attention au programme en mode debug avec du SQL, l’optimiseur rempliera rapidement la log.
L’ILE produit plus de log que l’OPM, c’est normal vous avez un niveau de plus à gérer, ca peut doubler les lignes écrites !!!
Pour avoir une vue de des spools de log, pensez à la commande, WRKJOBLOG
Un travail n’a pas forcément de log , la seule qu’il laisse dans tous les cas c’est un message CPF1124 pour son démarrage et un message CPF1164 pour indiquer sa fin.
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2020-09-06 19:08:052022-04-14 09:33:085 choses à savoir sur les logs de votre IBMi
Administration5 opérations à prévoir pour renommer une partition IBMi
Si vous voulez changer le nom de votre partition, attention il y a plusieurs noms à changer.
1) Les attributs réseaux
Attention, on parle ici plutôt du réseau SNA, c’est le nom que vous avez sur la mire d’ouverture 5250. Même si SNA est de moins en moins utilisé, le système l’utilise toujours. Vous pouvez voir cette information par la commande DSPNETA et l’extraire dans un programme CLLE par l’autre commande RTVNETA. C’est la commande CHGNETA qui permet de modifier Exemple :
CHGNETA SYSNAME(VOTRESYS) Pour que la modification soit prise en compte vous devez faire un IPL.
Vous devez ensuite modifier les inscriptions dans la directory SNA, vous pouvez les voir par la commande WRKDIRE. on ne peut pas changer l’identification SNA, vous devrez faire un ADDDIRE, et un RMVDIRE. Vous pouvez avoir la liste des inscriptions par la table QAOKP01A .
Exemple :
SELECT WOS1DDEN As Id_utilisateur, WOS1DDGN as adresse , WOS1USRP as Profil_util FROM QAOKP01A
Les valeurs peuvent apparaitre en hexadécimal lors de l’utilisation d’un script SQL ACS; on pourra faire un cast(nomzone as char(20) ccsid 37) pour les rendre lisibles.
2) Le nom de la base de données
Ce nom est utilisé par SQL, vous le voyez quand vous faites un connect (parfois implicite). Si vous faites un STRSQL , vous avez ce message , Connexion en cours : base de données relationnelle NEPTUNE. Pour voir les bases de données définies vous avez la commande WRKRDBDIRE, vous avez une seule Base de données locale. Vous pouvez voir la liste des bd par la table SQL QADBXRDBD
Exemple :
SELECT DBXRDBN nom_db FROM QADBXRDBD where DBXRMTN = ‘*LOCAL’
remarque :
Pour changer le nom de votre BD, vous devez la supprimer et la recréer ADDRDBDIRE et RMVRDBDIRE. attention sur la commande vous aurez un message (CPA3E01), à ignorer en répondant ‘G’ et il faut également reprendre les attributs de sécurité existants Vous devrez arrêter le service base de données pour que cela soit pris en compte
3) Le nom TCP/IP
C’est le nom utilisé par le réseau TCPIP, pour voir ces attributs, vous devez utiliser Navigator for i, vous pouvez le voir également par la vue QSYS2.TCPIP_INFO. exemple : SELECT substr(LOCAL_HOST_NAME, 1, (locate(‘.’, LOCAL_HOST_NAME)-1) ) FROM QSYS2.TCPIP_INFO
Pour le modifier c’est la commande CHGTCPDMN vous allez également indiquer un nom de domaine,
exemple: CHGTCPDMN HOSTNAME(‘votrenom’) …
Vous devrez arrêter TCPIP que cela soit pris en compte
remarque :
Ce nom peut être important pour certaines applications externes, surtout si vous mettez en place du SSO par exemple, le nom doit matcher avec celui qui est publié dans votre DNS
4) Le nom NETBIOS
C’est le nom utilisé par NetServer , vous pouvez le voir dans les propriétés de Navigator for i
pour le modifier vous devez utiliser par l’interface Navigator for i ou par l’api QZLSCHSN. exemple CALL QZLSCHSN PARM(‘nom_server’ ‘window’ ‘Description’ ‘ ‘) pour que la modification soit prise en compte vous devez arrêter et redémarrer NetServer
remarque :
Attention, si vous avez deux machines avec le même nom sur votre réseau, seule la première pourra démarrer Netserver
5) Sur la HMC
Vous devez ouvrir votre HMC Dans les propriétés de la partition vous pouvez changer le nom Il existe des commandes SSH pour connaitre un nom de partition, voire le changer , mais c’est un peu plus compliqué à automatiser.
Conseils :
Si vous faites une bascule de machine attention à n’avoir qu’une inscription dans votre DNS. Il est conseillé de mettre le même nom partout attention 8 caractères maximum, sinon vous devez avoir un transposition facile à faire. Le plus simple et de faire les modifications et un IPL dans la foulée pour tout mettre à jour.
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2020-09-02 11:05:422022-04-14 10:02:105 opérations à prévoir pour renommer une partition IBMi
Jusqu’en version 7.3, on utilisait une dtaara QFDTJRN qui indiquait comment journaliser les objets de la bibliothèque.
En version 7.4, les informations de journalisation sont inclues dans la description de la bibliothèque et la dtaara QDFTJRN n’est plus utilisée.
Il n’y aura pas d’erreur, juste les nouveaux fichiers ne seront pas journalisés, ce qui peut générer des problèmes plus tard …
On peut les voir par la commande ==>DSPLIBD votre_bib puis <F10> Affichage des règles d’héritage
Vous avez une ligne par type d’objets, *FILE, *DTAARA, *DTAQ
Pour les mettre en place, on peut utiliser les commandes suivante STRJRNLIB démarrer la journalisation ENDJRNLIB arrêter la journalisation CHGJRNOBJ *LIB modifier les attributs de journalisation
AdministrationSuperviser QSYSOPR simplement avec un watch !
Il existe beaucoup de techniques pour superviser des files d’attente
La première consiste à faire boucler un robot qui lira les messages par la commande RCVMSG
La deuxième consiste à utiliser une vue SQL AS SERVICE, QSYS2.MESSAGE_QUEUE_INFO en allant boucler dessus
Il en existe d’autres avec des API etc…
J’ai choisi de vous présenter une technique un peu moins connu mais très efficace et très facile à mettre en œuvre, les Watches.
Un watch c’est un peu comme un trigger ou un programme d’exit, on va associer un programme qui se déclenchera sur un événement, ici un message nécessitant une réponse dans la file QSYSOPR.
Vous pouvez voir les sessions de watch actives par la commande ==>WRKWCH WCH(*STRWCH)
Pour démarrer une session c’est la commande STRWCH
dans notre cas on indiquera les paramètres suivants
Vous conaissez tous la commande CPYTOIMPF qui va vous permettre de générer un fichier d’exportation, que vous pourrez fournir à un partenaire .
Voici quelques informations complémentaires qui pourront vous aider
1) C’est un moyen simple de centraliser sur L’IBMi des conversions de fichier base de données vers du CSV ou du EXCEL.
Ça vous évitera les .TTO dispatchés partout sur vos environnements Windows et difficiles à maintenir. L’utilisateur retrouvera ses fichiers dans l’IFS, les bonnes pratiques poussent vers le répertoire /home/votreuser/ L’utilisateur pourra également se faire envoyer son fichier par mail, la commande IBMi native SNDSMTPEMM permettant de joindre une pièce jointe. Si vous utiliser un outil complémentaire vous pouvez même faire des envois FTP vers des serveurs annexes.
2) Gestion du CCSID
Vous allez avoir à gérer celui du fichier source est celui du fichier cible
Pour le fichier source, il est conseillé si ce n’est pas le cas de forcer un ccsid
Par la commande en début de programme CHGJOB CCSID(1147) ou 297 pour la France, vous éviterez ainsi les problèmes d’extractions intermédiaires.
L’ennemi c’est le CCSID(65535) qui d’ailleurs va vous poser de plus en plus de problèmes notamment avec les produits Open source.
Pour le fichier cible il vous suffit d’indiquer le paramètre STMFCCSID(*PCASCII) ou 1252 qui est le CCSID de windows par défaut, sur la commande CPYTOIMPF.
Oui on pourrait faire de l’unicode …
3) CSV ou XLS
il y a peu de différence entre un CSV et un XLS que sait produire votre IBMi.
La vérité, elle se joue quand votre utilisateur double clique sur le fichier et qu’il ne s’ouvre pas directement par excel.
voici les paramètres pour un CSV CPYTOIMPF TOSTMF(‘xxxx.csv’) + RCDDLM(CRLF) STRDLM(NONE) FLDDLM(‘;’)
le fichier s’ouvrira directement dans EXCEL
voici les paramètres pour un EXCEL CPYTOIMPF TOSTMF(‘xxxx.XLS’) RCDDLM(CRLF) STRDLM(NONE) FLDDLM(‘*TAB’)
Vous pouvez avoir malgrè tout un message à l’ouverture, mais aucune manipulation à faire.
4) Tri du fichier
Vous avez un paramètre qui va vous permettre de trier votre fichier comme un order by SQL
c’est le paramètre ORDERBY , exemple ORDERBY(‘Datecreat desc’) qui triera par ordre de création
5) Entête de colonne
Si vous désirez un entête de colonne, le meilleur compromis c’est de mettre le paramètre ADDCOLNAM(*SQL)
Si vous avez un nom long SQL provenant de votre table, vous aurez ceci
Il y a toujours la solution de passer par une requête intermédiaire sur les zones vous pourrez indiquer la clause AS .
Par exemple
select numcli as ‘Numero_client’ ….
Conclusion :
La commande CPYTOIMPF est une commande simple pour convertir vos fichiers Base de données. Elle vous permet de garder la main, un batch de nuit peut générer des extractions, les utilisateurs n’ont pas besoin d’ ODBC, ni de droit sur le fichier d’origine.
A l’heure de SQL services , il peut être opportun de faire des contrôles BRMS par SQL.
Le fichier qui se cache derrière la commande DSPLOGBRM est le fichier QA1ALG ,et il se trouve dans la bibliothèque QUSRBRM.
Une exécution de sauvegarde en BRMS s’appelle un groupe de contrôle. Quand on passe la commande STRBKUBRM on lui indique un groupe de contrôle à exécuter.
Voici comment savoir si une sauvegarde s’est bien passée ? Vous allez sélectionner la date du contrôle, attention la date et au format numérique sAAMMJJ (s étant à 1 en 2000, à 0 en 1900) Vous allez sélectionner le job qui est égal au groupe de contrôle, si le travail a un nom différent vous pouvez tester substr(LGMDTA, 1, 10) à la place de LGJOB. Vous allez choisir les id messages suivants -BRM1380 début du groupe de contrôle -BRM1049 Fin normale du groupe de contrôle
Voici 2 exemples de requêtes
en CLP runsql(‘create table qtemp/ctlgrp as( + SELECT LGJOB, LGDATE, LGTIME, LGJNBR, LGMID FROM qusrbrm/QA1ALG + where LGJOB = »QUOT » and LGDATE = 1200707 + and LGMID in( »BRM1380 » , »BRM1049 »))’) commit(*none)
/* lecture du nombre d’enregistrements */ rtvmbrd file(qtemp/ctlgrp) NBRCURRCD(&nbr)
en RPGLE
exec sql SELECT count(*) into :NBR FROM qusrbrm/QA1ALG where LGJOB = ‘QUOT’ and LGDATE = 1200707 and LGMID in(‘BRM1380’ , ‘BRM1049’) ;
Dans les 2 cas, l’interprétation de la variable NBR est la suivante
Si vous avez 0 dans NBR, le groupe de contrôle n’a pas été lancé. Si vous avez 1 dans NBR, le groupe a été lancer mais il a des erreurs à contrôler. Si vous avez 2 dans NBR, tout est ok.
Conclusion
On peut facilement ajouter ce contrôle dans une sonde d’un outil de supervision .
Il est également conseillé d’enregistrer un exemple dans les requêtes des utilisateurs de ACS
Vous pouvez également ajuster vos contrôles pour différencier les cas d’anomalie , etc …
Suite à une sauvegarde, vous avez tous eu un message du genre CPF3837 Message . . . . : 678999 objets sauvegardés. 4 non sauvegardés.
Faisons une expérience !
1 session sous QSECOFR verrouillage d’un fichier chkout ‘/home/QSECOFR/VERSIONODE.TXT’
2 session sous plb edtf ‘/home/QSECOFR/VERSIONODE.TXT’ on peut éditer mais pas enregistrer CPFB620 Resource busy.
3 session sous QSECOFR edtf ‘/home/QSECOFR/VERSIONODE.TXT’ On peut éditer et enregistrer sans problème Donc le verrouillage est lié à l’utilisateur, le même utilisateur sur une autre session peut accéder au fichier sans restriction
Pour voir ce verrouillage vous pouvez utiliser sur la session 2 par exemple
WRKLNK ‘/home/QSECOFR/VERSIONODE.TXT’ 8=Afficher les attributs Vous constatez que le fichier est bien verrouillé Verrouillage par . . . . . . . . . . . : QSECOFR Date/heure de verrouillage . . . . . . : 27/07/20 13:58:23
Vous pouvez également utiliser la table fonction QSYS2.IFS_OBJECT_STATISTICS zone CHECKED_OUT
Vous sortez par signoff de la session qui vérouille ce fichier
Vous refaites la commande sur la session 2
WRKLNK ‘/home/QSECOFR/VERSIONODE.TXT’ 8=Afficher les attributs Vous constatez que le fichier est bien verrouillé Verrouillage par . . . . . . . . . . . : QSECOFR Date/heure de verrouillage . . . . . . : 27/07/20 13:58:23
Conclusion contrairement à un ALCOBJ, le fichier reste verrouillé, même quand le travail est arrêté, le verrouillage est lié uniquement à l’utilisateur
vous pouvez, si vous avez les droits sur le fichier, faire chkin ‘/home/QSECOFR/VERSIONODE.TXT’ qui déverrouillera le fichier
Attention ce n’est pas ce verrouillage que vous trouvez par la nouvelle vue ifs_object_lock_info
Puisque quand vous faites la requête suivante, vous avez 0 enregistrement
Prenons maintenant un fichier dont on est sûr qu’il est verrouillé applicativement, ici une log apache
select i.* from table ( qsys2.ifs_object_lock_info(‘/www/ws_demo/logs/error_log.Q120072700’)) i;
On obtient bien une ligne avec un travail exemple : 778168/QTMHHTTP/WS_DEMO, et des informations sur les différents types et modes de verrouillage
Par contre si vous faites wrklnk ‘/www/ws_demo/logs/error_log.Q120072700’ puis option 8 vous ne voyez pas de verouillage pour ce fichier
et si vous essayez d’éditer ce fichier vous avez le même problème que tout a l’heure, vous ne pourrez pas enregistrer votre modification CPFB620 Resource busy.
Si vous arrêtez l’instance apache qui verrouille le fichier votre fichier est déverrouillé, vous pouvez le mettre à jour.
En résumé
il y a 2 verouillages:
Un plutôt système, par les commandes CHKIN et CHKOUT que vous voyez dans les attributs du fichier.
Vous pouvez également le voir par la fonction table QSYS2.IFS_OBJECT_STATISTICS
Exemple dans notre cas
SELECT PATH_NAME, OBJECT_OWNER, CHECKED_OUT FROM TABLE (QSYS2.IFS_OBJECT_STATISTICS(START_PATH_NAME => ‘/home/QSECOFR/VERSIONODE.TXT’) )
Un plutôt applicatif, c’est l’api d’ouverture généralement qui fixera ce verrouillage vous pouvez voir ces verrouillages par l’API QP0LROR ou par la fonction table, qsys2.ifs_object_lock_info
Remarque :
Pour mettre à jour un fichier vous n’êtes pas obligé de verrouiller le fichier, exemple si vous avez 2 EDTF sur le même fichier c’est le dernier qui a raison. Il est donc conseillé de verrouiller votre fichier, si vous faites des mises à jours dans vos applicatifs.
Conclusion :
Si, suite à une sauvegarde, vous avez un verrouillage sur un fichier commencer par vérifier s’il y a un verrouillage système par WRKLNK ou par la fonction table QSYS2.IFS_OBJECT_STATISTICS c’est la zone CHECKED_OUT Si c’est le cas faites un CHKIN sur votre fichier pour le libérer ! Si il n’y a pas de verrouillage regardez par la fonction table qsys2.ifs_object_lock_info ou l’api QP0LROR Si vous trouvez le travail, vous devrez l’arrêter avant votre prochaine sauvegarde. Mais il est aussi possible que le job ne soit plus actif …
Vous avez intérêt à monitorer votre commande SAV et à analyser les erreurs pour les corriger
Vous pouvez combiner ces 3 informations pour établir un contrôle précis – L’utilisateur – La commande FTP – La ressource Vous pouvez rendre paramétrable ces validations en créant par exemple un petit fichier qui liste des utilisateurs avec les commandes FTP aux quels ils ont droit .
Remarques
La mise en place de votre programme d’exit ne se substitue pas aux autorisations natives de l’IBM i, un utilisateur interdit à un fichier ne peut pas y accéder … Vous avez intérêt à passer par une phase d’analyse (qui fait quoi? ) Une fois que vous avez validé qui doit faire quoi , il faut fermer et ouvrir par exception Votre programme doit être optimisé Votre programme ne doit pas planter
Mais il peut arriver que le fichier soit endommagé, et les commandes IBMi habituelles sont inefficaces sur ce fichier (idem pour RCLDBXREF et RCLSTG). C’est souvent un verrouillage du fichier QSYS2/SYSIXADV par des jobs QDBSRVxx qui fait planter votre sauvegarde par exemple.
Voici la procédure à suivre Vous devrez trouver le bon CCSID c’est celui de la zone DBXFIL du fichier QADBXREF par exemple par SQL en faisant
SELECT « CCSID » FROM SYSCOLUMNS
WHERE COLUMN_NAME = ‘DBXFIL’ and
TABLE_NAME = ‘QADBXREF’
Si vous n’arrivez pas, allouer le fichier. Vous allez devoir arrêter index advisor en ajoutant une variable d’environnement ADDENVVAR ENVVAR(QIBM_NO_INDEX_ADVICE) VALUE( ») LEVEL(SYS) pour que cela soit pris en compte vous devez faire un IPL
Vous devez ensuite refaire la procédure ci dessus attention il faut redémarrer index advisor en enlevant la variable d’environnement par
RMVENVVAR ENVVAR(QIBM_NO_INDEX_ADVICE) LEVEL(SYS) Vous devez refaire un IPL
Pour contrôler, vous pouvez regarder les variables d’environnement
WRKENVVAR ou par sql SELECT CAST(VAR_BNAME AS CHAR(50)) AS Nom_Variable, VAR_BVALUE AS Valeur_variable, VAR_CCSID AS CCSID_variable FROM QSYS2.ENVIRONMENT_VARIABLE_INFO WHERE VAR_TYPE = ‘SYSTEM’
et ensuite vous surveillez que le fichier QSYS2/SYSIXADV se remplisse de nouvelles suggestions.