2023年6月1日木曜日

Oracle APEXのアップグレード(1) - 単純なクローン

ORDSがデフォルト・プールを使ってPDBに接続している場合、以下のURLよりAPEXにアクセスできます。

http://ホスト名/ords/

最初にPDBをクローンします。

sqlplus / as sysdba
show pdbs

[oracle@apex-test config]$ sqlplus / as sysdba


SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Wed May 24 15:54:38 2023

Version 23.2.0.0.0


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



Connected to:

Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release

Version 23.2.0.0.0


SQL> show pdbs


    CON_ID CON_NAME   OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------

2 PDB$SEED   READ ONLY  NO

3 FREEPDB1   READ WRITE NO

SQL> 


FREEPDB1のクローンをFREEPDB2として作成します。Pluggable Mappingのときの作業と同じです。

create pluggable database freepdb2 from freepdb1 file_name_convert = ('FREEPDB1','FREEPDB2');
alter pluggable database freepdb2 open read write;

SQL> create pluggable database freepdb2 from freepdb1 file_name_convert = ('FREEPDB1','FREEPDB2');


Pluggable database created.


SQL> alter pluggable database freepdb2 open read write;


Pluggable database altered.

 

SQL> show pdbs 


    CON_ID CON_NAME   OPEN MODE  RESTRICTED

---------- ------------------------------ ---------- ----------

2 PDB$SEED   READ ONLY  NO

3 FREEPDB1   READ WRITE NO

4 FREEPDB2   READ WRITE NO

SQL> exit


追加したPDBに接続する接続プールを、ORDSに作成します。

対話的に接続プールを追加引数指定で接続プールを追加設定ファイルのコピーの3通りを試します。


対話的に接続プールを追加



ords installを対話的に実行して、接続プールを追加します。以下の入力を行います。

ords --config /etc/ords/config install
  1. 接続プールの追加のみを行うので、Create or update a database pool onlyを選択します。
  2. 追加する接続プールは新規作成なので、Create an additional database poolを選択します。
  3. Enter the database pool nameに作成する接続プールの名前を与えます。今回は接続プール名をpdb2としています。
  4. データベースへの接続情報としてBasicを選択し、接続先ホスト名ポート番号サービス名を指定します。サービス名はfreepdb2になります。
  5. 有効にするORDSの機能を指定します。今回はを選択しています。
  6. すでにWebサーバーは設定されているためSkipを選択し、構成を終了します。

[oracle@apex-test config]$ ords --config /etc/ords/config install


ORDS: Release 23.1 Production on Thu May 25 07:36:07 2023


Copyright (c) 2010, 2023, Oracle.


Configuration:

  /etc/ords/config/


Oracle REST Data Services - Interactive Install


  Enter a number to select the type of installation

    [1] Install or upgrade ORDS in the database only

    [2] Create or update a database pool and install/upgrade ORDS in the database

    [3] Create or update a database pool only

  Choose [1]: 3

  Enter a number to select the database pool to update, or create an additional database pool.

    [1] default      jdbc:oracle:thin:@//localhost:1521/freepdb1

    [2] Create an additional database pool

  Choose [1]: 2

  Enter the database pool name: pdb2

  Enter a number to select the database connection type to use

    [1] Basic (host name, port, service name)

    [2] TNS (TNS alias, TNS directory)

    [3] Custom database URL

  Choose [1]: 

  Enter the database host name [localhost]: 

  Enter the database listen port [1521]: 

  Enter the database service name [orcl]: freepdb2

  Enter a number to select additional feature(s) to enable:

    [1] Database Actions  (Enables all features)

    [2] REST Enabled SQL and Database API

    [3] REST Enabled SQL

    [4] Database API

    [5] None

  Choose [1]: 

  Enter a number to configure ORDS for standalone mode

    [1] Configure ORDS for standalone mode

    [2] Skip

  Choose [1]: 2

The setting named: db.connectionType was set to: basic in configuration: pdb2

The setting named: db.hostname was set to: localhost in configuration: pdb2

The setting named: db.port was set to: 1521 in configuration: pdb2

The setting named: db.servicename was set to: freepdb2 in configuration: pdb2

The setting named: db.username was set to: ORDS_PUBLIC_USER in configuration: pdb2

The setting named: db.password was set to: ****** in configuration: pdb2

The setting named: feature.sdw was set to: true in configuration: pdb2

The setting named: restEnabledSql.active was set to: true in configuration: pdb2

The setting named: security.requestValidationFunction was set to: ords_util.authorize_plsql_gateway in configuration: pdb2

[oracle@apex-test config]$ 


対話的な構成では、プロパティplsql.gateway.modeが設定されません。以下を追加します。

ords --config /etc/ords/config config --db-pool pdb2 set plsql.gateway.mode proxied

[oracle@apex-test config]$ ords --config /etc/ords/config config --db-pool pdb2 set plsql.gateway.mode proxied


ORDS: Release 23.1 Production on Wed May 24 07:27:45 2023


Copyright (c) 2010, 2023, Oracle.


Configuration:

  /etc/ords/config/


The setting named: plsql.gateway.mode was set to: proxied in configuration: pdb2

[oracle@apex-test config]$ 


接続プールpdb2が構成されました。

コピーしたPDB、FREEPDB2に作成されているユーザーORDS_PUBLIC_USERのパスワードを更新します。

2通りの方法があります。

ords installコマンドを実行し、ORDS_PUBLIC_USERへのパスワード設定と同時にウォレットの作成も行います。ORDS_PUBLIC_USERに設定されているパスワードが不明な場合に向いています。

ords --config /etc/ords/config install --admin-user sys --db-pool pdb2 --db-hostname localhost --db-port 1521 --db-servicename freepdb2 --proxy-user

[oracle@apex-test config]$ ords --config /etc/ords/config install --admin-user sys --db-pool pdb2 --db-hostname localhost --db-port 1521 --db-servicename freepdb2 --proxy-user


ORDS: Release 23.1 Production on Thu May 25 05:54:53 2023


Copyright (c) 2010, 2023, Oracle.


Configuration:

  /etc/ords/config/


Enter the database password for SYS AS SYSDBA: ********

Enter the database password for ORDS_PUBLIC_USER: ********

Confirm password: ********

Oracle REST Data Services - Non-Interactive Install


Retrieving information.

Connecting to database user: ORDS_PUBLIC_USER url: jdbc:oracle:thin:@//localhost:1521/freepdb2

The setting named: db.password was set to: ****** in configuration: pdb2

2023-05-25T05:55:24.491Z INFO        Updating ORDS_PUBLIC_USER database password in FREEPDB2 

------------------------------------------------------------

Date       : 25 May 2023 05:55:24

Release    : Oracle REST Data Services 23.1.2.r1151944


Database   : Oracle Database 23c Free,  

DB Version : 23.2.0.0.0

[*** script: ords_change_password.sql] 


PL/SQL procedure successfully completed.


2023-05-25T05:55:26.383Z INFO        Completed updating database password for ORDS_PUBLIC_USER. Elapsed time: 00:00:01.808 


[*** Info: Completed updating database password for ORDS_PUBLIC_USER. Elapsed time: 00:00:01.808 

 ]

2023-05-25T05:55:26.384Z INFO        To run in standalone mode, use the ords serve command:

2023-05-25T05:55:26.385Z INFO        ords --config /etc/ords/config serve

2023-05-25T05:55:26.385Z INFO        Visit the ORDS Documentation to access tutorials, developer guides and more to help you get started with the new ORDS Command Line Interface (http://oracle.com/rest).

[oracle@apex-test config]$ 


データベース・ユーザーへのパスワード設定と、ORDSの接続プールのウォレットへのパスワード設定を、それぞれ個別に実施することもできます。ORDSをクラスタで構成している場合、データベース・ユーザーのパスワード設定は1回ですが、ORDSのウォレットへのパスワード設定はORDSの数だけ実施する必要があります。そのため、データベースとウォレットへのパスワード設定は、分けて実施します。

sqlplus sys/パスワード@localhost/freepdb2 as sysdba
alter user ords_public_user identified by <パスワード>;

SQL> alter user ords_public_user identified by <パスワード>;


User altered.


SQL> exit


ORDSのプールpdb2のパスワードを更新します。

ords --config /etc/ords/config config --db-pool pdb2 secret db.password

[oracle@apex-test config]$ ords --config /etc/ords/config config --db-pool pdb2 secret db.password


ORDS: Release 23.1 Production on Wed May 24 07:19:19 2023


Copyright (c) 2010, 2023, Oracle.


Configuration:

  /etc/ords/config/


Enter the database password: ********

Confirm password: ********

The setting named: db.password was set to: ****** in configuration: pdb2

[oracle@apex-test config]$ 


以上でAPEX環境のクローンが作成され、以下のURLからアクセスできるようになります。

http://ホスト名/ords/pdb2/

URLに含まれるホスト名やパスより、リクエストを実行するデータベース(接続プール)を選択する方法については、マニュアルの以下の記載を参考にしてください。

3 複数のデータベースに対するOracle REST Data Servicesの構成

オラクル・データベースでは、パスワードの切り替え時に新旧双方のパスワードの両方が有効な期間を設定することができます。PASSWORD_ROLLOVER_TIME1を設定し、新旧のパスワードが1日の間有効である、という設定を行います。

create profile ords_public_user_prof limit password_rollover_time 1;
alter user ords_public_user profile ords_public_user_prof;

SQL> create profile ords_public_user_prof limit password_rollover_time 1;


Profile created.


SQL> alter user ords_public_user profile ords_public_user_prof;


User altered.


SQL> exit


現在のパスワードを使って接続を確認します。

sqlplus ords_public_user/現在のパスワード@localhost/freepdb2

[oracle@apex-test ~]$ sqlplus ords_public_user/現在のパスワード@localhost/freepdb2


SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Thu May 25 17:13:28 2023

Version 23.2.0.0.0


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


Last Successful login time: Thu May 25 2023 17:09:59 +09:00


Connected to:

Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release

Version 23.2.0.0.0


SQL> exit


パスワードを変更します。

alter user ords_public_user identified by 新しいパスワード;

SQL> alter user ords_public_user identified by 新しいパスワード;


User altered.


SQL> exit


以上でPASSWORD_ROLLOVER_TIMEとして指定した期間は、新旧のパスワードの両方でデータベースに接続できます。

パスワード・ロールオーバーに関する説明は、ORACLE-BASEの記事を参照しています。

Gradual Database Password Rollover Time (PASSWORD_ROLLOVER_TIME) in Oracle Database 19c and 21c
https://oracle-base.com/articles/21c/gradual-database-password-rollover-time-21c

良いことばかりではありません。

パスワードが流出した場合などはパスワードをすぐに変更する必要が出てきます。パスワード・ロールオーバーを設定したままだと、新しいパスワードに変更しても、パスワード・ロールオーバーの期間は古いパスワードでの接続を許してしまいます。


引数指定で接続プールを追加



引数指定で接続プールを追加する場合は、以下を実行します。

ords --config /etc/ords/config install \
--admin-user sys \
--db-pool pdb2 --db-hostname localhost --db-port 1521 --db-servicename freepdb2 \
--feature-db-api true --feature-rest-enabled-sql true --feature-sdw true \
--gateway-mode proxied --gateway-user APEX_PUBLIC_USER --proxy-user \
--config-only

オプション--password-stdinを付加すると、パスワード入力は画面からではなく標準入力から受け取ります。自動化のためのスクリプトに組み込むときに使用します。

オプション--proxy-userを付加している場合は、ORDS_PUBLIC_USERのパスワードの更新とウォレットへの設定が実施されます。--proxy-userをつけない場合は、ords config secret db.passwordを実行し、ウォレットにORDS_PUBLIC_USERのパスワードを設定する必要があります。

[oracle@apex-test config]$ ords --config /etc/ords/config install \

> --admin-user sys \

> --db-pool pdb2 --db-hostname localhost --db-port 1521 --db-servicename freepdb2 \

> --feature-db-api true --feature-rest-enabled-sql true --feature-sdw true \

> --gateway-mode proxied --gateway-user APEX_PUBLIC_USER --proxy-user \

> --config-only


ORDS: Release 23.1 Production on Thu May 25 09:47:57 2023


Copyright (c) 2010, 2023, Oracle.


Configuration:

  /etc/ords/config/


Enter the database password for SYS AS SYSDBA: ********

Enter the database password for ORDS_PUBLIC_USER: *******

Confirm password: ********

Oracle REST Data Services - Non-Interactive Install

The setting named: db.connectionType was set to: basic in configuration: pdb2

The setting named: db.hostname was set to: localhost in configuration: pdb2

The setting named: db.port was set to: 1521 in configuration: pdb2

The setting named: db.servicename was set to: freepdb2 in configuration: pdb2

The setting named: plsql.gateway.mode was set to: proxied in configuration: pdb2

The setting named: db.username was set to: ORDS_PUBLIC_USER in configuration: pdb2

The setting named: db.password was set to: ****** in configuration: pdb2

The setting named: feature.sdw was set to: true in configuration: pdb2

The setting named: restEnabledSql.active was set to: true in configuration: pdb2

The setting named: security.requestValidationFunction was set to: ords_util.authorize_plsql_gateway in configuration: pdb2

2023-05-25T09:48:05.695Z INFO        To run in standalone mode, use the ords serve command:

2023-05-25T09:48:05.697Z INFO        ords --config /etc/ords/config serve

2023-05-25T09:48:05.697Z INFO        Visit the ORDS Documentation to access tutorials, developer guides and more to help you get started with the new ORDS Command Line Interface (http://oracle.com/rest).

[oracle@apex-test config]$ 


ords install -hを実行すると、指定可能なオプションが一覧されます。


設定ファイルのコピー



PDB自体クローンしているため、同様に接続プールも設定ファイルpool.xmlをコピーして作成してみます。

クローンしたPDBのユーザーORDS_PUBLIC_USERのパスワードを更新します。パスワードが分かっている場合は、更新は不要です。

alter user ords_public_user identified by <新しいパスワード>;

[oracle@apex-test ~]$ sqlplus sys/<SYSのパスワード>@localhost/freepdb2 as sysdba


SQL*Plus: Release 23.0.0.0.0 - Developer-Release on Tue May 30 10:36:06 2023

Version 23.2.0.0.0


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



Connected to:

Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release

Version 23.2.0.0.0


SQL> alter user ords_public_user identified by <新しいパスワード>;


User altered.


SQL> exit

Disconnected from Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release

Version 23.2.0.0.0

[oracle@apex-test ~]$ 


最初に接続プールとなるディレクトリpdb2を作成し、設定ファイルpool.xmlをコピーします。

cd /etc/ords/config
mkdir databases/pdb2
cp databases/default/pool.xml databases/pdb2/


[oracle@apex-test ~]$ cd /etc/ords/config

[oracle@apex-test config]$ mkdir databases/pdb2

[oracle@apex-test config]$ cp databases/default/pool.xml databases/pdb2/


接続先となるデータベースのサービス名を変更し、ウォレットに設定されているパスワードを更新します。

ords --config /etc/ords/config config --db-pool pdb2 set db.servicename freepdb2
ords --config /etc/ords/config config --db-pool pdb2 secret db.password


[oracle@apex-test config]$ ords --config /etc/ords/config config --db-pool pdb2 set db.servicename freepdb2


ORDS: Release 23.1 Production on Tue May 30 01:39:52 2023


Copyright (c) 2010, 2023, Oracle.


Configuration:

  /etc/ords/config/


The setting named: db.servicename was set to: freepdb2 in configuration: pdb2

[oracle@apex-test config]$ ords --config /etc/ords/config config --db-pool pdb2 secret db.password


ORDS: Release 23.1 Production on Tue May 30 01:40:10 2023


Copyright (c) 2010, 2023, Oracle.


Configuration:

  /etc/ords/config/


Enter the database password: <ORDS_PUBLIC_USERのパスワード>

Confirm password: <ORDS_PUBLIC_USERのパスワード>

The setting named: db.password was set to: ****** in configuration: pdb2

[oracle@apex-test config]$ 


変更したサービス名とパスワード以外は、クローン元のPDBおよび接続プールの構成ファイルpool.xmlの設定を引き継ぎます。

以上になります。

APEXがインストールされたPDBのクローンを作成し、ORDSに接続プールを追加する方法について紹介しました。

続く