Application Continuity を Autonomous Database の ATP で試してみる。(Oracle Cloud Infrastructure)
昨日の Oracle Tech Night(下記) は実にディープな内容でした。
その余勢を駆って、Application Continuity を検証してみたやで彡(^)(^)
MAA - アプリケーションの継続性
https://oracle-code-tokyo-dev.connpass.com/event/186771/oracle4engineer - アプリケーション・コンティニュイティ(Speakerdeck)
https://speakerdeck.com/oracle4engineer/apurikesiyonkonteiniyuitei
1. Application Continuity とは?
Application Continuity は Oracle Database の高可用性機能の一つで、トランザクションでエラーが発生した際に、
そのエラーをクライアント側に返すことなく、透過的に再実行する機能となります。
アプリケーション・コンティニュイティ
https://www.oracle.com/technetwork/jp/database/options/clustering/applicationcontinuity/overview/ac-overview-1967264-ja.html6 アプリケーション・コンティニュイティの確保
https://docs.oracle.com/cd/E82638_01/racad/ensuring-application-continuity.html#GUID-C1EF6BDA-5F90-448F-A1E2-DC15AD5CFE75
2. 参考ドキュメント/マニュアル
以下のマニュアルやドキュメントを参考にしてみました。彡(゚)(゚)
アプリケーション・コンティニュイティの有効化および無効化
https://docs.oracle.com/cd/E83857_01/paas/atp-cloud/atpug/application-continuity.html#GUID-8874CB1D-0B20-461F-91D2-24E2EE4148A3DBMS_CLOUD_ADMIN.ENABLE_APP_CONTを使用して、選択したサービスでアプリケーション・コンティニュイティを有効にします。
6.3.2.6 SQL*Plusによるアプリケーション・コンティニュイティの使用
https://docs.oracle.com/cd/E82638_01/racad/ensuring-application-continuity.html#GUID-A16F0586-D9A1-48E2-9FAA-7154C361FF5C次に示すように、-acフラグを使用します。
sqlplus -ac user/password@ACservice
3. サンプルプログラムの実行 と ATP再起動
以下のサンプルプログラムを動かしてみます。1行 INSERT して1秒ずつスリープする簡単な SQL ……
sqlplus /nolog CONNECT ADMIN/xxxxxxxxxxxxxx@aysatp1_tp SET TIMING ON; CREATE TABLE TBL1 (C1 NUMBER); BEGIN FOR i IN 1..60 LOOP INSERT INTO TBL1 VALUES(i); DBMS_LOCK.SLEEP(1); END LOOP; COMMIT; END; /
これを動かした状態で ATP を Console から Restart すると……
ERROR at line 1: ORA-03113: end-of-file on communication channel Process ID: 61009 Session ID: 15678 Serial number: 18067 Elapsed: 00:00:29.11
ORA-3113 を検知して、エラーになります。
4. Application Continuity の有効化(DBMS_CLOUD_ADMIN.ENABLE_APP_CONT の実行)
Autonomous Database で Application Continuity を有効化するには、サービス名を確認して
そのサービスに対して DBMS_CLOUD_ADMIN.ENABLE_APP_CONT を実行します。
SELECT name, drain_timeout FROM v$services; BEGIN DBMS_CLOUD_ADMIN.ENABLE_APP_CONT( service_name => 'NTNCQ7OHFQU238D_AYSATP1_tp.adb.oraclecloud.com' ); END; / SELECT name, drain_timeout FROM v$services;
これを実行すると……彡(゚)(゚)
NAME DRAIN_TIMEOUT ---------------------------------------------------------------- ------------- NTNCQ7OHFQU238D_AYSATP1_tp.adb.oraclecloud.com 0 ntncq7ohfqu238d_aysatp1 0 NTNCQ7OHFQU238D_AYSATP1_tpurgent.adb.oraclecloud.com 0 NTNCQ7OHFQU238D_AYSATP1_low.adb.oraclecloud.com 0 NTNCQ7OHFQU238D_AYSATP1_high.adb.oraclecloud.com 0 NTNCQ7OHFQU238D_AYSATP1_medium.adb.oraclecloud.com 0 PL/SQL procedure successfully completed. NAME DRAIN_TIMEOUT ---------------------------------------------------------------- ------------- NTNCQ7OHFQU238D_AYSATP1_tp.adb.oraclecloud.com 300 ntncq7ohfqu238d_aysatp1 0 NTNCQ7OHFQU238D_AYSATP1_tpurgent.adb.oraclecloud.com 0 NTNCQ7OHFQU238D_AYSATP1_low.adb.oraclecloud.com 0 NTNCQ7OHFQU238D_AYSATP1_high.adb.oraclecloud.com 0 NTNCQ7OHFQU238D_AYSATP1_medium.adb.oraclecloud.com 0
DRAIN_TIMEOUT が 0 ⇒ 300 になりました。
5. サンプルプログラム(その2) の実行 と ATP再起動
サンプルプログラム(その2) を実行して、ATP を再起動してみます。
その2 と言っても、sqlplus に -ac オプションを付けただけ。
彡(゚)(゚)
sqlplus -ac /nolog CONNECT ADMIN/xxxxxxxxxxxxxx@aysatp1_tp SET TIMING ON; BEGIN FOR i IN 1..60 LOOP INSERT INTO TBL1 VALUES(i); DBMS_LOCK.SLEEP(1); END LOOP; COMMIT; END; / SELECT COUNT(*) FROM TBL1;
これを動かした状態で ATP を Console から Restart すると……
PL/SQL procedure successfully completed. Elapsed: 00:02:03.16 COUNT(*) ---------- 60
再起動分の時間が掛かっていますが、プログラム自体は正常終了してレコードも挿入されています。やったぜ。彡(^)(^)
6. まとめ
Application Continuity を Autonomous Database で動かせたやで!
今回は sqlplus + PL/SQL で検証してみましたが、次は Java(ucp.jar) でチャレンジしてみたいなぁ……彡(゚)(゚)