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

OCIの異機種DBLINK検証環境構築メモ ~その4 [OCI]

日曜日朝の秋晴れの中、リラックスして音楽を聴きながら、ひととき日常を忘れ、平和に執筆できることに幸せを感じる。さて、今回はいよいよOracle Gatewayの構成について記す。OCIのDBCSでOracle Gatewayを構成し、Oracle DatabaseのDBLINK経由でSQL ServerやDB2のEMP表をSELECTできるようになるまで構成した手順を記載する。

 1.VCNの設定
 2.DBCSの構築
 3.DB設定(初期化パラメータ設定、PDB構築)
 4.SQL Serverの構築
 5.LinkedServerの構成
 6.DB2の構築
 7.Federationの構成
 8.OracleGWの構築 ★
 9.SQL ServerへのDBLINKの構成 ★
 10.DB2へのDBLINKの構成 ★

なお、本記事執筆時点でOCIの30日フリートライアルは終了してしまったため、本記事記載の環境はまもなく削除されるだろう。30日でも目的を絞れば製品検証に結構使えるので、フィジビリティ確認には本当にありがたい。

8.OracleGWの構築


Oracle Gatewayの構成は、DBサーバに直接インストールする方法と、別サーバを立てる方法とあるが、今回は手っ取り早くDBCSに直接インストールすることにした。全体の導入方法は製品マニュアル(参考[1])を確認しながら行った。このマニュアルにはOracle Gatewayが対応する全てのデータベースに対する構成方法が記載されているので、今回はこの中のSQL Serverの記載を参照しながら作業を進めた。また、バイナリは以下OTNから19.3のものがダウンロードした。

Oracle Database Gateways 19c (19.3) for Linux x86-64

また、SQL Server側は接続先データベース(k8)を新規に作成し、emp/dept表をあらかじめ作成しておく。SQL ServerのDDLを書くのは初めてであったので、備忘まで今回作成したテスト用初期データ作成のDDLを参考ファイル[1]に添付しておく。

(1)Oracle Gateway(SQL Server)のインストール


DBサーバの適当なディレクトリに展開すると、gatewaysディレクトリができるので、配下のrunInstallerを起動する。ウィザードにしたがってインストールを進める。

20211010_OracleGWInst1.jpg


途中でインストールする対象製品を選択する画面が出る。今回はまずSQL Serverを選択する。

20211010_OracleGWInst2.jpg


SQL Serverの接続情報の画面が表示されるので、SQL ServerのIPアドレス、ポート、インスタンス名、DB名を入力する。k8はSQL Server側に作成したデータベース名である。あらかじめemp表を作成しておく。

20211010_OracleGWInst3.jpg


プレチェックが走り、インストールが開始される。最後にroot.shを実行する。

20211010_OracleGWInst4.jpg


以上でインストールは完了である。インストールされた後の$ORACLE_HOMEを確認してみよう。dg4msqlというディレクトリが追加されていることがわかる。後述するが、この配下のファイルにSQL Serverへの接続設定を行うことになる。
[oracle@hostname dbhome_1]$ ls -ltr
total 332
-rw-r--r--  1 oracle oinstall   852 Aug 18  2015 env.ora
...
drwxr-xr-x  3 oracle asmadmin  4096 Sep  8 16:19 admin
drwxr-xr-t  4 oracle oinstall  4096 Sep 12 04:26 log
drwxr-xr-x  2 oracle oinstall  4096 Sep 13 20:38 dbs
drwxr-x--- 15 oracle oinstall  4096 Sep 15 16:58 inventory
drwxr-xr-x  7 oracle oinstall  4096 Sep 15 16:59 dg4msql ★これが追加されている
drwxr-xr-x  2 oracle oinstall 12288 Sep 15 16:59 bin
drwxr-xr-x  8 oracle oinstall  4096 Sep 15 16:59 oui
drwxrwx--- 10 oracle oinstall  4096 Sep 15 16:59 install
drwxr-xr-x  4 oracle oinstall  4096 Sep 15 17:00 cfgtoollogs

また、bin配下にはdg4msqlが増えていることがわかる。これがDBLINKで接続時に実際にSQL Serverと接続するプロセスの実体(Oracleでいうところのサーバプロセス相当)になる。
[oracle@hostname dbhome_1]$ cd bin
[oracle@hostname bin]$ ll -ltr
total 759504
-rwxr-xr-x 1 oracle oinstall       153 Nov  7  1997 echodo
...
-rwxr-x--- 1 oracle oinstall      5538 Sep  8 16:05 emca
-rwxr-xr-x 1 oracle oinstall   1036120 Sep  8 16:05 ldapbind
-rwsr-s--x 1 oracle asmadmin 448598824 Sep  8 16:05 oracle
-rwxr-x--x 1 oracle oinstall    786176 Sep 15 16:59 dg4msql ★これが増えている
[oracle@hostname bin]$

$ORACLE_HOME/dg4msql配下を確認してみよう。admin/initdg4msql.oraはOracle Gatewayの初期化パラメータであり、ここに接続先SQL Serverの情報を記載する。インストーラで入力した値がHS_FDS_CONNECT_INFOに設定されているが、変更が必要ならここを直接編集すればよい。その他、listener.ora.sampleやtnsnames.ora.sampleはサンプルの設定ファイルで、後にリスナやtnsnames.oraを設定する際に必要に応じて参照すればよい。
[oracle@hostname dbhome_1]$ cd dg4msql
[oracle@hostname dg4msql]$ ls
admin  demo  driver  lib  log
[oracle@hostname dg4msql]$ cd admin
[oracle@hostname admin]$ ls
dg4msql_cvw.sql  initdg4msql.ora ★      tnsnames.ora.sample
dg4msql_tx.sql   listener.ora.sample
[oracle@hostname admin]$ view initdg4msql.ora
[oracle@hostname admin]$ pwd
/u01/app/oracle/product/19.0.0.0/dbhome_1/dg4msql/admin
[oracle@hostname admin]$ cat initdg4msql.ora
# This is a customized agent init file that contains the HS parameters
# that are needed for the Database Gateway for Microsoft SQL Server

#
# HS init parameters
#
HS_FDS_CONNECT_INFO=[192.168.0.101]:1433//k8 ★
# alternate connect format is hostname/serverinstance/databasename
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER

(2)Oracle Gatewayのリスナの構成


ここからOracle Gateway用のリスナを構成する。DBCSのリスナはgridで上がっているので、Gateway用はoracleでポートを1531として新たに起動する。dg4msql/admin配下のリスナのサンプルファイルを参考にlistener.oraを作成し、$ORACLE_HOME/network/admin配下に配置する。通常のリスナと異なる部分はLISTENER名はDBCSのものを重複しないようにLISTENER_DG4MSQLとすることと、SID_LISTでdg4msqlをSIDとしてリスナに登録する★部分である。
[oracle@hostname admin]$ cat listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/19.0.0.0/dbhome_1/network/admin/listener.ora/listener.ora
# Generated by Oracle configuration tools.

LISTENER_DG4MSQL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = hostname.subnet.vcn.oraclevcn.com)(PORT = 1531))
  )

ADR_BASE_LISTENER_DG4MSQL = /u01/app/oracle


SID_LIST_LISTENER_DG4MSQL= ★
  (SID_LIST=
      (SID_DESC=
         (SID_NAME=dg4msql)
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1)
         (PROGRAM=dg4msql)
      )
  )

上記設定のあと、リスナを起動し、dg4msqlがリスナに登録されていることを確認する(★部分)。
[oracle@hostname admin]$ lsnrctl start LISTENER_DG4MSQL
...
/u01/app/oracle/product/19.0.0.0/dbhome_1/bin/tnslsnrを起動しています。お待ちく ださい...
...
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hostname.subnet.vcn.oraclevcn.com)(PORT=1531)))
...
リスニング・エンドポイントのサマリー...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hostname.subnet.vcn.oraclevcn.com)(PORT=1531)))
サービスのサマリー...
サービス"dg4msql"には、1件のインスタンスがあります。
  インスタンス"dg4msql"、状態UNKNOWNには、このサービスに対する1件のハンドラがあ ります...★
コマンドは正常に終了しました。

(3)Oracle Gatewayのtnsnamesの構成


リスナの構成が終わったら、tnsnames.oraにこのリスナへのエントリを追加する。$ORACLE_HOME/network/admin/tnsnames.oraに以下エントリを追加する。
dg4msql  =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1531)) ★
    (CONNECT_DATA=(SID=dg4msql))
    (HS=OK)
  )

tnspingで疎通できるか確認する。問題なく名前解決でき、ポート1531で接続要求できている。
[oracle@hostname admin]$ tnsping dg4msql
...
エイリアスを解決するためにTNSNAMESアダプタを使用しました。
(DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1531)) (CONNECT_DATA=(SID=dg4msql)) (HS=OK))に接続の試行中
OK (0ミリ秒)


以上でOracle Gatewayの基本的な構成は完了である。

9.SQL ServerへのDBLINKの構成


OracleDatabaseのPDBから、SQL ServerへのDBLINKを作成してemp表を検索する。以下のように結果が返ってくる。
[oracle@hostname admin]$ sqlplus f/****@k5
SQL> CREATE PUBLIC DATABASE LINK dg4msql CONNECT TO "sa" IDENTIFIED BY "****" USING 'dg4msql';
データベース・リンクが作成されました。
SQL> select * from emp@dg4msql;

     empno
----------
ename
--------------------------------------------------------------------------------
job
--------------------------------------------------------------------------------
       mgr hiredate        sal       comm     deptno
---------- -------- ---------- ---------- ----------
      7369
SMITH
CLERK
      7902 80-12-17        800                    20
...
14行が選択されました。


実際は上記のようにすんなり接続できた訳ではなかった。はじめはクエリの結果が返ってこず、ハングしたような状態となった。原因はSQL Server側のWindows Firewallでポート1433が開いていないこと、TCP/IPの通信がdisableにされていたことであった。この原因解析で結局一番有効だったのは、telnetでポート疎通確認であった。DBCSにはtelnetが入っていない、かつ、yumリポジトリも構成されていない。このため、原因解析のために、yumリポジトリを構成し、telnetを導入し、問題を切り分けた。先の投稿でSQL Serverの構成手順を記載したが、Windows Firewallを開ける等の手順を追加しているのはこのためである。クラウドの場合は通信は明示的に開けなければ通信できない、という前提で低レベルのレイヤから丁寧に疎通確認をしていく必要があるとつくづく感じた。

10.DB2へのDBLINKの構成


DB2に対してOracle Gatewayを構成する。手順はSQL Serverの場合とほぼ同じであるため、異なる部分を中心に記載する。前提としてDB2側のtestdbにemp/deptを作成しておく。DDLおよび初期データは参考ファイル[2]を参照されたい。

(1)Oracle Gateways(DRDA)のインストール


Oracle Gateway for DRDAの基本的な手順はSQL Serverと同様、runInstallerからDRDAを選択してインストールする。

20211010_OracleGWInst5.jpg

DB2への接続情報を入れる。ここでDB2 UDB Target TypeはLUWを設定する(画面上はIOSとなっているが、Linux, UNIX, and Windowsを表すLUWが正しい)。

20211010_OracleGWInst6.jpg

ここで個別パッチ(interim patches)に影響する旨のワーニングが発生した。これは比較的最新のパッチが当たった状態のDBCSに19.3の素のGatewayをインストールしようとしたためと思われる。今回は無視して前に進み、インストールは問題なく完了したが、本来は$ORACLE_HOMEは分けてインストールすることが望ましいということだろう。

20211010_OracleGWInst7.jpg

インストール結果を確認すると、$ORACLE_HOMEにdg4db2ディレクトリが追加されていることがわかる。
[oracle@hostname dbhome_1]$ ls -ltr
...
drwxr-xr-x  6 oracle oinstall  4096 Sep 19 03:05 dg4db2 ★


dg4db2/network/admin配下に初期化パラメータinitdg4db2.oraがある。HS_FDS_CONNECT_INFOに画面で投入した接続情報が記録されていることがわかる。
[oracle@hostname admin]$ cat initdg4db2.ora
# This is a customized agent init file that contains the HS parameters
# that are needed for the Database Gateway for DB2

#
# HS init parameters
#
HS_FDS_CONNECT_INFO=[192.168.0.10]:25010/testdb,LUW ★
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
HS_TRANSACTION_MODEL=COMMIT_CONFIRM
HS_FDS_TRANSACTION_ISOLATION=READ_COMMITTED
HS_FDS_SUPPORT_STATISTICS=TRUE
HS_FDS_RESULTSET_SUPPORT=FALSE
HS_FDS_PACKAGE_COLLID=ORACLEGTW
HS_IDLE_TIMEOUT=0

(2)Oracle Gatewayのリスナの構成


リスナの構成は以下の通りSID_LISTにエントリを追加する。
SID_LIST_LISTENER_DG4MSQL=
  (SID_LIST=
      (SID_DESC=
         (SID_NAME=dg4msql)
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1)
         (PROGRAM=dg4msql)
      )
      (SID_DESC= ★
         (SID_NAME=dg4db2)
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1)
         (PROGRAM=dg4db2)
      )
  )

リスナを再起動し、dg4db2が登録されていることを確認する。
[oracle@hostname admin]$ lsnrctl stop LISTENER_DG4MSQL
...
コマンドは正常に終了しました。
[oracle@hostname admin]$ lsnrctl start LISTENER_DG4MSQL
...
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hostname.subnet.vcn.oraclevcn.com)(PORT=1531)))
...
リスニング・エンドポイントのサマリー...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=hostname.subnet.vcn.oraclevcn.com)(PORT=1531)))
サービスのサマリー...
サービス"dg4db2"には、1件のインスタンスがあります。
  インスタンス"dg4db2"、状態UNKNOWNには、このサービスに対する1件のハンドラがあります... ★
サービス"dg4msql"には、1件のインスタンスがあります。
  インスタンス"dg4msql"、状態UNKNOWNには、このサービスに対する1件のハンドラがあ ります...
コマンドは正常に終了しました。


(3)Oracle Gatewayのtnsnamesの構成


tnsnames.oraに以下のエントリを追加する。tnspingで名前解決できることを確認し、Gatewayの構成は基本的には完了である。
dg4db2  =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1531))
    (CONNECT_DATA=(SID=dg4db2))
    (HS=OK)
  )

(4)DBLINK作成


DBLINKを作成し、DB2のtestdbのtbl1をselectする。以下の通り正常にtbl1のselect結果が返ってくることが確認できた。ここで、db2inst1はDB2のOSユーザである。当然であるが、このパスワードでOSにログインできない場合は正常に動作しない(DB2側のインストーラでユーザを作成した際、SE Linuxのパスワード規則を満たしていなくてもDB2のインストーラはエラーを出さないので注意が必要。OSユーザできちんとログインできることを確認しておくとよい)。
SQL> CREATE PUBLIC DATABASE LINK dg4db2 CONNECT TO "db2inst1" IDENTIFIED BY "****" USING 'dg4db2';

データベース・リンクが作成されました。

SQL> select * from emp@dg4db2;

     EMPNO ENAME              JOB                    MGR
---------- ------------------------------ --------------------------- ----------
HIREDATE    SAL   COMM     DEPTNO
-------- ---------- ---------- ----------
      7839 KING               PRESIDENT
81-11-17       5000            10
...
14行が選択されました。


なお、上記は正常に動作したときの結果であるが、初めに疎通させてときには以下のようにORA-28500が発生した。
SQL> select * from tbl1@dg4db2;
select * from tbl1@dg4db2
                   *
行1でエラーが発生しました。:
ORA-28500:
OracleからOracle以外のシステムへの接続で次のメッセージが戻されました:  [Oracle][ODBC DB2 Wire
Protocol driver]Connection refused. Verify Host Name and Port Number. {08001}
ORA-02063: 先行のエラー・メッセージを参照してください2 lines(DG4DB2)。


解析の結果、上記エラーは、DB2側のDBサーバのLinux firewallにDB2通信用のポートが開いていないことが原因であった。OCIのOracle Linuxはデフォルトで以下のようにLinux Firewallが有効になっている。これではDB2への接続を確立するためのポート25010への接続要求は拒否されてしまう。
[db2inst1@db2 cfg]$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2021-09-18 09:07:31 JST; 18h ago
     Docs: man:firewalld(1)
 Main PID: 1298 (firewalld)
   CGroup: /system.slice/firewalld.service
           mq1298 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid


Linux Firewallにポートを開けるには以下のようにfirewall-cmd --add-portで通信許可設定を行う。設定後、firewall-cmd --reloadで設定を反映する。Oracle Database側からDB2のサーバへtelnetで当該ポートが通ることを確認するとよい。
[root@db2 tmp]# firewall-cmd --add-port=25010/tcp --zone=public
success
[root@db2 tmp]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: dhcpv6-client ssh
  ports: 25010/tcp ★
...

まとめ


今回はOracle Gatewayを用いてSQL ServerおよびDB2へDBCSのPDBからDBLINK経由で接続する構成方法について述べた。いずれも、emp表へのselectが返ってくることを確認した。
構成する上でつまずいた点は主にDBサーバ間の通信である。Windows FirewallやLinux Firewallで必要なポートが開いているか、telnetで確認してから構成を行うことが望ましい。特にDB2用に新規作成したOracle LinuxのインスタンスはSE Linuxが有効となっており、OSユーザのパスワード変更には厳しい規則が適用されていたりと注意が必要だろう。
また、今回の検証ではDBCS上にOracle Gatewayを構成したが、DBCSはパッチが適用されることを考えると、$ORACLE_HOMEを分ける、または別の独立したサーバ上に構成するするなどの配慮は必要だろう。
Oracle gatewayには初期化パラメータにより様々な設定が可能であるが、その点については考慮が及んでいない。例えば2フェーズコミットを行う場合などはそれに応じた追加作業が必要である。また、ディクショナリを使うためにはDB2側でスクリプトを流す必要があるようだが、今回そこまでは検証できていない。あくまで穴あけができた程度の検証、ととらえている。それでも、OCI上でこの検証を行うことによって、DB2やSQL Serverの表をOracleから参照できること、構成上注意するポイントはいくつか確認できた。

◇参考


[1] Oracle Database Gateway Installation and Configuration Guide

◇参考ファイル


[1] SQL Serverのemp/dept表作成スクリプト
USE [k8]
GO

/****** Object:  Table [dbo].[dept]    Script Date: 2021/09/15 23:50:57 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dept]') AND type in (N'U'))
DROP TABLE [dbo].[dept]
GO

/****** Object:  Table [dbo].[dept]    Script Date: 2021/09/15 23:50:57 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[dept](
	[deptno] [numeric](2, 0) NOT NULL,
	[dname] [varchar](14) NULL,
	[loc] [varchar](13) NULL,
 CONSTRAINT [PK_dept] PRIMARY KEY CLUSTERED 
(
	[deptno] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

/****** Object:  Table [dbo].[emp]    Script Date: 2021/09/15 23:51:32 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[emp]') AND type in (N'U'))
DROP TABLE [dbo].[emp]
GO

/****** Object:  Table [dbo].[emp]    Script Date: 2021/09/15 23:51:32 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[emp](
	[empno] [numeric](4, 0) NOT NULL,
	[ename] [varchar](10) NULL,
	[job] [varchar](9) NULL,
	[mgr] [numeric](4, 0) NULL,
	[hiredate] [date] NULL,
	[sal] [numeric](7, 2) NULL,
	[comm] [numeric](7, 2) NULL,
	[deptno] [numeric](2, 0) NULL,
 CONSTRAINT [PK_emp] PRIMARY KEY CLUSTERED 
(
	[empno] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

insert into DEPT (DEPTNO, DNAME, LOC)
values(10, 'ACCOUNTING', 'NEW YORK');

insert into dept
values(20, 'RESEARCH', 'DALLAS');

insert into dept
values(30, 'SALES', 'CHICAGO');

insert into dept
values(40, 'OPERATIONS', 'BOSTON');

insert into emp
values(
 7839, 'KING', 'PRESIDENT', null,
 convert(datetime,'1981-11-17'),
 5000, null, 10
);

insert into emp
values(
 7698, 'BLAKE', 'MANAGER', 7839,
 convert(datetime,'1981-5-1'),
 2850, null, 30
);


insert into emp
values(
 7782, 'CLARK', 'MANAGER', 7839,
 convert(datetime,'1981-6-9'),
 2450, null, 10
);

insert into emp
values(
 7566, 'JONES', 'MANAGER', 7839,
 convert(datetime,'1981-4-2'),
 2975, null, 20
);

insert into emp
values(
 7788, 'SCOTT', 'ANALYST', 7566,
 convert(datetime,'1987-7-13')-85,
 3000, null, 20
);

insert into emp
values(
 7902, 'FORD', 'ANALYST', 7566,
 convert(datetime,'1981-12-3'),
 3000, null, 20
);

insert into emp
values(
 7369, 'SMITH', 'CLERK', 7902,
 convert(datetime,'1980-12-17'),
 800, null, 20
);

insert into emp
values(
 7499, 'ALLEN', 'SALESMAN', 7698,
 convert(datetime,'1981-2-20'),
 1600, 300, 30
);

insert into emp
values(
 7521, 'WARD', 'SALESMAN', 7698,
 convert(datetime,'1981-2-22'),
 1250, 500, 30
);

insert into emp
values(
 7654, 'MARTIN', 'SALESMAN', 7698,
 convert(datetime,'1981-9-28'),
 1250, 1400, 30
);

insert into emp
values(
 7844, 'TURNER', 'SALESMAN', 7698,
 convert(datetime,'1981-9-8'),
 1500, 0, 30
);

insert into emp
values(
 7876, 'ADAMS', 'CLERK', 7788,
 convert(datetime,'1987-7-13')-51,
 1100, null, 20
);

insert into emp
values(
 7900, 'JAMES', 'CLERK', 7698,
 convert(datetime,'1981-12-3'),
 950, null, 30
);

insert into emp
values(
 7934, 'MILLER', 'CLERK', 7782,
 convert(datetime,'1982-1-23'),
 1300, null, 10
);


[2] DB2のemp/dept表作成スクリプト
--   Script: EMP and DEPT
--   Example EMP and DEPT tables.  Classic Oracle tables with 4 departments and 14 employees.  Includes a join query example.

-- Create DEPT table which will be the parent table of the EMP table. 
drop table emp;
drop table dept;

create table dept
(  
  deptno     int not null,  
  dname      varchar(14),  
  loc        varchar(13)
);

alter table dept add constraint pk_dept primary key (deptno);

-- Create the EMP table which has a foreign key reference to the DEPT table.  The foreign key will require that the DEPTNO in the EMP table exist in the DEPTNO column in the DEPT table.
create table emp(  
  empno    int not null,  
  ename    varchar(10),  
  job      varchar(9),  
  mgr      int,  
  hiredate date,  
  sal      decimal(7,2),  
  comm     decimal(7,2),  
  deptno   int
);

alter table emp add constraint pk_emp primary key (empno);
alter table emp add constraint fk_deptno foreign key (deptno) references dept (deptno);


-- copy emp/dept from oracle database
-- insert into dept select * from k5.f.dept;
-- commit;
-- insert into emp select * from k5.f.emp;
-- commit;
--

-- Insert row into DEPT table using named columns.
insert into DEPT (DEPTNO, DNAME, LOC)
values(10, 'ACCOUNTING', 'NEW YORK');

-- Insert a row into DEPT table by column position.
insert into dept  
values(20, 'RESEARCH', 'DALLAS');

insert into dept  
values(30, 'SALES', 'CHICAGO');

insert into dept  
values(40, 'OPERATIONS', 'BOSTON');

-- Insert EMP row, using TO_DATE function to cast string literal into an oracle DATE format.
insert into emp  
values(  
 7839, 'KING', 'PRESIDENT', null,  
 to_date('17-11-1981','dd-mm-yyyy'),  
 5000, null, 10  
);

insert into emp  
values(  
 7698, 'BLAKE', 'MANAGER', 7839,  
 to_date('1-5-1981','dd-mm-yyyy'),  
 2850, null, 30  
);

insert into emp  
values(  
 7782, 'CLARK', 'MANAGER', 7839,  
 to_date('9-6-1981','dd-mm-yyyy'),  
 2450, null, 10  
);

insert into emp  
values(  
 7566, 'JONES', 'MANAGER', 7839,  
 to_date('2-4-1981','dd-mm-yyyy'),  
 2975, null, 20  
);

insert into emp  
values(  
 7788, 'SCOTT', 'ANALYST', 7566,  
 to_date('13-7-1987','dd-mm-yyyy') - 85,  
 3000, null, 20  
);

insert into emp  
values(  
 7902, 'FORD', 'ANALYST', 7566,  
 to_date('3-12-1981','dd-mm-yyyy'),  
 3000, null, 20  
);

insert into emp  
values(  
 7369, 'SMITH', 'CLERK', 7902,  
 to_date('17-12-1980','dd-mm-yyyy'),  
 800, null, 20  
);

insert into emp  
values(  
 7499, 'ALLEN', 'SALESMAN', 7698,  
 to_date('20-2-1981','dd-mm-yyyy'),  
 1600, 300, 30  
);

insert into emp  
values(  
 7521, 'WARD', 'SALESMAN', 7698,  
 to_date('22-2-1981','dd-mm-yyyy'),  
 1250, 500, 30  
);

insert into emp  
values(  
 7654, 'MARTIN', 'SALESMAN', 7698,  
 to_date('28-9-1981','dd-mm-yyyy'),  
 1250, 1400, 30  
);

insert into emp  
values(  
 7844, 'TURNER', 'SALESMAN', 7698,  
 to_date('8-9-1981','dd-mm-yyyy'),  
 1500, 0, 30  
);

insert into emp  
values(  
 7876, 'ADAMS', 'CLERK', 7788,  
 to_date('13-7-1987', 'dd-mm-yyyy') - 51,  
 1100, null, 20  
);

insert into emp  
values(  
 7900, 'JAMES', 'CLERK', 7698,  
 to_date('3-12-1981','dd-mm-yyyy'),  
 950, null, 30  
);

insert into emp  
values(  
 7934, 'MILLER', 'CLERK', 7782,  
 to_date('23-1-1982','dd-mm-yyyy'),  
 1300, null, 10  
);


OCIの異機種DBLINK検証環境構築メモ ~その3 [OCI]

前回に続き、今回はOCI上にDB2を構成してみよう。

 1.VCNの設定
 2.DBCSの構築
 3.DB設定(初期化パラメータ設定、PDB構築)
 4.SQL Serverの構築
 5.LinkedServerの構成
 6.DB2の構築 ★
 7.Federationの構成 ★
 8.OracleGWの構築
 9.SQL ServerへのDBLINKの構成
 10.DB2へのDBLINKの構成

今回は検証目的なので手っ取り早くOracle Linux上にDB2を構成したが、サポートマトリクスを見るとDB2がOracle Linuxをサポートしていないので、基本的にこの構成はお勧めしない。OSとしてはRHELが一般的だろうが、OCIのイメージにはRHELがないので、RHELを手動で入れるか、DB2がサポートしているCentOSやUbuntuを選択すると良いだろう。もっとも、エンタープライズ用途でCentやUbuntuをDB2のOSとして使うのかという感はあるが、そもそもOCI上にDB2を構成するケース自体が稀だろうから、あまり悩む問題ではないのかもしれない。

6.DB2の構築


(1)Oracle Linuxコンピュートインスタンスの構築


まずはOracle Linuxコンピュートインスタンスを構築する。基本的にはOCIのメニューのComputeのInstanceからCreate Instanceを選択し作成する。イメージはデフォルトOracle Linux7.9なので、そのままとする。この際、SSHの秘密鍵、公開鍵をダウンロードする。シェイプはVM.Standard.E2.1.Micro (OCPU 1, memory 1GB, Boot volume 47GB)となった。作成されたら、Instance Detail画面のInstant AccessでパブリックIPアドレスを確認しておく。このデフォルトのシェイプはDBを動かす用途としては少し小さすぎたと後で反省した。
Inked20211008_db2computeinstance2.jpg

以上で、基本的な構成は終了である。手元のPCからSSHで暗号鍵を使ってパブリックIPに接続できることを確認する。タイムゾーンをUTCからAsia/Tokyoに変更しておく。
[root@db2 ~]# cp /etc/localtime /etc/localtime.org
[root@db2 ~]# ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
[root@db2 ~]# ll /etc/localtime*
lrwxrwxrwx. 1 root root 30 Sep 18 15:48 /etc/localtime -> /usr/share/zoneinfo/Asia/Tokyo
lrwxrwxrwx. 1 root root 25 Aug 19 02:32 /etc/localtime.org -> ../usr/share/zoneinfo/GMT
[root@db2 ~]#

(2)Oracle Linuxの環境の確認


環境を確認してみよう。OSのバージョンは以下の通りOracle Linux 7.9となっている。
[root@db2 ~]# cat /etc/oracle-release
Oracle Linux Server release 7.9
[root@db2 ~]# uname -a
Linux db2 5.4.17-2102.204.4.4.el7uek.x86_64 #2 SMP Tue Aug 17 20:25:28 PDT 2021 x86_64 x86_64 x86_64 GNU/Linux
[root@db2 ~]#

ローカルディスクは39GB、利用できるのは36GB程度。
[opc@db2 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        313M     0  313M   0% /dev
tmpfs           344M     0  344M   0% /dev/shm
tmpfs           344M  5.1M  339M   2% /run
tmpfs           344M     0  344M   0% /sys/fs/cgroup
/dev/sda3        39G  3.2G   36G   9% / ★
/dev/sda1       200M  7.5M  193M   4% /boot/efi
tmpfs            69M     0   69M   0% /run/user/0
tmpfs            69M     0   69M   0% /run/user/994
tmpfs            69M     0   69M   0% /run/user/1000

メモリは686MB。Hugepageは当然構成されていない。
[root@db2 ~]# free
              total        used        free      shared  buff/cache   available
Mem:         703108      262004       67392       47228      373712      268608
Swap:       8388604      301056     8087548
[root@db2 ~]#
[root@db2 ~]# cat /proc/meminfo
MemTotal:         703108 kB
MemFree:           64756 kB
MemAvailable:     266064 kB
Buffers:              20 kB
Cached:           306076 kB
...
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      226192 kB
DirectMap2M:      817152 kB
DirectMap1G:           0 kB
[root@db2 ~]#

CPUは2コア見える。実体は32コアのものから切り出しているようだ。
[root@db2 ~]# cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 23
model           : 1
model name      : AMD EPYC 7551 32-Core Processor
stepping        : 2
microcode       : 0x1000065
cpu MHz         : 1996.246
cache size      : 512 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibpb vmmcall fsgsbase tsc_adjust bmi1 avx2 smep bmi2 rdseed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 xsaves nt_good clzero xsaveerptr virt_ssbd arat arch_capabilities
bugs            : sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips        : 3992.49
TLB size        : 1024 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 1
vendor_id       : AuthenticAMD
cpu family      : 23
...

(3)DB2のインストール準備


今回はdb2setupを利用してインストールすることにする。手順は参考[2]を参考にしながら行った。
DB2のCommunity Edition(メモリ16GB、4コアの制限あり)のバイナリを以下のサイトからダウンロードする。最新のバージョンで11.5.6を利用する。
https://www.ibm.com/analytics/db2/trials

/tmpにDB2のバイナリを転送し解凍する(/tmpはいずれ削除されるので、インストーラを残したい場合は/tmpは避けた方が良い)。インストーラはdb2setupである。
[opc@db2 ~]$ ll /tmp
total 2034632
-rw-------. 1 root root        995 Sep 18 00:07 dhclient-exit-hooksTev.log
drwx------. 3 root root         17 Sep 18 00:07 systemd-private-ef825e99a66941098bbb8b10143e1fb0-chronyd.service-3zBi0J
-rw-r--r--. 1 opc  opc  2083458415 Sep 14 05:10 v11.5.6_linuxx64_server_dec.tar.gz ★
[opc@db2 ~]$ gunzip -c v11.5.6_linuxx64_server_dec.tar.gz | tar -xvf-
...
[root@db2 tmp]# ls server_dec/db2/linuxamd64/install/
codegen.jar         DB2prereqs.xml              libdb2jcc.so
compileGPL          db2remssh                   libdb2jcc.so.1
db2chglibpath       db2rocmc                    libdb2locale_install.so
db2ckgpfs           db2_run_as                  libdb2locale_install.so.1
db2ckpcmk           db2scp                      libdb2locale.so
db2cktsa            db2setup★                  libdb2locale.so.1
...

(4)DB2のプレチェック


手順に従ってプレチェックを走らせる。今回必要なはDB2 Database "Server"にパッケージが不足している旨のメッセージが出ている。
[root@db2 server_dec]# ./db2prereqcheck -v 11.5.6.0 -s
Requirement not matched for DB2 database "Server" . Version: "11.5.6.0".
Summary of prerequisites that are not met on the current system:    DBT3514W  The db2prereqcheck utility failed to find the following 32-bit library file: "/lib/libpam.so*".

DBT3514W  The db2prereqcheck utility failed to find the following 32-bit library file: "libstdc++.so.6".


Requirement not matched for DB2 database "Server" with pureScale feature . Version: "11.5.6.0".
Summary of prerequisites that are not met on the current system: DBT3613E  The db2prereqcheck utility failed to verify the prerequisites for TSA. Ensure your machine meets all the TSA installation prerequisites.

DBT3507E  The db2prereqcheck utility failed to find the following package or file: "patch".

   Actual version is undetermined: "kernel-headers".
DBT3617E  The db2prereqcheck utility detected that a "kernel-headers" package with a version that matches the system "kernel" level "5.4.17-2102.204.4.4.el7uek.x86_64" is not installed.

DBT3507E  The db2prereqcheck utility failed to find the following package or file: "kernel-devel".

DBT3507E  The db2prereqcheck utility failed to find the following package or file: "m4".

DBT3507E  The db2prereqcheck utility failed to find the following package or file: "gcc-c++".

DBT3563E  The db2prereqcheck utility determined that SELinux is enabled, which is not supported with GPFS.

DB2 database "Server"に不足している以下の32bitパッケージをインストールする。yumリポジトリは構成されているので、以下コマンドを実行するだけでインストールは可能。pureSclaeやTSAを利用する場合はさらにいろいろと必要なようであるが、今回は使用しないので、無視する。

yum install libstdc++.i686
yum install pam.i686

もう一度precheckを流したところ、全部OKとなった。
[root@db2 server_dec]# ./db2prereqcheck -v 11.5.6.0 -s
DBT3533I  The db2prereqcheck utility has confirmed that all installation prerequisites were met.★
・・・

(5)X11の設定


参考[4]を見ながらX11を設定する。XserverはXmingを利用、ターミナルはPuttyを利用することとし、端末側にセットアップする。Oracle Linuxサーバ上では以下を変更する。
[root@db2 opc]# vi /etc/ssh/sshd_config
[root@db2 opc]# cat /etc/ssh/sshd_config | grep X11UseLocalhost
#X11UseLocalhost yes
X11UseLocalhost no

Xを利用する上での注意は、opcでログインしてから、sudoでユーザを切り替える際、xauthの内容を以下のように引き継ぐ必要がある点である。自動でできると良いのだが、やり方がわからないので、手動で実行する(初めての使うときは、/root/.Xauthorityがないため、touchでファイルだけ作成する)。
[opc@db2 ~]$ xauth list
db2.subnet.vcn.oraclevcn.com:10  MIT-MAGIC-COOKIE-1  f6d909c7dfe75cd7e539c52068473291
[opc@db2 ~]$ sudo -s
[root@db2 opc]# xauth list ★opcのxauthが引き継がれていない(古い値になっている)ため、手動でxauth addする
db2.subnet.vcn.oraclevcn.com:10  MIT-MAGIC-COOKIE-1  1ae63e695284309e06b4f39b928ab8da
[root@db2 opc]# xauth add db2.subnet.vcn.oraclevcn.com:10  MIT-MAGIC-COOKIE-1  f6d909c7dfe75cd7e539c52068473291
[root@db2 opc]# xauth list ★opcのxauthが追加された
db2.subnet.vcn.oraclevcn.com:10  MIT-MAGIC-COOKIE-1  f6d909c7dfe75cd7e539c52068473291
[root@db2 opc]#

db2setupを起動するといくつか不足しているXのパッケージで引っかかるのでそれらをインストールする。ここはトライ&エラーで必要なパッケージを洗い出したが、結果としては以下4つのパッケージである。

yum install xauth
yum install libXrender.x86_64
yum install libXtst
yum install libXft

ようやくdb2setupの画面を見ることができた。
20211008_db2setup1.jpg


(6)db2setupによるDB2のインストール


インストーラが立ち上がれば、後はウィザードに従って必要事項を入力していくだけ、製品インストールと必要なOSユーザ(インスタンスオーナー用とフェンスユーザ用)とインスタンス作成まで実行してくれる。

Server Editionを選択

20211008_db2setup2.jpg


TypicalとCustomがあるが、Typicalを選択。create an instanceをチェック。I agree to the IBM and Non-IBM termsにチェック。
20211008_db2setup3.jpg


Instance Ownerとして新規ユーザを作成する。Passwordにパスワードを入力。他デフォルト(user name: db2inst1, use default UID, group name:db2iadm1, use default GID, Home directory:/home/db2inst1)とする。
20211008_db2setup4.jpg


Fenced Userも同様に作成。
20211008_db2setup5.jpg


Response File and Summary画面で、Install DB2 Server Edition on this computer and save my setting in a response fileを選択しFinishを押下。レスポンスファイルは/root/db2server.rspに作成される。参考まで、今回のインストールで作成されたレスポンスファイルは参考ファイル[1]に載せておく。これがあれば、次回同じ構成を作成する際に画面は不要となり、Xを構成する必要はないかもしれない。
20211008_db2setup6.jpg


インストールが始まる。しばらくかかる。
20211008_db2setup7.jpg


インストール完了。Post-install stepsを押下。
20211008_db2setup8.jpg


インスタンスオーナーとインスタンスのポートを確認する。この例では、インスタンスオーナのユーザIDはdb2inst1、db2inst1インスタンスのポートは25010となった。その他、インストール結果の検証方法等が記載されているので一通り確認する。
20211008_db2setup9.jpg


インストールされた環境を確認してみよう。
[db2inst1@db2 bin]$ db2val
DBI1379I  The db2val command is running. This can take several minutes.

DBI1335I  Installation file validation for the DB2 copy installed at
      /opt/ibm/db2/V11.5 was successful. ★インストール検証OK

DBI1339I  The instance validation for the instance db2inst1 was
      successful. ★インスタンス検証OK

DBI1343I  The db2val command completed successfully. For details, see
      the log file /tmp/db2val-210918_062559.log.

[db2inst1@db2 bin]$ db2licm -l
Product name:                     "DB2 Community Edition" ★コミュニティエディション
License type:                     "Community"
Expiry date:                      "Permanent"
Product identifier:               "db2dec"
Version information:              "11.5"
Max amount of memory (GB):        "16"
Max number of cores:              "4"
Features:
IBM DB2 Performance Management Offering:              "Not licensed"

[db2inst1@db2 bin]$ db2level
DB21085I  This instance or install (instance name, where applicable:
"db2inst1") uses "64" bits and DB2 code release "SQL11056" with level
identifier "0607010F".
Informational tokens are "DB2 v11.5.6.0", "s2106111000", "DYN2106111000AMD64", ★バージョン11.5.6パッチなし
and Fix Pack "0".
Product is installed at "/opt/ibm/db2/V11.5". ★インストールディレクトリ

(7)DB2のデータベース作成


まずはインスタンスオーナーにログインしてインスタンスを起動する。
[opc@db2 ~]$ sudo su - db2inst1
[db2inst1@db2 ~]$ db2start
09/18/2021 15:51:33     0   0   SQL1026N  The database manager is already active.
SQL1026N  The database manager is already active. ★すでに起動している
[db2inst1@db2 ~]$ db2stop ★停止する
09/18/2021 15:51:49     0   0   SQL1064N  DB2STOP processing was successful.
SQL1064N  DB2STOP processing was successful.
[db2inst1@db2 ~]$ db2start ★起動する
09/18/2021 15:51:55     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.
[db2inst1@db2 ~]$

インスタンスのコンフィグはdb2 get dbm cfgで確認できる。全体の出力結果は、参考ファイル[2]を参照されたい。
[db2inst1@db2 ~]$ db2 get dbm cfg

          Database Manager Configuration

     Node type = Enterprise Server Edition with local and remote clients
...
 Default database path                       (DFTDBPATH) = /home/db2inst1

 Database monitor heap size (4KB)          (MON_HEAP_SZ) = AUTOMATIC(90)
 Java Virtual Machine heap size (4KB)     (JAVA_HEAP_SZ) = 65536
 Audit buffer size (4KB)                  (AUDIT_BUF_SZ) = 0
 Global instance memory (% or 4KB)     (INSTANCE_MEMORY) = AUTOMATIC(131833)
 Member instance memory (% or 4KB)                       = GLOBAL
 Agent stack size                       (AGENT_STACK_SZ) = 1024
 Sort heap threshold (4KB)                  (SHEAPTHRES) = 0

 Directory cache support                     (DIR_CACHE) = YES

 Application support layer heap size (4KB)   (ASLHEAPSZ) = 15
 Max requester I/O block size (bytes)         (RQRIOBLK) = 65535
 Workload impact by throttled utilities(UTIL_IMPACT_LIM) = 10
...
[db2inst1@db2 ~]$

DBを作成する。ここではtestdbという名前のデータベースとした。
[db2inst1@db2 ~]$ db2 create database testdb
DB20000I  The CREATE DATABASE command completed successfully.

データベースに接続する。
[db2inst1@db2 ~]$ db2 connect to testdb

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.6.0
 SQL authorization ID   = DB2INST1
 Local database alias   = TESTDB

テーブルを作成し、レコードを入れてみる。なんとなくDBとして動く状態にはなったように見える。
[db2inst1@db2 ~]$ db2 "CREATE TABLE TBL1(COL1 INTEGER, COL2 VARCHAR(50))"
DB20000I  The SQL command completed successfully.
[db2inst1@db2 ~]$ db2 "select * from tbl1"

COL1        COL2
----------- --------------------------------------------------

  0 record(s) selected.

[db2inst1@db2 ~]$
[db2inst1@db2 ~]$ db2 "insert into tbl1 values(1,'kzhr')"
DB20000I  The SQL command completed successfully.
[db2inst1@db2 ~]$ db2 "commit"
DB20000I  The SQL command completed successfully.
[db2inst1@db2 ~]$ db2 "select * from tbl1"

COL1        COL2
----------- --------------------------------------------------
          1 kzhr

  1 record(s) selected.

データベースへの接続を停止する。これをしないとインスタンスの停止はできない。
[db2inst1@db2 ~]$
[db2inst1@db2 ~]$ db2 terminate
DB20000I  The TERMINATE command completed successfully.
[db2inst1@db2 ~]$ db2stop
09/18/2021 16:02:21     0   0   SQL1064N  DB2STOP processing was successful.
SQL1064N  DB2STOP processing was successful.
[db2inst1@db2 ~]$

7.Federationの構成


(1)Oracleクライアントのインストール準備


Oracleクライアントをインストールする準備を行う。まずはOTNからバイナリ(LINUX.X64_193000_client.zip)をダウンロード、サーバに配置し解凍する。
Oracle Database 19c Client (19.3) for Linux x86-64
https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html

以下の通りoracleユーザを作成する。念のためDBCS側のuid(101),gid(1001)は合わせておく。パスワードも設定しておく。
[root@db2 tmp]# groupadd -g 1001 oinstall
[root@db2 tmp]# useradd -u 101 -g oinstall oracle
[root@db2 tmp]# su - oracle
[oracle@db2 ~]$ id
uid=101(oracle) gid=1001(oinstall) groups=1001(oinstall) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[oracle@db2 ~]$
[root@db2 tmp]# passwd oracle

インストールディレクトリを作成する。今回は/u01/app/oracle配下にインストールする。
[root@db2 tmp]# mkdir -p /u01/app/oracle
[root@db2 tmp]# ll /u01/app
total 0
drwxr-xr-x. 2 root root 6 Sep 19 01:26 oracle
[root@db2 tmp]# chown oracle:oinstall /u01/app/oracle
[root@db2 tmp]# ll /u01/app
total 0
drwxr-xr-x. 2 oracle oinstall 6 Sep 19 01:26 oracle
[root@db2 tmp]# mkdir -p /u01/app/oraInventory
[root@db2 tmp]# chown oracle:oinstall /u01/app/oraInventory
[root@db2 tmp]#

(2)Oracleクライアントのインストール


oracleユーザでログインし、前述したxauth addしてXが起動できるようにしてからrunInstallerを起動する。以下のワーニングがでるが、yとする。
Checking monitor: must be configured to display at least 256 colors
    >>> Could not execute auto check for display colors using command /usr/bin/xdpyinfo. Check if the DISPLAY variable is set.    Failed <<<<

Some requirement checks failed. You must fulfill these requirements before

continuing with the installation,

Continue? (y/n) [n]

インストールタイプはAdministratorを選択する。Instant ClientでもFederationは構成できるはずであるが、検証目的なので全て入れておくことにした。
20211109_OraClient1.jpg


インストールロケーションはoracle baseとして先に作成したディレクトリを入力。ソフトウェアロケーションはデフォルト値のままとする。
20211109_OraClient2.jpg


初めてのインストールなのでoraInventoryを指定する。これも先に作成したディレクトリを指定する。
20211109_OraClient3.jpg


prerequisite checkでいくつかパッケージ不足のメッセージが表示される。今回は以下パッケージを追加インストールし、check againを押下し全てパスすることを確認する。
yum install compat-libcap1.x86_64 libstdc++-devel.x86_64 libaio-devel.x86_64 psmisc.x86_64
20211109_OraClient4.jpg


サマリ画面。レスポンスファイルを保存しておく。実際の内容は参考ファイル[3]を参照されたい。

20211109_OraClient5.jpg


インストールの途中でrootでスクリプトを実行する。
20211109_OraClient6.jpg

[root@db2 tmp]# /u01/app/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.

Changing groupname of /u01/app/oraInventory to oinstall.
The execution of the script is complete.

以上でOracleクライアントのインストールは完了。

(3)Oracleクライアントの設定


oracleユーザの.bash_profileに以下★の環境変数の設定を追加・変更する。
[oracle@db2 ~]$ cat ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

export ORACLE_HOME=/u01/app/oracle/product/19.0.0/client_1 ★
export NLS_LANG=Japanese_Japan.AL32UTF8 ★

# User specific environment and startup programs

PATH=$ORACLE_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin ★

tnsnames.oraを作成する。今回接続先となるDBCSのインスタンス(PDB)の接続識別子(k5)を作成する。
[oracle@db2 ~]$ cd $ORACLE_HOME/network/admin
[oracle@db2 admin]$ vi tnsnames.ora
[oracle@db2 admin]$ cat tnsnames.ora
k5 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = k5.subnet.vcn.oraclevcn.com)
    )
  )

tnspingで疎通確認を行う。問題なし。
[oracle@db2 admin]$ tnsping k5

TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 19-9月 -2021 02:06:51

Copyright (c) 1997, 2019, Oracle.  All rights reserved.

パラメータ・ファイルを使用しました:
/u01/app/oracle/product/19.0.0/client_1/network/admin/sqlnet.ora


エイリアスを解決するためにTNSNAMESアダプタを使用しました。
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.2)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = k5.subnet.vcn.oraclevcn.com)))に接続の試行中
OK (10ミリ秒)

続いてsqlplusで接続する。こちらも問題なし。
[oracle@db2 admin]$ sqlplus f/***@k5

SQL*Plus: Release 19.0.0.0.0 - Production on 日 9月 19 02:11:01 2021
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

最終正常ログイン時間: 金 9月  17 2021 14:23:53 +09:00


Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.11.0.0.0
に接続されました。
SQL>

以上でOracleクライアントの設定は完了である。

(4)DB2ユーザの設定


oinstallにdb2inst1,db2fenc1を追加する。必須ではないが、これにより、DB2のOSユーザでoerrコマンドなど、いくつかOracleの基本的なコマンドが動作しない問題が解決する。
[root@db2 opc]# id db2inst1
uid=1001(db2inst1) gid=101(db2iadm1) groups=101(db2iadm1)
[root@db2 opc]# usermod -aG oinstall db2inst1
[root@db2 opc]# id db2inst1
uid=1001(db2inst1) gid=101(db2iadm1) groups=101(db2iadm1),1001(oinstall) ★


DB2ユーザ(db2inst1)の環境変数の設定を行う。.bash_profileに以下★の設定を追加・変更する。db2inst1ユーザからtnspingおよびsqlplusでDBCSのPDBへ接続できることを確認する。
[db2inst1@db2 ~]$ cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

export ORACLE_HOME=/u01/app/oracle/product/19.0.0/client_1★
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH★
export NLS_LANG=Japanese_Japan.AL32UTF8★

# User specific environment and startup programs

PATH=$ORACLE_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin★

export PATH

(5)Federationの構成


OracleへのFederation Serverの構成方法は参考[3]のドキュメントを参考にしながら行った。
db2dj.iniに以下のoracleの設定を追加する。

ORACLE_HOME=/u01/app/oracle/product/19.0.0/client_1
DB2LIBPATH=/u01/app/oracle/product/19.0.0/client_1/lib
NLS_LANG=Japanese_Japan.AL32UTF8

ファイルは/home/db2inst1/sqllib/cfg/db2dj.iniにあるので、★の部分を追加する。
[db2inst1@db2 cfg]$ cat /home/db2inst1/sqllib/cfg/db2dj.ini
DJX_ODBC_LIBRARY_PATH=/home/db2inst1/sqllib/federation/odbc/lib:
DB2_FED_LIBPATH=/home/db2inst1/sqllib/federation/odbc/lib:/home/db2inst1/sqllib/federation/netezza/lib64:
ODBCINST=/home/db2inst1/sqllib/cfg/odbcinst.ini
NZ_ODBC_INI_PATH=/home/db2inst1/sqllib/cfg
[db2inst1@db2 cfg]$ cp db2dj.ini db2dj.ini.org
[db2inst1@db2 cfg]$ vi db2dj.ini
[db2inst1@db2 cfg]$ cat db2dj.ini
DJX_ODBC_LIBRARY_PATH=/home/db2inst1/sqllib/federation/odbc/lib:
DB2_FED_LIBPATH=/home/db2inst1/sqllib/federation/odbc/lib:/home/db2inst1/sqllib/federation/netezza/lib64:
ODBCINST=/home/db2inst1/sqllib/cfg/odbcinst.ini
NZ_ODBC_INI_PATH=/home/db2inst1/sqllib/cfg
ORACLE_HOME=/u01/app/oracle/product/19.0.0/client_1 ★
DB2LIBPATH=/u01/app/oracle/product/19.0.0/client_1/lib ★
NLS_LANG=Japanese_Japan.AL32UTF8 ★

続いて、NET8ラッパーを作成する。DB2インスタンスを起動、testdbへ接続し、CREATE WRAPPER NET8を実行する。
[db2inst1@db2 ~]$ db2start
09/19/2021 14:40:49     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.
[db2inst1@db2 ~]$ db2 "connect to testdb"

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.6.0
 SQL authorization ID   = DB2INST1
 Local database alias   = TESTDB

[db2inst1@db2 ~]$ db2 "CREATE WRAPPER NET8"
DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL20076N  The instance for the database is not enabled for the specified
action or operation.  Reason code = "1".  SQLSTATE=0A502

SQL20076Nのエラーが発生した。以下サイトを見ると、どうやらdatabase managerのfederated yesの設定変更してインスタンス再起動が必要とのことである。

https://www.ibm.com/support/pages/what-causes-error-sql20076n
・What causes error SQL20076N ?
Cause:Error SQL20076N is received when the FEDERATED database manager configuration parameter is not enabled.
Answer:
1. Set the FEDERATED database manager configuration parameter to YES by entering the following statement using the command line processor:
db2 update database manager configuration using federated yes
2. Restart the DB2 instance by typing the following commands using the command line processor:
db2stop
db2start

実際に上記設定変更を行う。特に問題なくインスタンスの再起動まで完了。
[db2inst1@db2 ~]$ db2 update database manager configuration using federated yes
DB20000I  The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.
[db2inst1@db2 ~]$ db2 terminate
DB20000I  The TERMINATE command completed successfully.
[db2inst1@db2 ~]$ db2stop
09/19/2021 15:09:06     0   0   SQL1064N  DB2STOP processing was successful.
SQL1064N  DB2STOP processing was successful.
[db2inst1@db2 ~]$ db2start
09/19/2021 15:09:11     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.
[db2inst1@db2 ~]$

再度CREATE WRAPPER NET8を行うと成功した。
[db2inst1@db2 ~]$ db2 connect to testdb

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.6.0
 SQL authorization ID   = DB2INST1
 Local database alias   = TESTDB

[db2inst1@db2 ~]$ db2 "CREATE WRAPPER NET8"
DB20000I  The SQL command completed successfully. ★
[db2inst1@db2 ~]$

続いてサーバを作成する。
[db2inst1@db2 ~]$ db2 "create server k5 type oracle version 19.0 wrapper NET8 options (node 'k5', password 'Y', pushdown 'Y')"
DB20000I  The SQL command completed successfully.
[db2inst1@db2 ~]$

ユーザマッピングの設定を行う。上記で作成したサーバにOracle側の接続ユーザの認証情報を設定する。
[db2inst1@db2 ~]$ db2 "create user mapping for user server k5 options ( REMOTE_AUTHID 'f', REMOTE_PASSWORD '***' )"
DB20000I  The SQL command completed successfully.

以上でFederationの設定は完了である。実際にOracleへのSQLが通るか確認すると、うまくいった!
[db2inst1@db2 ~]$ db2 "select * from k5.f.emp"

EMPNO  ENAME      JOB       MGR    HIREDATE                   SAL       COMM      DEPTNO
------ ---------- --------- ------ -------------------------- --------- --------- ------
  7839 KING       PRESIDENT      - 1981-11-17-00.00.00.000000   5000.00         -     10
  7698 BLAKE      MANAGER     7839 1981-05-01-00.00.00.000000   2850.00         -     30
  7782 CLARK      MANAGER     7839 1981-06-09-00.00.00.000000   2450.00         -     10
  7566 JONES      MANAGER     7839 1981-04-02-00.00.00.000000   2975.00         -     20
  7788 SCOTT      ANALYST     7566 1987-04-19-00.00.00.000000   3000.00         -     20
  7902 FORD       ANALYST     7566 1981-12-03-00.00.00.000000   3000.00         -     20
  7369 SMITH      CLERK       7902 1980-12-17-00.00.00.000000    800.00         -     20
  7499 ALLEN      SALESMAN    7698 1981-02-20-00.00.00.000000   1600.00    300.00     30
  7521 WARD       SALESMAN    7698 1981-02-22-00.00.00.000000   1250.00    500.00     30
  7654 MARTIN     SALESMAN    7698 1981-09-28-00.00.00.000000   1250.00   1400.00     30
  7844 TURNER     SALESMAN    7698 1981-09-08-00.00.00.000000   1500.00      0.00     30
  7876 ADAMS      CLERK       7788 1987-05-23-00.00.00.000000   1100.00         -     20
  7900 JAMES      CLERK       7698 1981-12-03-00.00.00.000000    950.00         -     30
  7934 MILLER     CLERK       7782 1982-01-23-00.00.00.000000   1300.00         -     10
  9998 NEWEMP     PRESIDENT      - 2021-09-12-11.13.53.000000   5000.00         -     10

  15 record(s) selected.

ちなみにDB2ではシノニムはニックネームとして作成することができる。以下のようにニックネームを作成することでサーバ名を隠蔽することが可能である。
[db2inst1@db2 ~]$ db2 "CREATE NICKNAME db2inst1.k5_emp FOR k5.f.emp"
DB20000I  The SQL command completed successfully.
[db2inst1@db2 ~]$ db2 "select * from k5_emp"

EMPNO  ENAME      JOB       MGR    HIREDATE                   SAL       COMM      DEPTNO
------ ---------- --------- ------ -------------------------- --------- --------- ------
...

まとめ


OCI上でDB2をインストール、データベースを作成し、Oracleクライアントをインストール・設定し、Federation Serverを構成しOracleへ接続する方法について記載した。Oracle LinuxでDB2は動くのかは不安はあったが、必須パッケージをきちんと準備すればインストールでき、今回検証した範囲では特に問題なく動作することを確認した。次回はOracleGatewayの構成方法について記載してみたいと思う。

◇参考


[1] 即戦力のDB2管理術

即戦力のDB2管理術 ~仕組みからわかる効率的管理のノウハウ

即戦力のDB2管理術 ~仕組みからわかる効率的管理のノウハウ

  • 作者: 下佐粉 昭
  • 出版社/メーカー: 技術評論社
  • 発売日: 2011/04/08
  • メディア: 単行本(ソフトカバー)


[2] Installing Db2 servers using the Db2 Setup wizard (Linux and UNIX)

[3] How does Federation Server connect to Oracle data source via Instant Client?

[4] Running Graphical Applications Securely on Oracle Cloud Infrastructure

◇参考ファイル


[1] DB2のインストーラのレスポンスファイル
[root@db2 opc]# cat /root/db2server.rsp
*-----------------------------------------------------
* Generated response file used by the DB2 Setup wizard
* generation time: 9/18/21 5:33 AM
*-----------------------------------------------------
*  Product Installation
LIC_AGREEMENT       = ACCEPT
PROD       = DB2_SERVER_EDITION
FILE       = /opt/ibm/db2/V11.5
INSTALL_TYPE       = TYPICAL
*-----------------------------------------------
*  Das properties
*-----------------------------------------------
DAS_CONTACT_LIST       = LOCAL
* ----------------------------------------------
*  Instance properties
* ----------------------------------------------
INSTANCE       = inst1
inst1.TYPE       = ese
*  Instance-owning user
inst1.NAME       = db2inst1
inst1.GROUP_NAME       = db2iadm1
inst1.HOME_DIRECTORY       = /home/db2inst1
inst1.PASSWORD       = 950640616429906512023297944420508313828123455632730438513228255593461432458416223456036832448445492711578342498653692333335222622734761075274283324395386411544853756320496743408227814262723354966225615278654096931872723108982573022551923619411473168849326813413622086595121272258350735774365940235475428514232842752410099416505600591422351305405369272625221103266374125068782624039439514382235224652624939751544942926724431946633696660344422014451331827766656638182692221427270556132248213153932610061491102358265668031394725150546523314042113086842631322008657621651335832910899983832426429664974541258329257743294274864627184825853337284486692243263756298331568533629324484241536415436621933235753093352433346360145945661814866416662446230343074518626998131246453143
ENCRYPTED       = inst1.PASSWORD
inst1.AUTOSTART       = YES
inst1.SVCENAME       = db2c_db2inst1
inst1.PORT_NUMBER       = 25010
inst1.FCM_PORT_NUMBER       = 20016
inst1.MAX_LOGICAL_NODES       = 6
inst1.CONFIGURE_TEXT_SEARCH       = NO
*  Fenced user
inst1.FENCED_USERNAME       = db2fenc1
inst1.FENCED_GROUP_NAME       = db2fadm1
inst1.FENCED_HOME_DIRECTORY       = /home/db2fenc1
inst1.FENCED_PASSWORD       = 571185537232343041763270154361524673344253060832241250240365234602333370773398890635958273178286044005834416435965614021261462055314463250142929745425525963488641223984212243393506854434500316144423087219321444062235207636591745243320662224886257926337032832864284149645637703113558324235226433548428325776824043119258429959369531480719670666491802742054565564421743149152034481843343046733520653714422769592050385076495215442236632303892949697939829063327030659950189374754317447285180122605814125162115375585545636033596545201925759408430553856375234257233353400134082655257979412926287539342379578352712795543751359487506516935370132975476390700266767723259273424251413414266528278129074633264442728175454530887654208855409471734028734758836723435352011324456551438
ENCRYPTED       = inst1.FENCED_PASSWORD
*-----------------------------------------------
*  Installed Languages
*-----------------------------------------------
LANG       = EN


[2] DB2インスタンスのコンフィグ
[db2inst1@db2 ~]$ db2 get dbm cfg

          Database Manager Configuration

     Node type = Enterprise Server Edition with local and remote clients

 Database manager configuration release level            = 0x1500

 CPU speed (millisec/instruction)             (CPUSPEED) = 1.889377e-07
 Communications bandwidth (MB/sec)      (COMM_BANDWIDTH) = 1.000000e+02

 Max number of concurrently active databases     (NUMDB) = 32
 Federated Database System Support           (FEDERATED) = NO
 Transaction processor monitor name        (TP_MON_NAME) =

 Default charge-back account           (DFT_ACCOUNT_STR) =

 Java Development Kit installation path       (JDK_PATH) = /home/db2inst1/sqllib/java/jdk64

 Diagnostic error capture level              (DIAGLEVEL) = 3
 Notify Level                              (NOTIFYLEVEL) = 3
 Diagnostic data directory path               (DIAGPATH) = /home/db2inst1/sqllib/db2dump/ $m
 Current member resolved DIAGPATH                        = /home/db2inst1/sqllib/db2dump/DIAG0000/
 Alternate diagnostic data directory path (ALT_DIAGPATH) =
 Current member resolved ALT_DIAGPATH                    =
 Size of rotating db2diag & notify logs (MB)  (DIAGSIZE) = 0

 Default database monitor switches
   Buffer pool                         (DFT_MON_BUFPOOL) = OFF
   Lock                                   (DFT_MON_LOCK) = OFF
   Sort                                   (DFT_MON_SORT) = OFF
   Statement                              (DFT_MON_STMT) = OFF
   Table                                 (DFT_MON_TABLE) = OFF
   Timestamp                         (DFT_MON_TIMESTAMP) = ON
   Unit of work                            (DFT_MON_UOW) = OFF
 Monitor health of instance and databases   (HEALTH_MON) = OFF

 SYSADM group name                        (SYSADM_GROUP) = DB2IADM1
 SYSCTRL group name                      (SYSCTRL_GROUP) =
 SYSMAINT group name                    (SYSMAINT_GROUP) =
 SYSMON group name                        (SYSMON_GROUP) =

 Client Userid-Password Plugin          (CLNT_PW_PLUGIN) =
 Client Kerberos Plugin                (CLNT_KRB_PLUGIN) =
 Group Plugin                             (GROUP_PLUGIN) =
 GSS Plugin for Local Authorization    (LOCAL_GSSPLUGIN) =
 Server Plugin Mode                    (SRV_PLUGIN_MODE) = UNFENCED
 Server List of GSS Plugins      (SRVCON_GSSPLUGIN_LIST) =
 Server Userid-Password Plugin        (SRVCON_PW_PLUGIN) =
 Server Connection Authentication          (SRVCON_AUTH) = NOT_SPECIFIED
 Cluster manager                                         =

 Database manager authentication        (AUTHENTICATION) = SERVER
 Alternate authentication           (ALTERNATE_AUTH_ENC) = NOT_SPECIFIED
 Cataloging allowed without authority   (CATALOG_NOAUTH) = NO
 Trust all clients                      (TRUST_ALLCLNTS) = YES
 Trusted client authentication          (TRUST_CLNTAUTH) = CLIENT
 Bypass federated authentication            (FED_NOAUTH) = NO

 Default database path                       (DFTDBPATH) = /home/db2inst1

 Database monitor heap size (4KB)          (MON_HEAP_SZ) = AUTOMATIC(90)
 Java Virtual Machine heap size (4KB)     (JAVA_HEAP_SZ) = 65536
 Audit buffer size (4KB)                  (AUDIT_BUF_SZ) = 0
 Global instance memory (% or 4KB)     (INSTANCE_MEMORY) = AUTOMATIC(131833)
 Member instance memory (% or 4KB)                       = GLOBAL
 Agent stack size                       (AGENT_STACK_SZ) = 1024
 Sort heap threshold (4KB)                  (SHEAPTHRES) = 0

 Directory cache support                     (DIR_CACHE) = YES

 Application support layer heap size (4KB)   (ASLHEAPSZ) = 15
 Max requester I/O block size (bytes)         (RQRIOBLK) = 65535
 Workload impact by throttled utilities(UTIL_IMPACT_LIM) = 10

 Priority of agents                           (AGENTPRI) = SYSTEM
 Agent pool size                        (NUM_POOLAGENTS) = AUTOMATIC(100)
 Initial number of agents in pool       (NUM_INITAGENTS) = 0
 Max number of coordinating agents     (MAX_COORDAGENTS) = AUTOMATIC(200)
 Max number of client connections      (MAX_CONNECTIONS) = AUTOMATIC(MAX_COORDAGENTS)

 Keep fenced process                        (KEEPFENCED) = YES
 Number of pooled fenced processes         (FENCED_POOL) = AUTOMATIC(MAX_COORDAGENTS)
 Initial number of fenced processes     (NUM_INITFENCED) = 0

 Index re-creation time and redo index build  (INDEXREC) = RESTART

 Transaction manager database name         (TM_DATABASE) = 1ST_CONN
 Transaction resync interval (sec)     (RESYNC_INTERVAL) = 180

 SPM name                                     (SPM_NAME) = db2
 SPM log size                          (SPM_LOG_FILE_SZ) = 256
 SPM resync agent limit                 (SPM_MAX_RESYNC) = 20
 SPM log path                             (SPM_LOG_PATH) =

 TCP/IP Service name                          (SVCENAME) = db2c_db2inst1
 Discovery mode                               (DISCOVER) = SEARCH
 Discover server instance                (DISCOVER_INST) = ENABLE

 SSL server keydb file                   (SSL_SVR_KEYDB) =
 SSL server stash file                   (SSL_SVR_STASH) =
 SSL server certificate label            (SSL_SVR_LABEL) =
 SSL service name                         (SSL_SVCENAME) =
 SSL cipher specs                      (SSL_CIPHERSPECS) =
 SSL versions                             (SSL_VERSIONS) =
 SSL client keydb file                  (SSL_CLNT_KEYDB) =
 SSL client stash file                  (SSL_CLNT_STASH) =

 Maximum query degree of parallelism   (MAX_QUERYDEGREE) = ANY
 Enable intra-partition parallelism     (INTRA_PARALLEL) = NO

 Maximum Asynchronous TQs per query    (FEDERATED_ASYNC) = 0

 Number of FCM buffers                 (FCM_NUM_BUFFERS) = AUTOMATIC(4096)
 FCM buffer size                       (FCM_BUFFER_SIZE) = 32768
 Number of FCM channels               (FCM_NUM_CHANNELS) = AUTOMATIC(2048)
 FCM parallelism                       (FCM_PARALLELISM) = AUTOMATIC(2)
 Node connection elapse time (sec)         (CONN_ELAPSE) = 10
 Max number of node connection retries (MAX_CONNRETRIES) = 5
 Max time difference between nodes (min) (MAX_TIME_DIFF) = 60

 db2start/db2stop timeout (min)        (START_STOP_TIME) = 10

 WLM dispatcher enabled                 (WLM_DISPATCHER) = NO
 WLM dispatcher concurrency            (WLM_DISP_CONCUR) = COMPUTED
 WLM dispatcher CPU shares enabled (WLM_DISP_CPU_SHARES) = NO
 WLM dispatcher min. utilization (%) (WLM_DISP_MIN_UTIL) = 5

 Communication buffer exit library list (COMM_EXIT_LIST) =
 Current effective arch level         (CUR_EFF_ARCH_LVL) = V:11 R:5 M:6 F:0 I:0 SB:0
 Current effective code level         (CUR_EFF_CODE_LVL) = V:11 R:5 M:6 F:0 I:0 SB:0

 Keystore type                           (KEYSTORE_TYPE) = NONE
 Keystore location                   (KEYSTORE_LOCATION) =

 Path to python runtime                    (PYTHON_PATH) =
 Path to R runtime                              (R_PATH) =



[3] Oracle Clientのレスポンスファイル
[oracle@db2 oraInventory]$ cat client.rsp
###############################################################################
## Copyright(c) Oracle Corporation 1998,2019. All rights reserved.           ##
##                                                                           ##
## Specify values for the variables listed below to customize                ##
## your installation.                                                        ##
##                                                                           ##
## Each variable is associated with a comment. The comment                   ##
## can help to populate the variables with the appropriate                   ##
## values.                                                                   ##
##                                                                           ##
###############################################################################


#-------------------------------------------------------------------------------
# Do not change the following system generated value.
#-------------------------------------------------------------------------------
oracle.install.responseFileVersion=/oracle/install/rspfmt_clientinstall_response_schema_v19.0.0

#-------------------------------------------------------------------------------
# Unix group to be set for the inventory directory.
#-------------------------------------------------------------------------------
UNIX_GROUP_NAME=oinstall
#-------------------------------------------------------------------------------
# Inventory location.
#-------------------------------------------------------------------------------
INVENTORY_LOCATION=/u01/app/oraInventory
#-------------------------------------------------------------------------------
# Complete path of the Oracle Home
#-------------------------------------------------------------------------------
ORACLE_HOME=/u01/app/oracle/product/19.0.0/client_1
#-------------------------------------------------------------------------------
# Complete path of the Oracle Base.
#-------------------------------------------------------------------------------
ORACLE_BASE=/u01/app/oracle
#------------------------------------------------------------------------------
#Name       : INSTALL_TYPE
#Datatype   : String
#Description: Installation type of the component.
#
#             The following choices are available. The value should contain
#             only one of these choices.
#               - Administrator
#               - Runtime
#               - InstantClient
#               - Custom
#
#Example    : INSTALL_TYPE = Administrator
#------------------------------------------------------------------------------
oracle.install.client.installType=Administrator

#-------------------------------------------------------------------------------
# Name       : oracle.install.client.customComponents
# Datatype   : StringList
#
# This property is considered only if INSTALL_TYPE is set to "Custom"
#
# Description: List of Client Components you would like to install
#
#   The following choices are available. You may specify any
#   combination of these choices.  The components you choose should
#   be specified in the form "internal-component-name:version"
#   Below is a list of components you may specify to install.
#
# oracle.sqlj:19.0.0.0.0 -- "Oracle SQLJ"
# oracle.rdbms.util:19.0.0.0.0 -- "Oracle Database Utilities"
# oracle.javavm.client:19.0.0.0.0 -- "Oracle Java Client"
# oracle.sqlplus:19.0.0.0.0 -- "SQL*Plus"
# oracle.dbjava.jdbc:19.0.0.0.0 -- "Oracle JDBC/THIN Interfaces"
# oracle.ldap.client:19.0.0.0.0 -- "Oracle Internet Directory Client"
# oracle.rdbms.oci:19.0.0.0.0 -- "Oracle Call Interface (OCI)"
# oracle.precomp:19.0.0.0.0 -- "Oracle Programmer"
# oracle.xdk:19.0.0.0.0 -- "Oracle XML Development Kit"
# oracle.network.aso:19.0.0.0.0 -- "Oracle Advanced Security"
# oracle.oraolap.mgmt:19.0.0.0.0 -- "OLAP Analytic Workspace Manager and Worksheet"
# oracle.network.client:19.0.0.0.0 -- "Oracle Net"
# oracle.network.cman:19.0.0.0.0 -- "Oracle Connection Manager"
# oracle.network.listener:19.0.0.0.0 -- "Oracle Net Listener"
# oracle.ordim.client:19.0.0.0.0 -- "Oracle Multimedia Client Option"
# oracle.odbc:19.0.0.0.0 -- "Oracle ODBC Driver"
# oracle.has.client:19.0.0.0.0 -- "Oracle Clusterware High Availability API"
# oracle.dbdev:19.0.0.0.0 -- "Oracle SQL Developer"
# oracle.rdbms.scheduler:19.0.0.0.0 -- "Oracle Scheduler Agent"
#
# Example    : oracle.install.client.customComponents="oracle.precomp:19.0.0.0.0","oracle.oraolap.mgmt:19.0.0.0.0","oracle.rdbms.scheduler:19.0.0.0.0"
#-------------------------------------------------------------------------------
oracle.install.client.customComponents=

#-------------------------------------------------------------------------------
# Host name to be used for by the Oracle Scheduler Agent.
# This needs to be entered in case oracle.rdbms.scheduler is selected in the
# list of custom components during custom install
#
# Example    : oracle.install.client.schedulerAgentHostName = acme.domain.com
#------------------------------------------------------------------------------
oracle.install.client.schedulerAgentHostName=

#------------------------------------------------------------------------------
# Port number to be used for by the Oracle Scheduler Agent.
# This needs to be entered in case oracle.rdbms.scheduler is selected in the
# list of custom components during custom install
#
# Example: oracle.install.client.schedulerAgentPortNumber = 1500
#------------------------------------------------------------------------------
oracle.install.client.schedulerAgentPortNumber=

OCIの異機種DBLINK検証環境構築メモ ~その2 [OCI]

先日の異機種DBのDBLINK性能検証を行ったOCI上の検証環境の構築方法について簡単にメモしておく。前回はDBCSでOracleを構成したので、今回はOCI上にSQL Serverを構成し、そこからOracleへLinkedServerで接続する。

 1.VCNの設定
 2.DBCSの構築
 3.DB設定(初期化パラメータ設定、PDB構築)
 4.SQL Serverの構築 ★
 5.LinkedServerの構成 ★
 6.DB2の構築
 7.Federationの構成
 8.OracleGWの構築
 9.SQL ServerへのDBLINKの構成
 10.DB2へのDBLINKの構成

4.SQL Serverの構成


(1)Windows2019の構築


まずはWindows2019を構築する。構築といっても、基本的にはOCIのメニューのComputeのInstanceからCreate Instanceを選択し、Image and shapeでWindows(Server 2019 Standard)を選択していくだけである。シェイプはVM.Standard2.1(OCPU 1, memory 15GB, Boot volume 256GB)となった。作成は比較的すぐ終わる。作成されたら、Instance Detail画面のInstant AccessでパブリックIPアドレスと、初期パスワードを確認しておく。

20211003_Win2019.jpg

次にRDPで作業できるようにポートを開ける。ハンバーガーメニューからNetworking、Virtual Cloud Networksを選択し、このサーバを配置したVCNを選択。左側のSecurity Listを選択し、デフォルトセキュリティリストを選択する。ここのIngress RulesにRDP用のアクセス許可を追加する。
  • Source CIDR:0.0.0.0/0
  • IP Protocol:TCP
  • Source Port range: All
  • Destination Port range: 3389

以上で、基本的な構成は終了である。手元のPCからリモートデスクトップでパブリックIPで接続する。アカウントはopc/初期パスワードで接続できる。

接続できたら、基本的な設定として、OSの言語(日本語の言語パックのダウンロード必要)、リージョンを変更しておく。時刻は変更しようとしたが成功しなかった(UTCのまま)。気にはなるが、検証なので一旦無視して先に進むことにする。

(2)SQL Serverの導入


SQL Server 2019のdeveloper版をダウンロードする。以下のSQL Server on-premisesのFree trialを選択すると180日間の評価版がダウンロードできる(氏名、会社、メールアドレス等の入力は必要)。
https://www.microsoft.com/en-us/sql-server/sql-server-downloads

インストーラを起動し、ウィザードに従ってインストールする。はじめにNew SQL Server stand-alone installation ... を選択する。インストールルールチェックで、Firewallが引っかかる。これはWindows FirewallによりSQL Serverへのアクセスのためのポートが開いていないことに起因する。インストールするためだけなら無視しても良いが、後々外からSQL Serverにアクセスする必要があるので、ここでWindows Firewallのポート(デフォルトポートは1433)を開けておくことが望ましい。

20211003_Win2FirewallError.jpg


WindowsFirewallの設定は以下の通り少し操作が面倒だが、やりたいことはサブネット内のIPからこのマシンへのポート1433へのアクセスを許可するだけである。
  • 設定→ネットワークとインターネット→Windowsファイアウォールを選択すると、ファイアウォールとネットワーク保護の画面が出るので、詳細設定を選択する。
  • セキュリティが強化されたWindows Defenderファイアウォールの画面の左ペインの「受信の規則」を選択する。
  • ここで右側の「新しい規則」を選択し、ポート、TCP、特定のポート(1433)、接続を許可する、この規則はいつ適用しますかはデフォルトのまま(全てチェック)、名前は任意(SQLPort等)とする。
  • 作成された規則をダブルクリックし、「スコープ」タブのリモートIPアドレスの部分で「これらのIPアドレス」を選択し、追加ボタンを押下、事前定義されたコンピューターセットでローカルサブネットを選択しOKする。

上記が完了すると以下のように1433を許可するルールが追加される。

20211003_WinFirewall1433.jpg

※蛇足ならが、WindowsFirewallの設定を間違えてRDPをブロックしてしまうと、本当にアクセスできなくなってしまうから注意が必要である。実は今回、安易にWindowsファイアウォールを無効化し、通信が通ることを確認後、有効化(設定の復旧)を行ったところ、RDPが通らなくなり、compute instanceから再構築する羽目になった。画面から簡単に操作ができる反面、RDPが絶たれると手も足もでなくなるWindowsの怖さを身をもって経験した。MOSを調べた限り、この状態に陥った場合の復旧方法はあるにはあるらしいが、具体的な手順として誰でも実行できるようなものではない印象だったので、くれぐれもFirewallの設定は注意が必要。

さて、SQL Server 2019のインストーラに戻る。基本的にはデフォルトでどんどんウィザードを進めていけば良い。Engineとクライアントのみインストール、パッチはあてない。変更点だけ以下に記載しておく。
  • Database Engine Configuration: Server configurationで認証方法を選択する。Windows authentication modeかMixed Mode(SQL server authentication and Windows authentication)を選択できるが、後者を選択し、saのパスワードを入れる。SQL server administratorにAdd Current Userでopcを追加しておく。
  • Database Engine Configuration: Memoryでメモリを指定できる。Defaultだと明らかに大きすぎる印象があったので、Recommendedを選択

上記でSQL Serverのインストールは完了。続いてinstall SQL Server Management toolsで管理ツールも導入しておく。検証用のデータベースも作成しておく。このあたりは画面操作で知っていれば難しくはないが、私は初めてだったので参考[1]を見ながら作業を進めた。ちなみにこの本はSQL Server 2016について記載されているが、2019インストール上は特に違和感なく作業を進められた。

(3)Oracle Clientの導入


続いてOracle Clientを導入する。SQL ServerからLinkedServerでOracle Databaseへ接続するには、OracleのOLE DB providerが必要なのだが、これがOracle Clientに含まれているからである。インスタントクライアントとどちらにするか悩んだが、確実な通常のクライアントにすることとした。OracleクライアントはOTNから19cのWindows64bit用を以下からダウンロードする。2つバイナリがあるが通常のインストールが必要なclient.zipの方を使う(homeが付いている方は配置するのみでインストール不要のようだが、パス等の設定を手動でやる必要がある。台数が少なければこちらが無難だろう)。

Oracle Database 19c Client (19.3) for Microsoft Windows x64 (64-bit),WINDOWS.X64_193000_client.zip
https://www.oracle.com/database/technologies/oracle19c-windows-downloads.html

Oracleクライアントはsetup.exeを起動、デフォルトでインストール。OSユーザはoracleユーザを作成する。インストール後、tnsnames.oraに以下を記載し、C:\app\oracle\product\19.0.0\client_1\network\admin配下に配置する。ここではk5というPDBへの接続エントリを追加している。
k5 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.X)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = k5.subnet.vcn.oraclevcn.com)
    )
  )

コマンドプロンプトからtnsping k5で応答あること、sqlplusで接続できることを確認しておく。

5.LinkedServerの構成


上記まででSQL ServerからOracle Databaseへ接続する準備ができた。ここから、SQL ServerでLinkedServerを構成してOracleへ接続してみよう。

(1)Linked Serverの構成


SQL Server Management Studioを起動し、saでログインする。Server ObjectsからLinked Serversを右クリックして、New Linked Serverを選択する。

Generalには以下の通り設定する。
  • Linked Server: Linked Serverの名前(ここではK5を指定)
  • Server Type: Other data sourceを選択。Oracle Provider for OLE DBを指定
  • Product Name: Oracle
  • Data source: tnsnames.oraの接続識別子(ここではk5を指定)

20211003_newLinkedServer.jpg

Securityはbe made using this security contextを選択し、Oracleの接続ユーザ名/パスワードを指定する。

20211003_newLinkedServer2.jpg

(2)Oracle OLE DBのプロパティを変更


次にOracle OLE DBのプロパティを変更する。これをしないとLinkedServerでOracleへ接続しようとしたときに以下MSG7399というエラーが発生するため、そのワークアラウンド設定である。Server ObjectsからLinked Servers、Providers、OraOLEDB.Oracleを右クリックでプロパティを開く。Allow inprocessにチェックを入れOKを押下する。
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "OraOLEDB.Oracle" for linked server "K5" reported an error. Access denied.
Msg 7350, Level 16, State 2, Line 1
Cannot get the column information from OLE DB provider "OraOLEDB.Oracle" for linked server "K5".Completion time: 2021-09-12T23:53:05.7344726+00:00

なお、この設定変更についての必要性はよくわかっていない。Googleで調べている際に参考[2]のスレッドを発見して試してみたところうまくいっただけなので、この設定の正しさについて保証できるものではない。

(3)SQL ServerのTCP/IPの有効化


20211003_allowinprocess.jpg


また、直接LinkedServerとは関係ないが、他サーバからSQL Serverに接続するためには、上記Windows Firewallの設定の他、SQL ServerのプロトコルでTCP/IPを有効にする必要がある。後にOracle Gatewayで接続するために必要となるので、ここで変更しておく。スタートメニューからSQL Server 2019構成マネージャを起動し、SQL Serverネットワークの構成からMSSQLSERVERのプロトコルを選択し、TCP/IPを右クリックで有効化する。

20211003_SQLTCPIPEnable.jpg

(4)Linked Serverの動作確認


Linked Serverの動作確認をしてみよう。以下のSQLを実行し、OracleDatabaseのemp表が表示されることを確認する。もちろん、事前にOracle側にemp表は作成しておく必要があるのはいうまでもない。

select * from openquery([k5],'select * from emp');

なお、下記のようにopenqueryを使わずとも、以下のようにクエリを実行することもできるようだ。この場合、Oracleのスキーマ名、オブジェクト名は大文字で記述しないとエラーとなる。Oracleはsqlplus上は大文字小文字は通常意識する必要はないので違和感があるかもしれない。

select * from K5..F.EMP;

20211003_LinkedServerQuery.jpg

まとめ


OCI上でSQL Serverを構成し、DBCSで構成されたOracle DatabaseへLinked Serverで接続する構成方法について記載した。Linked Serverの構成方法は難しいものではなく、Oracle Netで接続が確立されていれば、作成自体は簡単にできる。ただ、OLEDBを使う上で一部プロパティを変更しなければならなかった点が注意点である。OCI上で構成する上では必要な通信ができるようにファイアウォールの設定に注意が必要である。特にサーバ上にデフォルトで構成されているポリシーはセキュリティ確保のため厳しく設定してあるため、必要なサーバ間通信を正確に把握して明示的に通す設定を入れる点は構成上のポイントといえるだろう。
今回は以上であるが、次回はDB2で同様のことをやってみよう。

◇参考


[1] SQL Server 2016の教科書, Chapter 1 SQL Serverの概要とインストール

SQL Server 2016の教科書 開発編

SQL Server 2016の教科書 開発編

  • 出版社/メーカー: ソシム
  • 発売日: 2016/07/26
  • メディア: 単行本


[2] LinkedServerでMsg 7399の対処方法
https://www.sqlservercentral.com/forums/topic/linked-server-for-oracle-1
#836885: Just to follow up, a call to Microsoft support revealed that editing the Provider Properties (right-click the provider in the providers folder) and ticking the "Allow inprocess" option corrects my problem.

OCIの異機種DBLINK検証環境構築メモ ~その1 [OCI]

先日の異機種DBのDBLINK性能検証を行ったOCI上の検証環境の構築方法について簡単にメモしておく。大まかに以下が構築手順の全体像であるが、今回は1~3のDBCSでDBを作成する部分について、OCIで構築した際に発生した問題や気を付けるべき点を記す。アカウント作成してから30日以内に完了させないと、DBCSなどのalways free外のものは削除されるので、ある程度割り切って環境構築を進める。

 1.VCNの設定
 2.DBCSの構築
 3.DB設定(初期化パラメータ設定、PDB構築)
 4.SQL Serverの構築
 5.LinkedServerの構成
 5.DB2の構築
 6.Federationの構成
 7.OracleGWの構築
 8.SQL ServerへのDBLINKの構成
 9.DB2へのDBLINKの構成

1.VCNの設定


まずはVCNを作成する。今回は単純にDBサーバ3台だけなので、VCNのCiderは192.168.0.0/24で構築。サブネットも1つ。インターネットGWを作成し、インターネットへのルーティングを追加(0.0.0.0はIGWへ向ける)。サービスGWを作成し、ストレージサービスへのルーティングを追加。セキュリティリストのIngressに1521(OracleNet)と3389(RDP)を通しておく。このあたりはVCN Wizardを使えば楽に作れるが、サブネットがパブリックとプライベートで分かれてしまうので、今回の検証には使わなかった。

2.DBCSの構築


DBCSは以下の設定で行った。これだけでDBサーバがインスタンス込みで構築される。概ね30分程度でインスタンスが起動する。
・select a compartment: デフォルト
・name your DB system: DBSYSTEM
・select an availability domain: デフォルト(AD-1)
・select a shape type: virtual machine
・select a shape:VM.Standard2.2(デフォルトのVM.Standard2.4ではエラーとなる)
・Total node count:1
・Oracle database software edition: Enterprise Edition High Performance
・Choose storage management software: Oracle Grid Infrastructure
・available storage (GB): 256 (Total storage: 712 GB)
・Virtual cloud network in xxx(root): <1で作成したVCN>
・Client subnet: <1で作成したサブネット>
・Hostname prefix: <サーバのホスト名>
・Private IP address: 192.168.0.X
・Advanced Options/ Time zone: Asia/Tokyo (デフォルトだとUTCになるので注意)
・Database name: デフォルト(DB0908)
・Database unique name suffix: デフォルト
・Database image: Oracle Database 19c ※21cも選択できる
・PDB name: デフォルト(空欄) ※空欄としてもPDBは1つ作成される
・Username: デフォルト(sys)
・Password/Confirm password: ************
・Use the administrator password for the TDE wallet: デフォルト(チェック入り)
・Select workload type: Transaction Processing
・Configure database backups: チェックなし
・Advanced Options/ Character set: AL32UTF8/ National character set: AL16UTF16

作成された環境を少し細かく確認してみよう。まずメモリであるが、以下のようにHugePagesが設定されており、シェイプの物理メモリ30GBのうち約14.2GB(48.6%)が割り当てられている。
SQL> !cat /proc/meminfo
MemTotal:       30613012 kB
MemFree:         1981096 kB
MemAvailable:    8353072 kB
Buffers:          377268 kB
Cached:          8357844 kB
・・・
HugePages_Total:    7258
HugePages_Free:      354
HugePages_Rsvd:       10
HugePages_Surp:        0
Hugepagesize:       2048 kB

次に気になるのがHugePagesに格納されるSGAサイズである。初期化パラメータを確認するとSGAは以下の通り13.5GBとなっている。想定通りHugePagesにSGAを格納する設定になっている(use_large_pagesがonly)。ASMM(自動共有メモリ管理)となっているのは好感が持てる。
SQL> show parameter sga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
allow_group_access_to_sga            boolean     FALSE
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     TRUE
sga_max_size                         big integer 13824M★
sga_min_size                         big integer 0
sga_target                           big integer 13824M
unified_audit_sga_queue_size         integer     1048576
SQL>
SQL> show parameter large

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
large_pool_size                      big integer 0
use_large_pages                      string      only
SQL>

一方、ASMインスタンスの方は1GB程度であるが、HugePagesを使わない設定になっている。ということはHugePagesに少し余裕があるので、DBのSGAは若干上げる余地がある。
SQL> sho parameter sga

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
allow_group_access_to_sga            boolean     FALSE
lock_sga                             boolean     FALSE
sga_max_size                         big integer 1088M
sga_target                           big integer 0
unified_audit_sga_queue_size         integer     1048576
SQL> show parameter large

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
large_pool_size                      big integer 12M
use_large_pages                      string      FALSE
SQL>

次にネットワークの構成を確認してみよう。リスナーの状態についてgridでlsnrctlで確認したところ、以下の通り1521でDBとASMがサービス登録されているのがわかる。
[grid@hostname ~]$ lsnrctl status LISTENER

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 11-SEP-2021 09:33:55

Copyright (c) 1991, 2021, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                08-SEP-2021 15:59:42
Uptime                    2 days 17 hr. 34 min. 12 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/19.0.0.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/grid/diag/tnslsnr/hostname/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.2)(PORT=1521)))
Services Summary...
Service "+APX" has 1 instance(s).
  Instance "+APX1", status READY, has 1 handler(s) for this service...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "+ASM_DATA" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "+ASM_RECO" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "DB0908XDB.subnet.vcn.oraclevcn.com" has 1 instance(s).
  Instance "DB0908", status READY, has 1 handler(s) for this service...
Service "DB0908_nrt17b.subnet.vcn.oraclevcn.com" has 1 instance(s).
  Instance "DB0908", status READY, has 2 handler(s) for this service...
Service "cb77b668abf93826e0530200a8c0599a.subnet.vcn.oraclevcn.com" has 1 instance(s).
  Instance "DB0908", status READY, has 2 handler(s) for this service...
Service "cb8d1deee83a3d93e0530200a8c070de.subnet.vcn.oraclevcn.com" has 1 instance(s).
  Instance "DB0908", status READY, has 2 handler(s) for this service...
Service "db0908_pdb1.subnet.vcn.oraclevcn.com" has 1 instance(s).
  Instance "DB0908", status READY, has 2 handler(s) for this service...
Service "k3.subnet.vcn.oraclevcn.com" has 1 instance(s).
  Instance "DB0908", status READY, has 2 handler(s) for this service...
The command completed successfully
[grid@hostname ~]$

次にストレージの構成を確認してみよう。DBCSの構成でASMを選択したので、asmcmd lsdgで確認する。+DATA 256GB、+REDO 256GBで切られている。冗長度はExternalなので、ASMレイヤでの冗長化はなく、ブロックストレージ任せである。
[grid@hostname ~]$ asmcmd
ASMCMD> lsdg
State    Type    Rebal  Sector  Logical_Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512             512   4096  4194304    262144   247300                0          247300              0             Y  DATA/
MOUNTED  EXTERN  N         512             512   4096  4194304    262144   257480                0          257480              0             N  RECO/
ASMCMD>

物理的にこのディスクグループはどのように構成されているのか確認してみよう。v$asm_diskで物理デバイスを確認すると、以下の通りそれぞれのディスクグループは64GBのデバイスを4つ束ねて作成されていることがわかる。ここからDBCSのストレージサイズは64GBが最小単位であることが想像できる。
SQL> r
  1* select path,total_mb from v$asm_disk order by 1

PATH                             TOTAL_MB
------------------------------ ----------
/dev/DATADISK1                      65536
/dev/DATADISK2                      65536
/dev/DATADISK3                      65536
/dev/DATADISK4                      65536
/dev/RECODISK1                      65536
/dev/RECODISK2                      65536
/dev/RECODISK3                      65536
/dev/RECODISK4                      65536

8 rows selected.
SQL>

実際にデバイスを確認すると、実体は/dev/sdb~/dev/sdiにマッピングされている。この先は確認していないが、おそらくiSCSIのブロックストレージになっているのだろう。
[grid@hostname ~]$ ll /dev/DATA*
lrwxrwxrwx 1 root root 3 Sep 29 06:47 /dev/DATADISK1 -> sdb
lrwxrwxrwx 1 root root 3 Sep 29 06:50 /dev/DATADISK2 -> sdc
lrwxrwxrwx 1 root root 3 Sep 29 06:47 /dev/DATADISK3 -> sdd
lrwxrwxrwx 1 root root 3 Sep 29 06:47 /dev/DATADISK4 -> sde
[grid@hostname ~]$ ll /dev/RECO*
lrwxrwxrwx 1 root root 3 Sep 29 06:47 /dev/RECODISK1 -> sdf
lrwxrwxrwx 1 root root 3 Sep 29 06:47 /dev/RECODISK2 -> sdg
lrwxrwxrwx 1 root root 3 Sep 29 06:50 /dev/RECODISK3 -> sdh
lrwxrwxrwx 1 root root 3 Sep 29 06:47 /dev/RECODISK4 -> sdi
[grid@hostname ~]$

ついでにローカルディスクについても確認しておこう。dfで確認すると、/が45GB、/u01が197GB割り当てられている。/opt/oracle/dcs/commonstoreに5GBあるのは何なのだろうか。
[oracle@hostname ~]$ df -h
Filesystem                           Size  Used Avail Use% Mounted on
devtmpfs                              15G     0   15G   0% /dev
tmpfs                                 15G  1.1G   14G   8% /dev/shm
tmpfs                                 15G  297M   15G   2% /run
tmpfs                                 15G     0   15G   0% /sys/fs/cgroup
/dev/mapper/VolGroupSys0-LogVolRoot   45G  9.8G   33G  24% / ★
/dev/sda2                            1.4G   99M  1.2G   8% /boot
/dev/sda1                            486M  7.5M  478M   2% /boot/efi
/dev/sdj                             197G   27G  160G  15% /u01 ★
tmpfs                                3.0G     0  3.0G   0% /run/user/102
/dev/asm/commonstore-405             5.0G  352M  4.7G   7% /opt/oracle/dcs/commonstore ★
tmpfs                                3.0G     0  3.0G   0% /run/user/54322
[oracle@hostname ~]$

/opt/oracle/dcs/commonstoreを確認するとTDEのwalletsを格納するためのもののようである。
[oracle@hostname ~]$ ls /opt/oracle/dcs/commonstore
lost+found  oss  wallets
[oracle@hostname ~]$

クラスタの状態は以下の通り。先ほどの/opt/oracle/dcs/commonstoreがACFSが構成されている。RAC構成の場合にwalletsをサーバ間で共有するためなのかもしれない。
[grid@hostname ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.COMMONSTORE.advm
               ONLINE  ONLINE       hostname                 STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       hostname                 STABLE
ora.chad
               ONLINE  ONLINE       hostname                 STABLE
ora.data.commonstore.acfs
               ONLINE  ONLINE       hostname                 mounted on /opt/orac
                                                             le/dcs/commonstore,S★
                                                             TABLE
ora.net1.network
               ONLINE  ONLINE       hostname                 STABLE
ora.ons
               ONLINE  ONLINE       hostname                 STABLE
ora.proxy_advm
               ONLINE  ONLINE       hostname                 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
      1        ONLINE  ONLINE       hostname                 STABLE
ora.DATA.dg(ora.asmgroup)
      1        ONLINE  ONLINE       hostname                 STABLE
ora.LISTENER_SCAN1.lsnr
      1        OFFLINE OFFLINE                               STABLE
ora.RECO.dg(ora.asmgroup)
      1        ONLINE  ONLINE       hostname                 STABLE
ora.asm(ora.asmgroup)
      1        ONLINE  ONLINE       hostname                 Started,STABLE
ora.asmnet1.asmnetwork(ora.asmgroup)
      1        ONLINE  ONLINE       hostname                 STABLE
ora.cvu
      1        ONLINE  ONLINE       hostname                 STABLE
ora.db0908_nrt17b.db
      1        ONLINE  ONLINE       hostname                 Open,HOME=/u01/app/o
                                                             racle/product/19.0.0
                                                             .0/dbhome_1,STABLE
ora.hostname.vip
      1        ONLINE  ONLINE       hostname                 STABLE
ora.qosmserver
      1        ONLINE  ONLINE       hostname                 STABLE
ora.scan1.vip
      1        OFFLINE OFFLINE                               STABLE
--------------------------------------------------------------------------------

3.DB設定(初期化パラメータ設定、PDB構築)


まず初期化パラメータでデフォルトからDBCSで変更されているパラメータを確認する。
SQL> create pfile='/tmp/pfile.ora' from spfile
SQL> !cat /tmp/pfile.ora
DB0908.__data_transfer_cache_size=0
DB0908.__db_cache_size=12314476544
DB0908.__inmemory_ext_roarea=0
DB0908.__inmemory_ext_rwarea=0
DB0908.__java_pool_size=67108864
DB0908.__large_pool_size=67108864
DB0908.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
DB0908.__pga_aggregate_target=3623878656
DB0908.__sga_target=14495514624
DB0908.__shared_io_pool_size=134217728
DB0908.__shared_pool_size=1879048192
DB0908.__streams_pool_size=0
DB0908.__unified_pga_pool_size=0
*._datafile_write_errors_crash_instance=false
*._db_writer_coalesce_area_size=16777216
*._disable_interface_checking=TRUE
*._enable_numa_support=FALSE
*._file_size_increase_increment=2143289344
*._fix_control='18960760:on'
*._gc_policy_time=20
*._gc_undo_affinity=TRUE
*.audit_file_dest='/u01/app/oracle/admin/DB0908_nrt17b/adump'
*.audit_sys_operations=TRUE
*.audit_trail='db'
*.compatible='19.0.0.0'
*.control_file_record_keep_time=15
*.control_files='+RECO/DB0908_NRT17B/CONTROLFILE/current.256.1082736593'
*.control_management_pack_access='DIAGNOSTIC+TUNING'
*.cpu_count=0
*.cursor_sharing='EXACT'
*.db_block_checking='FULL'
*.db_block_checksum='FULL'
*.db_block_size=8192
*.db_create_file_dest='+DATA'
*.db_create_online_log_dest_1='+RECO'
*.db_domain='subnet.vcn.oraclevcn.com'
*.db_files=1024
*.db_lost_write_protect='TYPICAL'
*.db_name='DB0908'
*.db_recovery_file_dest='+RECO'
*.db_recovery_file_dest_size=255g
*.db_unique_name='DB0908_nrt17b'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=DB0908XDB)'
*.enable_ddl_logging=TRUE
*.enable_pluggable_database=true
*.encrypt_new_tablespaces='ALWAYS'
*.fast_start_mttr_target=300
*.filesystemio_options='setall'
*.global_names=TRUE ★
*.local_listener='LISTENER_DB0908'
*.log_archive_format='%t_%s_%r.dbf'
*.log_buffer=16777216
*.nls_language='AMERICAN' ★
*.nls_territory='AMERICA' ★
*.open_cursors=1000
*.os_authent_prefix='ops$'
*.parallel_execution_message_size=16384
*.parallel_threads_per_cpu=2
*.pga_aggregate_limit=6912m
*.pga_aggregate_target=3456m
*.processes=400
*.remote_login_passwordfile='EXCLUSIVE'
*.session_cached_cursors=100
*.sga_target=13824m
*.spatial_vector_acceleration=TRUE
*.sql92_security=TRUE
*.undo_retention=900
*.undo_tablespace='UNDOTBS1'
*.use_large_pages='only'

今回は上記★のパラメータを変更し、インスタンスを再起動する。あわせて、環境変数にNLS_LANG=Japanese_Japan.AL32UTF8を入れておく(.bash_profileに追記)。
alter system set global_names=FALSE scope=BOTH;
alter system set nls_language='JAPANESE' scope=SPFILE;
alter system set nls_territory='JAPAN' scope=SPFILE;

次にPDBと検証用データを入れるためUSERS表領域を作成する。PDB作成は画面からもできるが、普通にsshで接続してコマンドで作成してみよう。
conn / as sysdba
CREATE PLUGGABLE DATABASE K3 ADMIN USER pdbadmin IDENTIFIED BY oracle;
alter pluggable database K3 open;
alter session set container=K3;
CREATE TABLESPACE "USERS" DATAFILE
SIZE 5242880
AUTOEXTEND ON NEXT 1310720 MAXSIZE 32767M
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO;
CREATE TABLESPACE "USERS" DATAFILE

ORA-28361: マスター鍵が設定されていません

SQL> !oerr ora 28361
28361, 0000, "master key not yet set"
// *Cause:  The master key for the instance was not set.
// *Action: Execute the ALTER SYSTEM SET KEY command to set a master key
//          for the database instance.

PDB作成は問題なかったが、その後の表領域の作成でORA-28361が出た。調べて見ると、以下MOSの情報が見つかった。TDEなのでPDBのマスターキーを作成しなければならないらしい。
 Creating and Activating a Master Encryption Key for a PDB (in OCI and OCI-Classic) (ドキュメントID 2469398.1)

PDBのマスター鍵のウォレットの場所はsqlnet.oraのENCRYPTION_WALLET_LOCATIONに記載されている。実際に見てみよう。
[oracle@hostname ~]$ cat $ORACLE_HOME/network/admin/sqlnet.ora
ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/opt/oracle/dcs/commonstore/wallets/tde/$ORACLE_UNQNAME))) ★

SQLNET.ENCRYPTION_SERVER=REQUIRED
SQLNET.CRYPTO_CHECKSUM_SERVER=REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER=(AES256,AES192,AES128)
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER=(SHA1)
SQLNET.ENCRYPTION_CLIENT=REQUIRED
SQLNET.CRYPTO_CHECKSUM_CLIENT=REQUIRED
SQLNET.ENCRYPTION_TYPES_CLIENT=(AES256,AES192,AES128)
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT=(SHA1)

このディレクトリの中を見てみよう。ewallet.p12がキーストアである。
[oracle@hostname ~]$ ll /opt/oracle/dcs/commonstore/wallets/tde/$ORACLE_UNQNAME
total 28
-rw------- 1 oracle asmadmin 5864 Sep  8 16:23 cwallet.sso
-rw------- 1 oracle asmadmin 5819 Sep  8 16:23 ewallet.p12 ★キーストア
-rw------- 1 oracle asmadmin 2555 Sep  8 16:23 ewallet_2021090807235219_defaultTag.p12

キーストアに何が入っているかはv$encryption_keysで確認できる。CON_IDが4となっているのが先ほど作成したPDBであるが、キーが登録されていないことがわかる。
SQL> sho pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 DB0908_PDB1                    READ WRITE NO
         4 K3                             READ WRITE NO
SQL> col key_id for a80
SQL> SELECT con_id, key_id FROM v$encryption_keys;

    CON_ID KEY_ID
---------- --------------------------------------------------------------------------------
         3 AXJnaod6Mk9Gv141a+DUiTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
         1 Af4aIwQwmk/+vxsp/kS7yd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA

v$encryption_walletの状態(STATUS)を見ると、OPEN_NO_MASTER_KEY状態と、確かにキーがない状態であることがわかる。

SQL> SELECT * FROM v$encryption_wallet

WRL_TYPE   WRL_PARAMETER                                                STATUS               WALLET_TYPE  WALLET_ORD KEYSTORE_MODE  FULLY_BACK     CON_ID
---------- ------------------------------------------------------------ -------------------- ------------ ---------- -------------- ---------- ----------
FILE       /opt/oracle/dcs/commonstore/wallets/tde/DB0908_nrt17b/       OPEN                 AUTOLOGIN    SINGLE     NONE           NO                  1
FILE                                                                    OPEN                 AUTOLOGIN    SINGLE     UNITED         NO                  2
FILE                                                                    OPEN                 AUTOLOGIN    SINGLE     UNITED         NO                  3
FILE                                                                    OPEN_NO_MASTER_KEY★   AUTOLOGIN    SINGLE     UNITED         UNDEFINED           4
SQL> alter session set container=k3;

エラーの原因が分かったので、以下の通り、このPDBに対し、ADMINISTER KEY MANAGEMENT SET KEYでマスター鍵を作成する。
SQL> alter session set container=;
SQL> ADMINISTER KEY MANAGEMENT SET KEY USING TAG 'YYYYMMDD' FORCE KEYSTORE IDENTIFIED BY "************" WITH BACKUP USING 'masterkey-';
キーストアが変更されました。

SQL> !ls -l /opt/oracle/dcs/commonstore/wallets/tde/xxx_yyy
total 36
-rw------- 1 oracle asmadmin 7528 Sep 10 09:19 cwallet.sso
-rw------- 1 oracle asmadmin 7483 Sep 10 09:19 ewallet.p12
-rw------- 1 oracle asmadmin 2555 Sep  8 16:23 ewallet_2021090807235219_defaultTag.p12
-rw------- 1 oracle asmadmin 5819 Sep 10 09:19 ewallet_2021091000195784_masterkey-k3.p12

SQL> SELECT con_id, key_id FROM v$encryption_keys;

    CON_ID KEY_ID
---------- --------------------------------------------------------------------------------
         4 AWF5Pvc+H0/Ov+U30kxnD7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAA★

SQL> SELECT * FROM v$encryption_wallet;

WRL_TYPE   WRL_PARAMETER                                                STATUS               WALLET_TYPE  WALLET_ORD KEYSTORE_MODE  FULLY_BACK     CON_ID
---------- ------------------------------------------------------------ -------------------- ------------ ---------- -------------- ---------- ----------
FILE                                                                    OPEN★               AUTOLOGIN    SINGLE     UNITED         NO                  4

マスター鍵が登録されたら、表領域作成をする。今度は問題なく作成できた。表領域の暗号化の状態を確認すると、ユーザの作成した表領域は暗号化されているが、SYSTEMやSYSAUXは暗号化されていない。これはDBCSの仕様らしい。いずれにしても業務データは入らないため特に問題はない。
SQL> CREATE TABLESPACE "USERS" DATAFILE 
  2    SIZE 5242880
  3    AUTOEXTEND ON NEXT 1310720 MAXSIZE 32767M
  4    LOGGING ONLINE PERMANENT BLOCKSIZE 8192
  5    EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT 
  6   NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO;

表領域が作成されました。

SQL> select tablespace_name,ENCRYPTED from dba_tablespaces

TABLESPACE ENCRYPTED
---------- ---------
SYSTEM     NO
SYSAUX     NO
UNDOTBS1   NO
TEMP       NO
USERS      YES

逆にDBCSで表領域を暗号化せずに作成することができるのだろうか。初期化パラメータENCRYPT_NEW_TABLESPACESは、新規表領域を作成する際の暗号化の挙動を制御するパラメータで
DBCSではALWAYSに指定してある。この他のオプションとして、表領域作成時に明示的に暗号化指定した際だけにするDDLというオプションを指定することができる。試しにやってみよう。
SQL> show parameter ENCRYPT_NEW_TABLESPACES 

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
encrypt_new_tablespaces              string                            ALWAYS
SQL> 

SQL> ALTER SYSTEM set encrypt_new_tablespaces=DDL scope=MEMORY;

システムが変更されました。

SQL> show parameter ENCRYPT_NEW_TABLESPACES

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
encrypt_new_tablespaces              string                            DDL
SQL> 
SQL> 
SQL> 
SQL> CREATE TABLESPACE "USERS2" DATAFILE 
  2    SIZE 5242880
  3    AUTOEXTEND ON NEXT 1310720 MAXSIZE 32767M
  4    LOGGING ONLINE PERMANENT BLOCKSIZE 8192
  5    EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT 
  6   NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO;
CREATE TABLESPACE "USERS2" DATAFILE
*
行1でエラーが発生しました。:
ORA-28427: 暗号化されていない表領域を作成、インポートまたはリストアできません: Oracle Cloud内のUSERS2

SQL> !oerr ora 28427
28427, 00000, "cannot create, import or restore unencrypted tablespace: %s in Oracle Cloud"
// *Cause:  The specified tablespaces were not encrypted, or were not allowed
//          to be decrypted. Oracle Cloud mandates that all tablespaces must
//          be encrypted.
// *Action: Create, import or restore an encrypted tablespace, or encrypt the
//          specified tablespace, or do not decrypt the specified tablespace.

上記のようにOracleクラウドでは表領域作成時に暗号化でないと作成できないようになっているようだ。セキュリティを考えると、妥当なデザインだろう。

今回はここまでとして、次回はOCIでSQL Serverを立ててみる部分について記載したい。

以上