MainframeSupports
tip uge 33/2005:

Når jeg befinder mig på et MVS system vil jeg gerne vide, hvilke DB2'er, der er aktive på denne MVS. Det har jeg hidtil gjort ved at benytte SDSF eller SYSVIEW og display'e de aktive tasks, der hedder noget med *DBM1. Det virker selvfølgelig og med lidt fingerfærdighed kan man lave et program, der gør det samme, men videre elegant er det ikke. En anden mangel ved denne løsning er, at man ikke kan se hvilket data sharing gruppenavn, de forskellige DB2'er er kendt under.

Heldigvis kan man slå alle disse oplysninger op i storage, når man bare ved, hvor man skal kigge og hvordan informationerne hænger sammen. Det tog mig temmelig lang tid, men her er resultatet. Jeg har kodet mit program i PL/I, så derfor får du de nødvendige informationer i PL/I, så må du selv oversætte til det programmeringssprog, du foretrækker. Først de nødvendige erklæringer:

DCL max_address CHAR(4) INIT('80000000'X);
DCL psa_address CHAR(4) INIT('00000000'X);
DCL psa_pointer POINTER BASED(ADDR(psa_address));
DCL 1 psa BASED(psa_pointer)
  , 2 filler CHAR(16)
  , 2 cvt_pointer POINTER
  ;
DCL 1 cvt BASED(psa.cvt_pointer)
  , 2 filler1 CHAR(296)
  , 2 jesct_pointer POINTER
  , 2 filler2 CHAR(40)
  , 2 sysname CHAR(4)
  ;
DCL 1 jesct BASED(cvt.jesct_pointer)
  , 2 filler CHAR(24)
  , 2 ssct_start POINTER
  ;
DCL pointer_char CHAR(4);
DCL pointer_value POINTER BASED(ADDR(pointer_char));
DCL ssct_pointer POINTER;
DCL 1 ssct BASED(ssct_pointer)
  , 2 filler1 CHAR(4)
  , 2 ssct_next POINTER
  , 2 ssid CHAR(4)
  , 2 flag1 CHAR(1)
  , 2 filler2 CHAR(3)
  , 2 ssvt_pointer POINTER
  , 2 erly_pointer POINTER
  ;
DCL 1 erly BASED(ssct.erly_pointer)
  , 2 filler1 CHAR(4)
  , 2 eyecatcher CHAR(4)
  , 2 db2ssid CHAR(4)
  , 2 filler2 CHAR(36)
  , 2 asid FIXED BIN(15)
  , 2 filler3 CHAR(42)
  , 2 productid CHAR(9)
  , 2 filler4 CHAR(19)
  , 2 groupname CHAR(4)
  ;

Et DB2 subsystem skal oprettes som et MVS subsystem for at kunne køre på en MVS. Alle subsystemer på en MVS er oprettet i SSCT'en (SubSystem Control Table). PSA'en, CVT'en og JESCT'en er arealer, som man er nødt til at gå igennem for at komme hen til SSCT'en. I SSCT'en er der en pointer ud til den såkaldte ERLY, som jeg faktisk ikke rigtig ved, hvad gør godt for, ud over, at den indeholder Data Sharing group navnet og i øvrigt identificerer et MVS subsystem som værende et DB2 subsystem. Og nu til, hvordan ovenstående arealer benyttes:

PUT SKIP LIST('MVS-NAME=' !! cvt.sysname);
ssct_pointer = jesct.ssct_start;
DO WHILE(ssct_pointer ^= psa_pointer);
  pointer_value = ssct.ssvt_pointer;
  IF pointer_char > psa_address & pointer_char < max_address
   & ssct.flag1 = '00'X
  THEN DO;
    pointer_value = ssct.erly_pointer;
    IF pointer_char > psa_address & pointer_char < max_address
    THEN
      IF erly.eyecatcher = 'ERLY'
      THEN
        IF erly.productid = '5740XYR01'
        THEN
          IF erly.asid = 0
          THEN
            PUT SKIP LIST('DB2: ' !! erly.db2ssid !! ' inactive
                         !! ' (groupname ' !! erly.groupname
                         !! ').'
                         );
          ELSE
            PUT SKIP LIST('DB2: ' !! erly.db2ssid !! ' running '
                         !! ' (groupname ' !! erly.groupname
                         !! ').'
                         );
  END;
  ssct_pointer = ssct.ssct_next;
END;

Jeg kan ikke garantere, at ovenstående kode virker på din MVS. Det skyldes, at oplysningerne i SSCT'en ikke standardiserede. Felterne i SSCT'en indtil ssvt_pointer skal overholde visse spilleregler, men ssvt_pointer og hvad derefter følger må det enkelte subsystem selv bestemme. Det er derfor jeg kontrollerer om disse to pointere indeholder værdier, der ligger inden for MVS'ens adresserum. Før jeg indførte disse valideringer var der nogle MVS'er, som mit program abend'ede på. Nu vil du sikkert sige, at det der productid vist er versionsafhængigt. Til det kan jeg svare, at det virker for version 6, 7 og 8.

Første gang jeg kørte programmet blev jeg meget overrasket over, hvor mange DB2 subsystemer, der var inaktive på den pågældende MVS. Det var subsystemer, jeg aldrig havde hørt om. Det kan du også risikere at opleve, så nu er du advaret. Til gengæld ved du også, hvordan du finder de aktive, som jo i sagens natur er de mest interessante. Og så skal jeg også huske at skrive, at hvis groupname er blank, så er DB2'en selvfølgelig ikke tilknyttet en data sharing gruppe.

Forrige danske tip        Last tip in english        Tip oversigten