QlikReplicateによるOracleとSQL Serverのデータ連携 [OCI]

Qlik ReplicateというCDC製品をOCI上でDBCSとSQL Server間で構成したので備忘まで構成方法をメモしておく。
Qlik Replicateは異種データベース間の表のデータ同期を行う製品である。今回はDBCS上に構成されたPDBのEMP表を、SQL Server上に同期する設定について記載する。Qlik ReplicateはSQL Serverと同じWindows2019サーバに導入する。手順はQlik Replicate Setup and User Guideを参考に行った。製品は以下サイトから評価版が公開されているので、サイトにユーザ情報を登録しダウンロードする。今回はAttunityReplicate_2021.5.0.745_X64を使った(バイナリはAttunityReplicate_2021_5_0_Windows_X64.zip)。なお、評価版は片方向へのレプリケーションしかできない、1日あたりの更新量に制限(25万件)がある、等の制約がある点留意する。
https://www.qlik.com/us/products/qlik-replicate

1.Qlik Replicateのインストール


インストーラのバイナリをダブルクリックすると、Visual C++2019 Redistributable Packageが不足しているので、インストールする旨のメッセージが表示される。Installを押下すると、インストールが行われ、完了後にリブートを促されるので、リブートする。

20211012_QlikInstall1.jpg


リブート後に再度インストーラを起動すると、以下のようにウィザードが起動する。ライセンスアグリーメント、インストールディレクトリを指定、データファイルの格納ディレクトリを指定、ローカルレプリケートサーバをインストールを選択しインストールは完了する。
20211012_QlikInstall2.jpg

20211012_QlikInstall3.jpg

20211012_QlikInstall4.jpg

20211012_QlikInstall5.jpg

20211012_QlikInstall6.jpg


以上でインストールが完了する。スタートメニューからQlikReplicateのWebコンソールを起動するとIEが起動しhttps://サーバ名/attunityreplicateへアクセスする。ここで、Windowsのユーザ名・パスワード(opcユーザ)の認証の後、Qlik Replicateの管理画面にアクセスできる。IEの信頼済みサイトにhttps://サーバ名を追加しておくと良いだろう。

20211012_QlikConsole.jpg

2.ソースデータベース(DBCS)側の準備


Qlik ReplicateでCDCの設定に入る前に、ソースデータベースとなるOracleにいくつか設定が必要である。前提が整っていないとCDCを動かす際にエラーが発生する。

(1)アーカイブログの有効化


CDCは原理的にアーカイブログ運用が前提となる。オンラインREDOだけでも検証できないかとも思ったが、エラーが出たのでアーカイブログに変更する。ノーアーカイブからアーカイブログ運用に変更する手順は以下の通り。
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> alter database open;
データベースが変更されました。
SQL> archive log list
データベース・ログ・モード     アーカイブ・モード
自動アーカイブ                 有効 ★
アーカイブ先                    USE_DB_RECOVERY_FILE_DEST
最も古いオンライン・ログ順序   41
アーカイブする次のログ順序    43
現行のログ順序               43

(2)サプリメンタルロギングの有効化


サプリメンタルロギングはREDOに更新ログを出力する際に追加で主キー等の情報を付加する設定で、GoldenGateでも必要となる設定である。CDBに接続し、以下を実行して有効化する。

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
データベースが変更されました。

(3)ASMへのリスナーアクセスを可能とするためのパスワード設定


QlikReplicateはOracle Databaseのアーカイブログにアクセスするために、ASMインスタンスに直接接続する必要がある。ASMインスタンスにリスナ経由で接続するために、ASMのSYSのパスワードを設定する必要がある。変更方法はgridで接続し、asmcmdでorapwusr --modify SYSで設定する。なお、SYSは大文字である必要がある。sys(小文字)ではORA-01918: user 'sys' does not existが出るので注意が必要。

[grid@hostname dbs]$ asmcmd
ASMCMD> orapwusr --modify SYS  ★SYSはsysではダメ
Enter password: ************
ASMCMD> exit


変更したら、tnsnames.oraにASM接続用のエントリを追加する。今回は以下のエントリを追加した。デフォルトポート1521でインスタンス名は+ASM1である。
/u01/app/oracle/product/19.0.0.0/dbhome_1/network/admin/tnsnames.ora
k5asm =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER=DEDICATED)
      (SID=+ASM1)
      (UR=A)
    )
  )


この接続識別子を用いて、リスナ経由でASMインスタンスに接続できることを確認する。
[grid@hostname dbs]$ sqlplus sys/************@k5asm as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Sep 26 07:25:07 2021
Version 19.11.0.0.0
Copyright (c) 1982, 2020, Oracle.  All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.11.0.0.0
SQL>

(4)PDBおよびCDBの暗号化キーの確認


DBCSはTDEを使っているため、QlikReplicateに暗号化キーを設定する必要がある。この暗号化キーの確認するには以下のようにmkstoreコマンドでウォレットの中を確認する必要がある。なお、ウォレットファイルはフルパスで指定しなければならない。

[oracle@hostname DB0908_nrt17b]$ mkstore -wrl /opt/oracle/dcs/commonstore/wallets/tde/DB0908_nrt17b/ewallet.p12 -list
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.

Enter wallet password: ************
Oracle Secret Store entries:
ORACLE.SECURITY.DB.ENCRYPTION.Af4aIwQwmk/+vxsp/kS7yd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA★REDO用
ORACLE.SECURITY.DB.ENCRYPTION.ATkmXEgsDE+Yv89DS0GZ1ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.DB.ENCRYPTION.AWF5Pvc+H0/Ov+U30kxnD7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.DB.ENCRYPTION.AXBrtw7gs0+Rv+obia7EzLUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.DB.ENCRYPTION.AXJnaod6Mk9Gv141a+DUiTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.DB.ENCRYPTION.AYYVZZVRXU9fvxgcryysiQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA★PDB(k5)のエントリはこれ
ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY
ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY.CB77B668ABF93826E0530200A8C0599A
ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY.CB8D1DEEE83A3D93E0530200A8C070DE
ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY.CBAE6F1A06F74EC9E0530200A8C0C1BF
ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY.CBAE7AEFB42B5B77E0530200A8C045E9
ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY.CBAE7EA7B7B55FA2E0530200A8C08B4B
ORACLE.SECURITY.ID.ENCRYPTION.
ORACLE.SECURITY.KB.ENCRYPTION.
ORACLE.SECURITY.KM.ENCRYPTION.Af4aIwQwmk/+vxsp/kS7yd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.KM.ENCRYPTION.ATkmXEgsDE+Yv89DS0GZ1ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.KM.ENCRYPTION.AWF5Pvc+H0/Ov+U30kxnD7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.KM.ENCRYPTION.AXBrtw7gs0+Rv+obia7EzLUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.KM.ENCRYPTION.AXJnaod6Mk9Gv141a+DUiTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.KM.ENCRYPTION.AYYVZZVRXU9fvxgcryysiQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.KT.ENCRYPTION.Af4aIwQwmk/+vxsp/kS7yd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.KT.ENCRYPTION.ATkmXEgsDE+Yv89DS0GZ1ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.KT.ENCRYPTION.AWF5Pvc+H0/Ov+U30kxnD7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.KT.ENCRYPTION.AXBrtw7gs0+Rv+obia7EzLUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.KT.ENCRYPTION.AXJnaod6Mk9Gv141a+DUiTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.KT.ENCRYPTION.AYYVZZVRXU9fvxgcryysiQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


ここでORACLE.SECURITY.DB.ENCRYPTIONで始まるもののうち、対象となるCDBとPDBのものを特定する。今回は★のものが該当するので、それぞれmkstore -viewEntryでエントリを確認する。下記★部分がそれぞれのエントリである。これが後にQlikReplicateのOracleのエンドポイントを設定するときに必要となるため、記録しておく。

[oracle@hostname admin]$ mkstore -wrl /opt/oracle/dcs/commonstore/wallets/tde/DB0908_nrt17b/ewallet.p12 -viewEntry ORACLE.SECURITY.DB.ENCRYPTION.AYYVZZVRXU9fvxgcryysiQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.

Enter wallet password:
ORACLE.SECURITY.DB.ENCRYPTION.AYYVZZVRXU9fvxgcryysiQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA = AEMAASAAPLT8SflEbr1J8Kq1BOQMsMe+yVB8Hxz16DJqD4RnG3gDEACYaJaGlL6akNWhvWRBduY7BQcAeHkJCwomOQ== ★
[oracle@hostname admin]$
[oracle@hostname ~]$ mkstore -wrl /opt/oracle/dcs/commonstore/wallets/tde/DB0908_nrt17b/ewallet.p12 -viewEntry ORACLE.SECURITY.DB.ENCRYPTION.Af4aIwQwmk/+vxsp/kS7yd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.

Enter wallet password:
ORACLE.SECURITY.DB.ENCRYPTION.Af4aIwQwmk/+vxsp/kS7yd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA = AEMAASAAMKhtO43aSshj6P7YMRZLktjeCX94Iyi2vy27aAXNcxwDEACm4Ws2hfl9OIoBd/JY9Gl/BQcAeHkJCBEYNQ== ★

3.QlikReplicateのサーバ側の準備


QlikReplicateのサーバ側には以下の設定が必要である。なお、いわずもがなであるがASMインスタンスに接続するにはOracle Client導入が前提である(今回は、SQL ServerにOracle Client導入済みであったので特に追加の必要なし)。

(5)PDBおよびASMインスタンスへアクセスするためのtnsnames.oraの設定


PDBへの接続用のエントリ、および上記(3)で設定した+ASM1のエントリをQlik ReplicateのサーバのOracleクライアントのtnsnames.oraに設定する。tnspingとsqlplusで+ASM1へ接続できることを確認する。

k5 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
    (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = k5.subnet.vcn.oraclevcn.com)
)

k5asm =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER=DEDICATED)
      (SID=+ASM1)
      (UR=A)
    )
  )

4.QlikReplicateのエンドポイントとタスクの作成


CDCのソースとなるOracle DatabaseとターゲットとなるSQL Serverそれぞれについてエンドポイントを作成する。Qlik Replicateの管理コンソール上で作成できる。ここではそれぞれk5とSQLというエンドポイントを作成した。基本的には画面上にデータベースへの接続情報を入力すればよい。

20211012_QlikTASK.jpg


1点難しかったのが、Oracleのエンドポイントの作成画面(Advancedタブ)だったので、この部分の設定方法だけ記載しておく。

20211012_OracleEndpointAdvanced.jpg


まず、Secret store encryption entriesの部分については、PDBおよびCDBの暗号化キーを設定する。(4)で確認した暗号化キーを以下のようにカンマ区切りでNamesとValuesに設定する。

Names: ORACLE.SECURITY.DB.ENCRYPTION.AYYVZZVRXU9fvxgcryysiQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,ORACLE.SECURITY.DB.ENCRYPTION.Af4aIwQwmk/+vxsp/kS7yd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Values: AEMAASAAPLT8SflEbr1J8Kq1BOQMsMe+yVB8Hxz16DJqD4RnG3gDEACYaJaGlL6akNWhvWRBduY7BQcAeHkJCwomOQ==,AEMAASAAMKhtO43aSshj6P7YMRZLktjeCX94Iyi2vy27aAXNcxwDEACm4Ws2hfl9OIoBd/JY9Gl/BQcAeHkJCBEYNQ==


また、ASM parametersの部分は、(5)で設定したASMの接続識別子と、(3)で設定したASM接続に必要なアカウントを指定する。

エンドポイントを作成したら、タスクを作成する。ソース側のOracleのPDB(k5)のテーブルとして、emp、deptを指定、ターゲット側のSQL Server(k8)のテーブルとして、k5emp,k5deptとテーブルの名前を変更して登録した。ジョブを実行すると初期データロードが開始する。これでおそらくCDCの同期ができた状態になったと思われる。なお、評価版ライセンスの制約で、片方向への同期設定しか選択できないようになっていた。

20211012_QlikTASKSuccess.jpg


SQL Server側を確認すると、k5deptとk5emp表が作成されており、データが入っていることがわかる。

20211012_SQLServerEMPDEPT.jpg


初期データとして、Oracle側でdept表に10万件、emp表に100万件を入れておいた。k5deptは10万件、k5empは73万件入っている。k5empはなぜ75万件しか入っていなかった。Qlik Replicateのログログを見ると以下のような警告メッセージが出ていた。どうやらライセンスの制約らしい。

The maximum number of rows per day (250,000) that can be replicated using the Replicate Express Edition has been reached.

まとめ


今回はQlik ReplicateでOracleからSQL Serverへemp,dept表をレプリケートする構成方法について記載した。Qlik Replicateの導入は簡単であるが、レプリケーションを動作させるためには、Oracle側に前提となる設定(ASMへのリスナー接続など)が必要であるのに加え、OCIではTDEが有効になっていることにより考慮すべき設定があることがわかった。Qlik Replicateの設定は管理コンソールの画面上から直感的にできるので、一度動作する状態になれば後の操作は比較的容易にできそうな感触だった。
残念ながら今回は初期データロードするところまでしか確認できなかった。ソース側の表に変更を加えてターゲット側の表に正常に反映されることくらいは確認しておきたかった。やるにしてもまた1から環境構築が必要なので、改めて機会を伺いたい。DB2についてもQlik Replicateが構成できるはずなので、こちらもいずれ確認したいと思っている。

◇参考


[1] Qlik Replicate Setup and User Guide