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