pause-café
destinée aux informaticiens sur plateforme IBM i.
Pause-café #59
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 hautsi 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 exemplesvous 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ésEnsuite 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ésSTATUS
retourne le status du serveurSYSTS_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