NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

NDB で 1台の DB サーバに 複数の Oracle CDB をクローンしてみる。

Nutanix Database Service(NDB)では、1台の DB サーバ VM に複数の DB をクローンできます。今回は CDB の Oracle Database を、既存クローン DB をホストしている DB サーバ VM に追加クローンしてみました。

ちなみに、複数の CDB クローンを用意するなら、クローン DB ごとに DB サーバ VM を分割したほうが扱いやすそうです。

構成のイメージです。

1. 今回の環境

すでに、下記の投稿で CDB のクローン(DB と DB サーバ VM)を作成してあります。

この DB サーバ VM に、追加で CDB をクローンしてみます。

2. データベース パラメータ プロファイルの用意

DB サーバ VM に複数の DB をクローンすると、ビルトインのデータベース パラメータ プロファイルでは、クローン処理開始前にメモリ不足と判断されてしまします。

そこで、メモリ割り当ての少ないプロファイルを作成しておきます。

「プロファイル」→「データベースのパラメータ」画面で「作成」ボタンのクリックします。

データベース エンジンの種類として「ORACLE」を選択して「次へ」をクリックします。

パラメータを指定して「作成」をクリックします。

  • 名前: db-param-profile-oracle-02
  • Total Memory (MB): 512

プロファイルが作成されました。

ちなみに今回はプロファイルを admin ユーザで利用するので、「公開済み」は False のままです。

3. DB のクローン(SID のみ変更)

3-1. DB のクローン

ソース DB のタイムマシンで「アクション」→「シングル インスタンス データベース クローンの作成」をクリックします。

クローン元にするスナップショットがある日付をカレンダーでクリックして、スナップショットを選択して「次へ」をクリックします。

「データベース サーバー VM」で「認証済みサーバーの使用」を選択して、DB サーバーを選択して「次へ」をクリックします。

データベースのパラメータを入力して、「クローン」をクリックします。

  • 名前: デフォルトのまま
  • SID: orandb3(クローン元の「orandb2」とは重複しない SID を指定)
  • SYS と SYSTEM のパスワード: nutanix/4u
  • データベース パラメータのプロファイル: db-param-profile-oracle-02

少し待って、「オペレーション」画面でクローン処理の完了を確認します。

3-2. クローン DB の確認

DB サーバ VM を確認すると、2つめのクローン DB が作成されています。

クローンした DB は Oracle SID が変更されていますが、PDB の名前はクローン元のまま「PDB1」になっています。

DB サーバ VM に SSH 接続してみると、実際に 2つの DB インスタンス(orandb2 と orandb3)が起動されています。

[root@lab-linux-02 ~]# ssh oracle@192.168.11.141
Last login: Wed Dec 14 13:48:07 2022 from 192.168.20.19
[oracle@ndb-oracle-02-c ~]$ ps -ef | grep smon
oracle     10937       1  0 12月14 ?      00:00:04 ora_smon_orandb2
oracle    321375       1  0 09:00 ?        00:00:00 ora_smon_orandb3
oracle    325961  325927  0 09:15 pts/0    00:00:00 grep --color=auto smon

リスナーのステータスは下記のようになりました。pdb1 というサービスに、orandb2 と orandb3 のインスタンスが両方登録されてしまっています。

[oracle@ndb-oracle-02-c ~]$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 18-DEC-2022 09:16:28

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.11.141)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                18-DEC-2022 08:55:34
Uptime                    0 days 0 hr. 20 min. 54 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u02/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u02/app/oracle/diag/tnslsnr/ndb-oracle-02-c/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.11.141)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "86b637b62fdf7a65e053f706e80a27ca" has 2 instance(s).
  Instance "orandb2", status READY, has 1 handler(s) for this service...
  Instance "orandb3", status READY, has 1 handler(s) for this service...
Service "efc93d6bc93f53cee053720ba8c05fa1" has 2 instance(s).
  Instance "orandb2", status READY, has 1 handler(s) for this service...
  Instance "orandb3", status READY, has 1 handler(s) for this service...
Service "orandb2" has 1 instance(s).
  Instance "orandb2", status READY, has 1 handler(s) for this service...
Service "orandb3" has 1 instance(s).
  Instance "orandb3", status READY, has 1 handler(s) for this service...
Service "pdb1" has 2 instance(s).
  Instance "orandb2", status READY, has 1 handler(s) for this service...
  Instance "orandb3", status READY, has 1 handler(s) for this service...
The command completed successfully

ためしに、下記のように PDB「pdb1」にデフォルトで作成される「PDB1」サービスに接続してみます。

sqlplus -s 'system/"nutanix/4u"'@192.168.11.141/ORANDB3_PDB1 << 'EOF'
select instance_name from v$instance;
show con_name
exit
EOF

実際に接続してみると、交互に別の DB に接続されてしまいます。

[oracle@ndb-oracle-02-c ~]$ sqlplus -s 'system/"nutanix/4u"'@192.168.11.141/pdb1 << 'EOF'
> select instance_name from v$instance;
> exit
> EOF

INSTANCE_NAME
----------------
orandb2

[oracle@ndb-oracle-02-c ~]$ sqlplus -s 'system/"nutanix/4u"'@192.168.11.141/pdb1 << 'EOF'
> select instance_name from v$instance;
> exit
> EOF

INSTANCE_NAME
----------------
orandb3

[oracle@ndb-oracle-02-c ~]$ sqlplus -s 'system/"nutanix/4u"'@192.168.11.141/pdb1 << 'EOF'
> select instance_name from v$instance;
> exit
> EOF

INSTANCE_NAME
----------------
orandb2

3-3. 追加 CDB / PDB むけサービスの作成

クローン DB の PDB それぞれに接続するには、サービスを追加作成したり、クライアント側で tnsnames.ora ファイルを編集したりすることになります。

今回は、DBMS_SERVICE パッケージでサービスを追加してみます。

クローン DB「orandb3」の PDB「pdb1」に接続します。

[oracle@ndb-oracle-02-c ~]$ export ORACLE_SID=orandb3
[oracle@ndb-oracle-02-c ~]$ sqlplus / as sysdba
SQL> alter session set container=pdb1;

Session altered.

SQL> show con_name

CON_NAME
------------------------------
PDB1

PDB むけのサービスを追加作成して起動します。

SQL> exec DBMS_SERVICE.CREATE_SERVICE(SERVICE_NAME=>'ORANDB3_PDB1',NETWORK_NAME=>'ORANDB3_PDB1');

PL/SQL procedure successfully completed.

SQL> exec DBMS_SERVICE.START_SERVICE(SERVICE_NAME=>'ORANDB3_PDB1');

PL/SQL procedure successfully completed.

SQL> alter system register;

System altered.

SQL> exit

これで Oracle リスナーに、orandb3 CDB の pdb1 に接続できるサービス「ORANDB3_PDB1」が追加されました。今回は見つけやすくサービス名を大文字にしてあります。

[oracle@ndb-oracle-02-c ~]$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 18-DEC-2022 09:51:23

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.11.141)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                18-DEC-2022 08:55:34
Uptime                    0 days 0 hr. 55 min. 48 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u02/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u02/app/oracle/diag/tnslsnr/ndb-oracle-02-c/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.11.141)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "86b637b62fdf7a65e053f706e80a27ca" has 2 instance(s).
  Instance "orandb2", status READY, has 1 handler(s) for this service...
  Instance "orandb3", status READY, has 1 handler(s) for this service...
Service "ORANDB3_PDB1" has 1 instance(s).
  Instance "orandb3", status READY, has 1 handler(s) for this service...
Service "efc93d6bc93f53cee053720ba8c05fa1" has 2 instance(s).
  Instance "orandb2", status READY, has 1 handler(s) for this service...
  Instance "orandb3", status READY, has 1 handler(s) for this service...
Service "orandb2" has 1 instance(s).
  Instance "orandb2", status READY, has 1 handler(s) for this service...
Service "orandb3" has 1 instance(s).
  Instance "orandb3", status READY, has 1 handler(s) for this service...
Service "pdb1" has 2 instance(s).
  Instance "orandb2", status READY, has 1 handler(s) for this service...
  Instance "orandb3", status READY, has 1 handler(s) for this service...
The command completed successfully

接続してみると、orandb3 だけに接続できるようになりました。

[root@lab-linux-02 ~]# sqlplus -s 'system/"nutanix/4u"'@192.168.11.141/ORANDB3_PDB1 << 'EOF'
> select instance_name from v$instance;
> exit
> EOF

INSTANCE_NAME
----------------
orandb3

[root@lab-linux-02 ~]# sqlplus -s 'system/"nutanix/4u"'@192.168.11.141/ORANDB3_PDB1 << 'EOF'
> select instance_name from v$instance;
> exit
> EOF

INSTANCE_NAME
----------------
orandb3

[root@lab-linux-02 ~]#

 

4. DB のクローン(SID とリスナー ポートを変更)

4-1. DB のクローン

さらに、リスナーのポート番号を変更したクローン DB を作成してみます。

  • 名前: デフォルトのまま
  • SID: orandb4(既存の DB インスタンスとは重複しない SID を指定)
  • SYS と SYSTEM のパスワード: nutanix/4u
  • データベース パラメータのプロファイル: db-param-profile-oracle-02
  • リスナー ポート: 1524

4-2. クローン DB の確認

これで、DB サーバ VM に、3つめのクローン DB が作成されました。

追加のポート(1524)を指定したリスナーは、下記のように listener.ora ファイルに追記されます。

[oracle@ndb-oracle-02-c ~]$ echo $ORACLE_HOME
/u02/app/oracle/product/19.0.0/dbhome_1
[oracle@ndb-oracle-02-c ~]$ cat $ORACLE_HOME/network/admin/listener.ora
LISTENER =
       (DESCRIPTION_LIST =
         (DESCRIPTION =
           (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.11.141)(PORT = 1521))
           (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
         )
       )

LISTENER_1524 =
       (DESCRIPTION_LIST =
         (DESCRIPTION =
           (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.11.141)(PORT = 1524))
           (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1524))
         )
       )

しかし追加のポートを指定したリスナーは、クローン処理後には起動されないようです。

[oracle@ndb-oracle-02-c ~]$ lsnrctl status LISTENER_1524

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 18-DEC-2022 14:18:24

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.11.141)(PORT=1524)))
TNS-12541: TNS:no listener
 TNS-12560: TNS:protocol adapter error
  TNS-00511: No listener
   Linux Error: 111: Connection refused
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1524)))
TNS-12541: TNS:no listener
 TNS-12560: TNS:protocol adapter error
  TNS-00511: No listener
   Linux Error: 2: No such file or directory

4-3. 追加された Oracle リスナーの起動

追加されたリスナー「LISTENER_1524」を起動しておきます。

[oracle@ndb-oracle-02-c ~]$ lsnrctl start LISTENER_1524

これで、orandb4 DB インスタンスの PDB に接続できるようになりました。

[oracle@ndb-oracle-02-c ~]$ sqlplus 'SYSTEM/"nutanix/4u"'@192.168.11.141:1524/pdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Sun Dec 18 14:19:25 2022
Version 19.3.0.0.0

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

Last Successful login time: Thu Dec 15 2022 15:30:42 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orandb4

SQL> show con_name

CON_NAME
------------------------------
PDB1

Oracle の CDB をクローンする場合、NDB では PDB の対応がまだ十分ではなそうなので「新しいサーバーの作成」を選択して DB サーバ VM を作成つつクローンするとよさそうです。

以上。

©2023 gowatana
クリエイティブ・コモンズ・ライセンスこの 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。