VSAM on z/OS のレプリケーション - (2) レプリケーション構成 (to Db2)

# はじめに
ここでは、z/OS上のVSAMをRHEL上のDb2にレプリケーションするための構成を行っていきます。

## 関連記事

[VSAM on z/OS のレプリケーション - (1) 環境構築(to Db2)](https://qiita.com/tomotagwork/items/76b531eed506658381c0)
[VSAM on z/OS のレプリケーション - (2) レプリケーション構成(to Db2)](https://qiita.com/tomotagwork/items/e6c260edc9fd30c82fab)
[VSAM on z/OS のレプリケーション - (3) Kafka連携](https://qiita.com/tomotagwork/items/c6cdf650a9eadd482019)
[VSAM on z/OS のレプリケーション - (4) VSAMファイルの追加(Kafka連携) / レプリケーションのテスト](https://qiita.com/tomotagwork/items/5be473550df81c52184d)

# 全体像
レプリケーションのための設定として実施する主な作業を以下の吹き出しで示しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/47e0b819-0797-28b8-9059-b419945ceafc.png)

# (参考) VSAM Remote Source IVPによる確認
一応VSAM Remote SourceのIVPが用意されているのでそちらを動かしてみた時のログです。

<details><summary><font color="blue">VSAM Remote Source IVP</font></summary><div>

[Verifying the VSAM Remote Source installation](https://www.ibm.com/docs/en/idr/11.4.0?topic=source-verifying-vsam-remote-installation)
上のガイドに従って、VSAM Remote Sourceの構成をIVPで確認しておきます。

コンテナに接続してClassicInstallAndMaintenanceMenu.shスクリプトを実行します。

```
[root@test12 ~]# podman exec -it --workdir /classic/usr/scripts ClassicCDCVSAM bash
[cecuser@e0289065f5ba scripts]$ ./ClassicInstallAndMaintenanceMenu.sh
*---------------------------------------------------------------------*
*
* IBM Data Replication VSAM for z/OS Remote Source, V11.4
* PID: 5737-C30
*
* Menu options:
*    1.  Set the job card
*    2.  Set the z/OS High Level Qualifier (HLQ)
*    3.  Set the z/OS Unix System Services (USS) path
*    4.  Install or replace z/OS libraries with this container's maintenance level
*    5.  Start a new z/OS log reader
*    6.  Stop the existing z/OS log reader
*    7.  Get diagnostic log for the existing z/OS log reader
*    8.  Configure a z/OS VSAM cluster for the container environment
*    9.  Configure VSAM IVP file
*   10.  Update container scripts from the current image
*   11.  Generate diagnostics tar
*   99.  Exit this script
*
*---------------------------------------------------------------------*
Select an option:
```

Option 9を選択

```
*---------------------------------------------------------------------*
Select an option: 9
*---------------------------------------------------------------------*
*
* Classic CDC for Remote Log Reader Installation and Maintenance
* Configure VSAM IVP file
*
*---------------------------------------------------------------------*
LINE NO.    STATEMENT

       1    CONNECT TO SERVER "RHELSAMP" "TCP/0.0.0.0/9087,IBM-037/IBM-850";

  Start     End Processing
 Line #  Line #     Status Statement                Object
      1       1         0  CONNECT TO SERVER        RHELSAMP
CACM001I SQLCODE = 0, INFO: Statement execution was successful.

CACM001I SQLCODE = 0, INFO: Statement execution was successful.

LINE NO.    STATEMENT

       2
       3    DROP TABLE "VSAMDEMO"."EMPLOYEE";
      2       3      -204  DROP TABLE               "VSAMDEMO"."EMPLOYEE"
CACM002I SQLCODE = -204, ERROR:  SQL-Error-Message. -204. The EMPLOYEE is an und
CACM002I SQLCODE = -204, ERROR:  SQL-Error-Message. -204. The EMPLOYEE is an und
         efined name.

         efined name.

LINE NO.    STATEMENT

       4
       5    CREATE TABLE "VSAMDEMO"."EMPLOYEE" DBTYPE VSAM
       6    DS "CEC.V114.REMOTE.EMPLOYEE.FILE0001"
       7    (
       8        "ENAME" SOURCE DEFINITION DATAMAP OFFSET 0 LENGTH 20  DATATYP
            E C  USE AS CHAR(20),
       9        "PHONE" SOURCE DEFINITION DATAMAP OFFSET 20 LENGTH 4  DATATYP
            E UF USE AS INTEGER,
      10        "MAILID" SOURCE DEFINITION DATAMAP OFFSET 25 LENGTH 6 DATATYP
            E C  USE AS CHAR(6),
      11        "SALARY" SOURCE DEFINITION DATAMAP OFFSET 31 LENGTH 4 DATATYP
            E P  USE AS DECIMAL(7 , 2),
      12        "JOBID" SOURCE DEFINITION DATAMAP OFFSET 35 LENGTH 4 DATATYPE
             F   USE AS REAL,
      13        "EMPID" SOURCE DEFINITION DATAMAP OFFSET 39 LENGTH 4 DATATYPE
             UF  USE AS INTEGER,
      14        "DEPTID" SOURCE DEFINITION DATAMAP OFFSET 43 LENGTH 2 DATATYP
            E UH USE AS SMALLINT,
      15        "DEPARTMENT" SOURCE DEFINITION DATAMAP OFFSET 47 LENGTH 15 DA
            TATYPE C USE AS CHAR(15),
      16        PRIMARY KEY ("ENAME")
      17    );
      4      17         0  CREATE TABLE             "VSAMDEMO"."EMPLOYEE"
CACM001I SQLCODE = 0, INFO: Statement execution was successful.

CACM001I SQLCODE = 0, INFO: Statement execution was successful.

LINE NO.    STATEMENT

      18
      19    ALTER TABLE "VSAMDEMO"."EMPLOYEE" DATA CAPTURE CHANGES;
     18      19         0  ALTER TABLE              "VSAMDEMO"."EMPLOYEE"
CACM001I SQLCODE = 0, INFO: Statement execution was successful.

CACM001I SQLCODE = 0, INFO: Statement execution was successful.

**********************************************
cacmeta.sh /classic/usr/output/IVPEmployee1.grammar failed...
Do you want to ignore the above error and continue? (Y or N)
```

DROP TABLEのエラーは元々存在していないので無視。
Yで次に進みます。


```
Do you want to ignore the above error and continue? (Y or N)Y
To run chcclp for VSAM IVP configuration, Source and Target details are required including username and password.
Note: These details including username and password are saved in /classic/usr/output/chcclp_IVP_Input.txt file.

If you do not wish to provide those details to this script then enter N to discontinue and follow the below steps to configure VSAM IVP file:
1) Update the /classic/usr/output/chcclp_IVP_Input.txt for the source and target details.
2) Ensure you have a target table. Sample target table script for DB2 can be found at /classic/usr/output/EMPLOYEE.sql
3) To complete the VSAM IVP configuration please run the below command as a non root user:
chcclp.sh -f /classic/usr/output/chcclp_IVP_Input.txt -ap 10101
Do you want to continue? (Y or N)
```

Yで次に進みます。
ここでは以下の赤字の項目を入力

**Source:**

- Source Datastore Name: VSMSRC01 (<=勝手に設定されて変更不可)
- Source Hostname: test12 (<=勝手に設定されて変更不可)
- Enter Source Port: <font color="red">9087</font> (Linux上のコンテナがListenしているポート?)
- Enter Source Username: <font color="red">cecuser</font> (コンテナ実行ユーザー)
- Enter Source Password: <font color="red">*password*</font> (パスワード?)

**Target:**

- Target Datastore Name: TARGET01 (<=勝手に設定されて変更不可)
- Enter Target Hostname: <font color="red">xxxx</font> (Target EngineのIPアドレス / ホスト名だとNGだということが後で判明!)
- Enter Target Port: <font color="red">10901</font> (Target EngineがListenしているポート)
- Enter Target Username: <font color="red">cdcdb2</font> (Target Engineのユーザー)
- Enter Target Password: <font color="red">*password*</font> (Target Engineのパスワード)

```
Do you want to continue? (Y or N)Y
******************************
Enter Source Details
******************************
Source Datastore Name: VSMSRC01
Source Hostname: test12
Enter Source Port: 9087
Enter Source Username: cecuser
Enter Source Password:
******************************
Enter Target Details
******************************
Target Datastore Name: TARGET01
Enter Target Hostname: test12
Enter Target Port: 10901
Enter Target Username: cdcdb2
Enter Target Password:
Note: Ensure you have a target table. Sample target table script for DB2 can be found at /classic/usr/output/EMPLOYEE.sql
To complete the VSAM IVP configuration please run the below command as a non root user.
chcclp.sh -f /classic/usr/output/chcclp_IVP_Input.txt -ap 10101
```

上のセットアップ用スクリプトを抜けます。

別のWindowでホストOSの以下のディレクトリを確認します。(コンテナ上の/classic/usr/output/に相当)
/home/cecuser/classic/docker/volumes/classiccdcoutput/chcclp_IVP_Input.txtに、IVP用のセットアップをするためのパラメーターが書き出されます。

```txt:/home/cecuser/classic/docker/volumes/classiccdcoutput/chcclp_IVP_Input.txt
CHCCLP SESSION SET TO CDC;

connect datastore name VSMSRC01 hostname test12 port 9087 username cecuser password xxxxx context source;
connect datastore name TARGET01 hostname test12 port 10901 username cdcdb2 password xxxxx context target;

add subscription name VSAMREM1;
list databases name VSMSRC01;

add replication table name VSMSRC01 database VSAM schema VSAMDEMO table EMPLOYEE;
add table mapping sourceDatabase VSAM sourceSchema VSAMDEMO sourceTable EMPLOYEE targetSchema VSAMDEMO targetTable EMPLOYEE;

list subscriptions;
list replication tables;
list table mappings name VSAMREM1;

disconnect datastore name VSMSRC01;
disconnect datastore name TARGET01;
```

どうやらCHCCLPというコマンドをバッチモードで実行するために、コマンドのリストとして生成しているもののようです。
参考: [Running the CHCCLP commands in batch mode](https://www.ibm.com/docs/en/idr/11.4.0?topic=chcclp-running-commands-in-batch-mode)


ソース用に以下のSQLも生成されています。これは恐らく先のスクリプトのOption 9選択時に適用されたものだと思われます。

```sql:/home/cecuser/classic/docker/volumes/classiccdcoutput/IVPEmployee1.grammar
CONNECT TO SERVER "RHELSAMP" "TCP/0.0.0.0/9087,IBM-037/IBM-850";

DROP TABLE "VSAMDEMO"."EMPLOYEE";

CREATE TABLE "VSAMDEMO"."EMPLOYEE" DBTYPE VSAM
DS "CEC.V114.REMOTE.EMPLOYEE.FILE0001"
(
    "ENAME" SOURCE DEFINITION DATAMAP OFFSET 0 LENGTH 20  DATATYPE C  USE AS CHAR(20),
    "PHONE" SOURCE DEFINITION DATAMAP OFFSET 20 LENGTH 4  DATATYPE UF USE AS INTEGER,
    "MAILID" SOURCE DEFINITION DATAMAP OFFSET 25 LENGTH 6 DATATYPE C  USE AS CHAR(6),
    "SALARY" SOURCE DEFINITION DATAMAP OFFSET 31 LENGTH 4 DATATYPE P  USE AS DECIMAL(7 , 2),
    "JOBID" SOURCE DEFINITION DATAMAP OFFSET 35 LENGTH 4 DATATYPE F   USE AS REAL,
    "EMPID" SOURCE DEFINITION DATAMAP OFFSET 39 LENGTH 4 DATATYPE UF  USE AS INTEGER,
    "DEPTID" SOURCE DEFINITION DATAMAP OFFSET 43 LENGTH 2 DATATYPE UH USE AS SMALLINT,
    "DEPARTMENT" SOURCE DEFINITION DATAMAP OFFSET 47 LENGTH 15 DATATYPE C USE AS CHAR(15),
    PRIMARY KEY ("ENAME")
);

ALTER TABLE "VSAMDEMO"."EMPLOYEE" DATA CAPTURE CHANGES;
```

ターゲット用に以下のSQLも生成されます。

```sql:/home/cecuser/classic/docker/volumes/classiccdcoutput/EMPLOYEE.sql
CREATE TABLE "VSAMDEMO"."EMPLOYEE" (
        "ENAME" CHAR(20) FOR MIXED DATA NOT NULL WITH DEFAULT,
    "PHONE" INTEGER NOT NULL WITH DEFAULT,
    "MAILID" CHAR(6) FOR MIXED DATA NOT NULL WITH DEFAULT,
    "SALARY" DECIMAL(7, 2) NOT NULL WITH DEFAULT,
    "JOBID" REAL NOT NULL WITH DEFAULT,
    "EMPID" INTEGER NOT NULL WITH DEFAULT,
    "DEPTID" SMALLINT NOT NULL WITH DEFAULT,
    "DEPARTMENT" CHAR(15) FOR MIXED DATA NOT NULL WITH DEFAULT
)       AUDIT NONE
        CCSID UNICODE;

CREATE UNIQUE INDEX "VSAMDEMO"."XEMPLOYEE"
        ON "VSAMDEMO"."EMPLOYEE"
        ("ENAME" ASC);

ALTER TABLE "VSAMDEMO"."EMPLOYEE" ADD CONSTRAINT "ENAME" PRIMARY KEY
        ("ENAME");

GRANT ALTER ON TABLE "VSAMDEMO"."EMPLOYEE" TO "USER01" WITH GRANT OPTION;

GRANT DELETE ON TABLE "VSAMDEMO"."EMPLOYEE" TO "USER01" WITH GRANT OPTION;

GRANT INDEX ON TABLE "VSAMDEMO"."EMPLOYEE" TO "USER01" WITH GRANT OPTION;

GRANT INSERT ON TABLE "VSAMDEMO"."EMPLOYEE" TO "USER01" WITH GRANT OPTION;

GRANT REFERENCES ON TABLE "VSAMDEMO"."EMPLOYEE" TO "USER01" WITH GRANT OPTION;

GRANT SELECT ON TABLE "VSAMDEMO"."EMPLOYEE" TO "USER01" WITH GRANT OPTION;

GRANT TRIGGER ON TABLE "VSAMDEMO"."EMPLOYEE" TO "USER01" WITH GRANT OPTION;

GRANT UPDATE ON TABLE "VSAMDEMO"."EMPLOYEE" TO "USER01" WITH GRANT OPTION;
```

Db2に対して上のSQLを適用します。
生成されたSQLはDb2 for z/OSを前提としているようで、そのままDb2 for Linuxに対して実行するとエラーになるので、以下の様に修正します。 

- CREATE TABLE のAUDIT NONEを削除
- "USER01" を USER cdcdb2 に変更
- GRANT TRIGGERステートメントを削除

```sql:EMPLOYEE.sql
CREATE TABLE "VSAMDEMO"."EMPLOYEE" (
        "ENAME" CHAR(20) FOR MIXED DATA NOT NULL WITH DEFAULT,
    "PHONE" INTEGER NOT NULL WITH DEFAULT,
    "MAILID" CHAR(6) FOR MIXED DATA NOT NULL WITH DEFAULT,
    "SALARY" DECIMAL(7, 2) NOT NULL WITH DEFAULT,
    "JOBID" REAL NOT NULL WITH DEFAULT,
    "EMPID" INTEGER NOT NULL WITH DEFAULT,
    "DEPTID" SMALLINT NOT NULL WITH DEFAULT,
    "DEPARTMENT" CHAR(15) FOR MIXED DATA NOT NULL WITH DEFAULT
)
        CCSID UNICODE;

CREATE UNIQUE INDEX "VSAMDEMO"."XEMPLOYEE"
        ON "VSAMDEMO"."EMPLOYEE"
        ("ENAME" ASC);

ALTER TABLE "VSAMDEMO"."EMPLOYEE" ADD CONSTRAINT "ENAME" PRIMARY KEY
        ("ENAME");

GRANT ALTER ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION;

GRANT DELETE ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION;

GRANT INDEX ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION;

GRANT INSERT ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION;

GRANT REFERENCES ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION;

GRANT SELECT ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION;

GRANT UPDATE ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION;
```

db2インスタンスユーザー"db2inst1"で実行。

```
[cdcdb2@test12 ~]$ su - db2inst1
パスワード:

[db2inst1@test12 ~]$ db2 connect to sample2

   データベース接続情報

 データベース・サーバー = DB2/LINUXX8664 11.1.0
 SQL 許可 ID            = DB2INST1
 ローカル・データベース別名 = SAMPLE2

[db2inst1@test12 ~]$ db2 -tvf EMPLOYEE.sql
CREATE TABLE "VSAMDEMO"."EMPLOYEE" ( "ENAME" CHAR(20) FOR MIXED DATA NOT NULL WITH DEFAULT, "PHONE" INTEGER NOT NULL WITH                                              DEFAULT, "MAILID" CHAR(6) FOR MIXED DATA NOT NULL WITH DEFAULT, "SALARY" DECIMAL(7, 2) NOT NULL WITH DEFAULT, "JOBID" REAL                                              NOT NULL WITH DEFAULT, "EMPID" INTEGER NOT NULL WITH DEFAULT, "DEPTID" SMALLINT NOT NULL WITH DEFAULT, "DEPARTMENT" CHAR(                                             15) FOR MIXED DATA NOT NULL WITH DEFAULT ) CCSID UNICODE
DB20000I  SQL コマンドが正常に完了しました。

CREATE UNIQUE INDEX "VSAMDEMO"."XEMPLOYEE" ON "VSAMDEMO"."EMPLOYEE" ("ENAME" ASC)
DB20000I  SQL コマンドが正常に完了しました。

ALTER TABLE "VSAMDEMO"."EMPLOYEE" ADD CONSTRAINT "ENAME" PRIMARY KEY ("ENAME")
SQL0598W  既存索引 "VSAMDEMO.XEMPLOYEE"
が主キーまたはユニーク・キーの索引として使用されます。
SQLSTATE=01550

GRANT ALTER ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION
DB20000I  SQL コマンドが正常に完了しました。

GRANT DELETE ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION
DB20000I  SQL コマンドが正常に完了しました。

GRANT INDEX ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION
DB20000I  SQL コマンドが正常に完了しました。

GRANT INSERT ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION
DB20000I  SQL コマンドが正常に完了しました。

GRANT REFERENCES ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION
DB20000I  SQL コマンドが正常に完了しました。

GRANT SELECT ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION
DB20000I  SQL コマンドが正常に完了しました。

GRANT UPDATE ON TABLE "VSAMDEMO"."EMPLOYEE" TO USER cdcdb2 WITH GRANT OPTION
DB20000I  SQL コマンドが正常に完了しました。
```

再びコンテナに接続したシェルに戻ります。chcclp.sh実行。=> エラー

```
[cecuser@e0289065f5ba scripts]$ chcclp.sh -f /classic/usr/output/chcclp_IVP_Input.txt -ap 10101
Repl > chcclp session set to cdc;
Repl > connect datastore hostname test12 password xxxxx port 9087 name VSMSRC01 context source username cecuser;
Repl > connect datastore hostname test12 password xxxxx port 10901 name TARGET01 context target username cdcdb2;
[ERR2001]: Could not communicate with datastore. Please ensure that the hostname
and port for the datastore are valid, and that the datastore is running.
```

コンテナからtest12に対して名前解決が出来ていないっぽいので、コンテナ作成時に--add-host追記してtest12でアクセスできるようにしたはずなのだが...。というか逆に最初のVSAMSRC01に対してはなんでtest12でうまくいってたのだろう？、Db2に対するアクセスだけうまくいっていない。
chcclp_IVP_Input.txtを書き換えて、target側のhostnameをIPアドレスに変更したら進んだ。

```
[cecuser@44aa61d6003d scripts]$ chcclp.sh -f /classic/usr/output/chcclp_IVP_Input.txt -ap 10101
Repl > chcclp session set to cdc;
Repl > connect datastore hostname test12 password xxxxx port 9087 name VSMSRC01 context source username cecuser;
Repl > connect datastore hostname 10.0.2.15 password xxxxx port 10901 name cdc_db2_sample2 context target username cdcdb2;
Repl > add subscription name VSAMREM1;
Repl > list databases name VSMSRC01;

Databases for datastore VSMSRC01.

DATABASE
----------------
VSAM

Repl > add replication table schema VSAMDEMO database VSAM name VSMSRC01 table EMPLOYEE;
Repl > add table mapping targetSchema VSAMDEMO targetTable EMPLOYEE sourceTable EMPLOYEE sourceDatabase VSAM sourceSchema VSAMDEMO;
Repl > list subscriptions;

SUBSCRIPTION     SOURCE DATASTORE   TARGET DATASTORE          CONTEXT
---------------- ------------------ ------------------------- ----------------
VSAMREM1         VSMSRC01           cdc_db2_sample2           Yes
VSAMT01          VSMSRC01           External (test12@10901)

Repl > list replication tables;

Replication tables for datastore VSMSRC01.

DATABASE         SCHEMA           REPLICATION TABLE
---------------- ---------------- -------------------
VSAM             TEST01           FILEA
VSAM             VSAMDEMO         EMPLOYEE

Repl > list table mappings name VSAMREM1;

Table mappings for subscription VSAMREM1.

SOURCE TABLE             TARGET TABLE        MAPPING TYPE     METHOD           STATUS           PREVENT RECURSION   CONTEXT
------------------------ ------------------- ---------------- ---------------- ---------------- ------------------- ----------------
VSAM.VSAMDEMO.EMPLOYEE   VSAMDEMO.EMPLOYEE   Standard         Mirror           Refresh          No                  Yes

Repl > disconnect datastore name VSMSRC01;
Repl > disconnect datastore name TARGET01;
[ERR2203]: A connection to the datastore TARGET01 does not exist.
```

最後のdisconnectの所、datastore名変更し忘れたのでエラーになったが、恐らくうまくいったっぽい。
コンテナ内からアクセスする場合、どうやらターゲットに対してはなぜか--add-hostの指定がうまく働いていおらずIPアドレスを指定する必要があるっぽい。
(コンテナ内からcurlで--add-hostで指定したホスト名にアクセスできることは確認済みなのだが...)

</div></details>

# 1. ソース側設定

## 1.1 VSAM定義登録
まず、VSAM Remote Source上(Linux上のコンテナ)に、ソースとして使用するVSAMおよび、そのVSAMが使用するLogStreamの情報を登録する必要があります。

コンテナに接続してClassicInstallAndMaintenanceMenu.shスクリプトを実行します。

```
[root@test12 ~]# podman exec -it --workdir /classic/usr/scripts ClassicCDCVSAM bash
[cecuser@e0289065f5ba scripts]$ ./ClassicInstallAndMaintenanceMenu.sh
*---------------------------------------------------------------------*
*
* IBM Data Replication VSAM for z/OS Remote Source, V11.4
* PID: 5737-C30
*
* Menu options:
*    1.  Set the job card
*    2.  Set the z/OS High Level Qualifier (HLQ)
*    3.  Set the z/OS Unix System Services (USS) path
*    4.  Install or replace z/OS libraries with this container's maintenance level
*    5.  Start a new z/OS log reader
*    6.  Stop the existing z/OS log reader
*    7.  Get diagnostic log for the existing z/OS log reader
*    8.  Configure a z/OS VSAM cluster for the container environment
*    9.  Configure VSAM IVP file
*   10.  Update container scripts from the current image
*   11.  Generate diagnostics tar
*   99.  Exit this script
*
*--------------------------------------------------------------------
```

8 . Configure a z/OS VSAM cluster for the container environment を選択

ここではメニューに従って以下の様に値を指定しています。

- Enter a VSAM base cluster data set name: => TAGUCHI.CICS.FILEA
- Enter the replication log to use for this VSAM DSN: => CEC.RMTLRS.CECREPL
- Do you want to generate JCL to ALTER DSN: <TAGUCHI.CICS.FILEA> for change capture? (Y or N) => y
- Is CICS VR installed for VSAM batch logging? (Y or N) => n
- Do you want to generate JCL to DEFINE LOGSTREAM for replication log: <CEC.RMTLRS.CECREPL>? (Y or N) => n
- Should the IDCAMS ALTER JCL be submitted to your z/OS system? (Y or N) => n

今回使用するVSAMは、CICS提供ののサンプル(FILEA)を使用する想定で、ログを取得する設定になっていません。そのため、ログ収集の設定変更用のJCLを生成するオプションでYを指定しています。
LogStreamは先の環境構築の手順で作成したものをそのまま使う想定なのでLogStream定義用JCLの生成はNにしています。

```
*---------------------------------------------------------------------*
Select an option: 8
*---------------------------------------------------------------------*
*
* Classic CDC for VSAM
* Define a VSAM cluster to Linux components for refresh/replication
*
*---------------------------------------------------------------------*
Enter a VSAM base cluster data set name: TAGUCHI.CICS.FILEA
Enter the replication log to use for this VSAM DSN: CEC.RMTLRS.CECREPL
You provided DSN: <TAGUCHI.CICS.FILEA> with replication log: <CEC.RMTLRS.CECREPL>
Is this correct? (Y or N)y
DSN: <TAGUCHI.CICS.FILEA> added to <../../shell/vsamcat/vsamcat.txt>

Do you want to generate JCL to ALTER DSN: <TAGUCHI.CICS.FILEA> for change capture? (Y or N)y
*---------------------------------------------------------------------*
*
* Classic CDC for VSAM
* Create JCL with statements to alter a VSAM cluster for change capture
*
*---------------------------------------------------------------------*
TAGUCHI.CICS.FILEA CEC.RMTLRS.CECREPL ../output/TAGUCHI.CICS.FILEA.Alter.jcl.2021-08-08_14:14:03
Is CICS VR installed for VSAM batch logging? (Y or N)n
Do you want to generate JCL to DEFINE LOGSTREAM for replication log: <CEC.RMTLRS.CECREPL>? (Y or N)n
Should the IDCAMS ALTER JCL be submitted to your z/OS system? (Y or N)n
Provide the contents of ../output/TAGUCHI.CICS.FILEA.Alter.jcl.2021-08-08_14:14:03 to your z/OS group to perform the alter step.
```

VSAM Remote Source上にソースとしてのVSAMが登録されると、コンテナー内の以下のファイルにエントリーが追加されます。
/classic/shell/vsamcat/vsamcat.txt
このディレクトリは永続ボリュームとしてマウントされていますので、ホストOS側から以下のパスで確認することもできます。
/home/cecuser/classic/docker/volumes/classiccdcvsamcat/vsamcat.txt

```txt:/classic/shell/vsamcat/vsamcat.txt
** VSAM cluster registry file
** Contains a record for each VSAM cluster that has comma delimited tokens
**  of VSAM attributes.
** Comma delimited tokens are:
** 1.  DDName (up to 8 characters - ex: VSAMDD
** 2.  Dataset or path name (up to 44 characters - ex: CAC.VSAM.BONBONS)
** 3.  Maximum record length
** 4.  Key offset
** 5.  Key length ('0' for no key)
** 6.  Single character Type ('C' for cluster, 'R' for path)
** 7.  Single character DSType ('K'-KSDS,'R'-RRDS,'E'-ESDS, 'L'-LDS)
** 8.  Single character recovery status
** 9.  Single character Log Parm ('0':not set, '1':None, '2':Undo, '3':All)
** 10. CISIZE
** 11. FRReplicate ('Y'=set on)
** 12. Log File Name
**
VSAMDD,CAC.VSAM.BONBONS,175,0,3,C,K,N,0,18432,Y,CECCDC.VSAMLOG
VSAMDD,CAC.DEMO.KSDS.FILE0001,32760,0,20,C,K,Y,0,32764,Y,CDCSRC.IVP.REPLLOG
**
** All entries should be before this line
**
VSAMDD,CEC.V114.REMOTE.EMPLOYEE.FILE0001,32760,0,20,C,K,Y,0,32764,Y,CEC.RMTLRS.IVP.REPLLOG
VSAMDD,TAGUCHI.CICS.FILEA,32760,0,20,C,K,Y,0,32764,Y,CEC.RMTLRS.CECREPL
```


さらに、VSAM定義のカスタマイズ用に以下のJCLが生成されます。これは後の手順で使用します。

```jcl:/home/cecuser/classic/docker/volumes/classiccdcoutput/TAGUCHI.CICS.FILEA.Alter.jcl.xxx
//CCDCRLR JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),
// REGION=0M,NOTIFY=&SYSUID
//OUT1     OUTPUT JESDS=ALL,OUTDISP=(HOLD,HOLD)
//*
//STEP0001 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*,OUTPUT=(*.OUT1)
//SYSIN    DD *
 ALTER  TAGUCHI.CICS.FILEA -
 LOGREPLICATE -
 LOGSTREAMID(CEC.RMTLRS.CECREPL)
/*
//
```

## 1.2 LogStream

LogStreamは、前回環境構築時に作成した`CEC.RMTLRS.CECREPL`を使用することにします。

参考:[セットアップ用JCL実行 - 06_CreateLogs.jcl](https://qiita.com/tomotagwork/private/76b531eed506658381c0#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E7%94%A8jcl%E5%AE%9F%E8%A1%8C)

## 1.3 Log Reader
前回環境構築時に作成したLog Reader起動用のJCLを使用してLog Readerを稼働させておきます。

参考:[セットアップ用JCL実行 - 07_StartServerJob.jcl](https://qiita.com/tomotagwork/private/76b531eed506658381c0#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E7%94%A8jcl%E5%AE%9F%E8%A1%8C)

## 1.4 VSAM on z/OSのカスタマイズ

今回はCICS提供サンプルのFILEAを使用します。CICS提供のサンプルhlq.SDFHINST(DFHDEFDS)をベースに、以下のJCLでTAGUCHI.CICS.FILEAというVSAMファイルを作成している想定です。

```jcl:hlq.SDFHINST(DFHDEFDS)をカスタマイズ
//DEFFILEA JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//*
//DELETE    EXEC PGM=IDCAMS,REGION=1M
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
 DELETE TAGUCHI.CICS.FILEA
 SET MAXCC=0
/*
//DEFINE    EXEC PGM=IDCAMS,REGION=1M
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
 /*                                  */
 /*                                  */
 /* DEFINE A FILEA DATASET           */
 /*                                  */
 DEFINE CLUSTER(NAME(TAGUCHI.CICS.FILEA)-
          REC(80)-
          STORAGECLASS(SGBASE) INDEXED) -
         DATA(NAME(TAGUCHI.CICS.FILEA.DATA)-
         RECSZ(80 80)-
         UNIQUE -
         KEYS(6 1)) -
        INDEX(NAME(TAGUCHI.CICS.FILEA.INDEX)-
          UNIQUE -
          SHR(2 3))
/*
//*
//* LOAD VSAM DATA FILE
//*
//LOADFILE EXEC PGM=DFH$LDSP
//STEPLIB  DD DSN=DFH550.CICS.SDFHLOAD,DISP=SHR
//FILEA    DD DISP=SHR,
// DSN=TAGUCHI.CICS.FILEA
//SYSOUT   DD SYSOUT=*
//SYSIN    DD DISP=SHR,
// DSN=DFH550.CICS.SDFHSAMP(DFH$FAIN)
```

<font color="red">注意！レプリケーション対象のVSAMはSMS管理のボリュームに作成する必要があります。上の例ではDEFINE CLUSTERの際にSTORAGECLASSを指定しています。</font>

レプリケーションを行うためには、上のVSAMの設定をカスタマイズする必要があります。先の手順で生成したカスタマイズ用JCL(TAGUCHI.CICS.FILEA.Alter.jcl.xxx)をホスト側に転送し、以下の様にLOG(ALL)オプションを追加します。
[DFSMS - ALTER Parameters](https://www.ibm.com/docs/en/zos/2.4.0?topic=alter-parameters)


```
//CCDCRLR JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1),
// REGION=0M,NOTIFY=&SYSUID
//OUT1     OUTPUT JESDS=ALL,OUTDISP=(HOLD,HOLD)
//*
//STEP0001 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*,OUTPUT=(*.OUT1)
//SYSIN    DD *
 ALTER  TAGUCHI.CICS.FILEA -
 LOG(ALL) -
 LOGREPLICATE -
 LOGSTREAMID(CEC.RMTLRS.CECREPL)
/*
//
```

CICSからFIELAがOpenされている場合は一旦Closedの状態にしておき、上のJCLをSubmitします。

<details><summary><font color="blue">参考:SMS管理ではないVSAMに対して上のJCLを実行した場合...</font></summary><div>
以下のようなエラーになります。

```
0IDC3019I INVALID ENTRY TYPE FOR REQUESTED ACTION
 IDC3009I ** VSAM CATALOG RETURN CODE IS 60 - REASON CODE IS IGG0CLKV-98
 IDC0532I **ENTRY DFH550.CICS.FILEA NOT ALTERED
```

[IDC3009I](https://www.ibm.com/docs/en/zos/2.4.0?topic=messages-idc3009i)
ReturnCode: 60, ReasonCode: 98
>Explanation: ALTER of the RLS flags is not allowed for a data set that is not capable of being used by RLS. Data sets that are Linear, non-SMS managed, keyrange or temporary are not eligible for RLS access.
Programmer Response: Ensure that the entry being altered is eligible for RLS processing. Correct the error. Run the job again.

</div></details>

VSAM設定内容の確認を行います。LISTCコマンド(TSOコマンド)で設定を確認しておきます。

<details><summary><font color="blue">LISTC ENTRIESコマンド結果</font></summary><div>

```
LISTC ENTRIES('TAGUCHI.CICS.FILEA') ALL
CLUSTER ------- TAGUCHI.CICS.FILEA
     IN-CAT --- USERCAT.Z24B.USER
     HISTORY
       DATASET-OWNER-----(NULL)     CREATION--------2021.224
       RELEASE----------------2     EXPIRATION------0000.000
     SMSDATA
       STORAGECLASS -----SCBASE     MANAGEMENTCLASS---(NULL)
       DATACLASS --------(NULL)     LBACKUP ---0000.000.0000
       CA-RECLAIM---------(YES)
       EATTR-------------(NULL)
       BWO STATUS------00000000     BWO TIMESTAMP---00000 00:00:00.0
       BWO---------------(NULL)
     RLSDATA
       LOG -------------------ALL   RECOVERY REQUIRED --(NO)     FRLOG ------------(NULL)
       VSAM QUIESCED -------(NO)    RLS IN USE ---------(NO)     LOGREPLICATE------------(YES)
       LOGSTREAMID-----------------CEC.RMTLRS.CECREPL
       RECOVERY TIMESTAMP LOCAL-----X'0000000000000000'
       RECOVERY TIMESTAMP GMT-------X'0000000000000000'
       DATABASE -----------------(NULL)
     ENCRYPTIONDATA
       DATA SET ENCRYPTION-----(NO)
     PROTECTION-PSWD-----(NULL)     RACF----------------(NO)
     ASSOCIATIONS
       DATA-----TAGUCHI.CICS.FILEA.DATA
       INDEX----TAGUCHI.CICS.FILEA.INDEX
   DATA ------- TAGUCHI.CICS.FILEA.DATA
     IN-CAT --- USERCAT.Z24B.USER
     HISTORY
       DATASET-OWNER-----(NULL)     CREATION--------2021.224
       RELEASE----------------2     EXPIRATION------0000.000
       ACCOUNT-INFO-----------------------------------(NULL)
     PROTECTION-PSWD-----(NULL)     RACF----------------(NO)
     ASSOCIATIONS
       CLUSTER--TAGUCHI.CICS.FILEA
     ATTRIBUTES
       KEYLEN-----------------6     AVGLRECL--------------80     BUFSPACE-----------37376     CISIZE-------------18432
       RKP--------------------1     MAXLRECL--------------80     EXCPEXIT----------(NULL)     CI/CA------------------3
       SHROPTNS(1,3)   RECOVERY     UNIQUE           NOERASE     INDEXED       NOWRITECHK     UNORDERED        NOREUSE
       NONSPANNED
     STATISTICS
       REC-TOTAL-------------46     SPLITS-CI--------------0     EXCPS-----------------41
       REC-DELETED------------2     SPLITS-CA--------------0     EXTENTS----------------1
       REC-INSERTED-----------5     FREESPACE-%CI----------0     SYSTEM-TIMESTAMP:
       REC-UPDATED-----------18     FREESPACE-%CA----------0          X'DA2BC71EADAC5D00'
       REC-RETRIEVED--------417     FREESPC------------36864
     ALLOCATION
       SPACE-TYPE---------TRACK     HI-A-RBA-----------55296
       SPACE-PRI--------------1     HI-U-RBA-----------55296
       SPACE-SEC--------------0
     VOLUME
       VOLSER------------B4USR1     PHYREC-SIZE--------18432     HI-A-RBA-----------55296     EXTENT-NUMBER----------1
       DEVTYPE------X'3010200F'     PHYRECS/TRK------------3     HI-U-RBA-----------55296     EXTENT-TYPE--------X'00'
       VOLFLAG------------PRIME     TRACKS/CA--------------1
       EXTENTS:
       LOW-CCHH-----X'008F0004'     LOW-RBA----------------0     TRACKS-----------------1
       HIGH-CCHH----X'008F0004'     HIGH-RBA-----------55295
   INDEX ------ TAGUCHI.CICS.FILEA.INDEX
     IN-CAT --- USERCAT.Z24B.USER
     HISTORY
       DATASET-OWNER-----(NULL)     CREATION--------2021.224
       RELEASE----------------2     EXPIRATION------0000.000
     PROTECTION-PSWD-----(NULL)     RACF----------------(NO)
     ASSOCIATIONS
       CLUSTER--TAGUCHI.CICS.FILEA
     ATTRIBUTES
       KEYLEN-----------------6     AVGLRECL---------------0     BUFSPACE---------------0     CISIZE---------------512
       RKP--------------------1     MAXLRECL-------------505     EXCPEXIT----------(NULL)     CI/CA-----------------49
       SHROPTNS(2,3)   RECOVERY     UNIQUE           NOERASE     NOWRITECHK     UNORDERED     NOREUSE
     STATISTICS
       REC-TOTAL--------------1     SPLITS-CI--------------0     EXCPS-----------------17     INDEX:
       REC-DELETED------------0     SPLITS-CA--------------0     EXTENTS----------------1     LEVELS-----------------1
       REC-INSERTED-----------0     FREESPACE-%CI----------0     SYSTEM-TIMESTAMP:            ENTRIES/SECT-----------1
       REC-UPDATED------------0     FREESPACE-%CA----------0          X'DA2BC71EADAC5D00' SEQ-SET-RBA----------------0
       REC-RETRIEVED----------0     FREESPC------------24576                              HI-LEVEL-RBA---------------0
     ALLOCATION
       SPACE-TYPE---------TRACK     HI-A-RBA-----------25088
       SPACE-PRI--------------1     HI-U-RBA-------------512
       SPACE-SEC--------------0
     VOLUME
       VOLSER------------B4USR1     PHYREC-SIZE----------512     HI-A-RBA-----------25088     EXTENT-NUMBER----------1
       DEVTYPE------X'3010200F'     PHYRECS/TRK-----------49     HI-U-RBA-------------512     EXTENT-TYPE--------X'00'
       VOLFLAG------------PRIME     TRACKS/CA--------------1
       EXTENTS:
       LOW-CCHH-----X'008F0005'     LOW-RBA----------------0     TRACKS-----------------1
       HIGH-CCHH----X'008F0005'     HIGH-RBA-----------25087
```

</div></details>

## 1.5 VSAM表の作成
VSAMを別のデータストアにレプリケーションする際は、対象のVSAMデータの構造を汎用的なRDBの表のイメージにマッピングしてハンドリングする必要があります。VSAMデータ構造を表形式で表したものは"VSAM表"と呼ばれます。ここではVSAM Remote Source上に"VSAM表"を作成していきます。
VSAM表は元のVSAMデータ構造を表すCOBOL COPYBOOKを元に生成します。

参考: [Mapping source data into Classic logical tables](https://www.ibm.com/docs/en/idr/11.4.0?topic=source-mapping-data-into-classic-logical-tables)

適当なワークスペースを指定してCDAを起動します。以降、CDA上で作業していきます。
VSAM表を作成するには多くのステップを踏む必要があり、操作の位置づけが分かりにくいのでイメージを図示しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/925a289a-781b-ec58-351a-42944bcf7b1b.png)
図の吹き出しの操作を実施していくことになります。

### データ設計プロジェクト作成
ファイル - 新規 - プロジェクトを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0451076a-3858-b0dd-98de-ee63a86260ae.png)

データ設計プロジェクトを選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cdb0e375-bf2f-1ff0-a245-86ab90e94d5e.png)

プロジェクト名を指定して終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4d3492fe-71a4-54bf-c1d6-6e6ee2c6f7a6.png)

はい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d0bbd4af-abd7-e08d-e61a-58e69204d740.png)

データパースペクティブが開き、先ほど作成したプロジェクトが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6ae99414-e95c-1808-f88f-fe54a7776ae0.png)

### COPYBOOKのインポート
レプリケーション対象VSAMファイルのレコードフォーマットを表すCOBOL COPYBOOKを、CDAが稼働しているローカルPC上にコピーしておきます。
ここではCICS提供サンプルのFILEAをレプリケーション対象のVSAMとして使用するので、そのデータフォーマットを示すCOPYBOOKとして、HLQ.SDFHSAMP(DFH0CFIL)をローカルにDFH0CFIL.cpyというテキストファイルとしてコピーしておきます。

```cobol:DFH0CFIL.cpy
         02  FILEREC.
           03  STAT           PIC X.
           03  NUMB           PIC X(6).
           03  NAME           PIC X(20).
           03  ADDRX          PIC X(20).
           03  PHONE          PIC X(8).
           03  DATEX          PIC X(8).
           03  AMOUNT         PIC X(8).
           03  COMMENT        PIC X(9).
```

データ・プロジェクト・エクスプローラーから先に作成したプロジェクト名を右クリック - インポートを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f9ce8d7e-ab23-646a-a7f1-ae6bd293ce1b.png)

Classic Data Architect - クラシック参照ファイル を選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e4d6de13-e8dc-ea3c-a3bd-a6939928acb7.png)

ローカルホストを選択し、ファイル・タイプ: COBOLコピーブック、ファイル: 上のDFH0CFIL.cpy を選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/dc657a6a-b750-095b-f077-59c47f5d96c6.png)

内容を確認して終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a03683eb-24e9-2f06-4c4c-c725f3d8d7a0.png)

コピーブックが取り込まれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b57416df-ee84-30d7-d5c1-d421339efb87.png)

### 物理データモデルの作成
上で作成したプロジェクトを右クリック - 新規 - 物理データモデルを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b97bd472-5834-0d15-24d5-c084a4695d14.png)

データベース: Classic Integration、バージョン: V11.3 を選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e28412b5-973a-f919-6263-2d311b787afe.png)

そのまま終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0e214aba-82b2-df2e-19b0-62b5ac189a9f.png)

物理データモデルが作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f25b2ec8-2fbf-4018-aa93-f660ea8fdac5.png)


### VSAM表の作成

物理データ・モデルdbm以下のデータベースを右クリック - クラシック・オブジェクトの追加 - VSAM表を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/933fcdb5-e61b-3491-1789-99faacf47900.png)

データ定義横の参照ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/aa4adb1e-01b2-3fe9-d1f8-61c81a15f064.png)

先ほどインポートしたCOPYBOOKを選択してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c337f4e9-1034-2606-a4c3-e9728ae73529.png)

適当なスキーマ名を指定し、照会、変更キャプチャーを選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/722e702a-1c5a-615d-fffc-d39e0b481ddd.png)

表名:FILEA、データセットの名前: TAGUCHI.CICS.FILEA を指定して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9762b9c2-dae9-f8c9-e45f-d49d1c8188ab.png)

以下のようにチェックして次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/27ee391e-5141-e81f-28d3-e5808bbec77c.png)

内容を確認して終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e706a2ae-8cb3-7b56-8cdd-8ae56f726249.png)

VSAM表が作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/30f6111b-20bb-a842-892f-635ca2f143db.png)

### DDLの生成/適用

上で作成したVSAM表は、WindowsのCDA上のプロジェクトとして作成しただけなので、これをVSAM Remote Source上に反映させる必要があります。VSAM Remote Source上に反映させるためにはDDL(SQL)を生成してそれを実行する必要があります。

上で生成したVSAM表(FILEA)を右クリック - DDLの生成を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7f533f0e-4723-2d4b-b60d-ee8c8aa05708.png)

そのまま次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/234a72b3-a146-9827-a1ef-d20e0c01fc8f.png)

そのまま次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2ebb2193-9977-a19f-d71d-7eae0a1ec057.png)

ファイル名に適当な値を指定し、サーバー上でDDLを実行にチェックを入れて次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b940ea72-1d1b-e309-512f-0d706192b3b6.png)

新規をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0ad8bc7e-fd4f-b304-583d-a00ee3f9ebf0.png)

Classic Integrationを選択し、名前に"VSAMRemoteSource_on_Test12"を指定して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1c3c20fb-fd7a-9c0f-67cb-ad30a88ef379.png)

一通り値を設定して接続テストをしてOKだったら次へ
ここではコンテナとして稼働しているVSAM Remote SourceがListenしているホストとポート番号を指定することになりますが、ローカルホストの19087ポートからフォワードしているので、localhost:19087を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c56dfac0-ccfa-0f1d-8293-1012a442995d.png)

確認して終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f3b834f5-7e93-4d7f-2313-505ad54630c7.png)

生成された接続を選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7a994888-7b9c-e03a-1422-e9f5a15535e6.png)

確認して終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/72c39ee4-7b07-bd52-444f-750d8da65c06.png)

DDL適用結果の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3cc84b38-4f2e-5f96-c6b0-5690e5df61b4.png)

データ・ソース・エクスプローラー・ビューから、VSAM Remote Source上に反映されたVSAM表が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/33b641d5-55c7-7530-ccc7-5b8cc523df64.png)

※参考
DDLを適用した結果、CREATE TABLE文で以下のエラーが発生する場合は、先の手順で示したVSAM Remote Sourceへの[VSAM定義登録](https://qiita.com/tomotagwork/private/e6c260edc9fd30c82fab#vsam%E5%AE%9A%E7%BE%A9%E7%99%BB%E9%8C%B2)が正常に完了していない可能性がありますのでご確認ください。
「データ・セット、xxx.xxx.xxx が存在しないか、またはカタログされません。」


# 2. ターゲット側設定
ここで実施するのは以下の吹き出し部分の操作です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9f3cdb00-e01a-6c19-1598-c29f580e099d.png)

## Db2 テーブル・スペース
レプリケーションされるテーブルを配置するテーブル・スペースを用意しておきます。
今回はデフォルトで作成されているテーブルスペース"USERSPACE1"を使用することにするので確認だけ。

```
[root@test12 ~]# su - db2inst1
[db2inst1@test12 ~]$ db2 connect to sample2

   データベース接続情報

 データベース・サーバー = DB2/LINUXX8664 11.1.0
 SQL 許可 ID            = DB2INST1
 ローカル・データベース別名 = SAMPLE2

[db2inst1@test12 ~]$ db2 list tablespaces

           現在のデータベースの表スペース

 表スペース ID                        = 0
 名前                                 = SYSCATSPACE
 タイプ                               = データベース管理スペース
 内容                                 = すべての永続データ。 REGULAR 表スペース。
 状態                                 = 0x0000
   詳しい説明:
     正常

 表スペース ID                        = 1
 名前                                 = TEMPSPACE1
 タイプ                               = システム管理スペース
 内容                                 = システム一時データ
 状態                                 = 0x0000
   詳しい説明:
     正常

 表スペース ID                        = 2
 名前                                 = USERSPACE1
 タイプ                               = データベース管理スペース
 内容                                 = すべての永続データ。 LARGE 表スペース。
 状態                                 = 0x0000
   詳しい説明:
     正常

 表スペース ID                        = 3
 名前                                 = SYSTOOLSPACE
 タイプ                               = データベース管理スペース
 内容                                 = すべての永続データ。 LARGE 表スペース。
 状態                                 = 0x0000
   詳しい説明:
     正常
[db2inst1@test12 ~]$ db2 connect reset
DB20000I  SQL コマンドが正常に完了しました。
[db2inst1@test12 ~]$ exit
ログアウト
```

## レプリケーション・エンジンのインスタンス
ターゲットとなるデータソース(今回の場合Db2)にVSAM変更情報を反映させるためのレプリケーション・エンジンのインスタンスを作成しておく必要があります。

これは、先の環境構築の所で実施済みなので(cdc_db2_sample2)、これをそのまま使用します。
参考: [セットアップ(レプリケーション・エンジンのインスタンス作成)](https://qiita.com/tomotagwork/private/76b531eed506658381c0#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E4%BD%9C%E6%88%90)


# 3. レプリケーション設定 (サブスクリプション)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9d45c717-aa27-781c-fc67-8b28b6864290.png)

いよいよレプリケーションの設定を行っていくことになりますが、これらはいずれもManagement ConsoleからAccess Serverに接続して各種オブジェクトの定義を行っていくことになります。
まず、レプリケーション元(Source) と 先(Target)として何を使用するかというのを"データストア"というオブジェクトで管理しますので、ソース用、ターゲット用にデータストアを定義します。
次に、どのソースからどのターゲットにレプリケーションを行うか、という指定を"サブスクリプション"というオブジェクトで定義します。ここでは、ソース上のどの表をターゲット上のどの表にマッピングするか、というような情報も指定します。

## ソース用データストアの作成
Management Consoleを開いて、Access Serverに接続します。
ファイル - Access Server - 新規データストアを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0cdb49ae-47ef-6ecc-103c-5637d9e287d6.png)

適当な名前を指定し、コンテナとして稼働しているVSAM Remote SourceがListenするホスト名、ポートを指定します。ここで指定するホスト、ポートは、Access Serverから見た時のアクセス先なので、Access Serverから辿れるホスト名、ポートを指定します。Pingボタンをクリックすると指定したVSAM Remote Sourceに接続してプロパティー部分の情報が更新されます。接続パラメーターボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f5147a2e-5bb1-3245-332a-7c1a5996300d.png)

VSAM Remote Sourceの実行ユーザーのユーザーID、パスワードを指定してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f17914d8-6d98-4bc8-1e7d-4c68d23e1eae.png)

OKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6890d092-d4d5-ad20-a933-f989431abfd6.png)

ソース用のデータストアが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/eed92c18-f2cd-b4c2-3801-552f8337cc0c.png)

### ユーザーの割り当て
上で作成したデータストアに対してユーザーの割り当てを行います。

アクセス・マネージャータブのデータ・ストアの管理ビューで、データストア名"VsamRemoteSource01"(ソース用)を右クリックしてユーザーの割り当てを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/afe8b9d4-c870-4d99-5d00-c4e0682bd60f.png)

cdcadminを選択してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/63e59e27-0af2-5567-fbd5-2ce2fbcf4d5a.png)

デフォルトのユーザーが表示されるのでそのままOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/85bc6982-a500-2425-9785-d6df60af3c2e.png)

右側の接続の管理ビューで、cdcadminユーザーが追加されたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9c91c334-486e-22a3-e67c-50621820db0a.png)

## ターゲット用データストア作成

Management Consoleを開いて、Access Serverに接続します。
ファイル - Access Server - 新規データストアを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0cdb49ae-47ef-6ecc-103c-5637d9e287d6.png)


適当な名前を指定し、CDC Replication Engine for Db2のインスタンスがListenするホスト名、ポートを指定します。ここで指定するホスト、ポートは、Access Serverおよび、コンテナ内のVSAM Remote Sourceから辿れるホスト名、ポートを指定する必要があります。
<font color="red">※VSAM Remote Sourceのコンテナ作成時に--add-hostでホスト名とIPアドレスのマッピングをしてもコンテナからホスト名でのアクセスはNGでした。そのためこの"ホスト名"欄にはIPアドレスを指定する必要があります！</font>
Pingボタンをクリックすると指定したCDC Replication Engineに接続してプロパティー部分の情報が更新されます。接続パラメーターボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ab10c2ac-9bbe-523b-0e0a-b5a89eec7220.png)


CDC Replication Engine for Db2管理ユーザーのユーザーID、パスワードを指定してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0b1a5773-b2e6-a27f-259d-e769ccc7a2e9.png)

OKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d1f8622c-4fb1-404a-a572-42e26859fcc8.png)


ターゲット用のデータストアが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ef3aa9b5-6408-f01d-c142-ba0b216daca9.png)

<details><summary><font color="blue">参考:CDC Replication Engineのインスタンスがターゲットになれない場合...</font></summary><div>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e9f1a61e-64b0-169d-246e-235aeca26813.png)

タイプがソースになってしまう...

</div></details>

### ユーザーの割り当て
上で作成したデータストアに対してユーザーの割り当てを行います。

アクセス・マネージャータブのデータ・ストアの管理ビューで、データストア名"Db2_sample2"(ターゲット用)を右クリックしてユーザーの割り当てを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7f600df8-9e36-839d-0a56-4fa2f615b5d6.png)

cdcadminを選択してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c9a4d9b9-3d78-3b2c-15bd-e973111e27d5.png)

デフォルトのユーザーが表示されるのでそのままOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b734f6ea-d5fa-ec6f-6184-5857e24f743d.png)

右側の接続の管理ビューで、cdcadminユーザーが追加されたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/36608b2d-7baa-42f3-b811-871c21e9c23f.png)


## サブスクリプションの作成
構成タブに切り替えて、サブスクリプションビューの"新規サブスクリプションの作成"アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7a264ee4-52d6-213c-f218-68a9014bcd09.png)

適当な名前を指定し、データストアにはソースとしてVsamRemoteSource01、ターゲットとしてDb2_sample2を指定し、拡張設定をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/733445f8-4834-26f4-4e93-85e4e4a063e8.png)

確認のみ。(ソースIDとして前画面の名前の先頭8文字がとられるようなので、全画面の名前も8文字にしておくとよい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5bf99a13-391f-795f-a435-14668362cc77.png)

OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/10fdd70d-e127-b080-1223-0118ea1e2a14.png)

はい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/632e9a83-ae45-a0ff-8b4a-a07982c0a24c.png)

複数の1対1マッピングを選択し、タイプ:標準を選択し、次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b59c1e7f-c3a7-0786-ddc7-9a6e5d89d949.png)

FILEAにチェックをして次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2980ad6b-809a-832a-53c7-ec3374d529ab.png)

新規ターゲット表の作成を選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/78e8bed3-02c5-5dee-8a71-5617c7908dea.png)

表スペース名(ここではUSERSPACE1)を指定し、ターゲット・スキーマ部分をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a2d37b1f-e83c-18c6-790f-ff1976578299.png)

CDCDB2を選択してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/50acc20f-bfee-f05d-2f24-245f8b6fb33d.png)

次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/74ed5401-8c63-116d-e6eb-b3819f8057d4.png)

ソース表名と同じを選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/96d0d1df-0dbc-b443-bb2c-79473647e7bb.png)

ミラーリングを指定して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1a8e075e-fab2-5807-c8ce-57802c901e8c.png)

終了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/13afc09b-1b61-6eee-c059-297be34c7a02.png)

サブスクリプション、表マッピングが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/edba292b-61d9-a280-df68-6f2cdf20d6d4.png)

この時点で、Db2側(ターゲット側)にはガラとなるテーブルが作成されます。テーブルの中身はカラです。

```
[root@test12 ~]# su - db2inst1
[db2inst1@test12 ~]$ db2 connect to sample2 user cdcdb2 using xxxxx

   データベース接続情報

 データベース・サーバー = DB2/LINUXX8664 11.1.0
 SQL 許可 ID            = CDCDB2
 ローカル・データベース別名 = SAMPLE2

[db2inst1@test12 ~]$ db2 list tables

表/ビュー                       スキーマ        タイプ 作成時刻
------------------------------- --------------- ----- --------------------------
FILEA                           CDCDB2          T     2021-08-12-19.14.37.895402
TS_AUTH                         CDCDB2          T     2021-08-11-15.52.45.536044
TS_BOOKMARK                     CDCDB2          T     2021-08-11-15.52.45.624596
TS_CONFAUD                      CDCDB2          T     2021-08-11-15.52.45.721099
TS_DDLAUD                       CDCDB2          T     2021-08-11-15.52.45.831333

  5 レコードが選択されました。

[db2inst1@test12 ~]$ db2 "select * from FILEA"

STAT NUMB   NAME                 ADDRX                PHONE    DATEX    AMOUNT   COMMENT
---- ------ -------------------- -------------------- -------- -------- -------- ---------

  0 レコードが選択されました。
```

# レプリケーションの実行
一通り設定が済んだので、実際にレプリケーションを行ってみます。このあたりの制御もManagement Consoleから行います。

## リフレッシュ
まず最初に、現時点でのVSAMデータをDb2に反映させておきます。
この時、CICSからはVSAMをClose状態にしておきます。

サブスクリプションを右クリック - リフレッシュの開始を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/dc47b32e-fb92-2123-17fd-4ba01cf450eb.png)

OK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ca38543b-5acb-df74-ca90-539cebf2249f.png)

リフレッシュが完了すると、ターゲットのDb2上のテーブルにデータが反映されます。

```
[db2inst1@test12 ~]$ db2 "select * from FILEA"

STAT NUMB   NAME                 ADDRX                PHONE    DATEX    AMOUNT   COMMENT
---- ------ -------------------- -------------------- -------- -------- -------- ---------
     000100 S. D. BORMAN         SURREY, ENGLAND      32156778 26 11 81 $0100.11 *********
     000102 J. T. CZAYKOWSKI     WARWICK, ENGLAND     98356183 26 11 81 $1111.11 *********
     000104 M. B. DOMBEY         LONDON,ENGLAND       12846293 26 11 81 $0999.99 *********
...
     900000 D.S. RENSHAW         TAMPA, FLA.          35668120 26 11 81 $0040.00 *********
     999999 ANJI STEVENS         RALEIGH, N.Y.        84591639 26 11 81 $0049.00 *********

  43 レコードが選択されました。
```

## ミラーリングの開始

サブスクリプションを右クリック - ミラーリングの開始を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7f2eceef-778e-42d0-1b59-7380dc559c80.png)

継続を選択してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c75a4492-d367-72ce-d314-f7e08efaa8ed.png)

モニタータブを開いて、指定したサブスクリプションの状態が"継続ミラーリング"になっていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ec36063c-68b3-0534-b3d4-e27de3fbbef8.png)

CICS側で、当該ファイルをOpenにして当該FILEを更新する処理を実施してみます。
AMNUというCICS提供サンプルトランザクションで、以下のレコードを追加してみます。

```
              FILE ADD    
                          
NUMBER:  000001           
NAME:    AAA              
ADDRESS: BBB              
PHONE:   111              
DATE:    99               
AMOUNT:  $0001.00         
COMMENT:                  
```

ターゲットのDb2のテーブルを参照してみます。

```
[db2inst1@test12 ~]$ db2 "select * from FILEA"

STAT NUMB   NAME                 ADDRX                PHONE    DATEX    AMOUNT   COMMENT
---- ------ -------------------- -------------------- -------- -------- -------- ---------
A    000001 AAA                  BBB                  111      99       $0001.00
     000100 S. D. BORMAN         SURREY, ENGLAND      32156778 26 11 81 $0100.11 *********
     000102 J. T. CZAYKOWSKI     WARWICK, ENGLAND     98356183 26 11 81 $1111.11 *********
     000104 M. B. DOMBEY         LONDON,ENGLAND       12846293 26 11 81 $0999.99 *********
...
     900000 D.S. RENSHAW         TAMPA, FLA.          35668120 26 11 81 $0040.00 *********
     999999 ANJI STEVENS         RALEIGH, N.Y.        84591639 26 11 81 $0049.00 *********

  44 レコードが選択されました。
```

レコードが1件追加されました！
レプリケーションがうまく行われていることが確認できました。