Locating the DUMPQ checkpoint for RECOVERDM

Use the program IQCFCKPT to create a job stream to automatically locate the DUMPQ checkpoint so that you can submit a RECOVERDM job to restart IMS after a cold start.

You can use the program IQCFCKPT to create a job stream that will automatically locate the DUMPQ checkpoint. You can then submit a RECOVERDM job to restart IMS after a cold start.

The IMS Log Archive utility (DFSUARC0) creates a user-defined data set containing all DUMPQ log records required for IMS Queue Control Facility to re-create the IMS message queue after a cold start.

IQCFCKPT reads through the data set of IMS log records created by DFSUARC0 and creates the required CHECKPOINT command for the last DUMPQ checkpoint in the data set. IQCFCKPT also creates the appropriate checkpoint control card for the last SNAPQ simple checkpoint or reset checkpoint in the file.

Use the following process to locate the checkpoint and then restart after an IMS cold start.

  • Run DFSUARC0 to capture all the DUMPQ records IMS Queue Control Facility needs for running the RECOVERDM procedure
  • Run IQCFCKPT to identify and create the IMS Queue Control Facility checkpoint control card
  • Run SELECT to select all IMS log records necessary to recover the message queue
  • Run SORT to put the records in the proper sequence for insertion to the message queue
  • Execute LOAD to the selected, sorted messages back on the message queue

The following example RECOVERDM procedure shows sample JCL to locate DUMPQ checkpoint:

//RECOVER  JOB 'RECOVER AFTER DUMPQ',MSGCLASS=H,MSGLEVEL=(1,1),
//         TIME=1440,CLASS=S,USER=USRT001,NOTIFY=USRT001
//*
/*ROUTE    PRINT THISCPU/IMSTST13
//*
//*            Auto Restart after IMS DUMPQ
//*            ----------------------------
//*
//********************************************************************
//*           DELETE OLD DATASETS                                    *
//********************************************************************
//DELETE   EXEC PGM=IEFBR14
//SYSPRINT DD  SYSOUT=H
//DD1    DD  DSN=USRT001.ARCHLOG.CPFODMPQ,UNIT=SYSDA,DISP=(MOD,DELETE),
//        SPACE=(TRK,(1))
//DD2    DD  DSN=USRT001.ARCHLOG.DFSSLOGP,UNIT=SYSDA,DISP=(MOD,DELETE),
//        SPACE=(TRK,(1))
//DD3    DD  DSN=USRT001.ARCHLOG.DFSMRQ,UNIT=SYSDA,DISP=(MOD,DELETE),
//        SPACE=(TRK,(1))
//DD4    DD  DSN=USRT001.ARCHLOG.MSGQ,UNIT=SYSDA,DISP=(MOD,DELETE),
//        SPACE=(TRK,(1))
//DD5    DD  DSN=USRT001.ARCHLOG.SNAPQ,UNIT=SYSDA,DISP=(MOD,DELETE),
//        SPACE=(TRK,(1))
//DD6   DD  DSN=USRT001.ARCHLOG.LOGOUT,UNIT=SYSDA,DISP=(MOD,DELETE),
//        SPACE=(TRK,(1))
//DD7   DD  DSN=USRT001.ARCHLOG.SCRAPSEL,UNIT=SYSDA,DISP=(MOD,DELETE),
//        SPACE=(TRK,(1))
//DD8   DD  DSN=USRT001.ARCHLOG.SORTOUTB,UNIT=SYSDA,DISP=(MOD,DELETE),
//        SPACE=(TRK,(1))
//DD9   DD  DSN=USRT001.ARCHLOG.SCRAPLOG,UNIT=SYSDA,DISP=(MOD,DELETE),
//        SPACE=(TRK,(1))
//DD10  DD  DSN=USRT001.ARCHLOG.ISRTFIL,UNIT=SYSDA,DISP=(MOD,DELETE),
//        SPACE=(TRK,(1))
//*
//********************************************************************
//*           Run IMS Log Archive Utility to copy DUMPQ records.     *
//********************************************************************
//ARCHIVE EXEC PGM=DFSUARC0,PARM='DBRC=NO'
//*        PARM='SYS1,DBRC=NO'
//STEPLIB  DD  DISP=SHR,DSN=IMSBLD.I71RTS52.ARESLIB
//*TEPLIB  DD  DISP=SHR,DSN=IMSBLD.I810TS25.ARESLIB
//RECON1   DD  DSN=IMSTESTS.DSHR.RECON1,DISP=SHR
//RECON2   DD  DSN=IMSTESTS.DSHR.RECON2,DISP=SHR
//RECON3   DD  DSN=IMSTESTS.DSHR.RECON3,DISP=SHR
//*
//DFSSLDSP DD  DISP=SHR,DSN=MRQT.IMS81R.MULTI.DUMPQ,
//             VOL=SER=IMSDCL,UNIT=SYSDA
//*
//DFSSLOGP DD  DSN=USRT001.ARCHLOG.DFSSLOGP,DISP=(,CATLG),
//             DCB=(RECFM=VB,LRECL=22524,BLKSIZE=22528),
//             UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//DFSMRQ   DD  DSN=USRT001.ARCHLOG.DFSMRQ,DISP=(,CATLG),
//             DCB=(RECFM=VB,LRECL=22524,BLKSIZE=22528),
//             UNIT=SYSDA,SPACE=(CYL,(1,1),RLSE)
//*
//SYSPRINT DD  SYSOUT=*
//SYSUDUMP DD  SYSOUT=*
//SYSIN    DD   *
 COPY  DDNOUT1(DFSMRQ) -
    RECORD (O(5) T(X) V(4001) L(2) C(E)) -
    RECORD (O(5) T(X) V(4002) L(2) C(E)) -
    RECORD (O(5) T(X) V(4098) L(2) C(E)) -
    RECORD (O(5) T(X) V(4099) L(2) C(E))
/*
//********************************************************************
//*           Locate DUMPQ checkpoint on user-generated log          *
//********************************************************************
//FINDCK  EXEC PGM=IQCFCKPT,REGION=0M
//STEPLIB  DD  DISP=SHR,DSN=hlqual.SIQCLINK
//SYSUDUMP DD  SYSOUT=*
//SYSPRINT DD  SYSOUT=*
//CKPTIFIL DD  DSN=MRQT.IMS81R.MULTI.DUMPQ,UNIT=SYSDA,
//             VOL=SER=IMSDCL,DISP=SHR
//CKPTOFIL DD  SYSOUT=*,DCB=(RECFM=FA,LRECL=137)
//CPFOSIMP DD  SYSOUT=*,DCB=(RECFM=F,LRECL=80)
//CPFORSRT DD  SYSOUT=*,DCB=(RECFM=F,LRECL=80)
//CPFODMPQ DD  DSN=USRT001.ARCHLOG.CPFODMPQ,
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=0),
//             UNIT=SYSDA,SPACE=(TRK,(1)),
//             DISP=(,CATLG)
//CPFOSNPQ DD  SYSOUT=*,DCB=(RECFM=F,LRECL=80)
//CPFOQDMP DD  SYSOUT=*,DCB=(RECFM=F,LRECL=80)
//*
//********************************************************************
//*           DEFINE VSAM MSGQ FILE                                  *
//********************************************************************
//MSGQALL  EXEC PGM=IDCAMS
//SYSPRINT DD   SYSOUT=H
//SYSIN    DD   *
  DELETE USRT001.ARCHLOG.CLUSTER
  SET MAXCC=0
  DEFINE CLUSTER (NAME(USRT001.ARCHLOG.CLUSTER) -
                  VOL(000000) -
                  IXD KEYS(4 0) -
                  RECSZ(500 30000)  -
                  SPEED IMBED REPLICATE -
                  REUSE SHAREOPTIONS(3 3) ) -
         DATA    (NAME(USRT001.ARCHLOG.DATA) -
                  CONTROLINTERVALSIZE(32760) -
                  CYL(01,05) ) -
         INDEX   (NAME(USRT001.ARCHLOG.INDEX) -
                  CONTROLINTERVALSIZE(512) -
                  TRACKS(10,10) )
/*
//*
//********************************************************************
//*           QCF SELECT STEP                                        *
//********************************************************************
//SELECT  EXEC PGM=IQCSELCT,REGION=0M
//STEPLIB  DD  DISP=SHR,DSN=hlqual.SIQCLINK
//*                                   DATA FROM IMS LOG ARCHIVE UTILITY
//LOGIN    DD  DSN=USRT001.ARCHLOG.DFSMRQ,DISP=SHR
//LOGOUT   DD  DSN=USRT001.ARCHLOG.LOGOUT,UNIT=SYSDA,
//             DCB=(LRECL=32756,BLKSIZE=32760,RECFM=VB),
//             DISP=(,CATLG),VOL=SER=222222,SPACE=(CYL,(1,1),RLSE)
//MSGQ     DD  DSN=USRT001.ARCHLOG.CLUSTER,
//             AMP=('BUFND=20,BUFNI=10'),
//             DISP=(OLD,KEEP,KEEP)
//SCRAPSEL DD  DUMMY
//SORTINB  DD  DSN=&&SORTINB,SPACE=(TRK,(1,1)),DISP=(NEW,PASS),
//             UNIT=SYSVIO,
//             DCB=(LRECL=80,RECFM=FB,BLKSIZE=800)
//SYSUDUMP DD  SYSOUT=H
//QCFIN    DD  DSN=USRT001.ARCHLOG.CPFODMPQ,DISP=SHR
//         DD  DSN=IMSVS.ARCHLOG.QCFIN,DISP=SHR
//QCFPRINT DD  SYSOUT=H
//SNAPDUMP DD  SYSOUT=H
//********************************************************************
//*     SORT QCF SELECTED LOG RECORDS TO  IN COLD STARTED IMS        *
//********************************************************************
//SORTB   EXEC PGM=SORT,REGION=0M,PARM='CORE=MAX',
//         COND=(0,NE,SELECT)
//SORTLIB  DD  DISP=SHR,DSN=SYS1.SORTLIB
//SORTIN   DD  DISP=SHR,DSN=USRT001.ARCHLOG.LOGOUT,
//             UNIT=SYSDA,VOL=SER=222222
//SORTOUT  DD  DSN=USRT001.ARCHLOG.ISRTFIL,
//             UNIT=SYSDA,SPACE=(TRK,(5,2)),
//             DCB=(LRECL=32756,BLKSIZE=32760,RECFM=VB),
//             DISP=(NEW,CATLG),VOL=SER=000000
//SYSOUT   DD  SYSOUT=H
//SORTWK01 DD  UNIT=SYSVIO,SPACE=(CYL,(1,1))
//SORTWK02 DD  UNIT=SYSVIO,SPACE=(CYL,(1,1))
//SORTWK03 DD  UNIT=SYSVIO,SPACE=(CYL,(1,1))
//SORTWK04 DD  UNIT=SYSVIO,SPACE=(CYL,(1,1))
//SYSIN    DD  DSN=&&SORTINB,DISP=(OLD,PASS)
//*
//********************************************************************
//*           SORTED QCF SELECTED DUMPQ LOG RECORDS    
//********************************************************************
//LOAD     EXEC PGM=IQCINI0$,
//     PARM='BPEINIT=IQCBINI0,BPECFG=IQCIVPCF,IMSPLEX=IPLEX,QCFIMS=IMS1'
//STEPLIB  DD  DISP=SHR,DSN=hlqual.SIQCLINK
//         DD  DISP=SHR,DSN=IMSREL.RESLIB
//*
//QCFPRINT DD SYSOUT=A
//*
//LOAD     DD DISP=SHR,DSN=QCF.UNLOAD
//*
//* SCRAPLOG IS AN OPTIONAL DD STATEMENT. IT WILL CONTAIN THE 
//* REJECTED MESSAGES FROM THE LOAD STEP. 
//* DCB PARAMETERS SHOULD BE THE SAME AS THOSE FOR THE LOAD 
//* DATA SET.
//* HOWEVER, IT IS RECOMMENDED THAT THE MAXIMUM SIZES FOR LRECL
//* AND BLKSIZE ARE USED.
//*
//SCRAPLOG DD DSN=QCF.SCRAPLOG,UNIT=SYSDA,DISP=(NEW,CATLG),
//         DCB=(LRECL=32756,BLKSIZE=32760,RECFM=VB),
//         SPACE=(CYL,(5,5))
//* 
//SNAPDUMP DD SYSOUT=A 
//* 
//QCFIN DD DSN=USER.PRIVATE.PROCLIB(load),UNIT=SYSDA

In step FINDCK, program IQCFCKPT prepares the CHECKPOINT command that is used by the RECOVERDM function. This statement is stored in data set DSN=USRT001.ARCHLOG.CPFODMPQ (DDNAME CPFODMPQ in the same step).

The CPFODMPQ data set, concatenated with the IMSVS.ARCHLOG.QCFIN data set, is the QCFIN for the IQCSELCT program in the SELECT step.

In the IMSVS.ARCHLOG.QCFIN data set, you should prepare the FUNCTION and SELECT statements.

The following example shows how to do this for IMSVS.ARCHLOG.QCFIN:

   FUNCTION RECOVERDM
   SELECT   TYPE=DIO