Or “How to clean up the master catalog when you have filled it up with junk”. Looking at my z/OS system, I was reminded of my grandfathers garage/workshop where the tools were carefully hung up on walls, the chisels were carefully stored a a cupboard to keep them sharp etc. He had boxes of screws, different sizes and types in different boxes. My father had a shed with a big box of tools. In the box were his chisels, hammers, saws etc.. He had a big jar of “Screws – miscellaneous – to be sorted”. The z/OS master catalog should be like my grandfather’s garage, but I had made it like my father’s shed.
Well, what a mess I found! This blog post describes some of the things I had to do to clean it up and follow best practices.
In days of old, well before PCs were invented, all data sets were cataloged in the master catalog. Once you got 10s of thousands of data sets on z/OS, the time to search the catalog for a dataset name increased, and the catalogs got larger and harder to manage. They solved this about 40 years ago by developing the User Catalog – a catalog for User entries.
Instead of 10,000 entries for my COLIN.* data sets, there should be an Alias COLIN in the Master Catalog which points to another catalog which could be just for me, or can be shared by other users. This means that even if I have 1 million datasets in the user catalog, the access time for system datasets is not affected. What I expected to see in the master catalog is the system datasets, and aliases for the userids. I had over 400 entries for COLIN.* datasets, 500 BACKUP.COLIN.* datasets, 2000, MQ.ARCHIVE.* datasets etc. What a mess!
Steps to solve this.
Prevention is better than cure.
You can use the RACF Option PROTECTALL. This says a userid needs a RACF profile before it can create a dataset. This means each userid (and group) needs a profile like ‘COLIN.*’, and give the userid access to this profile. Once you have done this for all userids, you can use the RACF command SETROPTS PROTECTALL(WARNING) to enable this support. This will allow users to create datasets, when there is no profile, but produces a warning message on the operator console – so you can fix it. An authorised person can use SETROPTS NOPROTECTALL to turn this off. Once you have this running with no warnings you can use the command SETROPTS PROTECTALL to make it live – without warnings, and you will live happily ever after, or at least till the next problem.
- Whenever you create a userid (or a high level qualifier) you need to create the RACF dataset profile for the userid (high level qualifier)
- You also need to set up an ALIAS for the new userid(high level qualifier) to point to a User Catalog.
How bad is the problem?
You can use IDCAMS to print the contents of a catalog
//S1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
LISTCAT CATALOG(CATALOG.Z24A.MASTER) NAME
This has output like
NONVSAM ------- BACKUP.USER.Z24A.VTAMLST.D201210
NONVSAM ------- BACKUP.USER.Z24A.VTAMLST.D201222
NONVSAM ------- BACKUP.USER.Z24A.VTAMLST.D201224
ALIAS --------- BAQ300
This says there are datasets BACKUP… which should not be in the catalog.
There is an Alias BAQ300 which points to a user catalog. This is what I expect.
The IDCAMS command
LISTCAT ALIAS CATALOG(CATALOG.Z24A.MASTER) ALL
list all of the aliases in the catalog, for example
ALIAS --------- BAQ300
This shows for high level qualifier BAQ3000, go and look in the user catalog USERCAT.Z24A.PRODS.
Moving the entries out of the Master Catalog
The steps to move the COLIN.* entries out of the Master Catalog are
- Create a User Catalog
- Create an ALIAS COLIN2 which points to this User Catalog.
- Rename COLIN…. to COLIN2….
- Create an ALIAS COLIN for all new data sets.
- Rename COLIN2… to COLIN…
- Delete the ALIAS COLIN2.
Create a user catalog
Use IDCAMS to create a user catalog
DEFINE USERCATALOG -
( NAME('A4USR1.ICFCAT') -
MEGABYTES(15 15) -
FREESPACE(10 10) -
STRNO(3 ) ) -
DATA( CONTROLINTERVALSIZE(4096) -
BUFND(4) ) -
To list what is in a user catalog
Use a similar IDCAMS command to list the master catalog
LISTCAT ALIAS CATALOG(A4USR1.ICFCAT) ALL
Create an alias for COLIN2
DEFINE ALIAS (NAME(COLIN2) RELATE('A4USR1.ICFCAT') )
Get the COLIN.* entries from the Master Catalog into the User Catalog
This was a bit of a challenge as I could not see how to do a global rename.
You can rename non VSAM dataset either using ISPF 3.4 or use the TSO rename command in batch.
The problem occurs with the VSAM data sets. When I tried to use the IDCAMS rename, I got an error code IGG0CLE6-122 which says I tried to do a rename, which would cause a change of catalog.
The only way I found of doing it was to copy the datasets to a new High Level Qualifier, and delete the originals. Fortunately DFDSS has a utility which can do this for you.
//S1 EXEC PGM=ADRDSSU,REGION=0M PARM='TYPRUN=NORUN'
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DATASET(INCLUDE(COLIN.** )) -
Most of the data sets were “renamed” to COLIN2… but I had a ZFS which was in use, and some dataset aliases. I used
- the TSO command unmount filesystem(‘COLIN.ZCONNECT.BETA.ZFS’)
- the IDCAMS command DELETE COLIN.SCEERUN ALIAS for each of the aliases.
and reran the copy job. This time it renamed the ZFS. The renaming steps are
- Check there are no datasets with the HLQ COLIN.
- Define an alias for COLIN in the master catalog to point to a user catalog.
- Rerun the copy job to copy from COLIN2 back to COLIN.
- Mount the file system.
- Redefine the alias to data sets (eg COLIN.SCEERUN).
- Delete the alias for COLIN2.
To be super efficient, and like my grandfather, I could have upgraded the SMS ACS routines to force data sets to have the “correct” storage class, data class, or management class. The job output showed “Data set COLIN2.STOQ.CPY has been allocated with newname COLIN.STOQ.CPY using STORCLAS SCBASE, no DATACLAS, and no MGMTCLAS“. These classes were OK for me, but may not be for a multi-user z/OS system.
One last thing, don’t forget to add the new user catalog to your list of datasets to backup.