Pause-Café Volubis

pause-café

rendez-vous technique
Pause-Café est une réunion technique
destinée aux informaticiens sur plateforme IBM i.
Elle a lieu 3 à 4 fois par an : en Bretagne et sur internet.

Pause-café #59

Novembre 2011

Console SDMC.


La console SDMC est la suite logique de la console HMC (Hardware Management Console) qui est un système qui permet de contrôler des systèmes gérés
(Power 6 et suivants, uniquement) et notamment de gérer les partitions logiques de ce dernier.

 

Elle sert toujours de console (5250 et terminal pour AIX/Linux).

 

La fin de vie de la HMC est annoncée (2014 ?), SDMC remplace aussi IVM et permet de superviser des partitions pour Blade Center.

Enfin, dans le même temps, IBM i , version 7.1.3 (technology refresh 3) permet la création de partition linux et IBM i hostées, via Virtual Partition Manager (VPM)
(voir : http://www.redbooks.ibm.com/redpieces/abstracts/redp4806.html)

 

 

 

SDMC est disponible sous deux formes : une version "hardware appliance" en rack

et une version "software appliance" en machine virtuelle pour VMware ou KVM.

 

Quelques précisions

Comme la console HMC , la console SDMC doit être connectée au firmware du système POWER (via ETH0) et au réseau de l'entreprise (ETH1)

La console SDMC doit être connectée sur un des deux ports HMC réservés dans un réseau privé.


il s'agit de ports réseau, implémentés sur le boitier du Power et contenant le firmware


C'est ce soft, en dialogue avec la console, qui fait démarrer les partitions.

Comme les HMC, le premier port ethernet de la console (eth0) est donc connectée directement sur le firmware du power
la premiere console DOIT être serveur DHCP


le deuxieme port (eth1) sera lui connecté au réseau entreprise et permettera :

  • de prendre la main sur la console
  • de naviguer sur internet depuis la console
  • de mettre à jour cette dernière, ...


Au premier démarrage de la console SDMC, vous devrez

  • Choisir la locale (le langage), Attention à ce jour la console SDMC ne supporte que la langue US (entre autre pour incompatibilité avec la console 5250)
  • Accepter la licence
  • Fixer date et heure
  • choisir le mot de passe de sysadmin (qui remplace hscroot)
    • éventuellement, définir de nouveaux utilisateurs (vous pourrez le faire plus tard)
  • Définir les propriétés du réseau
    • eth0, serveur DHCP (avec choix de la plage d'adresse)
    • eth1, client DHCP ou adresse IP fixe
    • nom de host, de domaine, adresse ip du serveur DNS et passerelle par défaut
  • Configurer Agent Manager (pour IBM director)

  • Ensuite, vérifiez vos paramètres et confirmez l'installation

 


PRISE EN MAIN DE L'INTERFACE

 

Pour vous logger à distance, utilisez l'URL suivante : https://adresseip-de-la-sdmc

L'interface graphique de la console HMC est basée sur IBM Director :

particulièrement le menu à gauche de la fenêtre

Alors que la fenêtre principale est spécifique à la console SDMC et offre accès aux systèmes gérés :

    Lors du démarrage du système Power, ce dernier doit être reconnu (SDMC lui attribut une adresse IP via DHCP) et il doit apparaître dans la liste des hosts

    vous pourrez alors interagir avec ce dernier (clic droit sur le système à gérer)


    (remarquez le lancement d'ASMI)

     

    C'est par cette option , que vous pourrez créer des pools de processeurs partagés
    (afin de partager, par exemple, un seul processeur entre deux partitions)

     

    et aussi la gestion du voyant d'attention, par Service and support/Hardware/System Attention LED


    CREATION DE PARTITION



    Il vous faut ensuite créer des serveurs virtuels, qui est le mot SDMC pour "partition" (toujours clic droit sur le système)

    Un assistant est alors proposé


    notez le choix du pool de processeur, vu plus haut

    si vous créez un adaptateur :

     


    GESTION DES PARTITIONS

    Activation


    Choix du profil




    Otions avancées



    Lancement de la console locale

     

    L'accès console 5250 à distance se fait comme avec la HMC :

    lancer l'émulateur 5250 sur l'adresse IP de la console SDMC, port 2300, utilisateur Q#HMC

    pensez bien à vous logger sysadmin

     

    Le partitionnement logique Dynamique, se fait sur l'affichage "Manage Virtual Server"

    Vous pourrez en même temps, voir les caractéristiques de la partition et les modifier :



    La PTF SI40272 ainsi que le dernier niveau de GROUP PTF pour DB2 (level 9) apporte à Omnifind, deux fonctions supplémentaires

    • indexation de fichiers spools

    • indexations des fichiers stream dans l'IFS.

     

    Vous devez d'abord créer une collection pour stocker ces informations, cela va créer une bibliothèque, contenant

    • des tables contenant des informations sur les données à indexer
    • des tables contenant des informations sur les paramètres d'indexation
    • des procédures cataloguées de recherche et d'administration


      CALL SYSPROC/SYSTS-CRTCOL('OMNI_COL') -- nous utiliserons ce nom de collection pour le reste de nos exemples
      vous pouvez fournir des options d'indexation , comme
      
      CALL SYSPROC.SYSTS_CRTCOL(‘OMNI_COL’,‘UPDATE FREQUENCEY D(*) H(0) M(0)’)

      ou CALL SYSPROC.SYSTS_CRTCOL(‘OMNI_COL’,‘FORMAT INSO’) -- si les fichiers IFS sont de type Word, PDF, etc...

    Ensuite vous devez accorder des droits à la procédure cataloguée SEARCH qui vient d'être créé

    SET CURRENT SCHEMA OMNI_COL

    GRANT EXECUTE ON PROCEDURE SEARCH(VARCHAR) TO QPGMR

     

    comment ajouter des objets à l'index, toujours par procédure cataloguée

    IL faut toujours commencer par définir la collection dans le chemin de recherche des procédures cataloguées

    SET CURRENT PATH OMNI_COL

    • SPOOL
      CALL ADD_SPLF_OBJECT_SET(‘QGPL’, ‘QPRINT’) -- par OUTQ

      ou bien CALL ADD_SPLF_OBJECT_SET(‘’, ‘’ , 'QPGMR') -- par propriétaire
      version complète (un paramètre à blanc n'est pas un critère)
      CALL ADD_SPLF_OBJECT_SET(‘ ’ -- bibliothèque OUTQ
      ‘ ’ -- OUTQ ‘ ’ -- Propriétaire ‘ ’ -- nom du JOB ‘ ’ -- profil du JOB ‘ ' -- N° du JOB ‘ ’) -- USRDTA ‘2011-06-01T00:00:00’ -- date/heure de début '2011-06-30T23:59:59' -- date/heure de fin )
    • IFS
        CALL ADD_IFS_STMF_OBJECT_SET(‘/home/mesfichiers’)

      Remarques : -> le paramètre doit être un nom de répertoire -> ne peut pas contenir de caractères génériques (*) -> les liens symboliques ne sont pas traités -> les sous-répertoires ne sont pas traités

    Ensuite vous devez rafraîchir l'index OmniFInd pour indexer réellement

    CALL UPDATE

     

    enfin vous pouvez faire des recherches, par CALL SEARCH('mot-recherché')

    cela retourne un "result set" structuré comme suit :

    • OBJTYPE CHAR(10)
    • OBJATTR CHAR(10)
    • CONTAINING_OBJECT_LIB CHAR(10)
    • CONTAINING_OBJECT_NAME CHAR(10)
    • OBJECTINFOR XML
    • MODIFY_TIME TIMESTAMP
    • SCORE DOUBLE

    Exemple

    structure de la zone OBJECTINFOR

    • Pour un fichier spool

      <Spool_File xmlns="http://www.ibm.com/xmlns/prod/db2textsearch/obj1">
        <job_name>QPADEV000C</job_name>
        <job_user_name>QPGMR</job_user_name>
        <job_number>012907</job_number>
        <spool_file_name>QPDSPLIB</spool_file_name>
        <spool_file_number>1</spool_file_number>
        <job_system_name>D6013FC2</job_system_name>
        <create_date>1110705</create_date>
        <create_time>095554</create_time>
      </Spool_File>

    • Pour un fichier stream

      <Stream_File xmlns="http://www.ibm.com/xmlns/prod/db2textsearch/obj1">
        <file_path>/af4dir/AF4SRC/V4R30TXT/NATFILTER.HTM</file_path>
      </Stream_File>


      Vous pouvez aussi lancer la procédure par

      CALL SEARCH('recherche' , 'options')

    • options :

      • QUERYLANGUAGE = fr_FR
      • RESULTLIMIT = un-nombre
      • SYNONYM = OFF | ON

    Autres procédures

    QUERY_OBJECT_SET
       Retourne la liste des objets indexés

    GET_OBJECT_STATUS
      retourne le status d'un objet

    •   0 indexé
    • 10 en cours d'indexation
    • 20 objet modifié depuis l'indexation
    • 30 objet indexé, mais avec un Warning
    • 40 indexation en erreur

    GET_OBJECTS_NOT_INDEXED
      retourne la liste des objets non indexés

    STATUS
      retourne le status du serveur

    SYSTS_DRPCOL
      détruit une collection

    Pour de plus amples détails, voyez la documentation http://www-03.ibm.com/systems/resources/systems_power_ibmi_omnifind_extensions_user_guide.pdf


    Requêtes récursives en V7R10


    |

     Rappel sur les Requêtes récursives en V5R40  -------------------------------------------
     Soit le fichier, décrivant des vols d'avions, suivant :
      CREATE TABLE FLIGHTS (DEPARTURE CHAR(20), ARRIVAL CHAR(20),                         CARRIER CHAR(15), FLIGHT_NUMBER CHAR(5), PRICE INT)


     la requête suivante permet de voir toutes les destinations au départ    de Chicago :
     WITH temp (departure , arrival)  as (    SELECT departure, arrival from flights where departure = 'Chicago'      UNION ALL    SELECT f.departure, f.arrival         from temp T join  flights F on t.arrival = f.departure  )  SELECT * FROM temp

    |
     Affiche
    
     ....+....1....+....2....+....3....  DEPARTURE             ARRIVAL   Chicago               Miami  Chicago               Frankfurt  Miami                 Lima  Frankfurt             Moscow  Frankfurt             Beijing  Frankfurt             Vienna  Moscow                Tokyo  Tokyo                 Hong Kong
    vous pouvez obtenir désormais la même chose sur une syntaxe plus simple :
    SELECT departure, arrival  FROM vol.flights   START WITH departure = 'Chicago'   CONNECT BY PRIOR arrival = departure;
    cette syntaxe est nommée requête hiérarchique et offre quelques différences:

    |

    la requête basée sur une CTE (common Table Expression : clause WITH) traite    par défaut, les liens par niveau, la requête hiérarchique, par branche
     DEPARTURE             ARRIVAL   Chicago               Miami  Miami                 Lima  Chicago               Frankfurt  Frankfurt             Vienna  Frankfurt             Beijing  Frankfurt             Moscow  Moscow                Tokyo  Tokyo                 Hong Kong
     cela est plus clair avec une colonne LEVEL, qui est aussi plus simple   à produire avec les requêtes hiérarchiques :
     SELECT departure, arrival, LEVEL as niveau   FROM flights    START WITH departure = 'Chicago'    CONNECT BY PRIOR arrival = departure

    |

     DEPARTURE             ARRIVAL             NIVEAU   Chicago               Miami                  1  Miami                 Lima                   2  Chicago               Frankfurt              1  Frankfurt             Vienna                 2  Frankfurt             Beijing                2  Frankfurt             Moscow                 2  Moscow                Tokyo                  3  Tokyo                 Hong Kong              4

     la CTE aurait affiché 1/1 puis 2/2/2/2 enfin 3 et 4, sauf à utiliser :
      SEARCH DEPTH FIRST BY (un nom de colonne) SET nouvelle-colonne
      Indiquez 1/ un nom de colonne dont il faut analyser TOUTE la profondeur
               2/ un nom de colonne virtuelle à créér, ce flag interne sert                à SQL pour savoir s'il a déja traité une ligne et DOIT                être le critère de tri (ORDER BY) sur la requête finale

    |

      WITH temp (departure , arrival, niveau )  as (    SELECT departure, arrival, 1 from flights where departure = 'Chicago'      UNION ALL      SELECT f.departure, f.arrival, t.niveau + 1)     from temp T join  flights F on t.arrival = f.departure   )    SEARCH DEPTH FIRST BY arrival SET tri      Select * From Temp ORDER BY tri 
     les requêtes hiérarchiques proposent en plus un tri, pour les lignes   "soeurs" (siblings, ayant les mêmes parents).
    SELECT CONNECT_BY_ROOT departure AS origin, departure, arrival,       LEVEL niveau,  price prix   FROM  flights   START WITH departure = 'New York'   CONNECT BY PRIOR arrival = departure   ORDER SIBLINGS BY price ASC
      classe, pour les trajets ayant la même origine, par prix croissant

    |


         ORIGIN      DEPARTURE     ARRIVAL       NIVEAU     PRIX     1 New York    New York      Los Angeles     1         330    2 New York    Los Angeles   Tokyo           2         530    3 New York    Tokyo         Hong Kong       3         330    4 New York    New York      London          1         350    5 New York    London        Athens          2         340    6 New York    Athens        Nicosia         3         280    7 New York    New York      Paris           1         400    8 New York    Paris         Rome            2         340    9 New York    Paris         Madrid          2         380   10 New York    Paris         Cairo           2         480
     vous remarquerez que le tri principal se fait suivant l'arborescence   (New York->Los Angeles->Tokyo->Hong Kong sur les trois premières)
      ensuite, que les lignes 1 , 4 et 7 (même origine new-york) apparaissent    selon leur prix, ainsi que les lignes 8,9 et 10 (origine Paris)



    |

     A noter que la CTE suivante propose un service que ne sait pas rendre une    requête hierarchique, le cumul des prix :
     WITH temp (departure , arrival, niveau , total )  as ( SELECT      departure, arrival, 1 , price from flights where departure = 'Chicago'     UNION ALL      SELECT f.departure, f.arrival, t.niveau + 1, total + price        from temp T join  flights F on t.arrival = f.departure  ) select * from temp
       DEPARTURE             ARRIVAL                   NIVEAU           TOTAL     Chicago               Miami                          1             300    Chicago               Frankfurt                      1             480    Miami                 Lima                           2             830    Frankfurt             Moscow                         2           1.060    Frankfurt             Beijing                        2             960    Frankfurt             Vienna                         2             680    Moscow                Tokyo                          3           1.740


    |

     La clause CYCLE , évitait les boucles infinies avec les CTE
     CYCLE (nom de colonne) SET vartemp = valeur1 DEFAULT valeur0
     quand SQL va se rendre compte qu'il boucle (une ligne déja vue)   il va attribuer à vartemp (nouvelle variable interne) la valeur "valeur1"   (dans les autres cas, elle contient "valeur0")
      la ligne va quand même être affichée, mais la boucle se termine

     Avec CONNECT BY, la boucle infinie est automatiquement détectée et signalée    par SQ20451 : CYCLE DETECTED IN HIERARCHICAL QUERY.

     la requête se termine de manière anticipée (en erreur), sauf à indiquer   CONNECT BY NOCYCLE PRIOR arrival = departure
       la ligne provoquant la boucle sera affichée et la boucle interrompue.


    |

     la pseudio variable CONNECT_BY_ISCYCLE indique par 1 (oui) ou 0 (non)   si une ligne provoque une boucle.
         pour éventuellement, filtrer suite à CONNECT BY NOCYCLE

     la pseudo variable CONNECT_BY_ISLEAF indique par 1 (oui) ou 0 (non)   si une ligne est la dernière (une feuille de l'arborescence)
         une ville n'ayant pas de destination, par exemple.

     enfin la pseudo variable LEVEL que nous avons vu précédement indique le   niveau hiérarchique d'une ligne dans l'arborescence (à partir de 1)

      une astuce peut consister, à l'affichage, à utiliser SPACE(LEVEL)     ou SPACE(LEVEL * 3),  afin d'avoir un affichage incrémenté.



    |

     Outre l'opérateur PRIOR, vu plus haut et valide uniquement dans la clause    CONNECT BY, deux autre opérateurs sont bien pratiques :
      CONNECT_BY_ROOT <expression> 
       retourne la valeur de la racine de <expression> pour une branche
       par exemple SELECT CONNECT_BY_ROOT  departure AS Origine, retourne     la ville de départ (New York, si START WITH departure = 'New York')
      SYS_CONNECT_BY_PATH( <expression1> , <expression2>)
       retourne le chemin ayant permis d'arriver à cette ligne en concatenant     toutes les valeurs de <expression1> , séparées par <expression2>
       par exemple SELECT SYS_CONNECT_BY_PATH(trim(departure), '/') AS chemin     retourne sous forme de CLOB : /Chicago                                   /Chicago/Miami                                   /Chicago/Frankfurt                                   /Chicago/Frankfurt/Moscow                                   /Chicago/Frankfurt/Moscow/Tokyo

    |

     Pour terminer, deux précisions
      on peut faire une requête hiérarchique basée sur plusieurs tables
     1/ avec UNION
        FLIGHTS contient les vols d'avions, TRAINS les trajets en train             et vous voulez déplacer sans tenir du moyen de locomotion !

    SELECT CONNECT_BY_ROOT departure AS depart, arrival, LEVEL-1 correspondance
      FROM       ( SELECT departure, arrival FROM flights            UNION         SELECT departure, arrival FROM trains       ) as trajet
      START WITH departure = 'Chicago'   CONNECT BY PRIOR arrival = departure

    |

      on peut faire une requête hiérarchique basée sur plusieurs tables
     2/ avec JOIN
        FLIGHTSTAT contient des statistiques par vol sur l'exactitude      des horaires (en % de fois ou l'horaire a été respecté).
       SELECT CONNECT_BY_ROOT departure AS depart, arrival, on_time       FROM flights JOIN flightstats ON FLIGHT_NUMBER = FLIGHTN       START WITH departure = 'New York'       CONNECT BY PRIOR arrival = departure

     permettant de faire une sélection (l'un des vols à une exactitude > à 90%)
       SELECT CONNECT_BY_ROOT departure AS depart, arrival, on_time       FROM flights JOIN flightstats ON FLIGHT_NUMBER = FLIGHTN       WHERE ON_TIME_PERCENT > 90       START WITH departure = 'New York'       CONNECT BY PRIOR arrival = departure

    |

     Si vous souhaitez que tous les trajets aient une exactitude des horaires   supérieurs à 90 %
     Ecrivez    SELECT CONNECT_BY_ROOT departure AS depart, arrival, on_time_percent     FROM (         SELECT  departure , arrival, on_time_percent          FROM  flights JOIN flightstats ON FLIGHT_NUMBER = FLIGHTN            where ON_TIME_PERCENT > 90 ) as t1    START WITH departure = 'New York'    CONNECT BY PRIOR arrival = departure
    ou bien
      SELECT CONNECT_BY_ROOT departure AS depart, arrival, on_time      FROM flights JOIN flightstats ON FLIGHT_NUMBER = FLIGHTN      START WITH departure = 'New York' AND ON_TIME_PERCENT > 90      CONNECT BY PRIOR arrival = departure AND ON_TIME_PERCENT > 90
      (aves nos données de test, le résultat est vide)

    |
                                    
    En résumé, une requête hiérarchique utilise cette syntaxe :
      SELECT expression1 , expression2    FROM table    START WITH colonne = 'racine'    CONNECT BY [NOCYCLE] PRIOR enfant = parent
     Opérateurs 
      CONNECT_BY_ROOT     retourne la valeur racine pour une branche
      SYS_CONNECT_BY_PATH retourne la suite des valeurs, concaténées
     Pseudo variables 
      LEVEL               retourne le niveau dans la hiérarchie
      CONNECT_BY_ISCYCLE  indique si une ligne provoque une boucle infinie
      CONNECT_BY_ISLEAF   indique si une ligne est la dernière de sa branche




    ©AF400

     


Copyright © 1995,2011 VOLUBIS