OCIでPostgreSQLインスタンスの作成 [OCI]

 検証のためOCIのPostgreSQLインスタンスを作成したので備忘までメモを残しておく。細かな手順は別として、実際に構築してみてわかったのは以下の点である。
  • OSにログインはできない。psql等クライアントからの接続となる
  • バージョンは14.9(現時点で他に選択肢はない)
  • リードレプリカを作成可能(未検証)
  • postgresql.confは直接編集不可
  • ノード停止できない(起動したままとなる)
  • シェイプの変更はできない

実施した内容は以下の通り。詳細な手順は参考[1]のマニュアルを参照されたい。
  • 1.準備
  • 2.PostgreSQLインスタンス作成
  • 3.クライアントからの接続
  • 4.設定変更(timezone)

1.準備


 前提として、パブリックネットワークとプライベートネットワークから構成されるVCNがあるとする。PostgreSQLへ接続するコンピュートVMはパブリックネットワーク、PostgreSQLインスタンスはプライベートネットワークに配置するものとする。このため、プライベートネットワークのセキュリティリストにPostgreSQLの通信用に5432ポートの通信許可を追加する。
20240303_OCIPostgreSQL.jpg

 パブリックネットワークのクライアントVMには、PostgreSQLのクライアントを構成しておく。今回実施した手順は以下の通り(参考[2])。結果、psqlが使えることを確認する。
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install -y postgresql14-server

2.PostgreSQLインスタンス作成


 OCIコンソールのPostgreSQLメニューから、Create Database systemを選択し、以下を入力する。
  • Database system name: pg14
  • PostgreSQL major version: 14 (固定)
  • Node count: 1 (リードレプリカなし)
  • Performance tier: 300K IOPS (固定)
  • OCPU count: 2 (2,4,8,16,32,64から選択)
  • Network configuration: VCNとプライベートネットワーク、IPアドレスを指定
  • administrator credentials: pgadmin/xxxを指定 (OCI Vaultが利用可能)
  • Automatic backups: Enable/Daily/retention 1 dayを選択
  • Maintenance: set by oracleを指定(schdule your own maintenanceも選択可能)
  • Configuration: PostgreSQL.VM.Standard.E4.Flex.2.32GB-14-0_34 を指定(シェイプで決定される)

20240303_confdbsystem1.jpg

 レビュー画面で内容を確認しSubmitボタンを押下すると10分程度でインスタンス作成が完了しACTIVE状態になる。Connection detailから、EndpointのFQDNを確認しておく(今回は検証のためIPアドレスを直接指定する)。バックアップを取得しておく。
20240303_confdbsystem2.jpg

 設定(postgresql.conf)はシェイプ毎にOracleお勧めの設定がすでに用意されているので、普通に使うだけなら特に変更の必要はない。configurationメニューから設定されているパラメータセットの内容を確認することができる。ただ、ここで直接パラメータの変更はできない。パラメータセットを新規作成すると値を入力できるようだが、1つずつ入れていくのは現実的ではないので、何か良い方法があるのだろう。参考[4]に今回作成したpostgreSQLのパラメータを載せておく。
20240303_confdbsystem3.jpg

3.クライアントからの接続


 クライアントのコンピュートVMから、psqlで以下の通り接続する。
[opc@bastvm1 ~]$ psql -h 10.0.1.XX -U pgadmin -d postgres
Password for user pgadmin:
psql (14.11, server 14.9)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=> \l
                                         List of databases
   Name    |     Owner     | Encoding |   Collate   |    Ctype    |        Access privileges
-----------+---------------+----------+-------------+-------------+---------------------------------
 postgres  | pgadmin       | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | oci_superuser | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/oci_superuser               +
           |               |          |             |             | oci_superuser=CTc/oci_superuser
 template1 | oci_superuser | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/oci_superuser               +
           |               |          |             |             | oci_superuser=CTc/oci_superuser
(3 rows)

postgres=>

必要に応じて.pgpassを設定しておくと、パスワードを聞かれずに済むので楽になる。
[opc@bastvm1 ~]$ cat .pgpass
10.0.1.XX:5432:postgres:pgadmin:password
[opc@bastvm1 ~]$ ll .pgpass
-rw-------. 1 opc opc 45 Mar  3 05:13 .pgpass

4.設定変更


 検証用のDBを作成する。タイムゾーンがデフォルトUTCのため、Asia/Tokyoに変更する。postgresql.confを直接変更したいところだが、コンソールから直接変更することができないため、alter databaseで変更した。
[opc@bastvm1 ~]$ psql -h 10.0.1.XX -U pgadmin -d postgres
Password for user pgadmin:
...
postgres=> create database pgdb;
CREATE DATABASE
postgres=> \l
                                         List of databases
   Name    |     Owner     | Encoding |   Collate   |    Ctype    |        Acces
s privileges        
-----------+---------------+----------+-------------+-------------+-------------
--------------------
 pgdb★    | pgadmin       | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | pgadmin       | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
...(4 rows)

pgdb=> alter database pgdb set timezone='Asia/Tokyo';
ALTER DATABASE
postgres=> exit
[opc@bastvm1 ~]$ psql -h 10.0.1.XX -U pgadmin -d pgdb
Password for user pgadmin:
...
pgdb=> select now();
              now
-------------------------------
 2024-03-03 07:17:27.088856+09
(1 row)

pgdb=> show timezone;
  TimeZone
------------
 Asia/Tokyo
(1 row)

5.まとめ


 本稿ではOCIでPostgreSQLインスタンスを作成しクライアントから接続する手順を確認した。今回は単純なシングルインスタンスであったが、簡単にリードレプリカのノードを追加もできるようなので、時間があれば検証してみたい。さすがにOracleのBaseDBと比較すると、バージョンが固定であったり、CPUのスケーリングや停止ができないことなど制約があると感じた。postgresql.confの設定変更については便利な方法が望まれる。

参考


[1]OCI Database with PostgreSQL
[2]PostgreSQL Linux downloads (Red Hat family)
[3]PostgreSQLクライアントの構成例
[root@bastvm1 opc]# sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Last metadata expiration check: 0:06:25 ago on Sun 03 Mar 2024 04:32:27 AM JST.
pgdg-redhat-repo-latest.noarch.rpm               11 kB/s |  14 kB     00:01
Dependencies resolved.
================================================================================
 Package                Architecture Version           Repository          Size
================================================================================
Installing:
 pgdg-redhat-repo       noarch       42.0-38PGDG       @commandline        14 k

Transaction Summary
================================================================================
Install  1 Package

Total size: 14 k
Installed size: 15 k
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : pgdg-redhat-repo-42.0-38PGDG.noarch                    1/1
  Verifying        : pgdg-redhat-repo-42.0-38PGDG.noarch                    1/1

Installed:
  pgdg-redhat-repo-42.0-38PGDG.noarch

Complete!
[root@bastvm1 opc]#
[root@bastvm1 opc]# sudo dnf -qy module disable postgresql
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository "
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository "
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository "
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository "
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository "
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository "
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
[root@bastvm1 opc]#
[root@bastvm1 opc]# sudo dnf install -y postgresql14-server
Last metadata expiration check: 0:03:35 ago on Sun 03 Mar 2024 04:40:25 AM JST.
Dependencies resolved.
================================================================================
 Package               Arch     Version               Repository           Size
================================================================================
Installing:
 postgresql14-server   x86_64   14.11-1PGDG.rhel8     pgdg14              5.7 M
Installing dependencies:
 lz4                   x86_64   1.8.3-3.el8_4         ol8_baseos_latest   103 k
 postgresql14          x86_64   14.11-1PGDG.rhel8     pgdg14              1.5 M
 postgresql14-libs     x86_64   14.11-1PGDG.rhel8     pgdg14              281 k

Transaction Summary
================================================================================
Install  4 Packages

Total download size: 7.6 M
Installed size: 32 M
Downloading Packages:
(1/4): postgresql14-libs-14.11-1PGDG.rhel8.x86_ 111 kB/s | 281 kB     00:02
(2/4): postgresql14-14.11-1PGDG.rhel8.x86_64.rp 604 kB/s | 1.5 MB     00:02
(3/4): lz4-1.8.3-3.el8_4.x86_64.rpm              32 kB/s | 103 kB     00:03
(4/4): postgresql14-server-14.11-1PGDG.rhel8.x8 2.6 MB/s | 5.7 MB     00:02
--------------------------------------------------------------------------------
Total                                           1.6 MB/s | 7.6 MB     00:04
PostgreSQL 14 for RHEL / Rocky / AlmaLinux 8 -  2.4 MB/s | 2.4 kB     00:00
Importing GPG key 0x08B40D20:
 Userid     : "PostgreSQL RPM Repository "
 Fingerprint: D4BF 08AE 67A0 B4C7 A1DB CCD2 40BC A2B4 08B4 0D20
 From       : /etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : postgresql14-libs-14.11-1PGDG.rhel8.x86_64             1/4
  Running scriptlet: postgresql14-libs-14.11-1PGDG.rhel8.x86_64             1/4
  Installing       : lz4-1.8.3-3.el8_4.x86_64                               2/4
  Installing       : postgresql14-14.11-1PGDG.rhel8.x86_64                  3/4
  Running scriptlet: postgresql14-14.11-1PGDG.rhel8.x86_64                  3/4
  Running scriptlet: postgresql14-server-14.11-1PGDG.rhel8.x86_64           4/4
  Installing       : postgresql14-server-14.11-1PGDG.rhel8.x86_64           4/4
  Running scriptlet: postgresql14-server-14.11-1PGDG.rhel8.x86_64           4/4
  Verifying        : lz4-1.8.3-3.el8_4.x86_64                               1/4
  Verifying        : postgresql14-14.11-1PGDG.rhel8.x86_64                  2/4
  Verifying        : postgresql14-libs-14.11-1PGDG.rhel8.x86_64             3/4
  Verifying        : postgresql14-server-14.11-1PGDG.rhel8.x86_64           4/4

Installed:
  lz4-1.8.3-3.el8_4.x86_64
  postgresql14-14.11-1PGDG.rhel8.x86_64
  postgresql14-libs-14.11-1PGDG.rhel8.x86_64
  postgresql14-server-14.11-1PGDG.rhel8.x86_64

Complete!
[root@bastvm1 opc]#
[root@bastvm1 opc]# which psql
/bin/psql

[4]PostgreSQLパラメータ一覧:20240303_postgresqlconf.txt

OCI BaseDBの19cから23cへアップグレード(AutoUpgrade編) [OCI]

この記事は、JPOUG Advent Calendar 2023 20日目の記事です。19日目は HiroyukiNakaie さんの記事 「クラウドのリソース一覧をSQLで取得できるようにする」でした。

1.はじめに


 2023年9月にOCIのBase Database Serviceで23cが提供開始された。シングル構成に限るという制約はあるものの、23cの新規インスタンスを構成できるようになった。しかし、OCIコンソールで既存の19cの環境を23cへアップグレードする機能は提供されておらず、AutoUpgradeも23cに対応していない状況である。既存の19c環境を23cにアップグレードするには、前回のBlog記事のように新規環境を構築してデータ移行するのが一般的だろう。
 そんな中、Oracle社のアップグレードを専門とするDaniel Overby Hansen氏のブログ記事(参考[1])にAutoUpgradeを利用して19cのPDBを23cのBase Databaseへコピーする方法が紹介された。本稿では、この記事をもとに実際にOCIで19cのPDBを23cへアップグレードする検証をしてみたい。
 検証に用いた環境を下図に示す。左が移行元となる19cのソースDB(oradbvm1)で移行対象のPDB(oradb)を含む。PDBには、scottスキーマにEMP表100万件、DEPT表10万件が入っている。右が移行先となる23cのターゲットDB(oradbvm2)で、PDBはない状態。いずれもOCIのBaseDatabaseServiceを利用して環境を構築した。ターゲットDBからソースDBの移行対象PDBにDBLINKを作成し、AutoUpgradeを用いてPDBクローンによるアップグレードを行う。ターゲットDBのCDBには、23c用に必要な初期化パラメータや各種設定を行っておく。
20231220_upg23cTestEnv2.jpg

 アップグレードの基本的な手順は以下の通り。詳細は以下に述べていく。
3.準備
 AutoUpgradeツール・設定ファイルの配置
 ソースDBのDBLINKユーザ作成
 ターゲットDBのDBLINK作成
4.アナライズ・FIXUPS
 ソースDBのアナライズ(事前チェック)
  java -jar ./autoupgrade.jar -config oradb.cfg -mode analyze
 ソースDBのFIXUPS(事前チェックで検出された一部の自動修正)
  java -jar ./autoupgrade.jar -config oradb.cfg -mode fixups
5.アップグレード
 AutoupgradeへのTDEパスワード登録
  java -jar ./autoupgrade.jar -config oradb.cfg -load_password
 デプロイ(アップグレード)
  java -jar ./autoupgrade.jar -config oradb.cfg -mode deploy
6.事後作業
 ターゲットDBのPDBオープン
 サービス追加
 tnsnames.oraへの接続識別子追加
 接続確認

2.前提の理解


 本題に入る前にいくつか前提事項を整理しておきたい。まず、本手順で利用するAutoUpgradeツールは、ソースDBとターゲットDB両方に配置する必要がある。いずれの環境にも、もともと$ORACLE_HOMEにAutoUpgradeは含まれているが、19cのAutoUpgradeはターゲットDBとして23cはサポートしていない。そこで、ここでは23cのBase DatabaseのORACLE_HOMEに含まれるautoupgrade.jar(バージョンは23.3.230728)を19cのBase Databaseにコピーして使う。
 なお、AutoUpgradeの最新版はMOSからダウンロード可能である(参考[2])が、ここには23.3.230728は公開されていないため、OCIのBase Databaseの23cに含まれているautoupgradeは暫定的なリリースなのかもしれない。
[oracle@oradbvm2 ~]$ java -jar $ORACLE_HOME/rdbms/admin/autoupgrade.jar -version
build.version 23.3.230728 ★今回利用するAutoUpgradeのバージョン
build.date 2023/07/28 20:33:14 +0000
build.hash 58f81599
build.hash_date 2023/07/28 17:06:40 +0000
build.supported_target_versions 12.2,18,19,21,23
build.type production
build.label (HEAD, tag: v23.3, origin/devel, devel)

 AutoUpgradeを使うためには設定ファイルを用意する必要がある。今回作成したAutoUpgradeの設定ファイル(ここではoradb.cfgとした)は以下の通りである。パラメータの意味はAutoUpgradeマニュアル(参考[3])を、実際の設定は参考[4]を参照されたい。
global.autoupg_log_dir=/u01/app/oracle/cfgtoollogs/autoupgrade・・・ツールのログ出力先
global.keystore=/u01/app/oracle/cfgtoollogs/keystore・・・ツールのキーストア(パスワード)格納先
upg1.source_home=/u01/app/oracle/product/19.0.0.0/dbhome_1・・・ソースDBのORACLE_HOME
upg1.target_home=/u01/app/oracle/product/23.0.0.0/dbhome_1・・・ターゲットDBのORACLE_HOME
upg1.sid=coradb ★・・・ソースDBのSID
upg1.pdbs=oradb・・・ソースDBのPDB名
upg1.target_cdb=dummy ★・・・ターゲットDBのCDB名
upg1.source_dblink.oradb=clonepdb 600 ☆・・・ソースPDBへのDBLINK名とクローンのリフレッシュレート(600秒毎)
upg1.target_pdb_copy_option.oradb=file_name_convert=none・・・PDBのコピーオプション(ASMとOMFを利用)
upg1.target_version=23・・・ターゲットDBのバージョン
upg1.start_time=now ☆・・・アップグレードの実行タイミング(nowだと直ちに実行。時刻も指定可能)

 1点つまずいたのは、ソースDBとターゲットDBのSIDの設定を同じ(coradb)にすると、「The target_cdb parameter matches the sid parameter for coradb」というメッセージが出て、autoupgradeがエラーとなってしまう点である。これを回避するには、★部分をソースDBとターゲットDBで設定値を変更する必要がある。具体的には、ソースDBに配置する場合は、upg1.sidにソースDBのSIDを指定、upg1.target_cdbにはdummyを、逆にターゲットDBに配置する場合は、upg1.sidにdummyを指定、upg1.target_cdbにはターゲットDBのSIDを指定した。この点については、もっと良い方法があるのかもしれない。
 もう1点特筆すべきは、☆部分のstart_timeについてである。今回はnowを指定してアップグレードを即時実行することを指示した。実はここに特定の未来時刻を指定すると、その時刻にアップグレードを実行することができる。その際、source_dblink.oradbに指定するリフレッシュレートでアップグレード直近までPDBのリフレッシュが行われる。

3.準備


 ソースDBにて、作業ディレクトリ/home/oracle/autoupgを作成し、資材を配置する。oradb.cfgは参考[3]のソースDBの設定を使う。
[oracle@oradbvm1 ~]$ mkdir autoupg
[oracle@oradbvm1 ~]$ cd autoupg
[oracle@oradbvm1 autoupg]$ scp 10.0.1.12:/u01/app/oracle/product/23.0.0.0/dbhome
_1/rdbms/admin/autoupgrade.jar .
oracle@10.0.1.12's password:
autoupgrade.jar                               100% 5227KB 124.9MB/s   00:00
[oracle@oradbvm1 autoupg]$ vi oradb.cfg
[oracle@oradbvm1 autoupg]$ ll
total 5232
-rw-r----- 1 oracle oinstall 5352158 Nov 29 10:28 autoupgrade.jar
-rw-r--r-- 1 oracle oinstall     426 Nov 29 10:36 oradb.cfg

 ターゲットDBにて、作業ディレクトリ/home/oracle/autoupgを作成し、資材を配置する。
[oracle@oradbvm2 ~]$ mkdir autoupg
[oracle@oradbvm2 ~]$ cd autoupg
[oracle@oradbvm2 autoupg]$ vi oradb.cfg
[oracle@oradbvm2 autoupg]$ ll
total 5232
-rw-r----- 1 oracle oinstall 5352158 Nov 29 10:32 autoupgrade.jar
-rw-r--r-- 1 oracle oinstall     426 Nov 29 10:38 oradb.cfg
[oracle@oradbvm2 autoupg]$

 ソースDBにて、DBLINKの接続用ユーザを作成し、必要な権限を付与する。
SQL> create user dblinkuser identified by "XXX";
User created.

SQL> grant create session, create pluggable database, select_catalog_role to dblinkuser;
Grant succeeded.

SQL> grant read on sys.enc$ to dblinkuser;
Grant succeeded.

 ターゲットDBにて、DBLINKを作成するため、初期化パラメータglobal_namesをfalseに設定する。
SQL> alter system set global_names=FALSE scope=BOTH;
System altered.

SQL> show parameter global_names
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     FALSE

 ターゲットDBにて、DBLINKを作成する。ソースDBへのDBLINKの動作も確認しておく。
SQL> create database link clonepdb connect to dblinkuser identified by "XXX" using 'oradb_oradbvm1';
Database link created.
SQL> select banner_full from v$version@clonepdb;

BANNER_FULL
--------------------------------------------------------------------------------
Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.20.0.0.0

4.アナライズとFIXUPS


 ソースDBのアナライズを実施する。ジョブが正常終了すれば完了。
[oracle@oradbvm1 autoupg]$ java -jar ./autoupgrade.jar -config oradb.cfg -mode analyze
AutoUpgrade 23.3.230728 launched with default internal options
Processing config file ...
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 PDB(s) will be analyzed
Type 'help' to list console commands
upg> Job 101 completed
------------------- Final Summary --------------------
Number of databases            [ 1 ]

Jobs finished                  [1]
Jobs failed                    [0]

Please check the summary report at:
/u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.html
/u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.log
[oracle@oradbvm1 autoupg]$

 アナライズの結果のサマリレポートを確認する。ここで、ORADB TDE_PASSWORDS_REQUIREDとORADB TARGET_CDB_AVAILABILITYの2つは後続の手順で対処するため、無視する(参考[1]手順記載の通り)。[Detail]に記載されたログ(参考[5])に詳細な結果が記載されているので結果を確認する。ソースDBのデータベースの状態やコンポーネント、アップグレードに際して必要なアクション、推奨されるアクション、そのうち(この後実行する)FIXUPで修正される対象など重要な情報が記載されている。
[oracle@oradbvm1 autoupg]$ cat /u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.log
==========================================
          Autoupgrade Summary Report
==========================================
[Date]           Wed Nov 29 10:47:26 JST 2023
[Number of Jobs] 1
==========================================
[Job ID] 101
==========================================
[DB Name]                coradb_oradbvm1
[Version Before Upgrade] 19.20.0.0.0
[Version After Upgrade]  23
------------------------------------------
[Stage Name]    PRECHECKS
[Status]        FAILURE
[Start Time]    2023-11-29 10:46:34
[Duration]
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/101/prechecks
[Detail]        /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/101/prechecks/coradb_oradbvm1_preupgrade.log
                Check failed for ORADB, manual intervention needed for the below checks
                [TDE_PASSWORDS_REQUIRED, TARGET_CDB_AVAILABILITY]
Cause:The following checks have ERROR severity and no fixup is available or
the fixup failed to resolve the issue. Fix them manually before continuing:
ORADB TDE_PASSWORDS_REQUIRED
ORADB TARGET_CDB_AVAILABILITY
Reason:Database Checks has Failed details in /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/101/prechecks
Action:[MANUAL]
Info:Return status is ERROR
ExecutionError:No
Error Message:The following checks have ERROR severity and no fixup is available or
the fixup failed to resolve the issue. Fix them manually before continuing:
ORADB TDE_PASSWORDS_REQUIRED
ORADB TARGET_CDB_AVAILABILITY

------------------------------------------
[oracle@oradbvm1 autoupg]$

 次にFIXUPを実行する。ここでアップグレード前にソースDBに対する必要な修正が実行される。しかし、UPG-1321で異常終了してしまう。
[oracle@oradbvm1 autoupg]$ java -jar ./autoupgrade.jar -config oradb.cfg -mode fixups
AutoUpgrade 23.3.230728 launched with default internal options
Processing config file ...
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 PDB(s) will be processed
Type 'help' to list console commands
upg> "Database fixup failed with a runtime exception"  (conName="ORADB", stage="PREFIXUPS", checkName="NEW_TIME_ZONES_EXIST")

-------------------------------------------------
Errors in database [coradb]
Stage     [PREFIXUPS]
Operation [STOPPED]
Status    [ERROR]
Info    [
Error: UPG-1321
1 fixups with runtime errors
Cause: Runtime exception during Pre-Upgrade Fix-Up execution
For further details, see the log file located at /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/102/autoupgrade_20231129_user.log]

-------------------------------------------------
Logs: [/u01/app/oracle/cfgtoollogs/autoupgrade/coradb/102/autoupgrade_20231129_user.log]
-------------------------------------------------
upg>

 ログから以下のNEW_TIME_ZONES_EXISTのチェックの部分でエラーが発生していることを確認した。原因を探るため、failed_prefixups.logで詳細を確認する。
/u01/app/oracle/cfgtoollogs/autoupgrade/coradb/102/autoupgrade_20231129_user.log
...
2023-11-29 10:51:48.472 INFO Creating summary of the fixups which ran with errors in /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/102/prefixups/failed_prefixups.log ★
2023-11-29 10:51:48.473 ERROR "Database fixup failed with a runtime exception"  (conName="ORADB", stage="PREFIXUPS", checkName="NEW_TIME_ZONES_EXIST") ★

 ログを確認すると、ターゲットDBのzoneinfoディレクトリ配下のファイルを参照しようとしてNoSuchFileExceptionエラーになっているようである。これはORACLE_HOMEに含まれるファイルだが、当然ソースDBには23cのORACLE_HOMEディレクトリは存在しない。このロジックは、ソースDBとターゲットDBが同一DBサーバ上にあることを前提としているのかもしれない。
/u01/app/oracle/cfgtoollogs/autoupgrade/coradb/102/prefixups/failed_prefixups.log
...
2023-11-29 10:50:54.042 INFO Copying /u01/app/oracle/product/19.0.0.0/dbhome_1/oracore/zoneinfo/readme.txt to /u01/app/oracle/product/23.0.0.0/dbhome_1/oracore/zoneinfo/readme.txt - new_time_zones_exist.copyTimezone
2023-11-29 10:50:54.043 ERROR
============================ check info ============================
[ORADB][NEW_TIME_ZONES_EXIST][WARNING] ★
============================ check info ============================
=========================== trace start ==============================
Exception: NoSuchFileException ★
Err message: /u01/app/oracle/product/23.0.0.0/dbhome_1/oracore/zoneinfo/readme.txt
java.nio.file.NoSuchFileException: /u01/app/oracle/product/23.0.0.0/dbhome_1/oracore/zoneinfo/readme.txt ★

 仕方がないので、ターゲットDBのzoneinfo配下をソースDBにコピーする(readme.txtだけコピーではダメだったので、ディレクトリ配下のファイルを全てscpでコピー)。
[root@oradbvm1 ~]# mkdir -p /u01/app/oracle/product/23.0.0.0/dbhome_1/oracore/zoneinfo/
[root@oradbvm1 ~]# chown -R oracle:oinstall /u01/app/oracle/product/23.0.0.0/dbhome_1
[root@oradbvm1 ~]# cd /u01/app/oracle/product/23.0.0.0/dbhome_1/oracore/zoneinfo/
[oracle@oradbvm1 zoneinfo]$ scp -r 10.0.1.12:/u01/app/oracle/product/23.0.0.0/dbhome_1/oracore/zoneinfo/* .
oracle@10.0.1.12's password:
timezlrg_24.dat                               100%  759KB  96.8MB/s   00:00
timezone_22.dat                               100%  336KB  75.8MB/s   00:00
timezone_19.dat                               100%  335KB  94.4MB/s   00:00
...
timezone_8.dat                                100%  295KB  93.6MB/s   00:00
timezone_9.dat                                100%  343KB  98.4MB/s   00:00
[oracle@oradbvm1 zoneinfo]$ ll

 再度FIXUPを実行すると、ジョブは正常終了する。ログを確認すると、PRECHECKSはアナライズで出たエラーと同じもの(無視可能)が出るが、PREFIXUPSは成功している。ソースPDBへどのような変更がされたかが気になるところであるが、prefixups.htmlを見る限り、変更点は何もなかった。FIXUPSの手順自体不要だったのではという一抹の疑念はあるものの、一応手順は踏んでおいた方が良いのだろう。
[oracle@oradbvm1 autoupg]$ java -jar ./autoupgrade.jar -config oradb.cfg -mode fixups
AutoUpgrade 23.3.230728 launched with default internal options
Processing config file ...
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 PDB(s) will be processed
Type 'help' to list console commands
upg> Job 104 completed
------------------- Final Summary --------------------
Number of databases            [ 1 ]

Jobs finished                  [1]
Jobs failed                    [0]

Please check the summary report at:
/u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.html
/u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.log
[oracle@oradbvm1 autoupg]$
[oracle@oradbvm1 autoupg]$ cat /u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.log
==========================================
          Autoupgrade Summary Report
==========================================
[Date]           Wed Nov 29 11:55:14 JST 2023
[Number of Jobs] 1
==========================================
[Job ID] 104
==========================================
[DB Name]                coradb_oradbvm1
[Version Before Upgrade] 19.20.0.0.0
[Version After Upgrade]  23
------------------------------------------
[Stage Name]    PRECHECKS
[Status]        FAILURE
[Start Time]    2023-11-29 11:53:44
[Duration]      0:00:45
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/104/prechecks
[Detail]        /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/104/prechecks/coradb_oradbvm1_preupgrade.log
                Check failed for ORADB, manual intervention needed for the below checks
                [TDE_PASSWORDS_REQUIRED, TARGET_CDB_AVAILABILITY]
Cause:The following checks have ERROR severity and no fixup is available or
the fixup failed to resolve the issue. Fix them manually before continuing:
ORADB TDE_PASSWORDS_REQUIRED
ORADB TARGET_CDB_AVAILABILITY
Reason:Database Checks has Failed details in /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/104/prechecks
Action:[MANUAL]
Info:Return status is ERROR
ExecutionError:No
Error Message:The following checks have ERROR severity and no fixup is available or
the fixup failed to resolve the issue. Fix them manually before continuing:
ORADB TDE_PASSWORDS_REQUIRED
ORADB TARGET_CDB_AVAILABILITY

------------------------------------------
[Stage Name]    PREFIXUPS
[Status]        SUCCESS
[Start Time]    2023-11-29 11:54:29
[Duration]
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/104/prefixups
[Detail]        /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/104/prefixups/prefixups.html
------------------------------------------

 念のため、エラーの発生したNEW_TIME_ZONES_EXISTのチェックがパスしていることを確認。
 /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/104/prechecks/prechecks_oradb.log
 ...
  2538  2023-11-29 11:55:06.293 INFO Zone Directory /u01/app/oracle/product/23.0.0.0/dbhome_1/oracore/zoneinfo Defaulting TimeZone Value 36 - UpgradeUtilities.getTimeZoneReleasedVersion
  2539  2023-11-29 11:55:06.297 INFO TimeZone latest release value 42 from directory /u01/app/oracle/product/23.0.0.0/dbhome_1/oracore/zoneinfo - UpgradeUtilities.getTimeZoneReleasedVersion
  2540  2023-11-29 11:55:06.297 INFO End  - UpgradeUtilities.getTimeZoneReleasedVersion
  2541  2023-11-29 11:55:06.297 ★INFO Finished check [NEW_TIME_ZONES_EXIST][ORADB][PASSED] - CheckTrigger.call

5.アップグレード


 ターゲットDBにて、AutoUpgradeのキーストアにORACLE_SIDのTDEパスワードを設定する。本環境ではソースDBとターゲットDBのSIDは同一かつパスワードも同じなので、以下のように1つだけ登録する(元の手順ではソースDBとターゲットDB両方のパスワードを設定している)。
[oracle@oradbvm2 autoupg]$ java -jar ./autoupgrade.jar -config oradb.cfg -load_password
Processing config file ...

Starting AutoUpgrade Password Loader - Type help for available options
Creating new AutoUpgrade keystore - Password required
Enter password:
Enter password again:
AutoUpgrade keystore was successfully created

TDE> add coradb ★
Enter your secret/Password:
Re-enter your secret/Password:
TDE> save
Convert the AutoUpgrade keystore to auto-login [YES|NO] ? yes
TDE> list
+----------+---------------+------------------+-----------+------------------+
|ORACLE_SID|Action Required|      TDE Password|SEPS Status|Active Wallet Type|
+----------+---------------+------------------+-----------+------------------+
|    coradb|               |          Verified|   Inactive|               Any|
|     dummy|               |No password loaded|   Inactive|               Any|
+----------+---------------+------------------+-----------+------------------+
TDE> exit

AutoUpgrade Password Loader finished - Exiting AutoUpgrade
[oracle@oradbvm2 autoupg]$

 ターゲットDBにて、デプロイを実行する。ここで実際にDBLINK越しにPDBがクローンされ23cへのアップグレードが実行される。ログを見ると、AutoUpgradeのデプロイの各タスクでどの程度の時間がかかったかが確認できる。全体でかかった時間は概ね40分程度だが、うち30分はDBUPGRADE、10分はPOSTFIXUPSで占められていた(★部分)。
[oracle@oradbvm2 autoupg]$ java -jar ./autoupgrade.jar -config oradb.cfg -mode deploy
AutoUpgrade 23.3.230728 launched with default internal options
Processing config file ...
Loading AutoUpgrade keystore
AutoUpgrade keystore was successfully loaded
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 PDB(s) will be processed
Type 'help' to list console commands
upg> Copying remote database 'ORADB' as 'ORADB' for job 100
Remote database 'ORADB' created as PDB 'ORADB' for job 100
Job 100 completed
------------------- Final Summary --------------------
Number of databases            [ 1 ]

Jobs finished                  [1]
Jobs failed                    [0]
Jobs restored                  [0]
Jobs pending                   [0]



Please check the summary report at:
/u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.html
/u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.log
[oracle@oradbvm2 autoupg]$
[oracle@oradbvm2 autoupg]$ cat /u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.log
==========================================
          Autoupgrade Summary Report
==========================================
[Date]           Wed Nov 29 14:31:42 JST 2023
[Number of Jobs] 1
==========================================
[Job ID] 100
==========================================
[DB Name]                coradb_oradbvm1
[Version Before Upgrade] 19.20.0.0.0
[Version After Upgrade]  23.3.0.23.09
------------------------------------------
[Stage Name]    PREUPGRADE
[Status]        SUCCESS
[Start Time]    2023-11-29 13:50:47
[Duration]      0:00:00
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/dummy/100/preupgrade
------------------------------------------
[Stage Name]    DRAIN
[Status]        SUCCESS
[Start Time]    2023-11-29 13:50:47
[Duration]      0:00:02
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/dummy/100/drain
------------------------------------------
[Stage Name]    CLONEPDB
[Status]        SUCCESS
[Start Time]    2023-11-29 13:50:50
[Duration]      0:00:24
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/dummy/100/clonepdb
------------------------------------------
[Stage Name]    REFRESHPDB
[Status]        SUCCESS
[Start Time]    2023-11-29 13:51:14
[Duration]      0:00:03
------------------------------------------
[Stage Name]    DBUPGRADE
[Status]        SUCCESS
[Start Time]    2023-11-29 13:51:21
[Duration]      0:29:48★
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/dummy/100/dbupgrade
------------------------------------------
[Stage Name]    UNPLUGWORK
[Status]        SUCCESS
[Start Time]    2023-11-29 14:21:10
[Duration]      0:00:07
------------------------------------------
[Stage Name]    POSTCHECKS
[Status]        SUCCESS
[Start Time]    2023-11-29 14:21:17
[Duration]      0:00:14
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/dummy/100/postchecks
[Detail]        /u01/app/oracle/cfgtoollogs/autoupgrade/dummy/100/postchecks/coradb_oradbvm1_postupgrade.log
                Check passed and no manual intervention needed
------------------------------------------
[Stage Name]    POSTFIXUPS
[Status]        SUCCESS
[Start Time]    2023-11-29 14:21:32
[Duration]      0:10:09★
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/dummy/100/postfixups
[Detail]        /u01/app/oracle/cfgtoollogs/autoupgrade/dummy/100/postfixups/postfixups.html
------------------------------------------
[Stage Name]    POSTUPGRADE
[Status]        SUCCESS
[Start Time]    2023-11-29 14:31:41
[Duration]      0:00:00
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/dummy/100/postupgrade
------------------------------------------
[Stage Name]    SYSUPDATES
[Status]        SUCCESS
[Start Time]    2023-11-29 14:31:42
[Duration]
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/dummy/100/sysupdates
------------------------------------------
Summary: /u01/app/oracle/cfgtoollogs/autoupgrade/dummy/100/dbupgrade/upg_summary.log
[oracle@oradbvm2 autoupg]$

6.事後作業


 ターゲットDBにて、早速移行されたPDBの状態を確認する。確かにORADBが作成されていることがわかる。
[oracle@oradbvm2 admin]$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Production on Sat Dec 2 17:36:34 2023
Version 23.3.0.23.09

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


Connected to:
Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
Version 23.3.0.23.09

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORADB                          READ WRITE NO ★

 PDBのリソースの確認を行い、LISTENERでサービスが認識されることを確認する。
[oracle@oradbvm2 ~]$
[oracle@oradbvm2 ~]$ lsnrctl status LISTENER
...
Service "coradb_oradb.paas.oracle.com" has 1 instance(s).
  Instance "coradb", status READY, has 2 handler(s) for this service...
...
[grid@oradbvm2 ~]$ crsctl stat res -t
...
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
...
ora.coradb_oradbvm2.db
      1        ONLINE  ONLINE       oradbvm2                 Open,HOME=/u01/app/o
                                                             racle/product/23.0.0
                                                             .0/dbhome_1,STABLE
ora.coradb_oradbvm2.oradb.pdb ★
      1        ONLINE  ONLINE       oradbvm2                 READ WRITE,STABLE
ora.cvu
      1        ONLINE  ONLINE       oradbvm2                 STABLE
ora.oradbvm2.vip
      1        ONLINE  ONLINE       oradbvm2                 STABLE
ora.scan1.vip
      1        OFFLINE OFFLINE                               STABLE
--------------------------------------------------------------------------------
[grid@oradbvm2 ~]$

 tnsnames.oraへの接続識別子を追加する。
[oracle@oradbvm2 ~]$ cat $ORACLE_HOME/network/admin/tnsnames.ora
...
ORADB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oradbvm2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = coradb_oradb.paas.oracle.com)
    )
  )

 追加した接続識別子で接続確認する。EMP、DEPT表にソースDBのオブジェクトが格納されており、正しい件数が確認できた。
[oracle@oradbvm2 ~]$ sqlplus scott/XXX@oradb

SQL*Plus: Release 23.0.0.0.0 - Production on Sat Dec 2 17:43:45 2023
Version 23.3.0.23.09

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

Last Successful login time: Fri Nov 24 2023 12:56:29 +09:00

Connected to:
Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
Version 23.3.0.23.09

SQL> select count(*) from emp;

  COUNT(*)
----------
   1000000

SQL> select count(*) from dept;

  COUNT(*)
----------
    100000

SQL>

7.まとめ


 本稿では、AutoUpgradeを利用して、OCIの19cのPDBを23cのBase Databaseへアップグレードを行った。参考にした手順はあっさりしていたので、簡単に検証できると思ったが、環境の違いによるAutoUpgradeの想定外のエラー対応や、そもそもAutoUpgradeへの理解の不足等で思ったより手こずってしまった。
 AutoUpgradeはいずれ23cに対応するので、OCIコンソール画面から23cへアップグレードもできるようになるのは時間の問題だろう。それでも、本手順はアップグレード後も元の環境を残しておける点は有用と感じる。複数PDBを面として利用している場合など、切り替えを段階的に実行したいケースもあるだろう。
 AutoUpgradeは設定ファイルや環境の事前準備・検証が必要であるが、一度仕組みができてしまえば移行対象のDB数が多くても効率的に移行が実現できる点も大きなメリットである。今回は移行対象は1PDBだったが、複数PDBだったとしても設定ファイルに追加するだけである。効果的に利用するためにも、AutoUpgradeの仕様の理解を深めたい。

参考


[1]Upgrade Base Database Cloud Service to Oracle Database 23c
[2]AutoUpgrade Tool (Doc ID 2485457.1)
[3]Using AutoUpgrade for Oracle Database Upgrades
[4]autoupgradeの設定ファイル
oradb.cfg
---ソースDB用
global.autoupg_log_dir=/u01/app/oracle/cfgtoollogs/autoupgrade
global.keystore=/u01/app/oracle/cfgtoollogs/keystore
upg1.source_home=/u01/app/oracle/product/19.0.0.0/dbhome_1
upg1.target_home=/u01/app/oracle/product/23.0.0.0/dbhome_1
upg1.sid=coradb
upg1.pdbs=oradb
upg1.target_cdb=dummy
upg1.source_dblink.oradb=clonepdb 600
upg1.target_pdb_copy_option.oradb=file_name_convert=none
upg1.target_version=23
upg1.start_time=now
---ターゲットDB用
global.autoupg_log_dir=/u01/app/oracle/cfgtoollogs/autoupgrade
global.keystore=/u01/app/oracle/cfgtoollogs/keystore
upg1.source_home=/u01/app/oracle/product/19.0.0.0/dbhome_1
upg1.target_home=/u01/app/oracle/product/23.0.0.0/dbhome_1
upg1.sid=dummy
upg1.pdbs=oradb
upg1.target_cdb=coradb
upg1.source_dblink.oradb=clonepdb 600
upg1.target_pdb_copy_option.oradb=file_name_convert=none
upg1.target_version=23
upg1.start_time=now

[5]アナライズのプレチェック結果サンプル
[oracle@oradbvm1 ~]$ cat /u01/app/oracle/cfgtoollogs/autoupgrade/coradb/101/prechecks/coradb_oradbvm1_preupgrade.log
Report generated by AutoUpgrade 23.3.230728 (#58f81599) on 2023-11-29 10:47:25

Upgrade-To version: 23.0.0.0.0

=======================================
Status of the database prior to upgrade
=======================================
      Database Name:  coradb
     Container Name:  ORADB
       Container ID:  3
            Version:  19.20.0.0.0
     DB Patch Level:  Database Release Update : 19.20.0.0.230718 (35320081)
         Compatible:  19.0.0.0
          Blocksize:  8192
           Platform:  Linux x86 64-bit
      Timezone File:  40
  Database log mode:  ARCHIVELOG
           Readonly:  false
            Edition:  EE

  Oracle Component                       Upgrade Action    Current Status
  ----------------                       --------------    --------------
  OLAP Analytic Workspace                [to be upgraded]  VALID
  Oracle Server                          [to be upgraded]  VALID
  Oracle Java Packages                   [to be upgraded]  VALID
  Oracle Text                            [to be upgraded]  VALID
  Oracle Database Vault                  [to be upgraded]  VALID
  JServer JAVA Virtual Machine           [to be upgraded]  VALID
  Oracle Label Security                  [to be upgraded]  VALID
  Oracle Multimedia                      [to be removed]   VALID
  Oracle Workspace Manager               [to be upgraded]  VALID
  Real Application Clusters              [to be upgraded]  VALID
  Oracle Spatial                         [to be upgraded]  VALID
  Oracle XML Database                    [to be upgraded]  VALID
  Oracle XDK for Java                    [to be upgraded]  VALID
  Oracle OLAP API                        [to be upgraded]  VALID

  *
  * ALL Components in This Database Registry:
  *
  Component   Current      Current      Original     Previous     Component
  CID         Version      Status       Version      Version      Schema
  ----------  -----------  -----------  -----------  -----------  ------------
  APS         19.20.0.0.0  VALID        19.18.0.0.0               SYS
  CATALOG     19.20.0.0.0  VALID        19.18.0.0.0               SYS
  CATJAVA     19.20.0.0.0  VALID        19.18.0.0.0               SYS
  CATPROC     19.20.0.0.0  VALID        19.18.0.0.0               SYS
  CONTEXT     19.20.0.0.0  VALID        19.18.0.0.0               CTXSYS
  DV          19.20.0.0.0  VALID        19.18.0.0.0               DVSYS
  JAVAVM      19.20.0.0.0  VALID        19.18.0.0.0               SYS
  OLS         19.20.0.0.0  VALID        19.18.0.0.0               LBACSYS
  ORDIM       19.20.0.0.0  VALID        19.18.0.0.0               ORDSYS
  OWM         19.20.0.0.0  VALID        19.18.0.0.0               WMSYS
  RAC         19.20.0.0.0  VALID        19.18.0.0.0               SYS
  SDO         19.20.0.0.0  VALID        19.18.0.0.0               MDSYS
  XDB         19.20.0.0.0  VALID        19.18.0.0.0               XDB
  XML         19.20.0.0.0  VALID        19.18.0.0.0               SYS
  XOQ         19.20.0.0.0  VALID        19.18.0.0.0               OLAPSYS

==============
BEFORE UPGRADE
==============

  REQUIRED ACTIONS
  ================
  1.  Perform the specified action for each database in order to satisfy
      AutoUpgrade's TDE keystore requirements. This will involve adding the TDE
      keystore password for the database into either AutoUpgrade's keystore
      using the -load_password command line option or into a Secure External
      Password Store (SEPS) for the database. Once the upgrade has finished and
      there is no intention to use AutoUpgrade's system restore functionality
      to rerun the upgrade, the AutoUpgrade keystore file(s) can be removed
      from the directory or path referenced by the global.keystore
      configuration parameter.

      At this point, either (1) the TDE keystore password(s) required by
      AutoUpgrade have not been loaded into AutoUpgrade's keystore or a Secure
      External Password Store or (2) the auto-login keystore status of the
      database has not been modified. Review the required actions for each of
      the following databases:

      ORACLE_SID                      Action Required
      ------------------------------  ----------------------------------------
      dummy                           Open database

      For AutoUpgrade to upgrade a database using Oracle Transparent Data
      Encryption (TDE), the following conditions must be met:

      1. The TDE keystore password(s) required by AutoUpgrade must be loaded
      into AutoUpgrade's keystore or a Secure External Password Store for the
      database.

      When the source database uses TDE, AutoUpgrade requires TDE passwords for
      the databases listed below:
      * Both the source non-CDB and the target CDB of a non-CDB to PDB operation
      * Both the source CDB and the target CDB of an unplug-plug operation
      * Only the target CDB of an unplug-relocate operation

      2. The target CDB, if specified, must have an auto-login TDE keystore if
      its version is earlier than Oracle Database 19.11

      3. To upgrade a non-CDB or an entire CDB, the TDE keystore must be an
      auto-login keystore. This requirement also applies to a non-CDB to PDB
      operation, but only if the target CDB is at an Oracle Database Release
      earlier than 21c. If earlier than 21c, AutoUpgrade performs a standard
      upgrade of the non-CDB to the target version prior to creating the PDB in
      the target CDB.

  2.  Open the target CDB, dummy. Additionally, rerun the previous AutoUpgrade
      command as there are multiple checks that depend on the target CDB being
      available. Those checks have been temporarily marked as successful until
      the target CDB is open.

      The target CDB, dummy, is closed or unavailable.

      The target CDB, dummy, must be open in order to create a PDB during a
      non-CDB-to-PDB or unplug-plug operation.

  RECOMMENDED ACTIONS
  ===================
  3.  (AUTOFIXUP) Connect to the database as SYS to drop all Data Pump Advanced
      Queuing (AQ) tables prior to upgrading. Check MOS note 2789059.1 for
      details.

      There exists at least one Data Pump Advanced Queuing (AQ) table in the
      SYS schema which might prevent Data Pump AQ message types from getting
      re-created.

      The database needs to be free of Data Pump Advanced Queuing (AQ) tables
      in order for Data Pump AQ message types to be re-created during the
      database upgrade.

  4.  (AUTOFIXUP) Patch the new 23 $ORACLE_HOME/oracore/zoneinfo/ with the
      version 40 time zone data file from the 19.0.0.0.0
      $ORACLE_HOME/oracore/zoneinfo/.

      The database is using a time zone file version 40 that is newer than the
      version 36 in the target $ORACLE_HOME/oracore/zoneinfo directory.

      The time zone file version used in your database must exist in the new
      Oracle home before upgrading the database.

  5.  Convert your traditional audit configurations to unified audit policies
      and enable them. To continue using traditional audit in 23c, make sure
      initialization parameters AUDIT_TRAIL and AUDIT_SYS_OPERATIONS are set in
      the database after the upgrade process. This is intended as a temporary
      measure until you have time to convert to unified audit. Refer to MOS
      note 2909718.1 for more details on converting to unified audit.

      Traditional audit configuration is found in this database.

      Starting in 23c, Oracle unified audit is the auditing configuration for
      use in newly created databases. Support for traditional audit in 23c is
      limited to upgraded databases. On database upgrades, existent traditional
      audit settings are operational post upgrade for continued generation of
      audit records to the traditional audit trails. However, new traditional
      audit configurations cannot be created. Oracle strongly recommends to
      start using unified audit at the earliest opportunity.

  6.  (AUTOFIXUP) Gather stale data dictionary statistics prior to database
      upgrade in off-peak time using:

        EXECUTE DBMS_STATS.GATHER_DICTIONARY_STATS;

      Dictionary statistics do not exist or are stale (not up-to-date).

      Dictionary statistics help the Oracle optimizer find efficient SQL
      execution plans and are essential for proper upgrade timing. Oracle
      recommends gathering dictionary statistics in the last 24 hours before
      database upgrade.

      For information on managing optimizer statistics, refer to the 19.0.0.0
      Oracle Database Upgrade Guide.

  INFORMATION ONLY
  ================
  7.  To help you keep track of your tablespace allocations, the following
      AUTOEXTEND tablespaces are expected to successfully EXTEND during the
      upgrade process.

                                                 Min Size
      Tablespace                        Size     For Upgrade
      ----------                     ----------  -----------
      SYSTEM                             540 MB       844 MB
      SYSAUX                             500 MB       511 MB

      Minimum tablespace sizes for upgrade are estimates.

  8.  Follow the instructions in the Oracle Multimedia README.txt file in <23
      ORACLE_HOME>/ord/im/admin/README.txt, or MOS note 2555923.1 to determine
      if Oracle Multimedia is being used. If Oracle Multimedia is being used,
      refer to MOS note 2347372.1 for suggestions on replacing Oracle
      Multimedia.

      Oracle Multimedia component (ORDIM) is installed.

      Starting in release 19c, Oracle Multimedia is desupported. Object types
      still exist, but methods and procedures will raise an exception. Refer to
      23 Oracle Database Upgrade Guide, the Oracle Multimedia README.txt file
      in <23 ORACLE_HOME>/ord/im/admin/README.txt, or MOS note 2555923.1 for
      more information.

  9.  Here are ALL the components in this database registry:

      Component Current     Current     Original    Previous    Component
      CID       Version     Status      Version     Version     Schema
      --------- ----------- ----------- ----------- ----------- -----------
      APS       19.20.0.0.0 VALID       19.18.0.0.0             SYS
      CATALOG   19.20.0.0.0 VALID       19.18.0.0.0             SYS
      CATJAVA   19.20.0.0.0 VALID       19.18.0.0.0             SYS
      CATPROC   19.20.0.0.0 VALID       19.18.0.0.0             SYS
      CONTEXT   19.20.0.0.0 VALID       19.18.0.0.0             CTXSYS
      DV        19.20.0.0.0 VALID       19.18.0.0.0             DVSYS
      JAVAVM    19.20.0.0.0 VALID       19.18.0.0.0             SYS
      OLS       19.20.0.0.0 VALID       19.18.0.0.0             LBACSYS
      ORDIM     19.20.0.0.0 VALID       19.18.0.0.0             ORDSYS
      OWM       19.20.0.0.0 VALID       19.18.0.0.0             WMSYS
      RAC       19.20.0.0.0 VALID       19.18.0.0.0             SYS
      SDO       19.20.0.0.0 VALID       19.18.0.0.0             MDSYS
      XDB       19.20.0.0.0 VALID       19.18.0.0.0             XDB
      XML       19.20.0.0.0 VALID       19.18.0.0.0             SYS
      XOQ       19.20.0.0.0 VALID       19.18.0.0.0             OLAPSYS

      Review the information before upgrading.

  10. Here is a count of invalid objects by Oracle-maintained users:

      Oracle-Maintained User Name                 Number of INVALID Objects
      ---------------------------                 -------------------------
      None                                        None

      Review the information before upgrading.

  11. Here is a count of invalid objects by Application users:

      Application User Name                       Number of INVALID Objects
      ---------------------------                 -------------------------
      None                                        None

      Review the information before upgrading.

  12. No action needed. Enterprise Manager Database Express will be removed by
      the upgrade process.

      Enterprise Manager Database Express is present. The database has EM
      Express files and objects.

      Starting with Oracle Database 23c, Enterprise Manager Database Express is
      de-supported. Any EM Express specific files and objects will removed from
      your database during the upgrade. EM Express ports will no longer be
      opened to accept any HTTP request. Roles EM_EXPRESS_BASIC and
      EM_EXPRESS_ALL as well as "EM Express Connect" privilege will be removed.
      If user is to downgrade to a release earlier than 23c, EM Express will be
      restored, including all of its files and objects, as well as the
      EM_EXPRESS_BASIC and EM_EXPRESS_ALL roles and "EM Express Connect"
      privilege. However, any specific non out-of-box user grants and audit
      policies of these roles and privilege will not be restored upon downgrade.

=============
AFTER UPGRADE
=============

  REQUIRED ACTIONS
  ================
  None

  RECOMMENDED ACTIONS
  ===================
  13. (AUTOFIXUP) Recompile the objects with timestamp mismatch. Refer to MOS
      note 781959.1 for more details.

      There are objects whose timestamp are mismatched with its parent objects.

      Timestamp of dependent objects must coincide with the timestamp of parent
      objects.

  14. (AUTOFIXUP) Gather dictionary statistics after the upgrade using the
      command:

        EXECUTE DBMS_STATS.GATHER_DICTIONARY_STATS;

      Oracle recommends gathering dictionary statistics after upgrade.

      Dictionary statistics provide essential information to the Oracle
      optimizer to help it find efficient SQL execution plans. After a database
      upgrade, statistics need to be re-gathered as there can now be tables
      that have significantly changed during the upgrade or new tables that do
      not have statistics gathered yet.

  15. Gather statistics on fixed objects after the upgrade and when there is a
      representative workload on the system using the command:

        EXECUTE DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;

      Oracle recommends gathering fixed object statistics after upgrade. This
      recommendation is given for all preupgrade runs.

      Fixed object statistics provide essential information to the Oracle
      optimizer to help it find efficient SQL execution plans. Those statistics
      are specific to the Oracle Database release that generates them, and can
      be stale upon database upgrade.

      For information on managing optimizer statistics, refer to the 19.0.0.0
      Oracle Database Upgrade Guide.

  16. (AUTOFIXUP) Run $ORACLE_HOME/rdbms/admin/utlprpom.sql in order to
      recompile.

      There are invalid objects in Oracle-maintained schemas after upgrade.

      Invalid database objects need to be recompiled after the upgrade.

  INFORMATION ONLY
  ================
  17. In a CDB, you can recompile in N PDBs in parallel and have each PDB's
      recompilation use R degree of parallelism.
      For example:
        $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -b recomp
      -d $ORACLE_HOME/rdbms/admin -n  -l /tmp utlprp.sql
      '--p'
      Note:
       a) If total number of PDBs to recompile in is more than cpu_count/2, you
      can start with N as cpu_count/2; else set N to the number of PDBs.
       b) You can start with R as 2, as in:  ..catcon.pl .. utlprp.sql '--p2'
       c) And you can adjust N and R as needed for your database and system.
       d) Note: cpu_count is an Oracle initialization parameter.
       e) Note: For 23c and higher use utlprpom.sql instead of utlprp.sql in
      the catcon.pl command above.

      This is an informational message on how you can run utlrp in a CDB.

      Recompiling invalid objects in a CDB can be done in multiple PDBs in
      parallel.

OCI BaseDBの19cから23cへのデータ移行(DataPump編) [OCI]

1.はじめに


 OCI上で19cから23cの環境へデータを移行する検証をしたので備忘までメモを残しておく。具体的なシナリオとしては、19cの環境でexpdpでエクスポートしたダンプファイルを、新規に23cの環境にimpdpでインポートする。ダンプファイルはノーマル(平文)と、TDEの暗号鍵で暗号化したもの(encryption_mode = transparent)の2種類を用いる。後者のインポートのために、19c環境のTDEのマスタ暗号鍵を23c環境へインポートすることも行う。

20231124_expimp23cTestEnv2.jpg

 手順の概要は以下の通り。

2.環境準備


・ソースDB


 データ移行の対象となる表の状態確認をする。EMP表100万件、DEPT表10万件、セグメントサイズは合計77MB程度である。
[oracle@oradbvm1 ~]$ sqlplus scott/XXX@oradb
SQL> select count(*) from emp;
  COUNT(*)
----------
   1000000

SQL> select count(*) from dept;
  COUNT(*)
----------
    100000
    
SQL>  select segment_name, bytes/1024/1024 mb from user_segments;
   SEGMENT_NAME    MB
_______________ _____
DEPT                5 ★
EMP                72 ★
IDX1_EMP           23
PK_DEPT             2
PK_EMP             16

SQL>

 Base Database Serviceでは/u01配下に150GB程度の領域がある。この配下にディレクトリオブジェクトを作成する。
[oracle@oradbvm1 ~]$ df -h
Filesystem                      Size  Used Avail Use% Mounted on
・・・
/dev/sdg                        196G   42G  145G  23% /u01 ★

[oracle@oradbvm1 ~]$ mkdir -p /u01/app/oracle/dump/scott
[oracle@oradbvm1 ~]$ chmod 777 /u01/app/oracle/dump/scott
[oracle@oradbvm1 ~]$ ls -ld /u01/app/oracle/dump/scott
drwxrwxrwx 2 oracle oinstall 4096 Nov 21 06:11 /u01/app/oracle/dump/scott

[oracle@oradbvm1 ~]$ sqlplus sys/XXX@oradb as sysdba
SQL> CREATE DIRECTORY expdir AS '/u01/app/oracle/dump/scott';
Directory created.
SQL> grant read, write on directory expdir to scott;
Grant succeeded.

・ターゲットDB


 OCIコンソールからソースDBと同じセグメントに新規インスタンスを作成する。この際、DBバージョンは23c、エディションはEE HPを選択する(詳細な手順については[1]を参照)。プロビジョニング完了後、以下設定を行う。
  • OSのoracleユーザのパスワードを設定する(sshのファイル転送のため)
  • tnsnames.oraにPDBへの接続エントリを追加する
  • ソースDBと同じスキーマ(scott)を作成、必要な権限を付与する

 ディレクトリオブジェクトの作成はソースと同じ手順を実施する。表はソース側のEMP・DEPT表のDDL(参考[2]参照)を実行する。

3.エクスポート


・(ソースDB)マスタ暗号鍵のエクスポート


 ソースDBのPDBの管理者で接続し、以下のようにマスタ暗号鍵をエクスポートする。
[oracle@oradbvm1 ~]$ sqlplus sys/XXX@oradb as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Nov 22 09:21:03 2023
Version 19.20.0.0.0

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

Connected to:
Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.20.0.0.0

SQL> administer key management export encryption keys with secret "XXX" to '/home/oracle/ewallet_oradbmv1_oradb.p12' force keystore identified by "XXX";

keystore altered.

SQL> !ls -l
total 6108
-rw-r--r-- 1 oracle asmadmin    2612 Nov 22 09:21 ewallet_oradbmv1_oradb.p12 ★
SQL> 

・(ソースDB)データのエクスポート


はじめにノーマル(平文)のエクスポートを実行する。平文でエクスポートされたことを示すORA-39173が出力されるが、処理は正常終了する。
[oracle@oradbvm1 scott]$ expdp scott/XXX@oradb schemas=scott directory=expdir dumpfile=scott.dmp logfile=expdpscott.log content=data_only

Export: Release 19.0.0.0.0 - Production on Sun Nov 12 16:20:46 2023
Version 19.20.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
FLASHBACK automatically enabled to preserve database integrity.
Starting "SCOTT"."SYS_EXPORT_SCHEMA_01":  scott/********@oradb schemas=scott directory=expdir dumpfile=scott.dmp logfile=expdpscott.log content=data_only
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . exported "SCOTT"."EMP"                               55.15 MB 1000000 rows
. . exported "SCOTT"."DEPT"                              3.619 MB  100000 rows ★=~59MB
ORA-39173: Encrypted data has been stored unencrypted in dump file set. ★暗号化されてない
Master table "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SCOTT.SYS_EXPORT_SCHEMA_01 is:
  /u01/app/oracle/dump/scott/scott.dmp
Job "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Nov 12 16:20:51 2023 elapsed 0 00:00:04 ★正常終了

 続いて暗号化エクスポートを実行する。encryption=data_onlyと指定する。encryption_modeは指定していないが、TDEのウォレットがオープン状態なので、デフォルトでtransparent、つまりTDEのマスタ暗号鍵を利用して暗号化を行うこととなる。ORA-39173は発生しないので、暗号化されていることがわかる。
[oracle@oradbvm1 scott]$ expdp scott/XXX@oradb schemas=scott directory=expdir dumpfile=scotte.dmp logfile=expdpscotte.log content=data_only encryption=data_only

Export: Release 19.0.0.0.0 - Production on Sun Nov 12 16:52:47 2023
Version 19.20.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
FLASHBACK automatically enabled to preserve database integrity.
Starting "SCOTT"."SYS_EXPORT_SCHEMA_01":  scott/********@oradb schemas=scott directory=expdir dumpfile=scotte.dmp logfile=expdpscotte.log content=data_only encryption=data_only
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . exported "SCOTT"."EMP"                               55.15 MB 1000000 rows
. . exported "SCOTT"."DEPT"                              3.619 MB  100000 rows ★=~59MB
Master table "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SCOTT.SYS_EXPORT_SCHEMA_01 is:
  /u01/app/oracle/dump/scott/scotte.dmp
Job "SCOTT"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Nov 12 16:52:52 2023 elapsed 0 00:00:04 ★正常終了

ディレクトリオブジェクトのファイルを確認すると、以下のように2つのダンプファイルが作成されていることがわかる。暗号化してもファイルサイズに変化はない。
[oracle@oradbvm1 scott]$ ll
total 120936
-rw-r--r-- 1 oracle asmadmin     1056 Nov 12 16:52 expdpscotte.log
-rw-r--r-- 1 oracle asmadmin     1104 Nov 12 16:48 expdpscott.log
-rw-r----- 1 oracle asmadmin 61911040 Nov 12 16:48 scott.dmp ★ノーマル(平文)
-rw-r----- 1 oracle asmadmin 61911040 Nov 12 16:52 scotte.dmp ★暗号化
[oracle@oradbvm1 scott]$

4.ダンプファイル転送


・マスタ暗号鍵の転送


 ソースDBからマスタ暗号鍵をscp転送する
[oracle@oradbvm1 ~]$ cd ~/
[oracle@oradbvm1 ~]$ scp ewallet_oradbmv1_oradb.p12 10.0.1.12:~/
oracle@10.0.1.12's password:
ewallet_oradbmv1_oradb.p12                    100% 2612     5.4MB/s   00:00

・ダンプファイルの転送


 ソースDBからダンプファイルをscp転送する。
[oracle@oradbvm1 ~]$ cd /u01/app/oracle/dump/scott
[oracle@oradbvm1 scott]$ scp *.dmp 10.0.1.12:/u01/app/oracle/dump/scott
oracle@10.0.1.12's password:
scott.dmp                                     100%   59MB 100.0MB/s   00:00
scotte.dmp                                    100%   59MB  98.0MB/s   00:00
[oracle@oradbvm1 scott]$

 ターゲットDBにて、ダンプファイルを確認する。
[oracle@oradbvm2 scott]$ ll
-rw-r----- 1 oracle oinstall  61911040 Nov 21 07:12 scott.dmp
-rw-r----- 1 oracle oinstall  61911040 Nov 21 07:12 scotte.dmp

5.インポート


・(ターゲットDB)データのインポート(ノーマル)


 ターゲットDBにて、インポートを行う。EMP表からDEPT表への参照整合性制約を無効にしてからインポートを行うと、問題なくインポートできる。
[oracle@oradbvm2 ~]$ sqlplus scott/XXX@oradb
SQL> alter table emp disable constraint fk_deptno;

[oracle@oradbvm2 ~]$ impdp scott/XXX@oradb schemas=scott directory=expdir dumpfile=scott.dmp logfile=impdpscott.log content=data_only table_exists_action=truncate

Import: Release 23.0.0.0.0 - Production on Fri Nov 24 09:55:25 2023
Version 23.3.0.23.09

Copyright (c) 1982, 2023, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
Master table "SCOTT"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "SCOTT"."SYS_IMPORT_SCHEMA_01":  scott/********@oradb schemas=scott directory=expdir dumpfile=scott.dmp logfile=impdpscott.log content=data_only table_exists_action=truncate
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."EMP"                               55.15 MB 1000000 rows
. . imported "SCOTT"."DEPT"                              3.619 MB  100000 rows
Job "SCOTT"."SYS_IMPORT_SCHEMA_01" successfully completed at Fri Nov 24 09:56:09 2023 elapsed 0 00:00:35 ★成功

 ここで試しに、暗号化したダンプファイルをインポートしようとすると、複合化に必要なマスタ暗号鍵が見つからないため、ORA-28362のエラーでインポートすることができない。このため、ソースDBのPDBのマスタ暗号鍵のインポートが必要となる。
SQL> !impdp scott/XXX@oradb schemas=scott directory=expdir dumpfile=scotte.dmp logfile=impdpscotte.log content=data_only table_exists_action=truncate

Import: Release 23.0.0.0.0 - Production on Fri Nov 24 09:56:52 2023
Version 23.3.0.23.09

Copyright (c) 1982, 2023, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
ORA-39002: invalid operation
ORA-39189: unable to decrypt dump file set
ORA-28362: master key not found ★エラーとなる

・(ターゲットDB)マスタ暗号鍵のインポート


 ターゲットDBにて、ソースDBのPDBのマスタ暗号鍵をインポートする。インポートはコンテナDBに接続して実行する(PDBではインポートできない)。v$encryption_keysでインポートされていることを確認する。
[oracle@oradbvm2 ~]$ ll
total 12
-rw-r--r-- 1 oracle oinstall 2612 Nov 22 09:22 ewallet_oradbmv1_oradb.p12 ★

[oracle@oradbvm2 ~]$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Production on Wed Nov 22 09:26:27 2023
Version 23.3.0.23.09

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


Connected to:
Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
Version 23.3.0.23.09

SQL> administer key management import keys with secret "XXX" from '/home/oracle/ewallet_oradbmv1_oradb.p12' force keystore identified by "XXX" with backup;

keystore altered.

SQL> select key_id, creation_time, creator_dbname, activating_pdbname, con_id from v$encryption_keys;

KEY_ID                                                  CREATION_TIME                             CREATOR_DBNAME     ACTIVATING_PDBNAME       CON_ID
_______________________________________________________ _________________________________________ __________________ _____________________ _________
AXTVRRDA8U+uv9W09+9PuAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    19-APR-23 10.54.29.632286000 PM GMT       coradb_oradbvm1    ORADB                         3★PDBのマスタ暗号鍵
ARq4NDRE80+SvwxzekrKJbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    23-NOV-23 05.20.41.789397000 PM -07:00    coradb_oradbvm2    CDB$ROOT                      1
AYpmGS1/Gk9Ev1QZZYcswd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA    23-NOV-23 05.27.18.895760000 PM -07:00    coradb_oradbvm2    ORADB                         3
SQL>

・(ターゲットDB)データのインポート(暗号化)


 暗号化されたダンプファイルをインポートする。正常にインポートされたら、参照整合性制約を有効にする。
[oracle@oradbvm2 ~]$ impdp scott/XXX@oradb schemas=scott directory=expdir dumpfile=scotte.dmp logfile=impdpscotte.log content=data_only table_exists_action=truncate

Import: Release 23.0.0.0.0 - Production on Fri Nov 24 10:15:06 2023
Version 23.3.0.23.09

Copyright (c) 1982, 2023, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
Master table "SCOTT"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "SCOTT"."SYS_IMPORT_SCHEMA_01":  scott/********@oradb schemas=scott directory=expdir dumpfile=scotte.dmp logfile=impdpscotte.log content=data_only table_exists_action=truncate
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."EMP"                               55.15 MB 1000000 rows
. . imported "SCOTT"."DEPT"                              3.619 MB  100000 rows
Job "SCOTT"."SYS_IMPORT_SCHEMA_01" successfully completed at Fri Nov 24 10:15:32 2023 elapsed 0 00:00:24 ★成功

[oracle@oradbvm2 ~]$ sqlplus scott/XXX@oradb
SQL> alter table emp enable constraint fk_deptno;

6.まとめ


 本稿では、OCI上で19cの環境からデータをexpdp/impdpで23cの環境へ移行する手順について記載した。
 実際問題、今回のケースのようにOCIの内部でダンプの暗号化までする必要はないだろう。しかし、実際はファイルサイズが大きくなると、オブジェクトストレージや媒体を介した転送が必要なケースもあり、そのような場合に暗号化が必要になることが考えられる。暗号化の方法にはパスワードを設定する方法(encryption_mode=password)もあるが、インポートの際に毎回パスワードを設定するのも煩わしい。OCIでEE High Performance以上を使っているなら、advanced securityのダンプファイルの暗号化機能が利用できるため、元のPDBのマスタ暗号鍵をターゲットとなるDBにインポートすることで、透過的に暗号化ダンプファイルのエクスポート・インポートが可能となる。

参考


[1]ベースデータベース コンソールを使用したDBシステムの作成
https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/dbcs/doc/create-db-system-using-console.html#DBSCB-GUID-624EFC8F-CF53-4A88-B9AB-2F45F2B9A546

[2]検証用DDL
drop table emp cascade constraints;
drop table dept cascade constraints;
create table dept(  
  deptno     number(7,0),  
  dname      varchar2(14),  
  loc        varchar2(13),  
  constraint pk_dept primary key (deptno)  
);
create table emp(  
  empno    number(7,0),  
  ename    varchar2(10),  
  job      varchar2(9),  
  mgr      number(7,0),  
  hiredate date,  
  sal      number(7,2),  
  comm     number(7,2),  
  deptno   number(7,0),  
  constraint pk_emp primary key (empno),  
  constraint fk_deptno foreign key (deptno) references dept (deptno)  
);
create index idx1_emp on emp ( deptno );


OCIのDBCSでオブジェクトストレージをマウントする [OCI]

 ウクライナと円安の行方が心配な今日この頃、一歩間違えれば、生活が激変する可能性もある状況で、いまのところ平和に生活できていることに幸せを感じる。今日はOCIのDBCSでオブジェクトストレージをマウントする方法とその性能について、調べたことを記載しておきたい。

1.はじめに


 OCIのOracleマネージドサービスであるDBCSは、ローカルディスク(/u01配下)が200GB、うち、製品で25GB程度はデフォルトで使われてしまう。運用していくうちにログファイル等が大きくなっていくことから、ローカルディスクとして使える領域はせいぜい100~150GBGB程度と考えられる。DBCSはブロックストレージを追加することができないため、ローカルディスクに大きなファイル(ダンプファイルなど)を置く必要がある場合、困ってしまう。
 そんなときに役に立つのが、オブジェクトストレージである。DBCSからオブジェクトストレージをファイルシステムとしてマウントすれば、広大な領域をNAS領域のように利用可能となる。しかも、オブジェクトストレージは安価なコストで利用できるため、大きなファイルを長期間置いておく必要がある場合に非常に有益である。もともとオブジェクトストレージはNASのような階層型のファイルシステムを持たず、フラットな構造でデータを格納する方式なので、NASのような性能を期待してはいけない。
 MOSにはOCIのオブジェクトストレージをマウントする方法が公開されている(参考1)。今回、OCIのalways freeを使い、DBCSから実際にオブジェクトストレージをマウントする手順を確認した。権限に関して、マウントオプションの注意点があるので、それもあわせて記載している。また、性能に関してはRMANでDBのフルバックアップを取得し、ローカルディスクとオブジェクトストレージでどの程度性能差があるかを確認したので、その結果もあわせて記載する。

2.オブジェクトストレージのマウント手順


 前提として、オブジェクトストレージのマウント手順は、参考1に記載のMOSドキュメントに従うが、前提としてyumリポジトリを構成するなどの前提作業が必要になるので、これらを含めてDBCSで実施した手順を記載しておく。

(1)オブジェクトストレージの作成


 OCIのコンソールからマウント対象となるオブジェクトストレージを作成する。ハンバーガーメニューから、ストレージ→バケットを選択。Create Bucketで適当なバケット名を指定し作成する。ここではbucketという名前で作成する。
20221016_bucket.JPG

 作成したオブジェクトストレージを選択し、詳細情報画面からネームスペース名を確認しておく。後に利用するので、以下のようにメモしておく。
20221016_bucktNamespace.JPG

 ネームスペース:nrudxxkfnfy8

(2)カスタマー秘密鍵の作成


 ユーザのカスタマー秘密鍵を作成する。右上のユーザアイコンから、My profileを選択する。
20221016_profilememu.JPG

 左のメニューからCustomer secret keysを選択し、Generate secret keyを押下する。Nameに適当な名前を指定し、Generate secret keyを押下する。ここではs3fs-accessという名前を指定して作成する。すると、以下のようにGenerated keyが表示されるので、秘密鍵をコピーしておく(この画面を閉じると2度と表示されないので注意)。
20221016_generateSecretKey.JPG

20221016_secretKey.JPG

 作成された秘密鍵が表示されるので、そのアクセスキーIDをコピーしておく。このアクセスキーIDと上記秘密鍵は後に使うので、以下のようにメモしておくこと良い。
20221016_accessKeyID.JPG

 アクセスキーID = b92ce3ed0ff046e03a5ba0a85310cc8a7f591480
 秘密鍵 = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyNSyVM=

(3)yumリポジトリの構成


 DBCSのrootで以下コマンドを実行し、yumリポジトリを構成する(すでにyumが利用できる状態であれば不要)。
[root@oradb dev]# cd /etc/yum.repos.d
[root@oradb yum.repos.d]# ls
[root@oradb ~]# cd /etc/yum.repos.d
[root@oradb yum.repos.d]# wget http://yum-tokyo.oracle.com/yum-tokyo-ol7.repo
--2022-10-10 19:26:30--  http://yum-tokyo.oracle.com/yum-tokyo-ol7.repo
Resolving yum-tokyo.oracle.com (yum-tokyo.oracle.com)... 192.29.43.236, 192.29.45.0
Connecting to yum-tokyo.oracle.com (yum-tokyo.oracle.com)|192.29.43.236|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18747 (18K) [application/octet-stream]
Saving to: ‘yum-tokyo-ol7.repo’

100%[=========================================================================================>] 18,747      --.-K/s   in 0s

2022-10-10 19:26:30 (434 MB/s) - ‘yum-tokyo-ol7.repo’ saved [18747/18747]

[root@oradb yum.repos.d]# ls -l
total 20
-rw-r--r--   1 root root 18747 Sep 20 02:28 yum-tokyo-ol7.repo

(4)s3fsのインストール


 DBCSのrootで以下コマンドを実行し、s3fs-fuseをインストールする。
[root@oradb ~]# yum install s3fs-fuse

(5)パスワードファイルの構成


 DBCSのrootで、パスワードファイルを作成し、権限を600に設定する。ファイルに記載する内容は<アクセスキーID>:<秘密鍵>とする。
[root@oradb ~]# vi ${HOME}/.passwd-s3fs
[root@oradb ~]# cat ${HOME}/.passwd-s3fs
b92ce3ed0ff046e03a5ba0a85310cc8a7f591480:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyNSyVM=
[root@oradb ~]# chmod 600 ${HOME}/.passwd-s3fs
[root@oradb ~]# ll ${HOME}/.passwd-s3fs
-rw------- 1 root root 86 Oct 10 19:46 /root/.passwd-s3fs

(6)マウントポイントの作成


 DBCSのrootでマウントポイントを作成する。ここでは例として/mnt/bucketをマウントポイントとする。
[root@oradb ~]# mkdir -p /mnt/bucket

(7)オブジェクトストレージをマウント


 DBCSのrootでs3fsコマンドを実行し、オブジェクトストレージをマウントするが、ここでバケット名やマウントポイント以外に、オブジェクトストレージのネームスペース、およびリージョン名(OCI東京リージョンならap-tokyo-1など)を入れる必要がある。
 s3fs <バケット名> <マウントポイント名> -o url=https://<ネームスペース名>.compat.objectstorage.<リージョン名>.oraclecloud.com -o nomultipart -o use_path_request_style -o endpoint=<リージョン名>
 ここでは具体的に以下のコマンドでマウントした。allow_otherというオプションを付与しているのは、後に説明する権限問題を回避するためである。
[root@oradb mnt]# s3fs bucket /mnt/bucket -o url=https://nrudxxkfnfy8.compat.objectstorage.ap-tokyo-1.oraclecloud.com -o nomultipart -o use_path_request_style -o endpoint=ap-tokyo-1 -o allow_other

オブジェクトストレージがマウントされていることをdfコマンドで確認する。16E(エクサバイト)の広大な領域が利用可能なことがわかる。
[root@oradb ~]# df -h
Filesystem                      Size  Used Avail Use% Mounted on
devtmpfs                        7.7G     0  7.7G   0% /dev
tmpfs                           7.7G  1.1G  6.7G  15% /dev/shm
tmpfs                           7.7G   41M  7.7G   1% /run
tmpfs                           7.7G     0  7.7G   0% /sys/fs/cgroup
/dev/mapper/vg00-root           9.6G  2.9G  6.2G  32% /
/dev/mapper/vg00-var            5.7G  991M  4.5G  19% /var
/dev/mapper/vg00-home           960M  2.7M  891M   1% /home
/dev/mapper/vg00-opt             39G  6.3G   31G  17% /opt
/dev/sda2                       488M  235M  218M  52% /boot
/dev/mapper/vg00-var_log        3.8G   21M  3.6G   1% /var/log
/dev/mapper/vg00-var_log_audit  1.9G   11M  1.8G   1% /var/log/audit
/dev/sda1                       128M  7.3M  121M   6% /boot/efi
tmpfs                           7.7G  608K  7.7G   1% /tmp
tmpfs                           7.7G   24K  7.7G   1% /var/tmp
/dev/sdj                        196G   23G  163G  13% /u01
/dev/asm/commonstore-363        5.0G  386M  4.7G   8% /opt/oracle/dcs/commonstore
tmpfs                           1.6G     0  1.6G   0% /run/user/102
tmpfs                           1.6G     0  1.6G   0% /run/user/1000
s3fs                             16E     0   16E   0% /mnt/bucket ★

マウントポイントの権限を確認すると777となっているため、oracleユーザでも書き込みが可能なことがわかる。
[root@oradb ~]# ll -d /mnt/bucket
drwxrwxrwx 1 root root 0 Jan  1  1970 /mnt/bucket

なお、もしallow_otherを付与しないと、以下のようにroot以外アクセスできなくなる。この状態でrootで権限を変えることができないため、oracleユーザに権限を付与することができない。oracleユーザで利用できないとrmanもexpdp/impdpでも利用できないため、DBCSで利用する目的であれば、このオプションを付与したほうがよいだろう。セキュリティ的に気になるのであれば、oracleユーザでオブジェクトストレージのマウントをすることもできるが、自動マウント設定(fstab)などを考えるとrootでマウントしてしまうほうが使い勝手がよい。
[root@oradb opc]# ll -d /mnt/bucket/
drwx------ 1 root root 0 Jan  1  1970 /mnt/bucket/

(8)自動マウント設定(fstabへ記載)


 OS再起動でオブジェクトストレージが自動マウントされるように/etc/fstabの末尾に以下のエントリを追記する。基本的に、上記mountコマンドで実行したオプションを記載する
# s3fs
bucket /mnt/bucket fuse.s3fs nomultipart,use_path_request_style,passwd_file=/root/.passwd-s3fs,url=https://nrudxxkfnfy8.compat.objectstorage.ap-tokyo-1.oraclecloud.com,endpoint=ap-tokyo-1,allow_other

 上記設定後、umount/mountコマンドで当該マウントポイントのアンマウント・マウントの正常動作を確認しておく。以上で設定は完了である。

3.性能比較


 ローカルディスクとオブジェクトストレージでどの程度違いがあるか、RMANバックアップを取得し、バックアップ時間を比較してみた。オブジェクトストレージマウントした場合と、ローカルディスク(/u01配下)の場合で比較する。バックアップは単純にDB全体のバックアップコピーを取得することで行った。DBのサイズは概ね4GB弱である。

(1)ローカルディスクへのバックアップ


run {
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/u01/app/oracle/bkup/full_%u_%s_%p';
backup as copy tag 'fullbackup_disk' database;
}

(2)オブジェクトストレージへのバックアップ


run {
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/mnt/bucket/full_%u_%s_%p';
backup as copy tag 'fullbackup_objstg' database;
}

 RMANのreport schemaコマンドの結果に上記rmanバックアップ時のログを対応付け、データファイル毎のバックアップ時間を整理したのが以下の結果である。この結果では、ローカルディスクの性能が56MB/secに対し、オブジェクトストレージは11MB/sec程度であり、20%程度の性能であることがわかる。
20221016_RMANdiskperf.jpg

なお、以下のように2パラにすることで、オブジェクトストレージも若干の性能向上(17MB/s)を確認することができた。残念ながら、今回検証用に使ったDBCSが2コアだったからか、2パラ以上の性能向上は確認できなかった。
run {
CONFIGURE DEVICE TYPE DISK PARALLELISM 2;
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/mnt/bucket/full_%u_%s_%p';
backup as copy tag 'fullbackup_objstg2' database;
}

4.まとめ


 本稿では、OCIのDBCSからオブジェクトストレージのマウント方法と、RMANのバックアップにおける性能比較結果について述べた。OCIのオブジェクトストレージマウント方法については参考1のMOSドキュメントに記載されているものの、DBCSで使うためにはoracleユーザで読み書きする権限が必要なため、マウント時にallow_otherオプションを付与すると良い。オブジェクトストレージは広大な領域を安価に利用できる反面、性能は期待できない。実際、RMANのフルバックアップでは、DBCSのローカルディスクに比べ、20%の性能にとどまることが確認できた。アーカイブ領域として割り切って使うことが望ましいだろう。もし性能が必要な場合は(高価ではあるが)OCIのファイルストレージを利用すればよい。

◆参考1


Oracle Cloud Infrastructure - How to Mount an ObjectStorage Bucket as Filesystem in Oracle Linux 7 (ドキュメントID 2577407.1)

nice!(0)  コメント(0) 

オラクルクラウド(OCI)のDBCSがSIにもたらす価値とは [OCI]

1.はじめに

 昨年からOCIを本格的に使い始めて、試験環境を構築・運用していく中で、改めてOCIの良いところ・課題について感じたところをいくつか書き留めておきたい。いままで、オンプレExadataの運用経験はあれど、SIの中でクラウドになって結局何が良いの?というところは見方や立場によるところも大きいと思う。ここではDBエンジニアの立場から、SIのプロジェクトでOracleデータベース(DBCS)を使う上で、オンプレからクラウド(OCI)になることでもたらされる特筆すべき価値について考えてみたい。かなり主観的な見方ではあるが、ここでは、以下の点について記載したい。

(1)環境構築の短期化
(2)必要な機能が予め準備済み
(3)PoC検証が容易
(4)ライセンスの有効活用
(5)概ね必要十分な性能
(6)ストレージ領域のスモールスタート、必要に応じて利用・停止

2.OCI・DBCSがSIにもたらす価値

(1)環境構築の短期化

 まず、環境構築の短期化は特筆すべきことだろう。OCIのコンソールから、DBCSのインスタンスを構築するのは画面に必要事項を入れるのみで、入力する項目がきまっていればものの30分~1時間程度で利用可能なインスタンスが構築することが可能である。オンプレでは、データセンタのラックの前で、DVD等に焼いたメディアを持ち込みrunInstallerをはたいてインストーラでポチポチしていたが、もはや必要ない。追加パッケージもインターネット経由で簡単に導入できる。

 実際のところ、上記で完了するのはあくまでもCDBと1PDBだけで、追加のPDBは自分で作成する必要があるのと、通常の業務が使えるようにスキーマ、ディレクトリ(オブジェクト)、リスナーやtnsnames.ora、領域等の追加構築が必要になることは言うまでもない。それでもこの部分は従来職人技的な部分もあり(カーネルパラメータや必要パッケージ、OS周りの設定など)、正直ここをおまかせできるのはかなりありがたい。

 しかし、SIにおいて業務向けに環境を開放するまでのリードタイムが劇的に短縮されるかというと、そういう訳ではないと思っている。そもそも構築前に詳細設計、パラメータ設計の工程を踏むのが一般的で、この期間は実はあまり変わらないと思っている。クラウドだけに、設計上はクラウドサービスの仕様を理解し、それを取捨選択し、設計に落としていく必要があり、これはそれなりに時間がかかる。ベースの設計ができて構築フェーズに入れば、効率的に構築ができるので、たとえDB数が多くても、短期間で環境を開放してくことができる、という感覚である。プロジェクト計画上は、クラウドとはいえ、はじめの設計と構築まではしっかりと時間をとることが肝要かもしれない。

(2)必要な機能が予め準備済み

 DBとして必要な機能はおおむねOCIにそろっている。バックアップ、(性能)監視、ログ管理、データ同期(GG)など、必要に応じて使えばよい。当然、それぞれ設計要素はあるが、いずれも構築に関する要素はほとんどないように感じている。このあたりはオンプレは毎回スクラッチで設計から作りこむことが多く、それなりに手間もかかる部分である。設計の自由度に制約はあるかわり、80点の構成があらかじめ用意されており、ほぼ作りこみなしで使える点は評価したい。

 性能監視のDBManagementは簡易なEMのような感覚でSQLモニタリングを見ることができるので、最低限の解析はこれでできてしまう。データ同期はOracle GoldenGateのマネージドサービスを利用した。これも画面上でextractとreplicatのプロセスを定義し、同期対象テーブルの設定を行う。エージェントレスなので、DBサーバへのインストール作業は不要である。

 もちろん、作りこむ必要がない訳ではない。例えば、バックアップはデフォルトの自動バックアップ機能ではなく、オブジェクトストレージのバケットを追加し、DBサーバからマウント(s3fs)し、RMANのバックアップ出力先をそこに指定した。これにより、ノーアーカイブログ運用でも手動で任意のタイミングでコールドバックアップを取得できるようになる。ちなみに、このオブジェクトストレージをマウントする構成は、参考[1]のドキュメントが参考になる。

(3)PoC検証が容易

 DBの設計上、検証しないとわからないようなケースに遭遇することが多々ある。例えば、新しいバージョンの新機能や、新規要件に対する実現方式検討、運用改善や性能に関する設計見直し等の検討は、机上で結論を出すことは極めて難しい。このような場合に、簡単なモデルで実機にて早期に動作確認できるのは、クラウドの大きな利点だろう。特にオンプレでは、このようなアドホックな検証に利用するための環境がないことが多く、本格的な検証をするためにはベンダの検証環境を一時的に借用したりと、かなりの調整が必要だった経験がある。クラウドを利用すれば、サーバの台数、リソース、ネットワーク構成から、自由に検証環境構成を作ることができ、かつ、使い終わったら停止しておけば最小限のコストで設計の品質向上を図ることができる。実際にPoCで検証した例を挙げると、以下のようにDBCS単体では完結しないような検証に有用であることがわかる。

・異機種DB(DB2, SQL Server)へのDBLINK、CDC構成(QlikReplicate)
・DBオンライン性能検証(マルチクラウドのAPーDBのNWレイテンシ確認)
・DB移行方式検証(DB2からOracle等)

(4)ライセンスの有効活用

 DBCSのライセンス体系はオンプレのように、SE2かEE+オプションの2択ではなく、SE、EE、EE-HP、EE-EPの4択となる。パーティショニングが必要な状況では、最低EE-HPライセンスが必須となる。このライセンスは以下のオプションを含んでいる(詳細は参考資料[2]参照)。

・マルチテナント
・パーティショニング
・アドバンスト・コンプレッション
・Diagnostic & Tuning Pack(※)
・RAT(Real Application Testing)(※)
 ※:EEから利用可能なオプション

 オンプレではこれら個々のオプションに対して、CPUコア数に応じたコストがかかるため、よほど必要性が明確でない限り購入することは困難であった。しかし、クラウドになりこれらのオプションが含まれているとなると、むしろ利用しない方が損である。例えばRATについては、SPA(実行計画の比較機能)やDB Replay(性能試験のワークロードをキャプチャ・再生)の有用性は理解するものの、利用するためにはそれなりの技術者が必要であり、なかなか現場で積極的に利用しているのを見たことがない。

 クラウド利用のDB(Oracle)技術者は、ライセンスがないことを理由にできなくなる点、これまで以上にこれらの機能を積極的に活用していくスキルが求められるだろう。

(5)概ね必要十分な性能

 私の理解する限りでは、DBCSの性能は、手組のオンプレ環境(一般的なIAサーバとSANストレージをFC接続する構成等)と比べても、かなり優秀だと考えている。その理由はシングルブロックリード(db file sequential readの待機イベント)のレイテンシである。

 オンプレ環境であれば、SANストレージへのシングルブロックリードは通常数msec(概ね2~3msec)でもあまり違和感はない。Exadataであれば、私が直近経験したのはX7-2(ハーフ)で0.3~0.7msecの感覚である。これに対して、DBCSでオンライン性能を計測した際に確認したシングルブロックリードは0.7msec程度のレイテンシであった。

 もちろん負荷は低い状態ではあるが、これはかなり良いと感じている。オンプレのDBサーバのAWRを見ると、Top10待機イベントで、DB CPUの上にこの待機が出ているケースを見たりする。このような場合は、DBCSにするだけでIO待ちが1/3になるので、APの改修なしにクエリのパフォーマンスが改善するだろう。

(6)ストレージ領域のスモールスタート、必要に応じて利用・停止

 開発・試験環境のDB領域は時間とともに育っていくため、必要なストレージ領域は後工程になるほど本番環境に近くなっていく。オンプレの時は、どの環境にどの程度のストレージ領域が必要かをあらかじめ設計して、その範囲の中で試験を行ってきた。

 これに対してクラウドでは、必要に応じてストレージ領域(ASMのDG)の拡張が容易に可能なため、初期の段階では設計上の上限サイズより小さく領域を作成しておき、試験データの大きさに応じて、領域を拡張していく、という考え方ができる。もちろん、拡張する方向にしかできないが、長期間のプロジェクトではストレージ領域コストを削減することができるだろう。

 オンプレでは基本的に投資した設備を遊ばせておく論理はないので、このような発想はクラウドならではだろう。領域拡張に関してはオンラインでできることも運用上嬉しいポイントである。

3.おわりに

 本稿では、DBエンジニアの立場から、SIのプロジェクトでOracleデータベース(DBCS)を使う上で、オンプレからクラウド(OCI)になることでもたらされる価値について考えてみた。かなり主観的・抽象的な内容ではあるが、SIの現場においてオンプレからどのような発想の転換が必要となるか、という点について参考になれば幸いである。

◆参考

[1]Oracle Cloud Infrastructure - How to Mount an ObjectStorage Bucket as Filesystem in Oracle Linux 7 (Doc ID 2577407.1)
[2]DBCSサービス概要のご紹介
 https://speakerdeck.com/oracle4engineer/oracle-base-database-service

以上
コメント(0) 

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を立ててみる部分について記載したい。

以上