Trabajando con catálogos en mainframes

Autor: Kujaku | El martes 30 de octubre del 2007 @ 10:45.

Este artículo pretende arrojar algo más de luz al universo críptico de MVS (o OS/390, z/OS, lo mismo da). Trataré de explicar como funciona la estructura de los catálogos del sistema y cómo interactuar con ellos.

Introducción a los catálogos

Un catálogo es un tipo de fichero VSAM que almacena punteros a datasets o librerías. Si una librería no estuviera catalogada, seria necesario para poder referenciarla especificar, además del nombre de la librería, el volumen donde reside, y en instalaciones con gran número de librerías, llevar un recuento de esto seria demencial.

Generalmente, cuando una librería se crea con un JCL, por lo general, con el parámetro DISP se puede controlar si se cataloga o no. Por ejemplo, con un DISP=(NEW,CATLG,DELETE) le estás diciendo que la librería es nueva, si se crea bien que la catalogue y que si hay algún error al finalizar ese paso del JCL, que la borre.

Por tanto, cuando dicha librería se cataloga, se guardan dos cosas: Por un lado, el nombre de dicha librería y por otro, el volumen de disco donde reside. Ahora bien, ¿dónde se está catalogando dicha librería? ¿Y cómo se cataloga?.

Estructura de catálogos de z/OS

Para responder a esas dos preguntas, antes hay que conocer la estructura de catálogos en la que puede estar formada nuestra instalación. Por una parte, tenemos el catálogo MAESTRO (MASTER CATALOG) que viene a ser el catálogo por omisión que reside en la raíz. De hecho, el Master Catalog es el primero al que se hace referencia cuando se hace IPL al sistema, en el miembro LOADxx de la SYS1.IPLPARM o en su defecto, en la PARMLIB.

Por otro lado, existen los catálogos de Usuario o USER CATALOGS, que son todos aquellos catálogos que no son el Master Catalog y que podemos crear o borrar a placer.

Dichos catálogos de usuario están conectados al catálogo maestro, de tal forma que existe un puntero desde el Master Catalog a los catálogos de usuario que hayamos definido, y es posible también que un catálogo de usuario dependa de otro catalogo de Usuario del nivel superior, de tal forma que creamos una estructura de índices en árbol tan simple o compleja como nos dé la gana.

Funcionamiento de los catálogos

Una librería es catalogada en un catalogo por su nombre, concretamente, por el nombre de su HLQ o High Level Qualifier. Si cuando creo una librería, la llamo de cualquier manera, se cataloga por defecto en el Master Catalog. Pero si tenemos miles de librerías, realizar una búsqueda por el Master Catalog le resta rendimiento porque debe buscar las entradas una por una, y si dicho catálogo se hace muy grande, la búsqueda se puede llegar a prolongar mucho innecesariamente.

Además, por lo general, el Master Catalog se debe utilizar para almacenar las entradas de las librerías del sistema, y las librerías o datos de usuario se deberían catalogar aparte para no tener problemas ni mezclar churras con merinas.

Por tanto, cuando creemos una librería nueva, tenemos que tener muy en cuenta la nomenclatura que va a tener, y liberar al Master Catalog de entradas innecesarias. Claro, pero ¿cómo le digo yo donde catalogar las librerías que yo quiera y así luego poder referenciarlas?.

ALIASes

Para eso se crearon los ALIAS. Un ALIAS es una forma de decirle al sistema donde buscar la librería sin tener que recorrerse todos los catálogos. El ALIAS es una entrada más en el Master Catalog, pero tiene tres datos fundamentales: El HLQ de la librería, el catálogo de usuario donde dicho ALIAS está relacionado y el volumen donde dicho catalogo de usuario reside.

Por ejemplo, si quiero que todas las librerías que empiecen por URD se cataloguen en un catálogo de usuario llamado USERCAT.URD, basta con definir un alias y a partir de ese momento, toda librería nueva que empiece por URD, se catalogará siempre en ese catálogo de usuario, y no tocará nada del Master Catalog. Y para buscar es muy sencillo, como todas las búsquedas empiezan en el Master Catalog, al buscar por URD en seguida encontrará la entrada del alias, que redirigirá al catálogo de usuario relacionado y buscará allí dentro, de una manera rápida y eficaz.

Librerías SYS1

Todos los datasets que empiezan por SYS1 son del sistema y por lo tanto, especiales. Estas librerías están catalogadas siempre en el Master Catalog y sacarlas de ese catálogo puede llevar a errores de arranque y problemas con el z/OS en general, por lo que todo lo que empiece por SYS1 es mejor dejarlo en catálogo Maestro. De hecho, si creas una librería SYS1 se catalogará por defecto en el Maestro sin tener en cuenta los ALIAS ni nada. Así que con éstas cuidadito.

Utilidades de manejo de catálogos

Hay una serie de utilidades que nos pueden servir para crear catálogos, administrarlos, diagnosticarlos, listar su contenido, y también para catalogar, y descatalogar librerías o datasets. La gran mayoría se pueden ejecutar desde la Opción 6 del ISPF (TSO Commands) o desde JCL, utilizando la utilidad/comodín IDCAMS.

Como crear un Catálogo de Usuario

Para crear un catálogo de usuario (por ejemplo, USERCAT.URD) basta con lanzar este JCL:

//DEFINCAT JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//DFNEWCAT EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
DEFINE USERCATALOG -
(NAME(USERCAT.URD) -
VOLUME(PRODS1) -
MEGABYTES(15 5) -
ICFCATALOG -
FREESPACE(20 20) -
STRNO(3) -
REPLICATE ) -
DATA( CONTROLINTERVALSIZE(4096) -
BUFND(4) ) -
INDEX( BUFNI(4) )
/*

Con este JCL definimos el catálogo USERCAT.URD dentro del volumen PRODS1 que automáticamente se conectará al Catálogo Maestro. De todas formas, si no definimos ningún ALIAS relacionado con ese catálogo, este catálogo no guardará absolutamente nada y todo se seguirá catalogando en el Catálogo Maestro, así que para darle uso y liberar al catálogo Maestro de entradas innecesarias, definiremos un ALIAS.

Cómo definir un ALIAS

Desde la opción 6 del ISPF se puede teclear un DEFINE ALIAS (NAME(URD) RELATE(USERCAT.URD) pero también se puede lanzar el JCL con el IDCAMS:

//DEFINCAT JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//DFNEWCAT EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
DEFINE ALIAS (NAME(URD) RELATE(USERCAT.URD)
/*

Por lo que a partir de ese momento, todo lo que empiece por el HLQ URD se catalogará en ese catálogo de usuario.

También se pueden definir más ALIAS relacionadas con ese catálogo de usuario, de forma que con un DEFINE ALIAS (NAME(BELDANDY) RELATE(USERCAT.URD) y DEFINE ALIAS (NAME(SKULD) RELATE(USERCAT.URD) también podemos hacer que los datasets cuyo HLQ sea SKULD o BELDANDY se cataloguen en el mismo catálogo, pero se corre el riesgo de poblar demasiado ese catálogo de usuario y volver a tener problemas de rendimiento, así que cada uno verá en su instalación como controlar eso.

Catalogando y descatalogando librerías

Desde la opción 3.4 del ISPF, podemos listar los datasets que queremos catalogar o descatalogar, poniendo una C para catalogarlos o una U para descatalogarlos por delante, pero si quisiéramos hacerlo por JCL, tenemos la utility IEHPROGM que nos puede ayudar a resolver el problema:

//DESCATLG JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//PASO001 EXEC PGM=IEHPROGM,REGION=0M
//SYSPRINT DD SYSOUT=A
//DD1      DD UNIT=3390,VOL=SER=WORK01,DISP=OLD
//SYSIN    DD *
UNCATLG DSNAME=URD.GODDESS.LICNMBR
/*

Es decir, que este JCL descatalogará (que no borrará) el dataset URD.GODDESS.LICNMBR y solo podremos hacerle referencia catalogándolo de nuevo o yendo al volumen donde reside y explorar su VTOC (en nuestro caso el volumen se llama WORK01).

Si queremos volver a catalogarlo, basta con cambiar UNCATLG por CATLG y añadir el VOLSER donde reside:

//CATLGDSN JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//PASO001 EXEC PGM=IEHPROGM,REGION=0M
//SYSPRINT DD SYSOUT=A
//DD1      DD UNIT=3390,VOL=SER=WORK01,DISP=OLD
//SYSIN    DD *
CATLG DSNAME=URD.GODDESS.LICNMBR,VOL=3390=WORK01
/*

NOTA: Estas utilidades sólo sirven para catalogar y descatalogar datasets particionados, secuenciales o HFS. Para los VSAM, el procedimiento es distinto.

Moviendo y juntando catálogos

Puede ocurrir que se prefiera migrar los catálogos o realizar con varios catálogos de usuario, un único catálogo mas grande porque se tienen muchos catálogos de usuario pequeños y esto también puede afectar al rendimiento. Así pues, para migrar los catálogos a uno más grande, utilizaremos el IDCAMS con el REPRO MERGECAT.

Pero antes de todo, definiremos el nuevo catálogo de usuario al que luego cargaremos toda la información, cosa que he explicado en el apartado anterior. Una vez definido, podemos estar en condiciones de migrar los viejos catálogos de usuario a este nuevo catálogo con este JCL:

//MERGECAT JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//STEP1    EXEC PGM=IDCAMS
//DD1      DD VOL=SER=WORK01,UNIT=SYSDA,DISP=OLD
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
REPRO -
INDATASET(USERCAT.BELDANDY) -
OUTDATASET(USERCAT.GODDESS) -
MERGECAT -
FILE(DD1)
/*

Esto hará que se migre toda la información del catálogo de Usuario USERCAT.BELDANDY a USERCAT.GODDESS, quedando USERCAT.BELDANDY vacío.

¿Que queremos migrar USERCAT.URD a USERCAT.GODDESS? Pues se cambia ese JCL y se sustituye USERCAT.BELDANDY por USERCAT.URD y se ejecuta igual.

Comentar la Ficha DD1, que pondremos tantas como VVDS tengamos. En nuestro caso concreto, y dado que solo tenemos una VVDS en ese volumen, pondremos solo una.

Con esto, no basta. Debemos alterar los ALIAS que hacen referencia a ese catálogo, ya que si cuando se crearon hacían referencia al USERCAT.BELLDANDY o USERCAT.URD, y ahora deberán hacerlo a USERCAT.GODDESS. Así que hacemos un DEFINE ALIAS (NAME(BELDANDY) RELATE(USERCAT.GODDESS) y lo mismo para URD, con un DEFINE ALIAS (NAME(URD) RELATE(USERCAT.GODDESS).

Si tuviéramos un error por "DUPLICATE DATA SET NAME" es porque está el ALIAS viejo dando por saco, apuntando a un catálogo que ya está vacío. Así que, borramos el ALIAS con un DELETE URD ALIAS CATALOG(CATALOG.URD) para borrar la entrada y luego lo definimos de nuevo con las sentencias DEFINE de más arriba.

Tirado, ¿no?.

¿Y que ocurre con los catálogos antiguos? Que se pueden borrar tranquilamente con un DELETE USERCAT.URD PURGE USERCATALOG y con el de Beldandy lo mismo, DELETE USERCAT.BELDANDY PURGE USERCATALOG.

En un siguiente artículo explicaré algo del universo VSAM, sistemas completos de ficheros/bases de datos especiales del entorno mainframe.

Comentarios