MainframeSupports
tip uge 47/2010:

En af de SQL fejl, jeg oftest hjælper andre med at løse, er SQLCODE -904. For at kunne løse en -904, så er man nødt til at have hele SQLCA'et til rådighed og allerhelst i en formateret udgave:

DSNT408I SQLCODE = -904, ERROR: UNSUCCESSFUL EXECUTION CAUSED BY AN
         UNAVAILABLE RESOURCE. REASON 00C90081, TYPE OF RESOURCE
         00000200, AND RESOURCE NAME DB000011.TS000033

Hvis man kun har SQLCA'et til rådighed, så vil der et eller andet sted i SQLCA'et stå sådan her (med udgangspunkt i ovenstående eksempel): 00C90081 00000200 DB000011.TS000033, og det er nødvendigvis ikke en blank, der adskiller de tre informationer REASON, TYPE OF RESOURCE og RESOURCE NAME. Hvis du heller ikke har SQLCA'et til rådighed, så kan du faktisk finde oplysningerne i DB2-MSTR address spacet i selve JES message loggen. Her kan det dog blive en udfordring at finde netop den message, der relaterer sig til din -904. Søg efter UNAVAILABLE RESOURCE og kig på tidspunktet for logningen, så kan det godt lade sig gøre.

En SQLCODE -904 betyder, at en eller anden DB2-dims ikke er til rådighed. Det kan være en plan, en package, en bufferpool, et intert arbejdsareal, meget andet og mest almindeligt et tablespace. For at finde ud af, hvorfor DB2-dimsen ikke er til rådighed skal du slå REASON op i IBM Information Center. Følg vejledningen og indtast den aktuelle REASON i Search: feltet og tryk på vognretur tasten. Nu skal du i venstre side finde den version af DB2, der er relevant for dig, og klikke på linket. Nu har du den mest fyldestgørende beskrivelse, det er muligt at vride ud af IBM. Hvis du har brug for at vide mere om, hvad TYPE OF RESOURCE betyder, så kan du bruge dette link.

I det konkrete eksempel vist her kan du altså finde ud af, at 00C90081 betyder, at nogen har stoppet et tablespace. Du kan også finde ud af, at TYPE OF RESOURCE 00000200 ikke overraskende betyder et tablespace. Nu kan du så prøve at se, hvordan et tablespace, der er stoppet, ser ud ved hjælp af en -DISPLAY DB kommando. Den nemmeste måde at udføre DB2 kommandoer på, er ved at bruge en TSO DSN SYSTEM(XXXX), hvor du erstatter XXXX med navnet på dit DB2 subsystem. Når denne kommando svarer DSN, så indtaster du (med udgangspunkt i ovenstående eksempel) -DIS DB(DB000011) og trykker Enter:

DSNT360I -XXXX ***********************************
DSNT361I -XXXX * DISPLAY DATABASE SUMMARY
DSNT360I -XXXX ***********************************
DSNT362I -XXXX DATABASE = DB000011 STATUS = RW
DSNT397I -XXXX
NAME     TYPE PART  STATUS ...
-------- ---- ----- ----------------- -------- -------- -------- -----
TS000011 TS         RW
TS000022 TS         RW
TS000033 TS         STOP
TS000044 TS         RW
...
******* DISPLAY OF DATABASE DB000011 ENDED **********************
DSN9022I -XXXX DSNTDDIS 'DISPLAY DATABASE' NORMAL COMPLETION

Jeg har fjernet et par linier og et par indrykninger i ovenstående, hvis du skulle undre dig over, hvorfor det ikke helt ligner dit eget resultat. Nu kan du tydeligt se, at det forholder sig, som din -904 fortalte. Det kunne jo også være, at problemet i mellemtiden var løst. Derfor er det godt at vide, hvordan du laver en -DISPLAY kommando. Desværre er det ikke alle installationer, der tillader deres udviklere at kunne udføre -DISPLAY DB kommandoen, så bliv ikke overrasket, hvis du ikke må udføre den. Hvis du må, så kan det være, at din display viser rigtig mange linier. Det skyldes blandt andet, at kommandoen også viser status på index spaces tilhørende de tabeller, der findes i databasen. En -DISPLAY DB viser altså mere end bare tablespaces. Nu er det godt at vide, at du kan begrænse outputtet til de table eller index spaces, der er problemer med, ved at benytte en -DIS DB(DB000011) SPACE(*) RESTRICT:

DSNT360I -XXXX ***********************************
DSNT361I -XXXX * DISPLAY DATABASE SUMMARY
DSNT360I -XXXX ***********************************
DSNT362I -XXXX DATABASE = DB000011 STATUS = RW
DSNT397I -XXXX
NAME     TYPE PART  STATUS ...
-------- ---- ----- ----------------- -------- -------- -------- -----
TS000033 TS         STOP
******* DISPLAY OF DATABASE DB000011 ENDED **********************
DSN9022I -XXXX DSNTDDIS 'DISPLAY DATABASE' NORMAL COMPLETION

Nu får du kun vist de table eller index spaces, der er begrænset adgang til. For at få adgang til et stoppet table eller index space skal nogen udføre en -START DB(DB000011) SPACE(TS000033) (i dette tilfælde). Her er der endnu større sandsynlighed for, at du ikke har autorisation til kommandoen. Hvis du har, så skal du også lige tænke over, om nogen har stoppet tablespacet med en rigtig god grund, og at det måske vil skabe flere problemer end godt er bare at starte det igen uden videre.

Forrige danske tip        Last tip in english        Tip oversigten