Every online DB2 utility on z/OS is the same shape of job: start DSNUTILB, pass the subsystem and a unique UID, point STEPLIB at the right SDSNLOAD, feed statements through SYSIN, and collect messages on SYSPRINT. This page is the pattern book: shared DD names, then skeletons for LOAD, UNLOAD, REORG, RUNSTATS, COPY, RECOVER, CHECK DATA, CHECK INDEX, and REBUILD.
IBM lets you write the EXEC yourself or call the cataloged procedure DSNUPROC. Both end up running DSNUTILB from an APF-authorized library.
12345678//jobname JOB ... //UTIL EXEC PGM=DSNUTILB,PARM='DB2T,HR.COPY.HRTS' //STEPLIB DD DISP=SHR,DSN=DSN.DB2T.SDSNLOAD //SYSPRINT DD SYSOUT=* //UTPRINT DD SYSOUT=* //SYSIN DD * utility-control-statement /*
1234//UTIL EXEC DSNUPROC,SYSTEM=DB2T,UID='HR.COPY.HRTS' //SYSIN DD * utility-control-statement /*
PARM is system,uid[,utproc]. The UID identifies the job in SYSIBM.SYSUTIL for -DISPLAY UTILITY, -TERM UTILITY, and restart. Default UID is often userid.jobname. Restart uses the same UID with RESTART or RESTART(PHASE). PREVIEW checks syntax (and expands LISTDEF) without running the utility.
In data sharing, SYSTEM can be a group or subgroup attachment name. The job must run on a z/OS image that can attach to that group unless you use group attach.
| DD | Typical utilities | Role |
|---|---|---|
| SYSIN | All online utilities | Utility control statements |
| SYSPRINT | All online utilities | DSNU messages and reports |
| UTPRINT | Any utility that sorts | DFSORT / Db2 Sort messages |
| SYSUT1 / SORTOUT | LOAD, REORG, REBUILD, CHECK INDEX, MERGECOPY | WORKDDN sort in/out (defaults) |
| SYSCOPY | COPY, LOAD/REORG COPYDDN, MERGECOPY | Default image-copy output DD |
Prefer TEMPLATE for image copies and unload files so you are not editing GDGs in JCL every week:
123TEMPLATE LOC DSN HR.COPY.&DB..&TS..D&DATE..T&TIME. UNIT SYSDA DISP(NEW,CATLG,DELETE) SPACE(50,10) CYL COPY TABLESPACE HRDB.HRTS COPYDDN(LOC) FULL YES SHRLEVEL REFERENCE
LOAD needs input (SYSREC or INDDN), error (SYSERR), and usually sort work (SYSUT1, SORTOUT). Add SYSMAP when unique indexes or ENFORCE CONSTRAINTS can discard rows. Add SYSDISC if you want discarded records kept—LRECL/RECFM must match SYSREC. COPYDDN takes an inline image copy so LOG NO does not leave COPY-pending.
123456789101112131415//LOAD EXEC DSNUPROC,SYSTEM=DB2T,UID='HR.LOAD.EMP' //SYSREC DD DISP=SHR,DSN=HR.EMP.DATA //SYSERR DD DSN=HR.EMP.SYSERR,DISP=(MOD,DELETE,CATLG), // UNIT=SYSDA,SPACE=(CYL,(10,10),RLSE) //SYSMAP DD DSN=HR.EMP.SYSMAP,DISP=(MOD,DELETE,CATLG), // UNIT=SYSDA,SPACE=(CYL,(10,10),RLSE) //SYSDISC DD DSN=HR.EMP.SYSDISC,DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE) //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(50,20),RLSE) //SORTOUT DD UNIT=SYSDA,SPACE=(CYL,(50,20),RLSE) //UTPRINT DD SYSOUT=* //SYSIN DD * LOAD DATA INDDN(SYSREC) REPLACE LOG YES INTO TABLE HR.EMPLOYEE /*
Details of each LOAD DD are on the LOAD utility JCL page. Keep work data set DISP restart-friendly (IBM samples often use MOD,DELETE,CATLG).
UNLOAD writes rows to UNLDDN (default SYSREC) and can punch a LOAD statement to PUNCHDDN (often SYSPUNCH). FROMCOPY unloads from an image copy instead of the live space—then you do not need the table space allocated for read.
1234567891011//UNLD EXEC DSNUPROC,SYSTEM=DB2T,UID='HR.UNLD.EMP' //SYSREC DD DSN=HR.EMP.UNLOAD(+1),DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(CYL,(50,20),RLSE) //SYSPUNCH DD DSN=HR.EMP.PUNCH(+1),DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(TRK,(5,5),RLSE) //SYSIN DD * UNLOAD TABLESPACE HRDB.HRTS FROM TABLE HR.EMPLOYEE UNLDDN SYSREC PUNCHDDN SYSPUNCH /*
SHRLEVEL NONE REORG uses unload/reload work files (SYSREC, SYSUT1, SORTOUT). SHRLEVEL CHANGE/REFERENCE uses shadow data sets (often dynamically allocated) plus a mapping table for CHANGE. SORTDEVT/SORTNUM reduce hard-coded SORTWKnn DDs. COPYDDN is required in spirit for recoverability after LOG NO; REFERENCE/CHANGE take an inline copy during execution.
123456789//REORG EXEC DSNUPROC,SYSTEM=DB2T,UID='HR.REO.HRTS' //SYSIN DD * TEMPLATE CP DSN HR.COPY.&DB..&TS..REO.&DATE. REORG TABLESPACE HRDB.HRTS SHRLEVEL CHANGE COPYDDN(CP) SORTDEVT SYSDA SORTNUM 8 STATISTICS TABLE(ALL) INDEX(ALL) /*
RUNSTATS is the smallest skeleton: SYSIN, SYSPRINT, STEPLIB. COLGROUP/FREQVAL may allocate sort work dynamically. SHRLEVEL CHANGE lets queries run during collection.
123456//STATS EXEC DSNUPROC,SYSTEM=DB2T,UID='HR.RST.HRTS' //SYSIN DD * RUNSTATS TABLESPACE HRDB.HRTS TABLE(ALL) INDEX(ALL) SHRLEVEL CHANGE UPDATE ALL REPORT YES /*
COPY needs an output data set per COPYDDN/RECOVERYDDN name, or a TEMPLATE. Full copies often use a GDG (+1). FlashCopy needs FCCOPYDDN pointing at a VSAM template, not a sequential tape.
123456789//COPY EXEC DSNUPROC,SYSTEM=DB2T,UID='HR.CPY.HRTS' //SYSCOPY DD DSN=HR.COPY.HRTS(+1),DISP=(NEW,CATLG,DELETE), // UNIT=TAPE,LABEL=(1,SL) //SYSIN DD * COPY TABLESPACE HRDB.HRTS COPYDDN(SYSCOPY) FULL YES SHRLEVEL REFERENCE /*
RECOVER usually dynamically allocates image copies from SYSIBM.SYSCOPY. You often supply only SYSIN and SYSPRINT. Tapes must be in the catalog (or available to DFSMShsm recall). For TORBA/TOLOGPOINT, paste the hex from REPORT RECOVERY or QUIESCE output. Do not point a SYSCOPY DD at the backup unless you are using a documented FROMCOPY-style override—the default path is SYSCOPY catalog lookup.
12345//RECV EXEC DSNUPROC,SYSTEM=DB2T,UID='HR.RCV.HRTS' //SYSIN DD * RECOVER TABLESPACE HRDB.HRTS RECOVER INDEXSPACE HRDB.XENP1 /*
CHECK DATA needs sort work and an error DD; exception tables must already exist if you use FOR EXCEPTION. CHECK INDEX needs WORKDDN sort files. SHRLEVEL CHANGE variants exist with extra restrictions (including FlashCopy in some releases).
12345678910//CHK EXEC DSNUPROC,SYSTEM=DB2T,UID='HR.CHK.HRTS' //SYSERR DD DSN=HR.CHK.SYSERR,DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE) //SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(20,10),RLSE) //SORTOUT DD UNIT=SYSDA,SPACE=(CYL,(20,10),RLSE) //UTPRINT DD SYSOUT=* //SYSIN DD * CHECK DATA TABLESPACE HRDB.HRTS SCOPE ALL CHECK INDEX (ALL) TABLESPACE HRDB.HRTS /*
REBUILD INDEX reconstructs an index from the table. Provide sort work (SYSUT1/SORTOUT or SORTDEVT). COPYDDN can take an inline index copy if the index is COPY YES. STATISTICS collects index stats; follow with table-space RUNSTATS if you need matching table numbers.
123456//RBLD EXEC DSNUPROC,SYSTEM=DB2T,UID='HR.RBD.XEMP' //SYSIN DD * REBUILD INDEX (HR.XEMP1) SORTDEVT SYSDA SORTNUM 6 STATISTICS /*
| Utility | Typical extra DDs or templates |
|---|---|
| LOAD | SYSREC (INDDN), SYSERR, SYSMAP, SYSDISC, SYSUT1, SORTOUT, optional SYSCOPY |
| UNLOAD | SYSREC (UNLDDN) output, optional PUNCHDDN for LOAD statements |
| REORG TS | SYSREC/SYSUT1/SORTOUT or shadow data sets; COPYDDN; DISCARDDN; mapping table |
| RUNSTATS | Usually SYSIN/SYSPRINT only; optional work if COLGROUP sort |
| COPY | COPYDDN/RECOVERYDDN or TEMPLATE; optional FCCOPYDDN |
| RECOVER | Often no copy DD—RECOVER dynamically allocates from SYSCOPY |
| CHECK DATA | ERRDDN, WORKDDN, exception tables, SORTWK |
| CHECK INDEX | WORKDDN sort files |
| REBUILD INDEX | SYSUT1/SORTOUT, optional COPYDDN, STATISTICS |
SORTWKnn DDs appear when you do not use SORTDEVT. Allocate enough cylinders; B37 on sort is a common REORG/LOAD failure. Region=0M (or a large REGION) on the EXEC statement is a frequent shop standard for utility steps.
Utility JCL is a delivery truck form. The truck is always named DSNUTILB. The address is PARM (which Db2 house, which tracking number UID). SYSIN is the packing list (COPY, LOAD, REORG). SYSPRINT is the receipt. Each job type brings extra boxes: LOAD brings a crate of new toys (SYSREC), COPY brings an empty photo album (SYSCOPY), RECOVER usually brings nothing extra because it already knows where the albums are filed (SYSCOPY catalog). IKJEFT01 is a different truck that only delivers doorbell messages (DSN), not furniture.
1. Which program runs COPY, LOAD, and REORG?
2. Which two DD names every online utility job needs?
3. DSNUPROC is:
4. WORKDDN / SYSUT1 / SORTOUT appear on:
5. How should you restart a failed utility?