昨日の 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) でチャレンジしてみたいなぁ……彡(゚)(゚)