IBM i Migrate While Active のオブジェクト毎のコピー方式について

yoichi_nakamuraさんの[こちらの記事](https://qiita.com/yoichi_nakamura/items/4034172a83cce3d0b88a)を読みましてインスパイアされました（感謝♪）IBM i Migrate While Active 　をちょっと調べてみました。

## IBM i Migrate While Active とは

上記yoichi_nakamuraさんの記事をご参照ください。
個人的に要点を抜き出すと、、
- 同一のバージョン、PTFレベルのIBM i 同士でのシステム移行を想定した機能
- オンプレ・クラウドは問わず利用可能
- 当機能はSYSBAS（ASP1～32）だけが対象（IASPはIBM i OSの別機能またはベンダーツールで移行できる）
- ベースとなったDb2 Mirror for i では2つのIBM i システムでActive-Activeの負荷分散構成がとれたり、逆方向への複製もサポートされますが、当機能は一方方向の複製のみサポート（Active-Active構成もとれない）

## Db2 Mirror for i と IBM i Migrate While Active の関係性？

調べてないので機能面比較から一部推測ありになってしまいますが、
- Db2 Mirror for i はOracle RAC的な冗長化システムを構成するのが主目的で、そのためのオブジェクトのほぼリアルタイムな２システム間同期を目的としています。この機能を基本的には踏襲して（一部制限して&非同期モード前提に修正して？)IBM i Migrate While Activeでも利用しているようです。以下に記載している、「Db2ミラーのレプリケーション適格なオブジェクト」と「疑似オブジェクト」に該当するオブジェクトタイプがD2b Mirror for i の複製対象オブジェクトとほぼ同一だからです。
    - 少し古いですがDB2 Mirror for i の記事→[Db2 Mirror for i 概要と運用時の考慮点](https://www.imagazine.co.jp/db2-mirror-for-i-%E6%A6%82%E8%A6%81%E3%81%A8%E9%81%8B%E7%94%A8%E6%99%82%E3%81%AE%E8%80%83%E6%85%AE%E7%82%B9/)
- IBM i Migrate While Active は2システム間のマイグレーションが目的なので上記で対象外となるオブジェクトの複製機能を追加している。これらには「Non-Db2 ミラーレプリケーション適格オブジェクト」、「IFSオブジェクト」がある。
という事になると思います。

## オブジェクトの種類ごとの複製方式

ということで、上記のオブジェクトの複製カテゴリー別に要約してみます。（マニュアルページはこちらです。）[オブジェクトの種類と移行](https://www.ibm.com/docs/ja/i/7.5?topic=ssw_ibm_i_75/mig/migobjects.html)

※図式化するとこんな具合になると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c231f19e-a07d-089d-393d-0fac14c73fcc.png)

サマリーすると
- ①Db2ミラーのレプリケーション適格なオブジェクト（ミラー複製オブジェクトと表記します）
    Db2 Mirror for iと同様にIBM i OSが元システム（ソース・ノード）のオブジェクトの変更を検知しほぼリアルタイムにターゲットシステム（コピー・ノード）にオブジェクトの複製を行う。たとえばデータベース・テーブルの場合、追加・更新されたレコードだけが複製される。（テーブルがまるまる再コピーされるわけではない）。**ミラー・レプリケーション**と呼ばれる。
- ②Non-Db2ミラーレプリケーション適格オブジェクト（非ミラー複製オブジェクトと表記します）
    ①に該当しないライブラリーに存在しているオブジェクトを複製する機能で、ソース・ノードでオブジェクトを保管してコピー・ノードにオブジェクトを復元する。
- ③IFSオブジェクト
    狭義のIFS（=/QSYS.LIB以外のディレクトリー配下のオブジェクト）を複製する。②と同じくソース・ノードでオブジェクトを保管してコピー・ノードにオブジェクトを復元する。
- ④疑似オブジェクト
    疑似オブジェクトとは、IBM i OSのシステム値などIBM i OSが内部的に属性として保持している情報・設定についてソース・ノードからコピー・ノードに反映させる機能


### ①ミラー複製オブジェクト（正式には、Db2ミラーのレプリケーション適格なオブジェクト）
以下のオブジェクトタイプが対象
**ただし、QGPL、QTEMP、QSYS、QUSRSYSなどQxxxという名前のIBM i システム提供ライブラリーについては対象外。**

| オブジェクト・タイプ | 説明 | コメント |
|:-:|:-:|:-:|
| *DTAARA | データエリア | |
| *DTAQ | データキュー | タイプ *DDM, *DSP のデータキューは対象外 |
| *FILE | ファイル | Db2 for iテーブル、プログラムソース等。タイプ *DSPF, *PRTF、*TBL、*ICFF、*CMNF、および*SAVF は対象外 |
| *JOBD | ジョブ記述 | |
| *JOBQ | ジョブキュー | |
| *JRN | ジャーナル |　リモートジャーナルは対象外 |
| *LIB | ライブラリー | |
| *OUTQ | 出力待ち行列 | OUTQ内のスプールファイルはすべて複製される。スプールファイルを個別に複製指定は不可。 |
| *PGM | プログラム | |
| *SQLPKG | SQLパッケージ | 拡張ダイナミックパッケージは対象外 |
| *SQLUDT | SQLユーザー定義タイプ | |
| *SQLXSR | SQL XMLスキーマリポジトリー | |
| *SRVPGM | サービス・プログラム | |
| *USRIDX | ユーザー索引 | |
| *USRSPC | ユーザースペース | |
|:-:|:-:|:-:|
| *AUTL | 権限リスト | |
| *USRPRF | ユーザー・プロファイル | ユーザーID |

***デフォルトはすべてのユーザー・ライブラリーが複製対象になるが、Db2Mirrorレプリケーション基準リスト（RCL）に除外ルールとして追加すると除外も可能***

マニュアル記載の除外設定のSQL例
ライブラリー COOLSTUFF を除外する
```
--
-- Pause Migrate While Active data synchronization
--
CALL QSYS2.CHANGE_MIGRATION_MANAGER("ACTION" => 'PAUSE');

--
-- Exclude the COOLSTUFF library, and all objects within, from 
-- Migrate While Active's data synchronization
--
CALL QSYS2.ADD_REPLICATION_CRITERIA(INCLUSION_STATE => 'EXCLUDE',
                                    IASP_NAME       => '*SYSBAS',
                                    LIBRARY_NAME    => 'COOLSTUFF',
                                    APPLY           => 'ACTIVE'); 
                                    
--
-- Resume Migrate While Active data synchronization
--
CALL QSYS2.CHANGE_MIGRATION_MANAGER("ACTION" => 'SYNCHRONIZE');

```

### ②非ミラー複製オブジェクト（正式にはNon-Db2 ミラーレプリケーション適格オブジェクト）
**ミラーレプリケーションではなく保管・復元方式でレプリケーションされるオブジェクト。ライブラリーに存在するオブジェクトが対象（=狭義のISF上のオブジェクトは対象外）**

| オブジェクト・タイプ | 説明 | コメント |
|:-:|:-:|:-:|
| *ALRTBL | 警報テーブル | |
| *BNDDIR | バインディング・ディレクトリー | |
| *CHTFMT | 図形フォーマット | |
| *CLD | C/400 ロケール記述 | |
| *CMD | コマンド | |
| *CSI | 通信サイド情報 | |
| *DTAQ | データ・キュー | タイプ*DSPF, *DDM が対象 |
| *FCT | 用紙制御テーブル | |
| *FILE | ファイル | タイプ *DSPF, *PRTF、*TBL、*ICFF、*CMNF、および*SAVF が対象 |
| *FNTRSC | フォントリソース | |
| *FNTTBL | フォントテーブル | |
| *FORMDF | フォーマット定義 | |
| *FTR | フィルター | |
| *IGCDCT | DBCS変換辞書 | |
| *JRN | ジャーナル | リモート・ジャーナルが対象 |
| *LOCALE | ロケール | |
| *MEDDFN | 媒体定義 | |
| *MENU | メニュー | |
| *MGTCOL | マネジメントコレクション（パフォーマンスデータ） | |
| *MODULE | プログラム・モジュール | |
| *MSGF | メッセージ・ファイル | |
| *MSGQ | メッセージ・キュー | ただし、メッセージキュー内のエントリーは複製・同期されない |
| *NODL | ノードリスト | |
| *OVL | オーバーレイ | |
| *PAGDFN | ページ定義 | |
| *PAGSEG | ページセグメント | |
| *PDFMAP | PDFマップ | |
| *PDG | 印刷記述グループ | |
| *PNLGRP | パネルグループ | |
| *PSFCFG | PSF印刷構成 | |
| *QMFORM | 照会管理機能書式 | |
| *QMQRY | QUERY管理機能PGM | |
| *QRYDFN | QUERY for i 定義 | |
| *SBSD | サブシステム定義 | |
| *SCHIDX | 検索見出し | |
| *SSND | セッション記述 | |
| *TBL | テーブル | |
| *USRQ | ユーザー待ち行列 | |
| *VLDL | 妥当性検査リスト | |
| *WSCST | ワークステーションカスタマイズオブジェクト | |

**システムライブラリー内のオブジェクト**
以下のライブラリー内のオブジェクトも複製対象です。***ただし、これらはシステム移行フェーズで１度だけ（最初の複製で）移行されます。これ以降に変更された場合でもオブジェクトの複製し直しなどはされないので注意。*** 変更を反映させるにはユーザー操作による保管・復元になると思います。

***※システム・ライブラリー内とは、QDOC、QPASE、QQALIB、QSHELL、QSYSDIR、QSYS、QSYS2、QTCP、QUTL、QGPL、QUSRSYS、および名前がQで始まるその他のIBM iシステム・ライブラリです。***

〇:複製されるもの
NA:そのライブラリーには作成不可なオブジェクト（※ではなくて単に当機能で複製×だけかも・・のち確認します）

| オブジェクト・タイプ | 説明 | システムライブラリー内 |ユーザーライブラリー内  | コメント |
|:-:|:-:|:-:|:-:|:-:|
| *CFGL | 構成リスト | 〇 | 〇 | |
| *CNNL | 接続リスト | 〇 | NA | |
| *COSD | サービスクラス記述 | 〇 | NA | |
| *CRG | クラスターリソースグループ | 〇 | NA | |
| *CRQD | 要求記述の変更 | NA | 〇 | |
| *CSPTBL | システム間製品表 | NA | 〇 | |
| *CTLD | 制御装置記述 | 〇 | NA | |
| *DEVD | 装置記述 | 〇 | NA | |
| *DOC | 文書オブジェクト | 〇 | NA | |
| *DDIR | 分散フィアル・ディレクトリー| NA | 〇 | |
| *DSTMF | 分散ストリームファイル | NA | 〇 | |
| *DTADCT | データディクショナリー | NA | 〇 | |
| *EDTD | 編集記述 | 〇 | NA | |
| *EXITRG | EXIT登録 | 〇 | NA | |
| *FLR | フォルダー | 〇 | NA | |
| *GSS | グラフィックスシンボルセット | NA | 〇 | |
| *IGCSRT | DBCSソートテーブル | NA | 〇 | |
| *IGCTBL | DBCSフォントテーブル | 〇 | NA |  |
| *IMGCLG | イメージカタログ | 〇 | NA | |
| *IPXD | 内部パケット記述 | 〇 | NA | |
| *JOBSCD | ジョブスケジュール | 〇 | NA | |
| *JRNRCV | ジャーナルレシーバー | NA | 〇 | ※1 初期移行されるがそれ以後の更新差分はコピーシステムに複製されない |
| *LIND | 回線記述 | 〇 |〇 |　|
| *M36 | S/36拡張 | NA| 〇 | |
| *M36CFG | S/36拡張構成 | NA| 〇 | |
| *MODD | モード記述 | 〇 | NA | |
| *NTBD | NETBIOS記述 | 〇 | NA | |
| *NODGRP | ノードグループ | NA| 〇 | |
| *NWID | ネットワークインターフェース記述 | 〇 | NA | |
| *NWSCFG | NWS CONFIG | 〇 | NA | |
| *NWSD | NWSD構成 | 〇 | NA | |
| *PRDAVL | プロダクト可用性 | NA | 〇 | |
| *PRDDFN | プロダクト定義 | NA | 〇 | |
| *PRDLOD | プロダクトロード | NA | 〇 | |
| *RCT | 参照コード変換表 | NA | 〇 | |
| *S36 | S/36記述 | NA | 〇 | |
| *SOCKET | ソケット記述 | NA | 〇 | |
| *SPADCT | スペル援助辞書 | NA | 〇 | |
| *SVRSTG | NWSサーバーストレージ | NA | 〇 | |
| *TIMZON | タイムゾーン記述 | 〇 |NA | |

※1ジャーナルレシーバーの差分は移行されない。一方でジャーナルレシーバーでジャーナル出来る*FILE,*DTAARA,*DTAQ,*STMF,*DIR,*SYMLNKは更新情報もコピー・ノードに複製（ミラー）される点に要注意。（ジャーナルレシーバーの情報も手動同期させないと先のオブジェクトタイプの状態と整合性が崩れる可能性がある。
※1監査ジャーナルも同様に差分は当機能では移行されない。ユーザー操作による同期その他が必要になる。（ただし、監査対象オブジェクトの変更等は当機能でコピー・ノードに複製される）

***システム・ライブラリとユーザー・ライブラリの比較には,
QSYS2.MIRROR_COMPARE_LIBRARYプロシージャを使用可能。***
IBM i サービス SQLサンプル
ソース・ノードとコピー・ノードの間で、すべての 'non-Db2ミラー・レプリケーション適格オブジェクトを比較する。結果はファイルQGPL/ALLNONDB2Mに格納。
```
CL: SBMJOB CMD(RUNSQL SQL('CALL QSYS2.MIRROR_COMPARE_NODE(   COMPARE_SCOPE    => ''*SYSBAS'',
                                  RESULT_LIBRARY     => ''QGPL'',
                                  OBJECT_TYPE_LIST   => ''*ALLNONMIRROR'',
                                  RESULT_FILE        => ''ALLNONDB2M'',
                                  COMPARE_ATTRIBUTES => ''YES'',
                                  COMPARE_DATA       => ''NO'' 
                                  )') COMMIT(*NONE)) 
               JOB(MCOMPN) JOBMSGQFL(*PRTWRAP) LOG(4 00 *SECLVL);
--
-- Review any non-Db2 Mirror replication-eligible object differences, 
-- where the difference exists in a user library
--
SELECT *
    FROM qgpl.allnondb2m
    WHERE library_name NOT LIKE 'Q%'
    ORDER BY library_name, object_type;

--
-- Review any non-Db2 Mirror replication-eligible object differences, 
-- where the difference exists in an IBM i system library
--
SELECT *
    FROM qgpl.allnondb2m
    WHERE library_name LIKE 'Q%'
    ORDER BY library_name, object_type;

```

### ③IFSオブジェクト

***SYSBAS内のIFS（狭義のIFS）のオブジェクトは殆どが当機能でコピー・ノードに保管・復元方式で複製される。ただし以下のIFSオブジェクトは複製されない。***
| オブジェクト・タイプ | 説明 |コメント |
|:-:|:-:|:-:|
| *BLKSF | ブロック特殊ファイル| |
| *DDIR | 分散ファイルディレクトリー| |
| *DSTMF | 分散ストリームファイル| |
| *SOCKET | TCP/IPソケット定義 | |

***また当機能はUDFSユーザー定義ファイルシステムも複製しない。以下のIFSパスは複製対象外となる。***
```
QNTC
/QOPT
/QSR
/dev
/QIBM/ProdData
/QIBM/UserData/OS
/QIBM/UserData/OS400
/QOpenSys/QIBM/ProdData
/QOpenSys/pkgs
/QOpenSys/var/cache/rpm
/QOpenSys/var/cache/yum
/QOpenSys/var/lib/rpm
/QOpenSys/var/lib/yum
/QTCPTMM/.TMP
```

***ソースノードとコピーノードのIFSの比較をするSQLが提供されている。 IFS_OBJECT_STATISTICSテーブル関数。

SQLサンプル
/home/’の開始パスの下にあるサブディレクトリとサブディレクトリ内のオブジェクトが、ソースノードとコピーノードで比較される。
```
CL: CRTLIB MIGIFS;

CREATE OR REPLACE TABLE MIGIFS.COMP_HOMES AS (
SELECT *
  FROM TABLE (
      QSYS2.COMPARE_IFS(
        START_PATH_NAME1     => '/home/', 
        START_PATH_NAME2     => '/home/',
        RDB2                 => 'QIBM_DB2M_00000', 
        OBJECT_TYPE_LIST     => '*ALL', 
        SUBTREE_DIRECTORIES  => 'YES',
        COMPARE_ATTRIBUTES   => 'YES')
    )
    ) WITH DATA ON REPLACE DELETE ROWS;

SELECT * FROM MIGIFS.COMP_HOMES;
```

他にも有用な情報がInfocenterページにありました。

### ④疑似オブジェクト
***※疑似オブジェクト***
システム・レベルの環境変数 (*ENVVAR)、セキュリティー属性 (*SECATR)、システム値 (*SYSVAL)、および機能使用法 ID (*FCNUSG)のソース・ノードからコピー・ノードへの複製について。

| オブジェクト・タイプ | 説明 | 当機能での複製 |
|:-:|:-:|:-:|
| *ENVVAR | システムレベルの環境変数| 当機能、Db2 Mirror for i では複製されない。※2 |
| *SECATR | セキュリティ属性 | 当機能で差分含め複製される |
| *SYSVAL | システム値 | 初期にすべてのシステム値がコピーノードに複製される。その後一部のシステム値の変更が差分複製される※3 |
| *FCNUSG | 関数使用識別子 | 当機能で差分含め複製される※4 |

***※2 ソース・ノードとコピー・ノードのシステムレベル環境変数の比較用SQL***
サンプル
コピー・ノードに欠けているシステムレベルの環境変数を把握し、コピー・ノード上で実行可能なCLコマンドを構築して、それらの環境変数を設定する
```
--
-- Generate a list of system level environment variables (*ENVVAR) that exist on the copy node
--
DECLARE GLOBAL TEMPORARY TABLE SESSION.REMOTE_ENVVARS (
      ENVIRONMENT_VARIABLE_NAME, ENVIRONMENT_VARIABLE_VALUE, ENVIRONMENT_VARIABLE_CCSID) AS
      (SELECT ENVIRONMENT_VARIABLE_NAME, ENVIRONMENT_VARIABLE_VALUE, ENVIRONMENT_VARIABLE_CCSID
          FROM QIBM_DB2M_00000.QSYS2.ENVIRONMENT_VARIABLE_INFO
          WHERE ENVIRONMENT_VARIABLE_TYPE = 'SYSTEM')
      WITH DATA
  WITH REPLACE;

--
-- List the system level environment variables (*ENVVAR) that exist only on the source node
--
SELECT SOURCE.ENVIRONMENT_VARIABLE_NAME, SOURCE.ENVIRONMENT_VARIABLE_VALUE,
       SOURCE.ENVIRONMENT_VARIABLE_CCSID
  FROM QSYS2.ENVIRONMENT_VARIABLE_INFO SOURCE
       LEFT EXCEPTION JOIN SESSION.REMOTE_ENVVARS COPY
         ON SOURCE.ENVIRONMENT_VARIABLE_NAME = COPY.ENVIRONMENT_VARIABLE_NAME
  WHERE SOURCE.ENVIRONMENT_VARIABLE_TYPE = 'SYSTEM';
  
--
-- Generate CL commands that can be executed on the copy node to create the 
--   missing environment variables
--
SELECT 'QSYS/ADDENVVAR ENVVAR(''' CONCAT SOURCE.ENVIRONMENT_VARIABLE_NAME CONCAT 
       ''') VALUE(''' CONCAT  SOURCE.ENVIRONMENT_VARIABLE_VALUE CONCAT 
       ''') CCSID(' CONCAT SOURCE.ENVIRONMENT_VARIABLE_CCSID CONCAT ') LEVEL(*SYS)' 
       AS ENVVAR_COMMANDS
  FROM QSYS2.ENVIRONMENT_VARIABLE_INFO SOURCE
       LEFT EXCEPTION JOIN SESSION.REMOTE_ENVVARS COPY
         ON SOURCE.ENVIRONMENT_VARIABLE_NAME = COPY.ENVIRONMENT_VARIABLE_NAME
  WHERE SOURCE.ENVIRONMENT_VARIABLE_TYPE = 'SYSTEM';
```
※3 差分複製されるのは、下記のシステム値
```
QALWOBJRST	QCURSYM	QHOUR	QSECOND
QCCSID	QDATE	QIGCCDEFNT	QSECURITY
QCENTURY	QDATETIME	QIGCFNTSIZ	QSRTSEQ
QCHRID	QDATFMT	QKBDTYPE	QTIME
QCHRIDCTL	QDATSEP	QLANGID	QTIMSEP
QCNTRYID	QDAY	QMINUTE	QTIMZON
QCRTAUT	QDECFMT	QMONTH	QVFYOBJRST
QCRTOBJAUD	QFRCCVNRST	QPWDLVL	QYEAR
```

※4 ソース・ノードとコピー・ノードの疑似オブジェクトを比較できるSQLサンプル
複製オブジェクト・タイプを指定して比較可能。以下の例は*AUTL、*USRPRF、*SYSVAL、*ENVVAR、*FCNUSG、および*SECATRを比較
```
--
-- Determine if the pseudo object types are "in sync" between the source and copy node
--
CALL QSYS2.MIRROR_COMPARE_LIBRARY(
    LIBRARY_NAME   => 'QSYS',
    RESULT_SET     => 'YES',
    RESULT_LIBRARY => 'MIG_COMP',
    RESULT_FILE    => 'PSEUDOCOMP');

SELECT * FROM MIG_COMP.PSEUDOCOMP;


```

…結構なボリュームになってしまいました(^^;
調査ミスなどあるかもしれませんのでもしあればご指摘ください…m(_ _)m

## 参考URL
インフォセンター（IBM docks）：IBM® i Migrate While Active (ver.7.5)
https://www.ibm.com/docs/ja/i/7.5?topic=ssw_ibm_i_75/mig/migkickoff.html

[Db2ミラーのレプリケーション適格なオブジェクトの移行](https://www.ibm.com/docs/ja/i/7.5?topic=ssw_ibm_i_75/mig/migobjectsdb2m.html)
[Non-Db2 ミラーレプリケーション適格オブジェクトの移行](https://www.ibm.com/docs/ja/i/7.5?topic=ssw_ibm_i_75/mig/migobjectsnondb2m.html)
[IFSオブジェクトの移行](https://www.ibm.com/docs/ja/i/7.5?topic=ssw_ibm_i_75/mig/migobjectsifs.html)
[疑似オブジェクト・タイプの移行](https://www.ibm.com/docs/ja/i/7.5?topic=ssw_ibm_i_75/mig/migobjectspseudo.html)