OpenFrame HiDB 마이그레이션 툴

본 장에서는 OpenFrame HiDB에서 제공하는 마이그레이션 툴에 대해 기술한다.

1. 개요

다음은 Mainframe에서 사용되었던 계층형 데이터베이스 데이터를 마이그레이션하기 위한 프로그램 목록이다.

프로그램명 설명

dbdcpybkgen

Mainframe의 IMS/DB의 특정 DBD에서 SEGMENT, FIELD 정보를 추출하여 레이아웃(COBOL Copybook)을 생성한다.

dliprep

HiDB에서 애플리케이션의 EXEC DLI 인터페이스를 프리컴파일을 통해 HiDB 내부 인터페이스로 변환한다.

hdgensch

데이터 마이그레이션을 위한 스키마 파일을 생성한다.

hdload

HiDB 표준 포맷 데이터를 입력받아 HiDB 데이터베이스로 Load한다.

hdpcdf01

Mainframe의 Unload 유틸리티로 만든 데이터를 HiDB 표준 포맷으로 변환한다.

hidbptrmgr

Secondary index table과 Logical child table의 ID 연결 정보를 관리한다.

hidbreconv

HiDB에서 unload하고 dsmigout을 거친 데이터를 Mainframe의 load 유틸리티의 입력 형식으로 변환한다.

2. dbdcpybkgen

dbdcpybkgen은 Mainframe의 IMS/DB의 특정 DBD에서 SEGMENT, FIELD 정보를 추출하여 레이아웃(COBOL Copybook)을 생성하는 툴 프로그램이다.

Index DBD 또는 DBD 내부에 variable length segment가 존재하는 경우 기존의 레이아웃이 아닌 dbdcpybkgen을 사용하여 생성한 레이아웃을 사용해야 한다.

사용법

dbdcpybkgen 프로그램을 실행하는 방법은 다음과 같다.

Usage: dbdcpybkgen [options] <file> ...
  • [options]

    옵션 설명

    [-D]

    dbdcpybkgen을 DEBUG 모드로 수행한다.

    [-h]

    dbdcpybkgen의 사용방법을 화면에 출력한다.

  • 입력 항목

    항목 설명

    file

    레이아웃을 생성하고자 하는 DBD script를 명시한다.

사용예제

다음은 dbdcpybkgen을 실행하여 일반적인 DBD 세그먼트에 대하여 레이아웃을 생성하는 예이다.

$ dbdcpybkgen EXHIDAM

위의 명령이 정상적으로 종료하면 다음과 같은 메시지가 출력된다.

dbdcpybkgen version 7.2.0(10) jjeong@:ofsrc/ims(#1) 2018-02-05 11:32:29
Database Description Block Copybook Generation Program

DBDCPYBKGEN FCOUNT=1
--HiDB runs on debug mode
--HiDB connection name is HIDB_NX_CONN
--HiDB DLI functions show data buffer
--HiDB resets application buffer if GET request fails
--HiDB alters key sequences
  -HiDB use CONVERT('WE8EBCDIC1047', 'MSWIN949') key sequence
--HiDB requests SELECT query with LEAD for GET NEXT without SSA
--HiDB requests SELECT query with LEAD for GET NEXT IN PARENT without SSA
--HiDB uses RDB indicator to check column status
--HiDB use 0x20 to default value of fetched columns
------------------------------------------------------------
*** Processing DBD script "EXHIDAM"
------------------------------------------------------------

>>>>> Processing DBD "EXHIDAM"
 *** DBD information
  DBD NAME=EXHIDAM,ACCESS=(8,2),RMNAME=(,1,16,0)
    DATASET LABEL=,DD1=HIDAMD,DD2=,CISZ1=0,CISZ2=0
            BLOCK=(0,0),DEVICE=3380,SCAN=0,FRSPC(0,0)
    SEGM NAME=SEG1,PARENT=(,(,)),SOURCE=((,),(,))
      LCHILD NAME=(POINTER,EXHIIND),PAIR=,INDEX=
      LCHILD NAME=(POINTE1,EXHIIX1),PAIR=,INDEX=
      LCHILD NAME=(POINTE2,EXHIIX2),PAIR=,INDEX=
      LCHILD NAME=(POINTE3,EXHIIX3),PAIR=,INDEX=
      FIELD NAME=SEG1KEY,BYTES=6,START=1,ATTR=(SEQ,U)
      FIELD NAME=KOSI,BYTES=4,START=7,ATTR=
      XDFLD NAME=SEG1KE1,SEGMENT=SEG1
      XDFLD NAME=SEG2KE2,SEGMENT=SEG2
      XDFLD NAME=SEG3KE3,SEGMENT=SEG3
    SEGM NAME=SEG2,PARENT=(SEG1,(,)),SOURCE=((,),(,))
      LCHILD NAME=(POINTE4,EXHIIX4),PAIR=,INDEX=
      FIELD NAME=SEG2KEY,BYTES=6,START=1,ATTR=(SEQ,U)
      FIELD NAME=HAHA,BYTES=4,START=7,ATTR=
      FIELD NAME=/SX2,BYTES=4,START=0,ATTR=
      XDFLD NAME=SEG4KE4,SEGMENT=SEG4
    SEGM NAME=SEG3,PARENT=(SEG2,(,)),SOURCE=((,),(,))
      FIELD NAME=SEG3KEY,BYTES=6,START=1,ATTR=(SEQ,U)
      FIELD NAME=KAKA,BYTES=4,START=7,ATTR=
      FIELD NAME=CACA,BYTES=4,START=11,ATTR=
    SEGM NAME=SEG4,PARENT=(SEG2,(,)),SOURCE=((,),(,))
      FIELD NAME=SEG4KEY,BYTES=6,START=1,ATTR=(SEQ,U)
      FIELD NAME=BABA,BYTES=4,START=7,ATTR=
      FIELD NAME=/CKXX,BYTES=18,START=1,ATTR=
      FIELD NAME=/SX1,BYTES=4,START=0,ATTR=
    SEGM NAME=SEG5,PARENT=(SEG1,(,)),SOURCE=((,),(,))
      LCHILD NAME=(POINTE5,EXHIIX5),PAIR=,INDEX=
      FIELD NAME=SEG5KEY,BYTES=6,START=1,ATTR=(SEQ,U)
      FIELD NAME=DADA,BYTES=4,START=7,ATTR=
      XDFLD NAME=SEG5KE5,SEGMENT=SEG5
 *** Generating copybooks for the physical DBD segment SEG1 to /home/jjeong/prog_test/hidb_project/sears_20180423/copybook/EXHIDAM/SEG1.cpy
 *** Generating copybooks for the physical DBD segment SEG2 to /home/jjeong/prog_test/hidb_project/sears_20180423/copybook/EXHIDAM/SEG2.cpy
 *** Generating copybooks for the physical DBD segment SEG3 to /home/jjeong/prog_test/hidb_project/sears_20180423/copybook/EXHIDAM/SEG3.cpy
 *** Generating copybooks for the physical DBD segment SEG4 to /home/jjeong/prog_test/hidb_project/sears_20180423/copybook/EXHIDAM/SEG4.cpy
 *** Generating copybooks for the physical DBD segment SEG5 to /home/jjeong/prog_test/hidb_project/sears_20180423/copybook/EXHIDAM/SEG5.cpy
>>>>> Successfully generated copybooks for DBD "EXHIDAM"

PROGRAM COMPLETED SUCCESSFULLY. Total : [1]

디폴트 COPYBOOK 디렉터리를 확인하면 다음과 같은 레이아웃 파일이 생성되어 있음을 확인할 수 있다.

$ ls -al
-rw-rw-r--  1 jjeong jjeong  136  9월 10 09:46 SEG1.cpy
-rw-rw-r--  1 jjeong jjeong  109  9월 10 09:46 SEG2.cpy
-rw-rw-r--  1 jjeong jjeong  162  9월 10 09:46 SEG3.cpy
-rw-rw-r--  1 jjeong jjeong  109  9월 10 09:46 SEG4.cpy
-rw-rw-r--  1 jjeong jjeong  136  9월 10 09:46 SEG5.cpy

레이아웃 파일의 내용은 다음과 같다.

$ vim SEG1.cpy
      *generated by DBDCPYBKGEN
        01 SEG1.
         03 SEG1KEY PIC X(6).
         03 KOSI PIC X(4).
         03 FILLER PIC X(38).

다음은 dbdcpybkgen을 실행하여 DBD 내부에 variable length를 가진 세그먼트에 대하여 레이아웃을 생성하는 예이다.

$ dbdcpybkgen EXHIDAM

위의 명령이 정상적으로 종료하면 다음과 같은 메시지가 출력된다.

dbdcpybkgen version 7.2.0(0) oframe@:ofsrc/ims(#1) 2018-02-05 11:32:29
Database Description Block Copybook Generation Program

DBDCPYBKGEN FCOUNT=1
--HiDB runs on debug mode
--HiDB connection name is HIDB_NX_CONN
--HiDB DLI functions show data buffer
--HiDB resets application buffer if GET request fails
--HiDB alters key sequences
  -HiDB use CONVERT('WE8EBCDIC1047', 'MSWIN949') key sequence
--HiDB requests SELECT query with LEAD for GET NEXT without SSA
--HiDB requests SELECT query with LEAD for GET NEXT IN PARENT without SSA
--HiDB uses RDB indicator to check column status
--HiDB use 0x20 to default value of fetched columns
------------------------------------------------------------
*** Processing DBD script "EXHIDAM4"
------------------------------------------------------------

>>>>> Processing DBD "EXHIDAM4"
 *** DBD information
  DBD NAME=EXHIDAM4,ACCESS=(8,2),RMNAME=(,1,16,0)
    DATASET LABEL=,DD1=HIDAMD,DD2=,CISZ1=0,CISZ2=0
            BLOCK=(0,0),DEVICE=3380,SCAN=0,FRSPC(0,0)
    SEGM NAME=SEG1,PARENT=(,(,)),SOURCE=((,),(,))
      LCHILD NAME=(POINTER,EXHIIN4),PAIR=,INDEX=
      FIELD NAME=SEG1KEY,BYTES=4,START=3,ATTR=(SEQ,U)
      FIELD NAME=KOSI,BYTES=4,START=7,ATTR=
 *** Generating copybooks for the physical DBD segment SEG1 to /home/jjeong/prog_test/hidb_project/sears_20180423/copybook/EXHIDAM4/SEG1.cpy
>>>>> Successfully generated copybooks for DBD "EXHIDAM4"

PROGRAM COMPLETED SUCCESSFULLY. Total : [1]

레이아웃 파일의 내용은 다음과 같다.

$ vim SEG1.cpy
      *generated by DBDCPYBKGEN
        01 SEG1.
         03 DATALEN PIC 9(4) COMP.
         03 SEG1KEY PIC X(4).
         03 VARDATA2 PIC X(42).
관련 환경설정

OpenFrame 환경설정 중 hidb 서브젝트, HIDB_DEFAULT 섹션에 COPYBOOK_DIR 키의 VALUE 항목에 생성된 레이아웃을 저장할 디렉터리 경로를 설정한다.

$ ofconfig list -s hidb -sec HIDB_DEFAULT -k COPYBOOK_DIR

===================================================================================
  SUBJECT   |     SECTION      |        KEY         |             VALUE
===================================================================================
    hidb    |   HIDB_DEFAULT   |    COPYBOOK_DIR    |    /home/openframe/copybook
===================================================================================

OpenFrame 환경설정에 대한 자세한 내용은 OpenFrame HiDB "환경설정 안내서"를 참고한다.

3. dliprep

dliprep은 애플리케이션의 EXEC DLI 인터페이스를 프리컴파일을 통해 HiDB 내부 인터페이스로 변경하는 툴 프로그램이다.

사용법

dliprep 프로그램을 실행하는 방법은 다음과 같다.

Usage: dliprep [options] <file>
  • [options]

    옵션 설명

    [-v]

    dliprep의 버전 정보를 화면에 출력한다.

    [-h]

    dliprep의 사용방법을 화면에 출력한다.

  • 입력 항목

    항목 설명

    file

    프리컴파일할 애플리케이션 소스 파일을 명시한다.

사용예제

다음은 dliprep을 실행하여 일반적인 애플리케이션 소스를 프리컴파일하여 HiDB 내부 인터페이스로 치환된 애플리케이션 소스를 생성하는 예이다.

$ dliprep EXAM.cob

위의 명령이 정상적으로 종료하면 다음과 같은 메시지가 출력된다.

dliprep: EXAM.cob: preprocessed successfully.

dliprep을 수행한 디렉터리를 확인하면 다음과 같은 output 파일이 생성되어 있음을 확인할 수 있다.

$ ls -al
-rw-rw-r-- 1 oframe oframe   5568  5월 20 10:32 dliprep_EXAM.cob

input 파일의 내용은 다음과 같다.

$ vim EXAM.cob
       IDENTIFICATION DIVISION.
       PROGRAM-ID.    EXAMPLE.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01  CONSTANT-AREA.
         03  OUTREC-LEN PIC 9(4) COMP VALUE 300.
       01  PSBNAME PIC X(8) VALUE 'EXAMPSB '.
       01  SEGMENT-NAME PIC X(8).
       01  SEGMENT-DATA PIC X(10).
       01  WHERE-RHS1 PIC X(5).
       01  WHERE-RHS2 PIC X(5).
       LINKAGE SECTION.
       01  DB-PCB.
         03  DBD-NAME     PIC X(8).
         03  SEG-LEVEL    PIC XX.
         03  STATUS-CODE  PIC XX.
         03  PROCOPT      PIC X(4).
         03  RESERVED     PIC X(4).
         03  SEG-NAME     PIC X(8).
         03  KEYLEN       PIC 9(8) COMP.
         03  NSENSEG      PIC 9(8) COMP.
         03  CCATKEY      PIC X(6).

       PROCEDURE DIVISION.

           ENTRY 'DLITCBL' USING DB-PCB.
           EXEC DLI SCHEDULE PSB((PSBNAME))
           END-EXEC.

       EXIT.

output 파일의 내용은 다음과 같다.

$ vim dliprep-EXAM.cob
       IDENTIFICATION DIVISION.
       PROGRAM-ID.    EXAMPLE.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       01  CONSTANT-AREA.
         03  OUTREC-LEN PIC 9(4) COMP VALUE 300.
       01  PSBNAME PIC X(8) VALUE 'EXAMPSB '.
       01  SEGMENT-NAME PIC X(8).
       01  SEGMENT-DATA PIC X(10).
       01  WHERE-RHS1 PIC X(5).
       01  WHERE-RHS2 PIC X(5).
       01 HIDB-DLI-REQ.
            03 HIDB-FUNCTYPE     PIC X(8).
            03 HIDB-CHKPID       PIC X(8).
            03 HIDB-PSBNAME      PIC X(8).
            03 HIDB-CHKPAREA     USAGE POINTER OCCURS 3 TIMES.
            03 HIDB-CHKPLEN      PIC 9(8) COMP-5 OCCURS 3 TIMES.
            03 HIDB-PCBNO        PIC 9(8) COMP-5.
            03 HIDB-MAXLEN       PIC 9(8) COMP-5.
            03 HIDB-FEEDBACKLEN  PIC 9(8) COMP-5.
            03 HIDB-SCHDFLAGS    PIC 9(8) COMP-5.
            03 HIDB-SEGMCOUNT    PIC 9(8) COMP-5.
            03 HIDB-SEGM     OCCURS 16 TIMES.
               05 HIDB-SEGMNAME     PIC X(8).
               05 HIDB-SEGMLEN      PIC 9(8) COMP-5.
               05 HIDB-OFFSET       PIC 9(8) COMP-5.
               05 HIDB-SEGDATAAREA  USAGE POINTER.
               05 HIDB-KEYAREA      USAGE POINTER.
               05 HIDB-KEYLEN       PIC 9(8) COMP-5.
               05 HIDB-FIELDLEN     PIC 9(8) COMP-5.
               05 HIDB-SEGMFLAGS    PIC 9(8) COMP-5.
               05 HIDB-QUALSCNT     PIC 9(8) COMP-5.
               05 HIDB-QUALS     OCCURS 16 TIMES.
                  07 HIDB-LOP       PIC X(8).
                  07 HIDB-KEYFLD    PIC X(8).
                  07 HIDB-ROP       PIC X(2).
                  07 FILLER    PIC X(6).
                  07 HIDB-VADDR     USAGE POINTER.
                  07 HIDB-VADDRLEN  PIC 9(8) COMP-5.
                  07 FILLER    PIC X(4).
               05 HIDB-OCCTYPE      PIC X(1).
               05 HIDB-SETZERO      PIC X(1).
               05 HIDB-LOCKCLASS    PIC X(1).
               05 HIDB-MOVENEXT     PIC X(1).
               05 HIDB-GETFIRST     PIC X(1).
               05 HIDB-SEGMSET      PIC X(1).
               05 HIDB-SETCOND      PIC X(1).
               05 FILLER       PIC X(1).
            03 HIDB-KEYFEEDBACK   USAGE POINTER.
            03 HIDB-DATAAREA     USAGE POINTER.
            03 DLZDIB.
               05 DIBVER         PIC X(2).
               05 DIBSTAT        PIC X(2).
               05 DIBSEGM        PIC X(8).
               05 DIBFIL01       PIC X(1).
               05 DIBFIL02       PIC X(1).
               05 DIBSEGLV       PIC X(2).
               05 DIBKFBL        PIC S9(4) COMP-5.
               05 DIBDBDNM       PIC X(8).
               05 DIBDBORG       PIC X(8).
               05 DIBFIL03       PIC X(6).
       LINKAGE SECTION.
       01  DB-PCB.
         03  DBD-NAME     PIC X(8).
         03  SEG-LEVEL    PIC XX.
         03  STATUS-CODE  PIC XX.
         03  PROCOPT      PIC X(4).
         03  RESERVED     PIC X(4).
         03  SEG-NAME     PIC X(8).
         03  KEYLEN       PIC 9(8) COMP.
         03  NSENSEG      PIC 9(8) COMP.
         03  CCATKEY      PIC X(6).

       01 DLIUIB.
          02 UIBPCBAL USAGE IS POINTER.
          02 UIBRCODE.
            03 UIBFCTR PIC X.
              88 FCNORESP VALUE X'00'.
              88 FCNOTOPEN VALUE X'0C'.
              88 FCINVREQ VALUE X'08'.
              88 FCINVPCB VALUE X'10'.
            03 UIBDLTR PIC X.
              88 DLPSBNF VALUE X'01'.
              88 DLTASKNA VALUE X'02'.
              88 DLPSBSCH VALUE X'03'.
              88 DLLANGCON VALUE X'04'.
              88 DLPSBFAIL VALUE X'05'.
              88 DLPSBNA VALUE X'06'.
              88 DLTERMNS VALUE X'07'.
              88 DLFUNCNS VALUE X'08'.
              88 DLINA VALUE X'FF'.
       PROCEDURE DIVISION.

           ENTRY 'DLITCBL' USING DB-PCB.
      *    EXEC DLI  SCHEDULE PSB (( PSBNAME )) END-EXEC.
        INITIALIZE HIDB-DLI-REQ.
        MOVE "SCHD    " TO HIDB-FUNCTYPE OF HIDB-DLI-REQ.
        MOVE PSBNAME TO HIDB-PSBNAME OF HIDB-DLI-REQ.
        CALL 'ims_cdli_execute' USING BY REFERENCE HIDB-DLI-REQ.

       EXIT.

4. hdgensch

hdgensch는 Mainframe의 IMS/DB 데이터셋을 OpenFrame의 HiDB 데이터셋으로 마이그레이션할 때 필요한 데이터셋 마이그레이션용 스키마 파일을 생성하는 툴 프로그램이다.

일반적으로 스키마 파일은 cobgensch 또는 pligensch 툴을 이용하여 생성하고 데이터셋 마이그레이션 툴인 dsmigin에서 입력으로 지정하는데 HiDB 데이터셋의 경우 cobgensch 또는 pligensch 툴 대신 hdgensch 툴을 이용하여 스키마 파일을 생성해야 한다. 일반적인 데이터셋의 경우 1개의 Copybook이 매핑되는 반면 HiDB 데이터셋의 경우 세그먼트별로 정의된 하나 이상의 Copybook으로 매핑되기 때문이다. 따라서 hdgensch는 내부적으로 각각의 세그먼트별 copybook마다 cobgensch 또는 pligensch 툴을 호출하고, 생성된 스키마 파일들을 하나의 스키마 파일로 병합하는 처리를 하게 된다.

또한, 각 세그먼트의 테이블과 DML 파일을 생성하기 위한 COBOL 레이아웃을 OFM_HIDB_DBD_COLUMN 메타 테이블에 저장한다.

hdgensch가 정상적으로 종료하면 OpenFrame 환경설정 ds 서브젝트에 설정한 디폴트 스키마 디렉터리에 DBD 이름과 '.conv' 확장자로 구성된 파일명의 스키마가 생성되고 각 세그먼트의 COBOL 레이아웃 정보가 메타 테이블에 저장된다. 생성된 스키마는 cobgensch 또는 pligensch 툴에서 생성한 스키마와 동일한 문법을 사용한다.

스키마와 관련된 문법이나 멀티 레이아웃 사용에 관해서는 OpenFrame "마이그레이션 안내서"의 "데이터셋 마이그레이션"을 참고한다.

사용법

hdgensch 프로그램을 실행하는 방법은 다음과 같다.

Usage: hdgensch <schema|meta|all> dbd-name [copybook-dir-name] [options]
  • 입력 항목

    항목 설명

    <schema|meta|all>

    • schema : 주어진 DBD에 대해 스키마 파일을 생성한다.

    • meta : 주어진 DBD에 대해 COBOL Copybook을 참조하여 세그먼트 레이아웃 정보를 메타에 저장한다.

    • all : 위의 두 기능을 모두 실행한다.

    dbd-name

    생성할 스키마 또는 COBOL 레이아웃 메타 정보를 저장할 대상이 되는 데이터베이스를 정의한 DBD 이름을 지정한다.

    해당 DBD는 hdgensch를 실행하기 전에 디폴트 DBDLIB에 등록되어 있어야 하며 최대 8자 이내로 기술한다. DBDLIB 등록에 관한 내용은 dbdgen 툴을 참고한다.

    copybook-dir-name

    HiDB 데이터셋의 필드 정보가 들어 있는 Copybook들이 존재하는 디렉터리 이름을 지정한다. COBOL Copybook 파일명은 DBD에서 기술한 세그먼트 이름과 '.cpy' 확장자로 구성되어야 하고 PL/I Copybook 파일명은 DBD에서 기술한 세그먼트 이름과 '.inc' 확장자로 구성되어야 한다.

    이 경로를 지정하지 않는 경우 HiDB 환경설정 hidb 서브젝트 HIDB_DEFAULT 섹션에 COPYBOOK_DIR 키에 지정된 경로를 참조한다.

  • [options]

    옵션 설명

    [-v]

    hdgensch의 버전정보를 화면에 출력한다.

    [-t] <n|b|t>

    column 정보를 저장하는 경우 OCCURS 속성의 컬럼의 처리 방법을 설정한다.

    • n(normal) : occurs로 지정된 컬럼에 번호를 부여하여 메타 데이터로 저장한다.

    • b(bulk) : occurs로 지정된 컬럼을 하나로 묶어 메타 데이터로 저장한다. 이때 길이는 occurs로 곱해진 모든 컬럼 길이의 합과 같다.

    • t(table) : occurs로 지정된 컬럼을 별도의 테이블로 분리한다. 현재는 지원하지 않는다.

    [-h]

    hdgensch의 사용법을 화면에 출력한다.

    [-f]

    기존에 존재하는 DBD의 컬럼 정보를 삭제하고 다시 생성한다.

    [-u]

    레이아웃(copybook, include file)에 존재하는 dash(-) 문자를 underscore(_) 문자로 변환하여 컬럼 이름을 생성한다.

    [-p]

    Copybook이 PL/I 언어로 작성된 경우 지정한다. 지정을 생략한 경우 기본은 COBOL이다.

    [-he]

    변환 과정에서 세그먼트 이름을 EBCDIC 타입으로 취급해서 처리한다.

사용예제

다음은 hdgensch를 실행하여 스키마 파일을 생성하는 예이다.

$ hdgensch all TMAX01PD -f

위의 명령이 정상적으로 종료하면 다음과 같은 메시지가 출력된다.

hdgensch Version 7.2.0(0) oframe@:ofsrc7/ims(#3) 2018-02-10 16:35:34
HiDB Schema File Generation Program.

--HiDB runs on debug mode
--HiDB connection name is HIDB_NX_CONN
--HiDB will automatically fix data errors
--HiDB DLI functions show data buffer
column information for dbd TMAX01PD removed.

column information for segment REAL generated.

column information for segment TRFC generated.

column information for segment PAYR generated.

column information for segment REGS generated.

copybook information generated.

input filename = /home/arena/oframe_7_fix3/hidb_test/cpybook/TMAX01PD/REAL.cpy
scheme filename = /home/arena/oframe_7_fix3/schema/REAL.conv

 -> Segment('REAL') schema was merged.

input filename = /home/arena/oframe_7_fix3/hidb_test/cpybook/TMAX01PD/TRFC.cpy
scheme filename = /home/arena/oframe_7_fix3/schema/TRFC.conv

 -> Segment('TRFC') schema was merged.

input filename = /home/arena/oframe_7_fix3/hidb_test/cpybook/TMAX01PD/PAYR.cpy
scheme filename = /home/arena/oframe_7_fix3/schema/PAYR.conv

 -> Segment('PAYR') schema was merged.

input filename = /home/arena/oframe_7_fix3/hidb_test/cpybook/TMAX01PD/REGS.cpy
scheme filename = /home/arena/oframe_7_fix3/schema/REGS.conv

 -> Segment('REGS') schema was merged.

HiDB schema('TMAX01PD.conv') was generated successfully.

디폴트 스키마 디렉터리를 확인하면 다음과 같은 스키마 파일이 생성되어 있음을 확인할 수 있다.

$ ls -al
-rw-r--r--   1 adb adb 13862 Oct  6 10:41 TMAX01PD.conv
관련 환경설정
  • OpenFrame 환경설정 중 ds 서브젝트, DATASET_DIRECTORY 섹션에 SCHEMA_DIR 키의 VALUE 항목에 생성된 스키마 파일을 저장할 디렉터리 경로를 설정한다.

    $ ofconfig list -s ds -sec DATASET_DIRECTORY -k SCHEMA_DIR
    
    ===================================================================================
      SUBJECT   |       SECTION        |       KEY        |            VALUE
    ===================================================================================
         ds     |  DATASET_DIRECTORY   |    SCHEMA_DIR    |  /home/openframe/schema
    ===================================================================================
  • OpenFrame 환경설정 중 ims 서브젝트, IMS_DEFAULT 섹션에 DBDLIB_NAME 키의 VALUE 항목에 작업대상 데이터베이스의 DBD가 등록되어 있는 DBDLIB를 설정한다.

    $ ofconfig list -s ims -sec IMS_DEFAULT -k DBDLIB_NAME
    
    ===================================================================================
      SUBJECT   |       SECTION        |       KEY        |             VALUE
    ===================================================================================
        ims     |     IMS_DEFAULT      |   DBDLIB_NAME    |          IMS.DBDLIB
    ===================================================================================

OpenFrame 환경설정에 대한 자세한 내용은 OpenFrame HiDB "환경설정 안내서"를 참고한다.

5. hdload

hdload는 ASCII 코드로 변환된 OpenFrame 표준 포맷 형식의 데이터셋을 입력받아 HiDB 데이터베이스로 Load하는 툴 프로그램이다.

입력 데이터셋은 다음과 같은 포맷으로 구성되어 있어야 하며 DFSURGU0 유틸리티가 생성한 Unload 데이터셋과 동일한 포맷이다.

figure 1 1
OpenFrame 표준 OpenFrame HiDB 마이그레이션 데이터 포맷
사용법

hdload 프로그램을 실행하는 방법은 다음과 같다.

Usage: hdload [options] dbd-name load-data-file [log=log-file]
  • [options]

    옵션 설명

    [-v]

    hdload의 버전정보를 화면에 출력한다.

    [-h]

    hdload의 사용법을 화면에 출력한다.

    [-q]

    Secondary index table에 대한 insert 없이 load를 실행한다.

    [-rmpk]

    hdpcdf01의 addpk로 생성한 데이터를 처리할 때만 쓰인다.

    [-mk]

    데이터를 tbloader나 sqlldr로 로드하기 위한 포맷의 파일을 작성한다.

    OpenFrame 환경설정 중 hidb 서브젝트, HIDB_DEFAULT 섹션에 HIDB_IMPORT_DIR 키의 VALUE 항목에 파일이 생성될 PATH를 작성하고 사용해야 한다.

    [-ld]

    tbloader(Oracle은 sqlldr)를 사용하여 conventional 방식으로 로드한다.

    -mk 옵션으로 생성된 데이터를 로드한다.

    [-ld2]

    tbloader(Oracle은 sqlldr)를 사용하여 DPL 방식으로 로드한다.

    -mk 옵션으로 생성된 데이터를 로드한다.

    [-p]

    tbloader DPL을 세그먼트마다 병렬로 실행해 로드한다.

    [-bs] <n>

    tbloader의 block size를 지정한다.

    [-pc] <n>

    tbloader의 parallel count를 지정한다.

    [-mg]

    tboloder를 사용하여 merge한다.

    로드하려는 데이터의 key 필드가 기존에 로드되어 있는 key 필드의 데이터와 동일하다면 REPLACE 동작을 수행한다(OCC_ID는 업데이트되지 않는다).

    로드하려는 데이터의 key 필드가 기존에 로드되어 있는 key 필드의 데이터와 다르다면 INSERT 동작을 수행한다.

    -mk 옵션으로 생성된 데이터를 tbloader를 이용하여 merge한다.

    [-qimd]

    -mk와 -im2 옵션의 기능을 한번에 수행한다.

    dbd-name과 load-data-file을 기술해야 한다.

    [-qld]

    -mk와 -ld 옵션의 기능을 한번에 수행한다.

    dbd-name과 load-data-file을 기술해야 한다.

    [-qldd]

    -mk와 -ld2 옵션의 기능을 한번에 수행한다.

    dbd-name과 load-data-file을 기술해야 한다.

    [-qmg]

    -mk와 -mg 옵션의 기능을 한번에 수행한다.

    dbd-name과 load-data-file을 기술해야 한다.

  • 입력 항목

    항목 설명

    dbd-name

    입력 파일의 데이터베이스를 정의한 DBD의 이름을 지정한다.

    해당 DBD는 hdload을 실행하기 전에 디폴트 DBDLIB에 등록되어 있어야 하며 최대 8자 이내로 기술한다.

    DBDLIB 등록에 관한 내용은 dbdgen 툴을 참고한다.

    load-data-file

    hdload의 Load 대상 입력 파일을 지정한다. 파일의 사이즈가 0인 경우 HDAM, HIDAM 데이터베이스는 데이터셋 초기화(pre-format)작업이 수행된다.

    [log=log-file]

    지정한 로그 파일이름으로 세그먼트별 Load 작업 로그를 기록한다. Load가 실패할 경우 원인이 되는 세그먼트 데이터를 찾을 때 유용하다.

    로그 파일에는 Load 세그먼트 순번, 세그먼트 이름, 상태코드, 세그먼트 키값이 기록된다.

사용예제

다음은 hdload를 실행하여 스키마 파일을 생성하는 예이다.

$ hdload TMAX01PD tmax01pd.hdb

TMAX01PD는 Load 대상 데이터베이스를 정의한 DBD의 이름이며 tmax01pd.hdb는 HiDB 표준 포맷으로 변환된 입력 파일이다. TMAX01PD.dd는 Load 대상 데이터베이스의 데이터셋을 동적으로 할당하기 위한 정보가 들어있는 파일이며 res_out은 Prefix Resolution 작업을 위한 작업용 출력 파일이다.

hdload가 정상적으로 종료되면 다음과 같은 메시지가 출력된다.

hdload Version 7.2.0(0) oframe@tplinux32:ofsrc7/ims(#1) 2017-11-09 23:14:22
HiDB Data Load Program

 (*) HiDB DATA LOAD 100% COMPLETED.

*** HIERARCHICAL DIRECT DB REORG RELOAD ***

         SEGMENT  LEVEL  STATISTICS

       TOTAL SEGMENTS BY SEGMENT TYPE
===========================================
SEGMENT   SEGMENT
NAME      LEVEL       RELOADED  DIFFERENCE
-------------------------------------------
TMAX1VAA     1            9628
TMAX1VAD     2            9628
TMAX1VAE     2               0
TMAX1VAB     2           28243
TMAX1VAF     3           28243
TMAX1VAC     3           15586
TMAX1VAG     2               0
-------------------------------------------
         TOTAL SEGMENTS IN DATABASE
UNLOADED          RELOADED      DIFFERENCE
   91328             91328
===========================================

EXECUTION TIME(USER/SYS/REAL): 11.62, 5.34, 148.01
  • SEGMENT LEVEL STATISTICS

    다음은 출력 내용 중 SEGMENT LEVEL STATISTICS의 필드 항목에 대한 설명이다.

    항목 설명

    SEGMENT NAME

    같은 라인의 통계정보가 적용되는 세그먼트 이름이다.

    SEGMENT LEVEL

    데이터베이스 내 세그먼트의 계층레벨 번호이다.

    RELOADED

    데이터베이스에 Reload된 세그먼트 인스턴스의 총 개수이다.

    DIFFERENCE

    Reload 건수와 Unload 건수가 일치하면 공백으로 표시된다.

    Reload 건수가 더 많은 경우는 플러스 기호(+)와 Unload 건수가 더 많은 경우는 마이너스 기호(-)와 해당 건수가 함께 표시된다.

  • TOTAL SEGMENTS IN DATABASE

    다음은 출력 내용 중 TOTAL SEGMENTS IN DATABASE의 필드 항목에 대한 설명이다.

    항목 설명

    UNLOADED

    HD 재편성 Unload 유틸리티인 DFSURGU0에서 Unload할 때 계수한 모든 세그먼트 인스턴스들의 개수이다.

    RELOADED

    HD 재편성 Reload 유틸리티인 DFSURGL0에서 Reload할 때 계수한 모든 세그먼트 인스턴스들의 개수이다.

    DIFFERENCE

    Reloa 건수와 Unload 건수가 일치하면 공백으로 표시된다. 같지 않으면 차이나는 건수가 표시된다.

관련 환경설정

다음과 같이 OpenFrame 환경설정의 ims 서브젝트, IMS_DEFAULT 섹션에 DBDLIB_NAME 키의 VALUE 항목에 작업대상 데이터베이스의 DBD가 등록되어 있는 DBDLIB를 설정한다.

$ ofconfig list -s ims -sec IMS_DEFAULT -k DBDLIB_NAME

===================================================================================
  SUBJECT   |     SECTION      |        KEY         |             VALUE
===================================================================================
    ims     |   IMS_DEFAULT    |    DBDLIB_NAME     |           IMS.DBDLIB
===================================================================================

OpenFrame 환경설정에 대한 자세한 내용은 OpenFrame HiDB "환경설정 안내서"를 참고한다.

6. hdpcdf01

hdpcdf01은 Mainframe에서 IMS/DB Unload 유틸리티인 DFSURGU0으로 생성한 데이터셋을 입력으로 받아 OpenFrame의 HiDB Reload 툴인 hdload에서 사용 가능한 HiDB 표준 포맷의 데이터셋을 생성해주는 툴 프로그램이다.

DFSURGU0에서 생성한 Unload 데이터셋은 HiDB 데이터베이스로 Reload가 불가능하기 때문에 Mainframe에서 생성한 Unload 데이터셋의 내부 포맷을 분석하여 Header와 Trailer 부분을 제거하고 OpenFrame에서 Reload 가능한 형태의 데이터셋으로 재작성하게 된다.

출력된 데이터셋은 다음과 같은 포맷으로 구성된다.

figure 1 1
OpenFrame 표준 OpenFrame/HiDB 마이그레이션 데이터 포맷
사용법

hdpcdf01 프로그램을 실행하는 방법은 다음과 같다.

Usage: hdpcdf01 [options] [format] if=input-file of=output-file dbd=dbd-name
  • [options]

    옵션 설명

    [-v]

    hdpcdf01의 버전정보를 화면에 출력한다.

    [-h]

    hdpcdf01의 사용법을 화면에 출력한다.

    [-d]

    hdpcdf01을 수행하는 동안 입력 파일의 현재 처리 포지션을 출력한다.

    [-hp number]

    입력 파일의 내부 포맷을 분석하는 과정에서 헤더 길이를 계산하는 경우 바이트 값을 추가한다.

    [-dp number]

    입력 파일의 내부 포맷을 분석하는 과정에서 세그먼트 데이터 길이를 계산하는 경우 바이트 값을 추가한다.

    [-rdw]

    입력 파일이 RDW(4Bytes)가 포함된 가변길이형식의 데이터셋인 경우 지정한다.

    [-addpk]

    데이터셋을 마이그레이션하는 경우 자식 세그먼트에 대한 변환할 때에 부모 세그먼트의 키 영역을 참조해야하는 경우가 있다. 이 옵션을 지정하면 자식 세그먼트 레코드의 앞부분에 부모 세그먼트의 키 영역을 추가한다.

  • [format]

    옵션 설명

    [-f1]

    입력 파일이 SHISAM 데이터베이스를 Unload한 데이터셋일 경우 지정한다.

    [-dedb]

    입력 파일이 DEDB 데이터베이스를 Unload한 데이터셋일 경우 지정한다.

  • 입력 항목

    항목 설명

    if=input-file

    hdpcdf01의 입력 파일을 지정한다. 입력 파일은 Mainframe의 IMS/DB Unload 유틸리티인 DFSURGU0에서 생성한 데이터셋 파일명을 기술한다.

    of=output-file

    hdpcdf01의 출력 파일을 지정한다. 출력 파일은 마이그레이션 툴인 dsmigin에서 입력으로 사용된다.

    dbd=dbd-name

    입력 파일의 데이터베이스를 정의한 DBD의 이름을 지정한다.

    해당 DBD는 hdpcdf01을 실행하기 전에 디폴트 DBDLIB에 등록되어 있어야 하며 최대 8자 이내로 기술한다. DBDLIB 등록에 관한 내용은 dbdgen 툴을 참고한다.

사용예제

다음은 hdpcdf01를 실행하여 스키마 파일을 생성하는 예이다.

$ hdpcdf01 if=tmax01uld.dat of=tmax01uld.hdb dbd=TMAX01PD

위의 명령이 정상적으로 종료되면 다음과 같은 메시지가 출력된다.

hdpcdf01 version 7.2.0(1) obuild@tplinux32:ofsrc7/ims(#1) 2017-11-09 23:14:22
HiDB Pre-conversion Program

 * Bytes of Header Part    : 243
 * Bytes of Trailer Part   : 245
 * Bytes of Input file     : 23147438
 * Position of Trailer part: 23147193
 * Current Position of Reading:23146727, Segment:TMAX1VAA
 * MESSAGE: input data reading success.

   *** HDPCDF01  DATA CONVERSION  ***

         SEGMENT  LEVEL  STATISTICS
       TOTAL SEGMENTS BY SEGMENT TYPE
===========================================
SEGMENT                     READ
NAME                        COUNT
-------------------------------------------
TMAX1VAA                    9629
TMAX1VAD                    9628
TMAX1VAE                       0
TMAX1VAB                   28243
TMAX1VAF                   28243
TMAX1VAC                   15586
-------------------------------------------
TOTAL SEGMENTS IN DATABASE = 91329
===========================================

디폴트 스키마 디렉터리를 확인하면 다음과 같은 스키마 파일이 생성되어 있음을 확인할 수 있다.

$ ls -al
-rw-r--r--   1 adb adb 13862 Oct  6 10:41 TMAX01PD.conv
관련 환경설정
  • OpenFrame 환경설정 중 ds 서브젝트, DATASET_DIRECTORY 섹션에 SCHEMA_DIR 키의 VALUE 항목에 생성된 스키마 파일을 저장할 디렉터리 경로를 설정한다.

    $ ofconfig list -s ds -sec DATASET_DIRECTORY -k SCHEMA_DIR
    
    ===================================================================================
      SUBJECT   |     SECTION       |        KEY         |             VALUE
    ===================================================================================
        ds      | DATASET_DIRECTORY |    SCHEMA_DIR      |    /home/openframe/schema
    ===================================================================================
  • OpenFrame 환경설정 중 ims 서브젝트, IMS_DEFAULT 섹션에 DBDLIB_NAME 키의 VALUE 항목에 작업대상 데이터베이스의 DBD가 등록되어 있는 DBDLIB를 설정한다.

    $ ofconfig list -s ims -sec IMS_DEFAULT -k DBDLIB_NAME
    
    ===================================================================================
      SUBJECT   |     SECTION      |        KEY         |             VALUE
    ===================================================================================
        ims     |   IMS_DEFAULT    |    DBDLIB_NAME     |           IMS.ACBLIB
    ===================================================================================

OpenFrame 환경설정에 대한 자세한 내용은 OpenFrame HiDB "환경설정 안내서"를 참고한다.

7. hidbptrmgr

hidbptrmgr은 HiDB의 Secondary index segment table과 Logical relationship에서 사용되는 ID 매핑 정보를 관리하기 위한 툴이다.

Secondary index의 경우 대상이 되는 DBD에 존재하는 세그먼트들과 관련된 Index segment table에 데이터를 insert하며, Logical relationship의 경우 대상 DBD에 Logical child segment가 존재할 경우 Logical parent를 찾아 LPARENT_ID 컬럼을 업데이트한다.

hidbptrmgr은 OpenFrame 환경설정 중 hidb 서브젝트, HIDB_DEFAULT 섹션에 NO_INDEX_TABLE 키의 VALUE 항목의 설정값이 NO인 환경에서 Index source segment가 있는 DBD를 hdload -q 옵션으로 실행했을 때, 또는 Logical relationship을 사용하는 환경에서 Logical child segment가 있는 DBD를 hdload를 실행했을 때 반드시 사용해야 한다.

OpenFrame 환경설정에 대한 자세한 내용은 OpenFrame HiDB "환경설정 안내서"를 참고한다.

사용법

hidbptrmgr 프로그램을 실행하는 방법은 다음과 같다.

Usage: hidbptrmgr <command> dbd-name
  • <command>

    명령 설명

    si

    대상 DBD에 있는 Secondary index source segment와 관련된 Secondary index table에 데이터를 입력한다.

    lr

    대상 DBD에 있는 Logical child segment table의 LPARENT_ID 컬럼(logical parent id column)을 갱신한다.

    all

    si와 lr 명령 모두를 처리한다.

    sil

    si 옵션의 동작을 tbloader(Oracle은 sqlldr)을 이용하여 Conventional 방식으로 로드한다.

    sil2

    si 옵션의 동작을 tbloader(Oracle은 sqlldr)을 이용하여 DPL 방식으로 로드한다.

    lr2

    lr 옵션의 동작과 동일하나, 내부적으로 쿼리 발행을 줄인 옵션이다.

    lr3

    lr2 옵션의 동작과 동일하나, merge 문을 사용한 옵션이다.

    lr4

    Logical child segment table의 LPARENT_ID 컬럼(logical parent id column)을 Table 단위로 갱신한다.

  • 입력 항목

    항목 설명

    dbd-name

    처리할 DBD 이름을 지정한다.

사용예제

다음은 hidbptrmgr를 실행하는 예시이다.

$ hidbptrmgr si TESTDBD1
$ hidbptrmgr lr TESTDBD2

hdload가 정상적으로 종료되면 다음과 같은 메시지가 출력된다.

HIDBPTRMGR version 7.2.0(0) tmaxtp@:oframe/ims(#1) 2017-11-29 09:50:54
HiDB secondary index build tool - insert data to secondary index segment table

HIDBPTRMGR: successfully finished the request for the DBD TESTDBD

EXECUTION TIME(USER/SYS/REAL): 0.02, 0.00, 0.08

8. hidbreconv

hidbreconv 툴은 HiDB의 데이터를 다시 원본 데이터베이스로 Load할 때 HiDB의 출력 데이터 형식을 원본 데이터의 입력 데이터 형식으로 변환해주는 툴이다. hdpcdf01의 작업을 반대로 동작한다.

HiDB의 데이터를 DFSURGU0로 Unload하고 dsmigout을 거치면 원본 데이터베이스와 같은 문자셋의 데이터로 변환되지만, 원본 데이터베이스의 로드 유틸리티를 사용하기 위해서는 hdpcdf01로 제거한 헤더를 다시 생성해줄 필요가 있다. 이 프로그램은 dsmigout 작업까지 끝난 데이터에 원본 데이터베이스의 헤더 정보를 추가해주는 역할을 한다.

사용법

hidbreconv 프로그램을 실행하는 방법은 다음과 같다.

Usage: hidbreconv <dbd_name> <input_filepath> [output_filepath] [options]
  • 입력 항목

    항목 설명

    dbd_name

    입력 파일의 데이터베이스를 정의한 DBD의 이름을 지정한다.

    input_filepath

    dfsurgu0로 Unload되고 dsmigout으로 마이그레이션 과정을 거친 입력 파일을 지정한다.

    output_filepath

    hidbreconv 프로그램의 출력 파일을 지정한다. 지정하지 않으면 현재 디렉터리에 입력파일과 같은 이름.rfm으로 만들게 된다.

  • [options]

    옵션 설명

    [-v]

    hidbreconv의 버전정보를 화면에 출력한다.

    [-h]

    hidbreconv의 사용법을 화면에 출력한다.

    [-ftpb]

    FTP -B 포맷으로 출력 파일을 만든다.

사용예제

다음은 hidbreconv 프로그램을 실행하여 원본 데이터베이스 로드용 데이터를 생성하는 예시이다.

$ hidbreconv TSTDBD hidbuld.dat hidbuld.rfm

위의 명령이 정상적으로 종료되면 다음과 같은 메시지가 출력된다.

hidbreconv version 7.2.0(0) oframe@:ofsrc7/ims(#2) 2017-11-29 09:50:54
Convert HiDB segment data

hidbreconv: process request
  --DBD: TSTDBD
  --Input file: hidbuld.dat
  --Output file: hidbuld.rfm
EXECUTION TIME(USER/SYS/REAL): 0.00, 0.00, 0.00

hidbreconv: request for the DBD TSTDBD is finished successfully
  --Input file: hidbuld.dat
  --Output file: hidbuld.rfm