ねら~ITエンジニア雑記

やきうのお兄ちゃんが綴るOracle Databaseメインのブログ

Oracle Database Enterprise Edition 19c を rpm の yum localinstall で OCI Compute にインストールしてみる。

表題の通り Oracle Database Enterprise Edition 19c を rpmyum localinstall で OCI Compute にインストールしてみるやで。
彡(゚)(゚)

1. 参考ドキュメント

マニュアルは下記となります。「Oracle Database RPMの手動インストール」でインストールしてみます。

RPMパッケージの実行によるOracle Databaseのインストール
https://docs.oracle.com/cd/F19136_01/ladbi/running-rpm-packages-to-install-oracle-database.html#GUID-BB7C11E3-D385-4A2F-9EAF-75F4F0AACF02

2. oracle-database-preinstall-19c のインストール

まずは oracle-database-preinstall-19c を yum でインストールします。

このパッケージをインストールすると、Oracle Database Enterprise Edition 19c を
インストールするためのパッケージ類がまとまって入ります。超便利。もう戻れない。

yum -y install oracle-database-preinstall-19c

3. oracle-database-preinstall-19c のダウンロードと配置

下記のリンクを辿って Linux x86-64版 の rpm をダウンロードしてきます。

Oracle Software Downloads
http://www.oracle.com/technetwork/indexes/downloads/index.html

Database

Database 19c Enterprise/Standard Editions

Linux x86-64 の See All

Oracle Database 19c Download for Linux x86-64
https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html

今回は 対象Compute の /tmp配下に rpm を配置しました。

[root@ays-compute2 ~]# ls -la /tmp/oracle-database-ee-19c-1.0-1.x86_64.rpm
-rw-rw-r--. 1 opc opc 2694664264 Mar 30 15:11 /tmp/oracle-database-ee-19c-1.0-1.x86_64.rpm
[root@ays-compute2 ~]#

4. oracle-database-ee-19c の インストール(yum localinstall)

/tmp に配置した rpm をローカルインストールします。

cd /tmp
yum -y localinstall oracle-database-ee-19c-1.0-1.x86_64.rpm

[root@ays-compute2 tmp]# yum -y localinstall oracle-database-ee-19c-1.0-1.x86_64.rpm
Loaded plugins: langpacks, rhnplugin, ulninfo
This system is receiving updates from ULN.
:
Installed:
  oracle-database-ee-19c.x86_64 0:1.0-1

Complete!

待ってるだけで完了や!彡(^)(^)

5. インストールの確認と sqlplus の起動

インストール先は /opt/oracle/product/19c/dbhome_1 となります。

cd /opt/oracle/product/19c/dbhome_1
ls -la

[root@ays-compute2 dbhome_1]# ls -la
total 120
drwxr-xr-x. 69 oracle oinstall  4096 Apr 30 10:44 .
drwxr-xr-x.  3 oracle oinstall    22 Apr 30 10:39 ..
drwxr-xr-x.  2 oracle oinstall   102 Apr 30 10:39 addnode
drwxr-xr-x.  6 oracle oinstall  4096 Apr 30 10:39 apex
:
drwxr-xr-x.  6 oracle oinstall    53 Apr 30 10:43 sqlplus
drwxr-xr-x.  6 oracle oinstall    54 Apr 30 10:43 srvm
drwxr-xr-x.  5 oracle oinstall    45 Apr 30 10:43 suptools
drwxr-xr-x.  3 oracle oinstall    35 Apr 30 10:43 ucp
drwxr-xr-x.  4 oracle oinstall    31 Apr 30 10:43 usm
drwxr-xr-x.  2 oracle oinstall    33 Apr 30 10:43 utl
drwxr-xr-x.  3 oracle oinstall    19 Apr 30 10:43 wwg
drwxr-x---.  7 oracle oinstall    69 Apr 30 10:43 xdk

環境変数をセットして sqlplus を起動してみます。

export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 30 10:45:54 2021
Version 19.3.0.0.0

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

SQL>

sqlplus を起動できました彡(^)(^)

6. まとめ

かつては GUICUI の Response File でガチャガチャやっていたインストールも楽々や!彡(^)(^)

本当は Data Guard で Application Continuity の記事を書こうと
思ったんやけど、環境が壊れてしまったので、そちらはまた次回彡(゚)(゚)

おまけ?. 直の yum install しても No Package で見つからない。

uln_register して yum -y install oracle-database-ee-19c しても、
No Package でインストールできないんですよねー。(゚ε゚ )

https://linux.oracle.comhttp://yum.oracle.com/ にもそれっぽいパッケージは無いし。謎。

OCI DBCS VM で Data Guard を有効化して、ロールベース・サービスを構成して PRIMARYロール に透過的に接続してみる。(Oracle Cloud Infrastructure)

Oracle Cloud Infrastructure(以下、OCI) の DBCS(VM) で Data Guard を有効化して、
ロールベース・サービスを構成して PRIMARYロール の DB に透過的に接続してみるやで。
彡(^)(^)

1. Data Guard の有効化 in OCI DBCS VM

OCI DBCS VM の Data Guard有効化 は マニュアル や下記記事の通りです。
基本Webコンソールでポチポチするだけ彡(゚)(゚)

仮想マシンDBシステムでOracle Data Guardを有効にするには
https://docs.oracle.com/ja-jp/iaas/Content/Database/Tasks/usingdataguard.htm

6. 「Data Guardアソシエーション」セクションで、「Data Guardの有効化」をクリックします。

OCI DatabaseでのData Guardの作り方(VM
https://qiita.com/fujid/items/e2a7186f1b5e74be9d78

EnableDataGuard.jpg

しばらく待つと Data Guard が構成されるので、dgmgrlコマンドで様子を確認してみます。

[oracle@ayudbcs1 ~]$ dgmgrl
:
DGMGRL> CONNECT SYS/########@ayudbcs2.ayuprvsubnet2.ayuvcn1.oraclevcn.com:1521/ayucdb1_nrt18j.ayuprvsubnet2.ayuvcn1.oraclevcn.com
DGMGRL> SHOW CONFIGURATION;

Configuration - ayucdb1_nrt1fg_ayucdb1_nrt18j

  Protection Mode: MaxPerformance
  Members:
  ayucdb1_nrt1fg - Primary database
    ayucdb1_nrt18j - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 14 second ago)

DGMGRL>

無事 Data Guard が有効化されてますやね彡(^)(^)
この環境では DB #1 が ayucdb1_nrt1fg、DB #2 が ayucdb1_nrt18j になります。

2. ロールベース・サービスの登録

srvctlコマンドでロールベース・サービスを (GI = Grid Infrastructure の) Clusterware に
登録します。DB #1(Primary), DB #2(Standby) のそれぞれで実行して、サービスを登録します。

Oracle Real Application Clusters 管理およびデプロイメント・ガイド 19c
A.9.103 srvctl add service
https://docs.oracle.com/cd/F19136_01/racad/server-control-utility-reference.html#GUID-EC1BA6D7-D538-4E11-9B31-C59389FDF93B

-role {PRIMARY | PHYSICAL_STANDBY | LOGICAL_STANDBY | SNAPSHOT_STANDBY}
Oracle Data Guard構成でのデータベースのロールを指定します。デフォルトはPRIMARYです。

コマンドは以下の通り、-roleパラメータがポイントで DB が PRIMARY の時だけ起動するサービス彡(゚)(゚)

# DB #1(Primary, ayucdb1_nrt1fg) 
srvctl add service -db ayucdb1_nrt1fg -service ayudbcs_primary2 -pdb ayupdb1 -role PRIMARY
# DB #2(Standby, ayucdb1_nrt18j) 
srvctl add service -db ayucdb1_nrt18j -service ayudbcs_primary2 -pdb ayupdb1 -role PRIMARY

DB #1(Primary, ayucdb1_nrt1fg) で登録したサービスを開始します。

# DB #1(Primary, ayucdb1_nrt1fg) 
srvctl start service -db ayucdb1_nrt1fg -service ayudbcs_primary2

DB #1 のリスナーに起動したサービスが登録されているのを確認します。

# DB #1(Primary, ayucdb1_nrt1fg) 
lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 31-MAR-2021 04:50:37
:
Service "ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com" has 1 instance(s).
  Instance "ayucdb1", status READY, has 2 handler(s) for this service...
:

ロールベース・サービスの注意事項として、ロールベース・サービスは Data Guard Broker と
GI(Grid Infrastructure, or Restart) が連携して制御されます。従って GI(or Restart) と Broker との併用が必須です。

Oracle Data Guard Broker 19c
5.6.1.2 データベース・サービスの構成要件
https://docs.oracle.com/cd/F19136_01/dgbkr/using-data-guard-broker-to-manage-switchovers-failovers.html#GUID-05918DD1-FB0F-435B-873B-A43BEC1C7638

3. ロールベース・サービスへの接続文字列構成(※接続時フェイルオーバーを有効化した書き方)

クライアントの tnsnames.ora を編集して、ロールベース・サービスへの接続文字列を構成します。

接続時フェイルオーバーで DB #1(Primary)側への接続を失敗した時に、
DB #2(旧Standby、接続時には新Primary) に接続をフェイルオーバーするように記述するのがポイント
彡(゚)(゚)

Oracle Database Net Servicesリファレンス 19c
6.8.2 FAILOVER
https://docs.oracle.com/cd/F19136_01/netrf/local-naming-parameters-in-tns-ora-file.html#GUID-4A20F0A2-EDCD-4006-9177-2EA4B12D656D

AYUDBCS_PRIMARY2=(
  DESCRIPTION_LIST=
    (LOAD_BALANCE=OFF)(FAILOVER=ON)
    (
      DESCRIPTION=
        (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=5)(RETRY_DELAY=3)(RETRY_COUNT=3)(ENABLE=BROKEN)
        (ADDRESS_LIST=
          (ADDRESS=(PROTOCOL=TCP)(HOST=ayudbcs1-scan.ayuprvsubnet2.ayuvcn1.oraclevcn.com)(PORT=1521))
        )
        (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com))
    )
    (
      DESCRIPTION=
        (CONNECT_TIMEOUT=5)(TRANSPORT_CONNECT_TIMEOUT=5)(RETRY_DELAY=3)(RETRY_COUNT=3)(ENABLE=BROKEN)
        (ADDRESS_LIST=
          (ADDRESS=(PROTOCOL=TCP)(HOST=ayudbcs2-scan.ayuprvsubnet2.ayuvcn1.oraclevcn.com)(PORT=1521))
        )
        (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com))
    )
)

上記の書き方だと、まず 1番目のDESCRIPTION(DB #1へのエントリ) に接続を試みて、
失敗すると 2番目のDESCRIPTION(DB #2へのエントリ)に接続を試みます。

4. ロールベース・サービスへの接続確認(DB #1 が PRIMARY)

まずはロールの確認、DB #1(ayucdb1_nrt1fg) が PRIMARYロール なのを確認します。

dgmgrl
CONNECT SYS/########@ayudbcs2.ayuprvsubnet2.ayuvcn1.oraclevcn.com:1521/ayucdb1_nrt18j.ayuprvsubnet2.ayuvcn1.oraclevcn.com
SHOW CONFIGURATION;

Configuration - ayucdb1_nrt1fg_ayucdb1_nrt18j

  Protection Mode: MaxPerformance
  Members:
  ayucdb1_nrt1fg - Primary database
    ayucdb1_nrt18j - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 14 second ago)

DB #1 が Primary の状態で #3. の接続文字列でロールベース・サービスに接続します。

sqlplus /nolog
CONNECT AYSHIBAT/########@AYUDBCS_PRIMARY2
SET LINESIZE 300;
SET PAGESIZE 100;
COLUMN HOST_NAME FORMAT A50;
COLUMN MY_SERVICE FORMAT A80;
SELECT NAME, DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
SELECT INSTANCE_NAME, HOST_NAME FROM V$INSTANCE;
SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS MY_SERVICE FROM DUAL;
SHOW CON_NAME;

結果は以下の通り、DB #1(ayucdb1_nrt1fg) に接続できてますやね彡(^)(^)

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 31 05:23:58 2021
:
SQL> CONNECT AYSHIBAT/########@AYUDBCS_PRIMARY2
Connected.
SQL> SET LINESIZE 300;
SQL> SET PAGESIZE 100;
SQL> COLUMN HOST_NAME FORMAT A50;
SQL> COLUMN MY_SERVICE FORMAT A80;
SQL> SELECT NAME, DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;

NAME      DB_UNIQUE_NAME                 DATABASE_ROLE    OPEN_MODE
--------- ------------------------------ ---------------- --------------------
AYUCDB1   ayucdb1_nrt1fg                 PRIMARY          READ WRITE

SQL> SELECT INSTANCE_NAME, HOST_NAME FROM V$INSTANCE;

INSTANCE_NAME    HOST_NAME
---------------- --------------------------------------------------
ayucdb1          ayudbcs1

SQL> SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS MY_SERVICE FROM DUAL;

MY_SERVICE
--------------------------------------------------------------------------------
ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com

SQL> SHOW CON_NAME;

CON_NAME
------------------------------
AYUPDB1
SQL>

5. スイッチオーバー(ロール変換)の実行 ※追記あり

※追記:OCI DBCS におけるスイッチオーバー、フェイルオーバーはWebコンソール または OCI CLI
使うべきである、という指摘がありました。詳しくは # 8. を参照……。

dgmgrl の SWITCHOVERコマンド で DB #1(ayucdb1_nrt1fg) と DB #2(ayucdb1_nrt18j) のロールを入れ替えます。
Data Guard の手動スイッチは超面倒なんですが、dgmgrl のスイッチオーバーはコマンド一発で超らくちん彡(^)(^)

dgmgrl
CONNECT SYS/########@ayudbcs2.ayuprvsubnet2.ayuvcn1.oraclevcn.com:1521/ayucdb1_nrt18j.ayuprvsubnet2.ayuvcn1.oraclevcn.com
SWITCHOVER to ayucdb1_nrt18j;
SHOW CONFIGURATION;

結果は以下の通り、きっちりロール(Primary, Standby)が入れ替わってますやね彡(^)(^)

[oracle@ayudbcs1 ~]$ dgmgrl
DGMGRL for Linux: Release 19.0.0.0.0 - Production on Wed Mar 31 05:17:32 2021
:
DGMGRL> CONNECT SYS/########@ayudbcs2.ayuprvsubnet2.ayuvcn1.oraclevcn.com:1521/ayucdb1_nrt18j.ayuprvsubnet2.ayuvcn1.oraclevcn.com
Connected to "ayucdb1_nrt18j"
Connected as SYSDBA.
DGMGRL> SWITCHOVER to ayucdb1_nrt18j;
Performing switchover NOW, please wait...
New primary database "ayucdb1_nrt18j" is opening...
Oracle Clusterware is restarting database "ayucdb1_nrt1fg" ...
Connected to "ayucdb1_nrt1fg"
Connected to "ayucdb1_nrt1fg"
Switchover succeeded, new primary is "ayucdb1_nrt18j"
DGMGRL> SHOW CONFIGURATION;

Configuration - ayucdb1_nrt1fg_ayucdb1_nrt18j

  Protection Mode: MaxPerformance
  Members:
  ayucdb1_nrt18j - Primary database
    ayucdb1_nrt1fg - Physical standby database

Fast-Start Failover:  Disabled

Configuration Status:
SUCCESS   (status updated 15 seconds ago)

6. ロールベース・サービスへの接続確認(DB #2 が PRIMARY)

DB #2 のリスナーに起動したサービスが登録されているのを確認します。

# DB #2(Primary, ayucdb1_nrt18j) 
lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 31-MAR-2021 04:50:37
:
Service "ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com" has 1 instance(s).
  Instance "ayucdb1", status READY, has 2 handler(s) for this service...
:

DB #2 が Primary の状態で #3. の接続文字列でロールベース・サービスに接続します。

sqlplus /nolog
CONNECT AYSHIBAT/########@AYUDBCS_PRIMARY2
SET LINESIZE 300;
SET PAGESIZE 100;
COLUMN HOST_NAME FORMAT A50;
COLUMN MY_SERVICE FORMAT A80;
SELECT NAME, DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
SELECT INSTANCE_NAME, HOST_NAME FROM V$INSTANCE;
SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS MY_SERVICE FROM DUAL;
SHOW CON_NAME;

結果は以下の通り、DB #2(ayucdb1_nrt18j) に接続できてますやね彡(^)(^)

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 31 05:23:58 2021
:
SQL> CONNECT AYSHIBAT/########@AYUDBCS_PRIMARY2
Connected.
SQL> SET LINESIZE 300;
SQL> SET PAGESIZE 100;
SQL> COLUMN HOST_NAME FORMAT A50;
SQL> COLUMN MY_SERVICE FORMAT A80;
SQL> SELECT NAME, DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;

NAME      DB_UNIQUE_NAME                 DATABASE_ROLE    OPEN_MODE
--------- ------------------------------ ---------------- --------------------
AYUCDB1   ayucdb1_nrt18j                 PRIMARY          READ WRITE

SQL> SELECT INSTANCE_NAME, HOST_NAME FROM V$INSTANCE;

INSTANCE_NAME    HOST_NAME
---------------- --------------------------------------------------
ayucdb1          ayudbcs2

SQL> SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS MY_SERVICE FROM DUAL;

MY_SERVICE
--------------------------------------------------------------------------------
ayudbcs_primary2.ayuprvsubnet2.ayuvcn1.oraclevcn.com

SQL> SHOW CON_NAME;

CON_NAME
------------------------------
AYUPDB1
SQL>

7. まとめ

ロールベース・サービス と 接続時フェイルオーバー の組み合わせで、クライアントの
接続文字列を変更せずに Data Guard の PRIMARYサイト に透過的に接続できる!
彡(^)(^)

これで仕込みは完了、本当にやりたかった事(AC)は次回以降に……彡(゚)(゚)

8. 追記:Webコンソール と OCI CLI による OCI DBCS の Data Guard ロール変換(スイッチオーバー/フェイルオーバー)

OCI DBCS においては Data Guard のスイッチオーバー や フェイルオーバー は Webコンソール や OCI CLI
やるべきである、という指摘がありました。そうしないと画面の状態と実際の DB の状態が異なってしまうそうな。
なるぺそ彡(゚)(゚)


Oracle Data Guardの使用
https://docs.oracle.com/ja-jp/iaas/Content/Database/Tasks/usingdataguard.htm

データベースのスイッチオーバーを実行するには

5. スイッチオーバーを実行するData Guardアソシエーションについて、
「アクション」アイコン(3つのドット)をクリックし、「スイッチオーバー」をクリックします。

データベースのフェイルオーバーを実行するには

5. フェイルオーバーを実行するData Guardアソシエーションについて、「フェイルオーバー」をクリックします。


Docs >> db >> data-guard-association >> switchover
https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.22.1/oci_cli_docs/cmdref/db/data-guard-association/switchover.html
Usage
oci db data-guard-association switchover [OPTIONS]


Docs >> db >> data-guard-association >> failover
https://docs.oracle.com/en-us/iaas/tools/oci-cli/2.22.1/oci_cli_docs/cmdref/db/data-guard-association/failover.html
Usage
oci db data-guard-association failover [OPTIONS]


皆さま、お気を付けくださいませ。(`・ω・)ゞ

OCI 2020 Architect Associate (1Z0-1072-20) に合格したので、受験方法や学習コンテンツをまとめてみる。(Oracle Cloud Infrastructure)

Oracle Cloud Infrastructure 2020 Architect Associate (1Z0-1072-20) に合格したやで!
合格の勢いを駆って、受験方法や学習コンテンツをまとめてみましたやで。
彡(^)(^)

1. 公式ページ

まずは公式ページから。該当資格の公式ページは下記のとおり。

Oracle Cloud Infrastructure 2020 Architect Associate
Exam Number: 1Z0-1072-20
https://education.oracle.com/ja/oracle-cloud-infrastructure-2020-architect-associate/pexam_1Z0-1072-20

2. Learning Subscription の申込(※無料)

OCI 2020 Architect Associate の Learning Subscription(※無料) を下記リンクから申し込みできます。

Become OCI Architect (Associate)
https://learn.oracle.com/ols/learning-path/become-oci-architect-associate/35644/75658
OCI_Associate001.jpg

各種動画や模試等をクリアして 100% になると、「Oracle Cloud Infrastructure 2020 Architect Associate (1Z0-1072-20)」のリンクからピアソンVUEのページに飛ばされて、試験の申込ができます。 OCI_Associate002.jpg

3. 試験の申込(1Z0-1072-20 or 1Z0-1072-20-JPN) と 再受験無料キャンペーン

前述のリンクからピアソンVUEのサイトに飛ばされて、試験の申込ができます。
前述のリンクは英語版の試験(1Z0-1072-20)ですが、日本語版(1Z0-1072-20-JPN)も検索すれば有ります。
OCI_Associate003.jpg

再受験無料キャンペーンもありますので、プロモーションコードを確実にゲットしておきましょう。

ラクル認定資格試験 再受験無料キャンペーン 2021
https://www.pearsonvue.co.jp/Clients/Oracle/Special-Offers/Retake2021.aspx

オンライン試験と会場試験が有るのですが、オンライン試験はクリアデスクの確認が有るらしく、
ワイはそれを突破する自信が無かったので会場試験、教材が英語中心だったので英語試験を選択彡(゚)(゚)

会場受験の場合は受験当日に身分証明書(本人確認書類)が2種類必要なので、そこは抜かりなく。

本人確認書類について
https://www.pearsonvue.co.jp/Test-takers/Tutorial/Identification-2.aspx

以下のいずれかの組み合わせで計 2 点をご提示ください。

4. 教材・学習コンテンツ

まずは既出の下記リンク動画(Oracle Cloud Infrastructure Architect Associate Workshop)が
標準的な教材となります。10時間以上もある、膨大な時間の動画群……:(;゙゚'ω゚'): 英語ですが日本語字幕対応。

Become OCI Architect (Associate)
https://learn.oracle.com/ols/learning-path/become-oci-architect-associate/35644/75658

日本語の動画もあります。こちらは試験のポイントを解説したセミナーのもの。

Oracle Cloud Infrastructure 2019 Certified Architect Associate 資格試験ポイント解説セミナー(1)
https://www.youtube.com/watch?v=Fo0hK9fYflo

Oracle Cloud Infrastructure 2019 Certified Architect Associate 資格試験ポイント解説セミナー (2)
https://www.youtube.com/watch?v=LXPxiDjbeBA

Oracle Cloud Infrastructure 2019 Certified Architect Associate 資格試験ポイント解説セミナー(3)
https://www.youtube.com/watch?v=Uw0FPAmM7wQ

Oracle Cloud Infrastructure 2019 Certified Architect Associate 資格試験ポイント解説セミナー(4)
https://www.youtube.com/watch?v=Nol78y58khQ

Udemy には 65問*3セット の模擬試験(英語)が有るので、これを購入するのもエエんかと。

Udemy - Oracle Cloud Infrastructure 2020 Architect Associate
https://www.udemy.com/course/oracle-cloud-infrastructure-2020-architect-associate

実環境も触っておくと良いと思います。Always Free などをご活用下さい。
オススメは Phoenix か Ashburn を Home Region に指定した Always Free垢 を獲得して、
PAYG にアップグレードして 無料 or 安価なリソースを利用すること。
無料リソースでも PAYG垢 でないと作れないリソース(※)もあるので(゚ε゚ )
※NAT Gateway や Service Gateway がその代表的なリソース

Always Free Cloud Servicesを試し、30日間トライアルを入手する
https://www.oracle.com/jp/cloud/free/

Oracle Cloud Always Free の登録でハマりがちな3つのポイントとその対処法
https://qiita.com/Skogkatter112/items/1097c2d51be14fb66652

最近待望の書籍も出版されました!こちらのご購読も推奨や!彡(^)(^)

Oracle Cloud Infrastructure エンタープライズ構築実践ガイド
https://www.amazon.co.jp/dp/B08R9GXZ2Y

ガチ英語ですが試験問題の回答と解説をしてくれている動画も。

T3P - [Latest] Oracle Cloud Infrastructure 2020 Architect Associate (1Z0-1072-20) Questions with Answer
https://www.youtube.com/watch?v=v2-PgRet2As
T3P - Oracle Cloud Infrastructure 2020 Architect Associate (1Z0-1072-20) Rectified Questions with Answer
https://www.youtube.com/watch?v=WHXdYKBEv2s

5. 学習の実態

ワイは下記のような感じで学習してました。OCI は業務である程度触っているので、
出題傾向の確認と試験の世界に入り込むための模試と動画視聴が中心彡(゚)(゚)

Practice Exam For: OCI 2020 Architect Associate(30分くらい)

Practice Exam For: OCI 2020 Architect Associate(回答の確認、10分くらい)

OCI Architect Associate Workshop の動画をメモしながら視聴(かなり端折って6時間くらい)

Practice Exam For: OCI 2020 Architect Associate(3回目, 10分くらい)

Udemy の模試(Test1)実施(1周目、65問で60分強)

Udemy の模試(Test1)結果/回答確認(やはり60分くらい)

Udemy の模試(Test1)実施(2周目、20分程度)

上記Udemy模試2周回を Test2, Test3 でも実施(Test2 と Test3 をそれぞれ2周するのに2時間半*2程度)

Practice Exam For: OCI 2020 Architect Associate(4回目, 10分くらい, この時点でかなり試験の世界観に染まってる。)

会場近くには早めに到着、近くのカフェで Udemy Test1,2,3 の1周目不正解問題を中心に復習

6. 試験の結果

試験は 85分で60問。1時間ほどで60問を解きつつ、残り25分で Mark した問題を見直して Submit した結果は……! OCI_Associate004.jpg ……OCI Foundations Associate の3倍くらい真面目に対策したんですが、割とギリギリの合格。
AD(Availability Domain) や LB や DR(Cross-Region)等の可用性廻りを問う問題が多かったでしょうか。

とまれ合格は合格や!みなさんもこれらの試験も活用しつつ、OCI を使ってくださいね彡(^)(^)

参考:

OCI Foundations 2020 Associate(1Z0-1085-20) に合格したので
受講手順と勉強方法をメモしておく。(Oracle Cloud Infrastructure)
https://qiita.com/ora_gonsuke777/items/966c4cda580199f63674

Oracle Cloud Infrastructure 2018 Architect Associate 合格体験記
https://qiita.com/y-araki-qiita/items/ec575467d13bfc67a11c

OCI の Outbound Data Transfer の現在値を確認してみる。(Oracle Cloud Infrastructure)

OCI(Oracle Cloud Infrastructure) の Outbound Data Transfer、OCI内から外部へのデータ転送で
発生する料金は月毎に 10TB まで無償なんですが、現在値がどの程度かは気になりますよね。

Oracle Networking Cloudの価格
https://www.oracle.com/jp/cloud/networking/networking-pricing.html

アウトバウンドデータ転送 - 最初の10 TB(1か月あたり)- 無償
 
・OCI 課金にまつわるエトセトラ
https://speakerdeck.com/mmarukaw/oci-ke-jin-nimatuwaruetosetora

この Outbound Data Transfer の現在値を確認する方法がちょっと解り難かったので、まとめてみましたやで。
彡(゚)(゚)

1. OCI Console から Service User Console を開く。

Outbound001.jpg

OCI Console画面右上の人のアイコンをクリックして、プルダウンメニューから「Service User Console」を開きます。

2. Service User Console から My Admin Accounts を開く。

Outbound002.jpg

Service User Console画面右上の人のアイコンをクリックして、プルダウンメニューから「My Admin Accounts」を開きます。

3. My Admin Accounts の Usageタブをクリックする。

Outbound003.jpg

My Admin Accounts の Usageタブをクリックします。

4. Usage Summary の Compute を展開する。

Outbound004.jpg

Usage Summary の Description に表示されている Compute の三角マークをクリックして展開します。

5. Outbound Data Transfer の確認

Outbound005.jpg

Description の Compute が展開されると、Outbound Data Transfer の現在値が確認できます。
Usage Quantity の単位は、おそらく課金単位の GB のはず……。彡(゚)(゚)

6. まとめ

Outbound Data Transfer の現在値はちょっと解り難い場所にひっそりと佇んでますね……。
とまれ転送量が 10TB を超えることはそうそう無いはず。OCI をどんどん活用して下さいね。彡(^)(^)

追記. Cost Analysis での同メトリックの取得

Outbound006.jpg

コメントにも有る通り Cost Analysis でも同メトリックが取得できました。
sugimount さん、ありがとうございます!彡(^)(^) また逢い見えましょう。

DBMS_STATSパッケージ の estimate_percentパラメータ を AUTO_SAMPLE_SIZE と 100(100%) に設定した際の PGA使用量 を比較してみる。(Oracle Database)

表題の通り、DBMS_STATSパッケージ の estimate_percentパラメータ を変更した時の PGA使用量 を比較してみたやで。
彡(゚)(゚)

1. 検証を行った環境

今回は Autonomous Database の ATP-S の環境を使用しました。必ずしも Autonomous Database の
必要は無いんですが、IO性能が良いのと SSB(Star Schema Bench) のサンプルデータがプリセットされているので。
(゚ε゚ )

2. サンプルデータの作成(SSB.CUSTOMER表の複製)

Autonomous Database には SSB(Star Schema Bench) のサンプルスキーマがプリセットされているので、
そこの CUSTOMER表 を ADMINスキーマ に CTAS でコピーして、サンプルデータとします。

SET TIME ON;
SET TIMING ON;

DROP TABLE ADMIN.CUSTOMER;
CREATE TABLE ADMIN.CUSTOMER PARALLEL 12 AS SELECT /*+ PARALLEL(12) */ * FROM SSB.CUSTOMER;
ALTER TABLE ADMIN.CUSTOMER PARALLEL 1;

COLUMN SEGMENT_NAME FORMAT A30;
SELECT SEGMENT_NAME, BYTES FROM DBA_SEGMENTS WHERE OWNER = 'ADMIN' AND SEGMENT_NAME = 'CUSTOMER';

SELECT /*+ PARALLEL(12) */ COUNT(*) FROM ADMIN.CUSTOMER;

実行結果は下記の通り、3000万件のサンプルデータができました。

Table ADMIN.CUSTOMERが削除されました。

経過時間: 00:00:00.228

Table ADMIN.CUSTOMERは作成されました。

経過時間: 00:00:13.052

Table ADMIN.CUSTOMERが変更されました。

経過時間: 00:00:00.224

SEGMENT_NAME                        BYTES
------------------------------ ----------
CUSTOMER                       3965714432

経過時間: 00:00:00.215

  COUNT(*)
----------
  30000000

経過時間: 00:00:00.400

3. estimate_percentパラメータ に AUTO_SAMPLE_SIZE を セットした際の PGA使用量

estimate_percentパラメータ に AUTO_SAMPLE_SIZE をセットした時の PGA使用量 を確認してみます。

SET TIMING ON;
COLUMN VALUE FORMAT 999,999,999,999,999;

SELECT S.SID, N.NAME, S.VALUE
  FROM V$MYSTAT   S
     , V$STATNAME N
 WHERE S.STATISTIC# = N.STATISTIC#
   AND N.NAME LIKE '%pga%';

EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'ADMIN', TABNAME => 'CUSTOMER', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, degree => 1);

SELECT S.SID, N.NAME, S.VALUE
  FROM V$MYSTAT   S
     , V$STATNAME N
 WHERE S.STATISTIC# = N.STATISTIC#
   AND N.NAME LIKE '%pga%';

COLUMN OWNER FORMAT A10;
COLUMN TABLE_NAME FORMAT A20;

SELECT OWNER, TABLE_NAME, NUM_ROWS, BLOCKS, AVG_ROW_LEN
  FROM DBA_TAB_STATISTICS
 WHERE OWNER = 'ADMIN' AND TABLE_NAME = 'CUSTOMER';

結果は下記の通り、44MB程度の PGA を使用しています。

       SID NAME                                             VALUE
---------- --------------------------------- --------------------
     37237 session pga memory                          14,311,736
     37237 session pga memory max                      16,539,960 ★統計取得前は16MB程度

経過時間: 00:00:00.217

PL/SQLプロシージャが正常に完了しました。

経過時間: 00:01:03.802

       SID NAME                                             VALUE
---------- --------------------------------- --------------------
     37237 session pga memory                          20,209,976
     37237 session pga memory max                      44,327,224 ★44MB程度を使用

経過時間: 00:00:00.203

OWNER      TABLE_NAME             NUM_ROWS     BLOCKS AVG_ROW_LEN
---------- -------------------- ---------- ---------- -----------
ADMIN      CUSTOMER               30000000     484096         108

経過時間: 00:00:00.405

4. estimate_percentパラメータ に 100(100%) を セットした際の PGA使用量

SET TIMING ON;
COLUMN VALUE FORMAT 999,999,999,999,999;

SELECT S.SID, N.NAME, S.VALUE
  FROM V$MYSTAT   S
     , V$STATNAME N
 WHERE S.STATISTIC# = N.STATISTIC#
   AND N.NAME LIKE '%pga%';

EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'ADMIN', TABNAME => 'CUSTOMER', estimate_percent => 100, degree => 1);

SELECT S.SID, N.NAME, S.VALUE
  FROM V$MYSTAT   S
     , V$STATNAME N
 WHERE S.STATISTIC# = N.STATISTIC#
   AND N.NAME LIKE '%pga%';

COLUMN OWNER FORMAT A10;
COLUMN TABLE_NAME FORMAT A20;

SELECT OWNER, TABLE_NAME, NUM_ROWS, BLOCKS, AVG_ROW_LEN
  FROM DBA_TAB_STATISTICS
 WHERE OWNER = 'ADMIN' AND TABLE_NAME = 'CUSTOMER';

結果は下記の通り、730MB程度の PGA を使用しています。

       SID NAME                                           VALUE
---------- ------------------------------- --------------------
     37237 session pga memory                        19,882,296
     37237 session pga memory max                    43,671,864 ★統計取得前は43MB程度

経過時間: 00:00:00.187

PL/SQLプロシージャが正常に完了しました。

経過時間: 00:04:27.525

       SID NAME                                           VALUE
---------- ------------------------------- --------------------
     37237 session pga memory                        19,423,544
     37237 session pga memory max                   731,341,112 ★730MB程度を使用

経過時間: 00:00:00.205

OWNER      TABLE_NAME             NUM_ROWS     BLOCKS AVG_ROW_LEN
---------- -------------------- ---------- ---------- -----------
ADMIN      CUSTOMER               30000000     484096         108

経過時間: 00:00:00.462

5. まとめ

AUTO_SAMPLE_SIZE最高や!下記ブログに記載が有りますが、approximate NDV algorithm というのが効いているみたいです。

How does AUTO_SAMPLE_SIZE work in Oracle Database 12c?
https://blogs.oracle.com/optimizer/how-does-auto_sample_size-work-in-oracle-database-12c

AUTO_SAMPLE_SIZE をどんどん使用して下さいね彡(^)(^)

Application Continuity を Java の UCP(ucp.jar) と Autonomous Database の ATP で試してみる。(Oracle Cloud Infrastructure)

本エントリは JPOUG Advent Calendar 2020 および Oracle Cloud Infrastructure Advent Calendar 2020 の 9日目 の記事です。以前 sqlplus で検証した Application Continuity を、本記事では Java の UCP(ucp.jar) で試してますやで。
彡(^)(^)

JPOUG Advent Calendar 2020
https://adventar.org/calendars/5265

Oracle Cloud Infrastructure Advent Calendar 2020
https://qiita.com/advent-calendar/2020/oci

Application Continuity を sqlplus と Autonomous Database の ATP で試してみる。(Oracle Cloud Infrastructure)
https://qiita.com/ora_gonsuke777/items/8251cd3079d2904b3934

1. Application Continuity とは?

Application Continuity は Oracle Database の高可用性機能の一つで、Oracle Database のトランザクション実行中に
エラーが発生した際に、そのエラーをクライアント側に返すことなく透過的に再実行する機能となります。

アプリケーション・コンティニュイティ
https://www.oracle.com/technetwork/jp/database/options/clustering/applicationcontinuity/overview/ac-overview-1967264-ja.html

oracle4engineer - アプリケーション・コンティニュイティ(Speakerdeck)
https://speakerdeck.com/oracle4engineer/apurikesiyonkonteiniyuitei

2. 参考ドキュメント/マニュアル

以下のマニュアルとソースコードを参考にしてみました。彡(゚)(゚)

アプリケーション・コンティニュイティの有効化および無効化
https://docs.oracle.com/cd/E83857_01/paas/atp-cloud/atpug/application-continuity.html#GUID-8874CB1D-0B20-461F-91D2-24E2EE4148A3

DBMS_CLOUD_ADMIN.ENABLE_APP_CONTを使用して、選択したサービスでアプリケーション・コンティニュイティを有効にします。

GitHub: UCPSample.java
https://github.com/oracle/oracle-db-examples/blob/master/java/jdbc/ConnectionSamples/UCPSample.java

10.1 UCPを使用したアプリケーション・コンティニュイティの有効化の概要
https://docs.oracle.com/cd/F19136_01/jjucp/application-continuity-using-ucp.html#GUID-54F9FD1C-9301-40D3-999B-C74478E72DB0

プール対応のデータソースでアプリケーション・コンティニュイティ機能を使用にするには、
アプリケーションでoracle.ucp.jdbc.PoolDataSourceインタフェースに対して次のコールを実行する必要があります。
// pds is a PoolDataSource
pds.setConnectionFactoryClassName("oracle.jdbc.replay.OracleDataSourceImpl");

3. 検証環境&接続トポロジー

以下の環境で検証しています。

Windows 10(Windows PC) + PowerShell
Oracle JDK 11.0.9
Oracle Database 19c (19.8) JDBC Driver & UCP の ojdbc10-full.tar.gz
Autonomous Databaase の Autonomous Transaction Processing(ATP) 19c

接続トポロジーは以下の通りです。

Windows PC(PowerShell) => (Internet) => ATP

4. JDBC Driver と ATP Wallet の ダウンロード と 解凍、動作確認

以下のページから JDBC Driver と UCP(ucp.jar) を入手します。今回は現時点で最新の 19.8 の ojdbc10-full.tar.gz をダウンロードします。

JDBC and UCP Downloads page
https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html

次に ATP の Console から Wallet の zip を ダウンロード します。 wallet.jpg

ダウンロードした ojdbc10-full.tar.gz と ATP Wallet ZIP を解凍します。今回は Windows PC の下記ディレクトリに解凍しました。

ojdbc10-full.tar.gz ... C:\tools\ac_java\ojdbc10-full\
ATP Wallet ZIP ... C:\tools\wallet\Wallet_AYUATP1\

まずは下記記事のプログラムで、動作確認しておく事を推奨します。

Autonomous DB(ADW/ATP) に JavaJDBC Thin Driver で接続してみる。(OCI, Oracle Cloud Infrastructure)
https://qiita.com/ora_gonsuke777/items/91ec0e15848a78ede385

Wallet の指定方法に幾つかバリエーションが有るんですが、今回は TNS_ADMIN を JDBC URL を書くパターンを選択
彡(゚)(゚)

5. テスト用のテーブル作成

ATP に ADMINユーザー で接続して、テスト用のテーブルを作成しておきます。

CREATE TABLE AC_TEST_TABLE (
    C1 NUMBER
  , C2 VARCHAR2(100)
  , C3 DATE
);

6. Java + ucp.jar のサンプルプログラム

下記がサンプルプログラムになります。GitHub にもアップロードしました。
1行 INSERT して1秒ずつスリープする簡単なプログラム……
JDBCドライバクラスの "oracle.jdbc.replay.OracleDataSourceImpl" がポイント彡(゚)(゚)

import java.sql.*;
import oracle.ucp.jdbc.*;
import java.lang.Thread;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class AC_UCPSample {
  final static String DB_URL=   "jdbc:oracle:thin:@ayuatp1_tp?TNS_ADMIN=C:/tools/wallet/Wallet_AYUATP1";
  final static String DB_USER = "ADMIN";
  final static String DB_PASSWORD = "xxx";
  final static String CONN_FACTORY_CLASS_NAME = "oracle.jdbc.replay.OracleDataSourceImpl";

  /*
   * The sample demonstrates UCP as client side connection pool.
   */
  public static void main(String args[]) throws Exception {
    // Get the PoolDataSource for UCP
    PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();

    // Set the connection factory first before all other properties
    pds.setConnectionFactoryClassName(CONN_FACTORY_CLASS_NAME);
    pds.setURL(DB_URL);
    pds.setUser(DB_USER);
    pds.setPassword(DB_PASSWORD);
    pds.setConnectionPoolName("JDBC_UCP_POOL");

    // Default is 0. Set the initial number of connections to be
    // created when UCP is started.
    pds.setInitialPoolSize(1);

    // Default is 0. Set the minimum number of connections
    // that is maintained by UCP at runtime.
    pds.setMinPoolSize(1);

    // Default is Integer.MAX_VALUE (2147483647). Set the maximum
    // number of connections allowed on the connection pool.
    pds.setMaxPoolSize(1);

    // Default is 30secs. Set the frequency in seconds to enforce
    // the timeout properties. Applies to
    // inactiveConnectionTimeout(int secs),
    // AbandonedConnectionTimeout(secs)&
    //TimeToLiveConnectionTimeout(int secs).
    // Range of valid values is 0 to Integer.MAX_VALUE.
    pds.setTimeoutCheckInterval(10);

    // Default is 0. Set the maximum time, in seconds, that a
    // connection remains available in the connection pool.
    pds.setInactiveConnectionTimeout(10);

    // Set seconds to wait on query.
    pds.setQueryTimeout(300);
    //pds.setFastConnectionFailoverEnabled(true);

    System.out.println("Available connections before checkout: " + pds.getAvailableConnectionsCount());
    System.out.println("Borrowed connections before checkout: " + pds.getBorrowedConnectionsCount());
    // Get the database connection from UCP.
    try (Connection conn = pds.getConnection()) {
      System.out.println("Available connections after checkout: " + pds.getAvailableConnectionsCount());
      System.out.println("Borrowed connections after checkout: " + pds.getBorrowedConnectionsCount());
      // Displays db container name
      GetConainerName(conn);
      // Set Application Continuity test data
      System.out.println("Set AC Data start - " + FormatLocalDateTime(LocalDateTime.now()));
      SetACData(conn);
      System.out.println("Set AC Data end   - " + FormatLocalDateTime(LocalDateTime.now()));
    } catch (SQLException e) {
      e.printStackTrace();
      System.out.println("UCPSample - " + "SQLException occurred : " + e.getMessage());
      throw e;
    }
    System.out.println("Available connections after checkin: " + pds.getAvailableConnectionsCount());
    System.out.println("Borrowed connections after checkin: " + pds.getBorrowedConnectionsCount());
  }
 /*
  * Displays database container name.
  */
  public static void GetConainerName(Connection connection) throws SQLException {
    // Statement and ResultSet are AutoCloseable and closed automatically.
    //final String SQL = "INSERT INTO AC_TEST VALUES(?, ?, SYSDATE)";
    connection.setAutoCommit(false);
    try (Statement statement = connection.createStatement()) {
      try (ResultSet resultSet = statement.executeQuery("SELECT NAME FROM V$CONTAINERS")) {
        while (resultSet.next()) {
          System.out.println("Container Name - " + resultSet.getString(1));
        }
      }
    }
  }
 /*
  * Set Application Continuity test data.
  */
  public static void SetACData(Connection connection) throws SQLException {
    // Insert SQL.
    final String SQL = "INSERT INTO AC_TEST_TABLE VALUES(?, ?, SYSDATE)";
    connection.setAutoCommit(false);
    // Insert 100 rows by waiting 1 second for each row.
    try (PreparedStatement ps = connection.prepareStatement(SQL)) {
      for (int i = 1; i <= 100; i++) {
        System.out.println(i + "..." + FormatLocalDateTime(LocalDateTime.now()));
        ps.setInt(1, i);
        ps.setString(2, "Data" + i);
        ps.executeUpdate();
        try {
          Thread.sleep(1000);
        }
        catch(InterruptedException e) {
          e.printStackTrace();
          throw new RuntimeException("Unexpected interrupt", e);
        }
      }
    }
    connection.commit();
  }
 /*
  * To formatted string yyyy/MM/dd HH:mm:ss.SSS from LocalDateTime.
  */
  public static String FormatLocalDateTime(LocalDateTime ldt) {
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS");
    return ldt.format(dtf);
  }
}

7. サンプルプログラム動作と ATP の再起動

上記のソースコードPowerShellコンパイルして実行してみます。

cd C:\tools\ac_java\
$env:CLASSPATH = "C:\tools\ac_java\ojdbc10-full\ucp.jar;C:\tools\ac_java\ojdbc10-full\ojdbc10.jar;C:\tools\ac_java\ojdbc10-full\ons.jar;C:\tools\ac_java\ojdbc10-full\oraclepki.jar;C:\tools\ac_java\ojdbc10-full\osdt_core.jar;C:\tools\ac_java\ojdbc10-full\osdt_cert.jar;."
javac AC_UCPSample.java
java AC_UCPSample

Available connections before checkout: 0
Borrowed connections before checkout: 0
Available connections after checkout: 0
Borrowed connections after checkout: 1
Container Name - NTNCQ7OHFQU238D_AYUATP1
Set AC Data start - 2020/12/09 10:38:50.743
1...2020/12/09 10:38:50.786
2...2020/12/09 10:38:51.918
:

上記のプログラムを動かした状態で ATP を Restart してみると……彡(゚)(゚) restart.jpg

:
25...2020/12/09 10:39:17.710
26...2020/12/09 10:39:18.832
java.sql.SQLRecoverableException: ソケットから読み込むデータはこれ以上ありません。
        at oracle.jdbc.driver.T4CMAREngineNIO.prepareForUnmarshall(T4CMAREngineNIO.java:804)
        at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:449)
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:410)
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:269)
        at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:655)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:270)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:91)
        at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:970)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1205)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3666)
        at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1426)
        at oracle.jdbc.driver.OraclePreparedStatement.executeLargeUpdate(OraclePreparedStatement.java:3756)
        at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3736)
        at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1063)
        at oracle.ucp.jdbc.proxy.oracle$1ucp$1jdbc$1proxy$1oracle$1StatementProxy$2oracle$1jdbc$1internal$1OraclePreparedStatement$$$Proxy.executeUpdate(Unknown Source)
        at AC_UCPSample.SetACData(AC_UCPSample.java:103)
        at AC_UCPSample.main(AC_UCPSample.java:65)
UCPSample - SQLException occurred : ソケットから読み込むデータはこれ以上ありません。
Exception in thread "main" java.sql.SQLRecoverableException: ソケットから読み込むデータはこれ以上ありません。
        at oracle.jdbc.driver.T4CMAREngineNIO.prepareForUnmarshall(T4CMAREngineNIO.java:804)
        at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:449)
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:410)
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:269)
        at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:655)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:270)
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:91)
        at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:970)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1205)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3666)
        at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1426)
        at oracle.jdbc.driver.OraclePreparedStatement.executeLargeUpdate(OraclePreparedStatement.java:3756)
        at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3736)
        at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1063)
        at oracle.ucp.jdbc.proxy.oracle$1ucp$1jdbc$1proxy$1oracle$1StatementProxy$2oracle$1jdbc$1internal$1OraclePreparedStatement$$$Proxy.executeUpdate(Unknown Source)
        at AC_UCPSample.SetACData(AC_UCPSample.java:103)
        at AC_UCPSample.main(AC_UCPSample.java:65)

Exception が発生して異常終了します。テーブルの件数も 0件 です。

SELECT COUNT(*) FROM AC_TEST_TABLE;

  COUNT(*)
----------
         0

8. Application Continuity の有効化(DBMS_CLOUD_ADMIN.ENABLE_APP_CONT の実行)

Autonomous Database で Application Continuity を有効化するには、サービス名を確認して
そのサービスに対して DBMS_CLOUD_ADMIN.ENABLE_APP_CONTプロシージャ を実行します。
今回は TPサービス に接続しているので、TPサービスに対してプロシージャを実行します。

SELECT name, drain_timeout FROM v$services;

BEGIN
    DBMS_CLOUD_ADMIN.ENABLE_APP_CONT(
        service_name => 'NTNCQ7OHFQU238D_AYUATP1_tp.adb.oraclecloud.com'
    );
END;
/

SELECT name, drain_timeout FROM v$services;

これを実行すると……彡(゚)(゚)

NAME                                                             DRAIN_TIMEOUT
---------------------------------------------------------------- -------------
NTNCQ7OHFQU238D_AYUATP1_high.adb.oraclecloud.com                             0
NTNCQ7OHFQU238D_AYUATP1_tpurgent.adb.oraclecloud.com                         0
NTNCQ7OHFQU238D_AYUATP1_low.adb.oraclecloud.com                              0
NTNCQ7OHFQU238D_AYUATP1_medium.adb.oraclecloud.com                           0
ntncq7ohfqu238d_ayuatp1                                                      0
NTNCQ7OHFQU238D_AYUATP1_tp.adb.oraclecloud.com                               0

6行が選択されました。 


PL/SQLプロシージャが正常に完了しました。


NAME                                                             DRAIN_TIMEOUT
---------------------------------------------------------------- -------------
NTNCQ7OHFQU238D_AYUATP1_high.adb.oraclecloud.com                             0
NTNCQ7OHFQU238D_AYUATP1_tpurgent.adb.oraclecloud.com                         0
NTNCQ7OHFQU238D_AYUATP1_low.adb.oraclecloud.com                              0
NTNCQ7OHFQU238D_AYUATP1_medium.adb.oraclecloud.com                           0
ntncq7ohfqu238d_ayuatp1                                                      0
NTNCQ7OHFQU238D_AYUATP1_tp.adb.oraclecloud.com                             300

6行が選択されました。

DRAIN_TIMEOUT が 0 ⇒ 300 になりました。

9. サンプルプログラムの再実行 と ATP再起動

Application Continuity を有効化した状態でサンプルプログラムを実行して、ATP を再起動してみます。 restart.jpg

java AC_UCPSample

Available connections before checkout: 0
Borrowed connections before checkout: 0
Available connections after checkout: 0
Borrowed connections after checkout: 1
Container Name - NTNCQ7OHFQU238D_AYUATP1
Set AC Data start - 2020/12/09 10:55:40.604
1...2020/12/09 10:55:40.644
2...2020/12/09 10:55:41.794
:
36...2020/12/09 10:56:20.107
37...2020/12/09 10:56:21.234 ★ここで
38...2020/12/09 10:56:58.567 ★中断が発生
39...2020/12/09 10:56:59.699
:
99...2020/12/09 10:58:07.799
100...2020/12/09 10:58:08.929
Set AC Data end   - 2020/12/09 10:58:10.192
Available connections after checkin: 1
Borrowed connections after checkin: 0

途中で中断しながらも、プログラムが動作し切ったぞ!彡(^)(^)

SELECT COUNT(*) FROM AC_TEST_TABLE;

  COUNT(*)
----------
       100

テーブルにデータも挿入されています彡(^)(^)

10. まとめ

Java でも UCP(ucp.jar) で Application Continuity や!彡(^)(^)

なお上記サンプルでは40秒弱程度の中断が発生していますが、FAN(Fast Application Notification) と
FCF(Fast Connection Failover) が使える環境なら、瞬断程度で済むはず。余裕が有れば記事書くかも彡(゚)(゚)

おまけ

UCP(ucp.jar) じゃない、生の JDBC Driver でも Application Continuity できました。
下記ソース参照彡(゚)(゚)
https://github.com/gonsuke777/OracleDatabase/blob/master/ac_java_ucp/AC_Sample.java

Object Storage にアップロードしたファイルを Autonomous Database の DATA_PUMP_DIR にコピーする。(Oracle Cloud Infrastructure)

本エントリは Oracle Cloud Infrastructure #2 Advent Calendar 2020 の Day 1 です。
Day 1 と言っても、もう 12月5日 ですけどね……#2 は余り埋まってないので、気ままに書いていこうかと。
彡(゚)(゚)

Oracle Cloud Infrastructure #2 Advent Calendar 2020
https://qiita.com/advent-calendar/2020/oci2

Object Storage にアップロードしたファイルを Autonomous Database の DATA_PUMP_DIR に コピーしてみます。

1. Object Storage の作成とファイルアップロード

特に難しいことも無いので、粛々とやる。 WS000000.JPG

2. IAMユーザーの作成と権限(Policy)の付与

Object Storage に対する権限を持った IAMユーザー を作成します。付与した権限(Policy Statement)は下記となります。

ALLOW GROUP AYU_IAM_Group1 TO manage object-family IN compartment ayu-compartment01

WS000001.JPG WS000002.JPG WS000003.JPG

3. IAMユーザーの Auth Token発行

IAMユーザーの Auth Token を発行します。後から確認は出来ないので注意 WS000004.JPG

4. DBMS_CLOUD.CREATE_CREDENTIAL で Autonomous Database に Auth Token を登録

DBMS_CLOUDパッケージ の CREATE_CREDENTIALプロシージャ で 3. の Auth Token を Autonomous Database に登録します。

BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'CRED_AYU_TOKEN', -- 任意の文字列
    username => 'AYU_IAM_USER1',         -- Auto Token を発行したIAMユーザー名
    password => 'xxxxxxxxxxxxxxxxxxxx'   -- 3. で生成した Auth Token
  );
END;
/

PL/SQLプロシージャが正常に完了しました。

5. DBMS_CLOUD.GET_OBJECT で Object Storage から Autonomous Database の DATA_PUMP_DIR にファイルをコピー

DBMS_CLOUDパッケージ の CREATE_CREDENTIALプロシージャ で Auth Token を Autonomous Database に登録します。

BEGIN 
   DBMS_CLOUD.GET_OBJECT(
     credential_name => 'CRED_AYU_TOKEN',
     object_uri => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/xxxxxxxxxxxx/b/ayu-bucket1/o/test.txt',
     directory_name => 'DATA_PUMP_DIR'
   ); 
END;
/

BEGIN 
   DBMS_CLOUD.GET_OBJECT(
     credential_name => 'CRED_AYU_TOKEN',
     object_uri => 'https://objectstorage.us-phoenix-1.oraclecloud.com/n/xxxxxxxxxxxx/b/ayu-bucket1/o/test2.txt',
     directory_name => 'DATA_PUMP_DIR'
   ); 
END;
/

PL/SQLプロシージャが正常に完了しました。

PL/SQLプロシージャが正常に完了しました。

6. DBMS_CLOUD.LIST_FILES でコピー結果を確認

DBMS_CLOUD.LIST_FILESファンクション で DATA_PUMP_DIR の中身を確認します。TABLEファンクションなので SELECT文 で確認

COLUMN OBJECT_NAME FORMAT A30;
COLUMN CHECKSUM FORMAT A30;
SELECT * FROM TABLE(DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR'));

OBJECT_NAME                         BYTES CHECKSUM                       CREATED                            LAST_MODIFIED                     
------------------------------ ---------- ------------------------------ ---------------------------------- ----------------------------------
test.txt                                6                                2020/12/05 05:20:09.000000000 GMT: 2020/12/05 05:20:09.000000000 GMT:
test2.txt                               7                                2020/12/05 05:20:57.000000000 GMT: 2020/12/05 05:20:57.000000000 GMT:

7. まとめ

本当は別記事を書くつもりやったんやけど、思いのほか長くなったんで切り出してみた。
次の Advent Calendar はいつ書こうかしら……皆さんも Oracle Cloud と Advent Calendar をよろしくね彡(^)(^)

Oracle Cloud Infrastructure Advent Calendar 2020
https://qiita.com/advent-calendar/2020/oci

Oracle Cloud Infrastructure #2 Advent Calendar 2020
https://qiita.com/advent-calendar/2020/oci2

8. 参考ドキュメント

A Autonomous Database提供パッケージ・リファレンス
DBMS_CLOUDパッケージ
https://docs.oracle.com/cd/E83857_01/paas/atp-cloud/atpug/dbms-cloud-package.html#GUID-CE359BEA-51EA-4DE2-88DB-F21A9FC10721