29 novembre 2012

Utilitaire db2top : suivre l'activité d'une base DB2

DB2 fournit sous Unix une interface permettant de suivre l'activité de la base : db2top
Ci joint un lien vers un manuel assez pratique, avec des cas d'usage.





Pour avoir le rendu en couleurs, faire un :
export TERM=xterm

Puis appeler l'exécutable :
db2top

La vue dynamic SQL accessible par "D" permet de consulter les ordres SQL dynamiques en cours.
A noter : 
  • on n'y trouve pas les requêtes statiques (sans champs variabilisés - stockées dans des bibliothèques DB2 lors du BIND),
  • Pour changer le tri , faire "z" ou "Z",
  • Pour voir l'ordre complet, faire "L" puis indiquer l'identifiant "HashValue" de la requête,
  • L'option -V permet de spécifier le schéma par défaut - ce qui peut être utile à db2expln et db2exfmt (option "e" et "x" pour l'analyse du plan d'accès de la requête).
  • Pour rafraichir les données (purger le tampon) des "dynamic sql", faire "R".
Il y a d'autres vues, comme "T" pour les tables accédées ou "U" pour les verrous actifs.

Des options par défaut peuvent être spécifiées dans $HOME/.db2toprc.

Vous pouvez collecter les données en batch - ici pendant 5 minute avec un intervalle de 30 secondes :
db2top -C -d hradev -b m -m 5 -i 30 -f $TMP/db2top.file

[14:41:32] Starting DB2 snapshot data collector, collection every 30 second(s), max duration 5 minute(s), max file growth/hour 100.0M, hit <CTRL+C> to cancel...
[14:41:32] Overridding previous occurence of '/hradev/hraccess/txt/tmp/db2top.file'
[14:42:02] 1.4M written, time 30.112, 173.8M/hour
...

[14:46:33] 8.5M written, time 300.962, 103.0M/hour
[14:47:03] Max duration reached, 8.5M bytes, time was 331.062...
[14:47:03] Snapshot data collection stored in '/hradev/txt/tmp/db2top.file'
Exiting...


Puis extraire les données du fichier :
db2top -d hradev -b l -f $TMP/db2top.file
Time;Application_Handle(Stat);Cpu%_Total;IO%_Total;Mem%_Total;Application_Status;Application_Name;Delta_RowsRead/s;Delta_RowsWritten/s;Delta_IOReads/s;Delta_IOWrites/s;Delta_TQr+w/s;Sess_Memory;Assoc._Agents;Paral._Degree;Lockwait_(sec);Locks_Held;Sorts_(sec);Log_Used;Delta_RowsSelect/s;Fetch_Count(Stmt);Dynamic_SQL;Static_SQL;#of_XQueries;Os_User;DB_User;Client_NetName;Client_Platform;Status_ChTime;Time_InStatus;IoType_(Data/Index/Temp);Sorts_Overflows;Hash_Join_Overflows;Client_Pid;Node_Number;Last_Operation;TimeTo_Connect;Session_Cpu;Statement_Cpu;Max Cost_Estimate;Wkd_Id;Recent_Cpu[1]
14:43:33;18528;0.00%;2.08%;4.76%;UOW Waiting in the application;db2jcc_applicat;43;20;713;0;0;262144;1;1;0;0;0;0;25;0;3613;354;0;DIGIX;DIGIX;digix;ABCD;14:43:04;28.081875;ddddddddddddddddddd;0;0;0;0;Static Commit;1.340;0.240599;0.000008;0;1;0.000
14:44:33;18528;0.00%;30.77%;4.40%;UOW Waiting in the application;db2jcc_applicat;0;0;16;0;0;262144;1;1;0;0;0;0;0;0;3639;362;0;
DIGIX;DIGIX;digix;ABCD;14:44:04;29.102762;ddddddddddddddddddd;0;0;0;0;Static Commit;1.340;0.245410;0.000012;0;1;0.000
...

  
Avec l'option -A on a un résumé orienté performance par application.

 Rank Application_Handle(Stat)        Percentage fromTime toTime                   sum(Cpu%_Total)
----- ------------------------------ ----------- -------- --------- ------------------------------
    1 18528                             50.0000% 14:44:33 14:46:03                          100000
    2 5288                              50.0000% 14:44:33 14:46:03                          100000
    3 20799                              0.0000% 14:44:33 14:46:03                               0


Merci à Michel pour le tuyau.

28 novembre 2012

Mise a jour des références croisées des squelettes par TYBXRBS

Depuis HRv7, une chaîne technique TYBXRBS est mise a disposition pour permettre la mise a jour des références croisées d'un squelette (CALL entre programmes, relations programmes et contextes, liens avec des compteurs de paie). Ces références croisées sont stockées dans les tables RF**.

Cette opération est nécessaire après avoir livré un squelette par copie du fichier (suite à réception d'un patch Hot Line ou d'une personnalisation).

14 novembre 2012

Maintenir des processus Utilitaires



Les processus utilitaires (de qualification "UT") peuvent servir à plusieurs titres :
  • Chaîne NOY d'export de données,
  • Chaîne ROL de dé-vérolage de dossiers (reconstruction des TD12 et renumérotation des NULIGS, NULIGP des informations historiques),
  • Chaîne ROM pour generation de bordereaux de purge des informations historiques
  • Chaîne ROS pour édition de la LG10
  • Chaîne RBI pour edition TXT du contenu d'un dossier en base
Il est important de pouvoir disposer de ces outils sur tous les environnements (surtout les NOY et ROL). Maintenez donc pour chaque structure de données un processus utilitaire (en standard vous trouverez des processus YIY**. Ouvrez les pour contrôle car il est parfois nécessaire d'y renseigner le code Structure de données).



Ci joint une commande script permettant de connaitre les informations manquantes à rattacher à vos processus, au vu des données présentes dans la base :

ls $SIGACS/prod/gnt/YIY??BCG.so |sed 's/^.*YIY\(..\)BCG.so/\1/' | while read SD
do
   echo "select distinct '${SD}'||CDINFO from ${SD}TD12 where NOMBRE>0 

   minus select CDSTDO||CDINFO from AP30 where TEANNU='0' and CDPROS='YIY${SD}';"
done | sqlplus -s HR/password


Dans l'autre sens pour connaitre les informations a priori inutiles et détachables de vos processus :
ls $SIGACS/prod/gnt/YIY??BCG.so |sed 's/^.*YIY\(..\)BCG.so/\1/' | while read SD
do
   echo "
select CDSTDO||CDINFO from AP30 where TEANNU='0' and CDPROS='YIY${SD}' 
   minus select distinct '${SD}'||CDINFO from ${SD}TD12 where NOMBRE>0;"
done | sqlplus -s HR/password

13 novembre 2012

FATAL - HRJS9002 An exception occurred while starting RMI : Port already in use


Comme dans le message concernant le AP0, les causes de cette contention peuvent être multiples.

Dans notre cas le problème de démarrage de HRQuery était dû au fait que le port de communication était déjà attribué par le système d'exploitation à une autre application. En effet, la plage des ports non réservés (et libres pour attributions dynamiques) est de 9000 à 65000 et les ports utilisés par l'environnement étaient dans cette plage.

Afin de ne pas reproduire ce problème, il faut relever la borne inférieure de la plage (dans notre exemple à 33500).
  • Sous LINUX
pour connaitre la plage d'attribution dynamique :
sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 9000     65500


Pour la modifier :

sysctl -w net.ipv4.ip_local_port_range="33500 65500"
net.ipv4.ip_local_port_range = 33500    65500

Merci Gabriel ...
  • Sous AIX
no -a | grep ephemeral
       tcp_ephemeral_high = 65535
        tcp_ephemeral_low =
32768
        udp_ephemeral_high = 65535
        udp_ephemeral_low = 32768

et 
no -o tcp_ephemeral_low=33500 -o tcp_ephemeral_high=65535 
(mais cette mise a jour non pérenne - inclure la commande dans le fichier /etc/rc.tcpip juste avant le démarrage des démons).

D'autres cas sont discutés sur ephemeral_ports.html ...

7 novembre 2012

Erreur lors du FTP de publication - pensez au mode "Passif"

Par défaut le protocole FTP fonctionne en mode "actif" : pour l'envoi des données c'est le serveur qui initialise la session TCP vers un port choisi dynamiquement par le poste client.

Cela pose problème en cas de translation d'adresse et/ou de firewall - ce qui impose en général d'utiliser un mode "passif" où cette fois c'est le client qui initialise et le serveur qui choisit le port.

Dans le doute - dans l'objet Site HRS - toujours choisir un fonctionnement en mode "passif" au niveau du connecteur FTP lié à la publication.





A noter : le client FTP présent sur Windows ne permet pas de passer en mode passif



(sauf avec la commande "literal pasv" ou "quote pasv" mais cette dernière impose de s'être connecté...)

A la différence du client FTP Unix


Ci joint un lien sur Wikipedia - lire le chapitre "Établissement des connexions" et sur ce blog.

6 novembre 2012

unable to load options.xml

Il arrive que ce message "unable to load options.xml" apparaisse à l'ouverture d'une page de HR Access Web (HRv5) ou au moment de l'accès à un formulaire du client riche (HRv7, HRv9). Les causes peuvent être multiples ... Toutefois, avant d'appeler la Hot Line à l'aide, pensez à :

  • Vider le cache de votre navigateur web (outils / options internet)

  • Ainsi que celui de la console java (panneau de configuration / java) 


Merci Gabriel ...

5 novembre 2012

RBF et EXECUTE DBMS_REFRESH.REFRESH(NAME=>'V3')

La chaine RBF termine ses DDL de création de tables par la commande :

EXECUTE DBMS_REFRESH.REFRESH(NAME=>'V3')

Cet ordre permet d'exécuter une procédure stockée Oracle qui rafraîchit les vues V31 et V3.
Ces vues servent à RBF pour connaître le nombre de colonnes des clefs primaires - la chaîne utilise ce critère pour déterminer si la clef primaire sur l'information "00" doit être recréée...

Dans le squelette de BGA :

587400*ALTER TABLE PRIMARY KEY                                          P006
587500*N35EH.    NOTE *LECTURE DU NOMBRE DE COLONNES      *.            P005
587600 F35EH.                                                           P005
587700*DE LA CLE PRIMAIRE                                               P006
587800*<DEBSUB>RDVUES                                                   P010
587900     EXEC SQL    SELECT           NBCOLK                          P100
588000                 INTO             :H-NBCOLK                       P150
588100                 FROM %1.V3                                       P200
588200                 WHERE  RDTABL =  :H-RDTABL AND                   P300
588300                        CDTABL =  :H-NMTABL            END-EXEC.  P310
588400*<FINSUB>                                                         P900

...
592000*N35FN.    NOTE *CAS DE L"INFORMATION FIXE          *.            P005
592100 F35FN.    IF    WP00-TEIN00 = "1"                                P005
592200           NEXT SENTENCE ELSE GO TO     F35FN-FN.                 P005
592300*PRINCIPALE :                                                     P006
592400*IL FAUT AVOIR UNE CLE PRIMAIRE                                   P007
592500*SUR NUDOSS POUR NE PAS GENERER                                   P008



Le script TUE.sql de prod/ddl contient les ordres de création "CREATE MATERIALIZED VIEW V31", "CREATE MATERIALIZED VIEW V3" et le " begin DBMS_REFRESH.MAKE".

1 novembre 2012

Mettre a jour les séquences d'attribution du NUDOSS

Depuis HRv7 les NUDOSS sont ne sont plus calculés sur la base de l'horodatage système, mais attribués par une séquence Oracle ou DB2 nommée SEQU{SD}.

Si vous devez purger ou livrer des dossiers par un outil du SGBD (imp, load), ces séquences ne seront pas mises à jour, ce qui peut être source d'erreurs de type "clef en double" lors des futures créations de dossiers :
  • sous Oracle : code erreur SQL 1
  • sous DB2 : code erreur SQL 803
Exemple d'erreur induite :
  • Avec NOZ : 
BQL-BBAD0015-ERREUR D'ACCES (TABLE RELATIONNELLE) : S1/EXECUTE/10/PK/000000000000001
BQL-BBAD0015-ERREUR D'ACCES (TABLE RELATIONNELLE) : S1/EXECUTE/10/PK/000000000000803
  • Avec NRB :  
Zone libre : BML40DD-000000001 / BML40DD-000000803
et message BME-BBAM0016-ERREUR GRAVE DURANT LA MISE A JOUR 

Pour mettre à niveau une séquence, dans un premier temps sélectionnez le plus grand NUDOSS (exemple pour ZY) :
SQL> select max(NUDOSS) from ZY00;
126

Sous DB2 mettez a jour la séquence par un ALTER :
DB2> alter sequence SEQUZY restart with 127

Sous Oracle vous devrez détruire et recréer la séquence :
SQL> drop sequence SEQUZY;
SQL> create sequence SEQUZY start with 127;