Help us understand the problem. What is going on with this article?

Oracle Database: SQL*PlusでApplication Continuity(AC)やってみてみた

■目的

Application Continuity(AC)はSQL*Plusでもできるようになっています。
バッチ等はSQL*Plus接続で作られていることが多いので、ACできるとRACローリングによる計画メンテナンスも実施しやすくなります。
ということで、前回RAC構築した環境で、ACやってみてみます。

 ・参考:Oracle Cloud: Real Application Clusters(RAC)作成してみてみた

Application Continuity(AC)は、
アプリケーション開発者にとって、データベース・セッション(インスタンス、ノード、ストレージ、ネットワーク、またはその他の関連コンポーネント)の停止を隠すことは大変な作業です。
その結果、多くの場合エラーやタイムアウトがエンドユーザーに返され、ユーザーの不満や生産性の欠如、機会の損失につながります。
アプリケーション・コンティニュイティでは、停止後に影響を受けるデータベース・セッションで実行中の作業がリカバリされるため、停止がエンドユーザーやアプリケーションに認識させません。
そのため、アプリケーションがユーザーにエラーを送信し 、ユーザーは何が起きているか分からないまま置き去りにされたり、データの再入力を求められたり、さらに悪いことに管理者が中間層サーバーを再起動して障害に対応するといった状況が回避されます。
アプリケーション・コンティニュイティは、Oracleデータベースを利用するシステムおよびアプリケーションのフォルト・トレランスを強化します。

■Application Continuity(AC)設定

アプリケーション・コンティニュイティを使用するためにSRVCTLを使用してサービス属性を設定します。

・FAILOVER_TYPE = AUTO | TRANSACTION: 
    透過的ACの場合、AUTO、手動ACの場合、TRANSACTIONを使用します。
    この属性は、リプレイ・ドライバおよびアプリケーション・コンティニュイティのリプレイ機能を有効にします。

・REPLAY_INITIATION_TIMEOUT = n: 
    リプレイの開始を許可するまでの期間(秒数)を設定する場合

・FAILOVER_RETRIES = 30: 
    リプレイごとに接続の再試行回数を指定する場合

・FAILOVER_DELAY = 10: 
    接続の再試行間の遅延時間を秒単位で設定する場合

・GOAL = SERVICE_TIME: 
    Oracle RACまたはOracle Global Data Servicesを使用する場合の推奨設定

・CLB_GOAL = SHORT: 
    Oracle RACまたはOracle Global Data Servicesを使用する場合の推奨設定

・COMMIT_OUTCOME = TRUE: 
    トランザクション・ガードを使用する場合

・FAILOVER_RESTORE = AUTO | LEVEL1: 
    透過的ACの場合AUTO、手動ACの場合LEVEL1を設定
    リプレイの開始前に、接続プールに事前設定されているクライアント状態:が自動的にリストアされます

●AC用Serviceの設定

ここでは、透過的アプリケーション・コンティニュイティを使用するサービス pdb01_ac を作成します

・pdb01_acサービス作成

[oracle@rac19c1 ~]$ srvctl add service -db cdb01_nrt14x -pdb pdb01 -service pdb01_ac -preferred cdb011,cdb012 -clbgoal SHORT -rlbgoal SERVICE_TIME -failover_restore AUTO -failoverretry 30 -failoverdelay 10 -commit_outcome TRUE -failovertype AUTO -replay_init_time 1800 -retention 86400 -notification TRUE

・pdb01_acサービス起動

[oracle@rac19c1 ~]$ srvctl status service -d cdb01_nrt14x

    Service pdb01_ac is not running.

[oracle@rac19c1 ~]$ srvctl start service -d cdb01_nrt14x

[oracle@rac19c1 ~]$ srvctl status service -d cdb01_nrt14x
    Service pdb01_ac is running on instance(s) cdb011,cdb012

・pdb01_acサービス Listner登録確認

[oracle@rac19c1 admin]$ lsnrctl stat | grep _ac
    Service "pdb01_ac.publicsubnet01.vcn.oraclevcn.com" has 1 instance(s).
 ==> このService情報をtnsnames.oraに設定します

●SQL*NET設定

今回はサーバー・サイド側でフェールオーバーを行うService設定なので、tnsnames.oraの設定はシングル構成と同じ設定になり、SERVICE_NAME項目部分を作成したACのService名へ設定します。

・tnsnames.ora設定

[oracle@rac19c1 admin]$ vi $ORACLE_HOME/network/admin/tnsnames.ora

PDB01_AC =
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = rac19c0-scan.publicsubnet01.vcn.oraclevcn.com)(PORT = 1521))
        (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = pdb01_ac.publicsubnet01.vcn.oraclevcn.com)
        )
    )

・tnsping正常確認

[oracle@rac19c1 admin]$ tnsping PDB01_AC

    TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 26-AUG-2019 13:56:39

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

    Used parameter files:
    /u01/app/oracle/product/19.0.0.0/dbhome_1/network/admin/sqlnet.ora


    Used TNSNAMES adapter to resolve the alias
    Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = rac19c0-scan.publicsubnet01.vcn.oraclevcn.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pdb01_ac.publicsubnet01.vcn.oraclevcn.com)))
    OK (0 msec)

●AC接続USER作成

[oracle@rac19c01 ~]$ sqlplus / as sysdba
SQL> alter session set container=pdb01;

    Session altered.

SQL> show con_name

    CON_NAME
    ------------------------------
    PDB01


SQL> CREATE USER qiita IDENTIFIED BY <パスワード > 
    DEFAULT TABLESPACE USERS 
    QUOTA UNLIMITED ON USERS 
    TEMPORARY TABLESPACE TEMP;

    User created.

SQL> GRANT CONNECT, RESOURCE,DBA to qiita;

    Grant succeeded.

●Transaction Guardへのアクセス許可

アプリケーション・コンティニュイティを使用してフェイルオーバーするデータベース・ユーザーに、Transaction Guardパッケージ、DBMS_APP_CONTへの権限を付与します。

SQL> GRANT EXECUTE ON DBMS_APP_CONT to qiita;

    Grant succeeded.

■AC セッション・フェールオーバー・テスト

●SQL*Plus接続

[oracle@rac19c1 admin]$ sqlplus qiita/<パスワード>@PDB01_AC

    SQL*Plus: Release 19.0.0.0.0 - Production on Mon Aug 26 13:06:15 2019
    Version 19.3.0.0.0

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

    Last Successful login time: Mon Aug 26 2019 13:04:50 +00:00

    Connected to:
    Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
    Version 19.3.0.0.0

SQL> select instance_name from v$instance;

    INSTANCE_NAME
    ----------------
    cdb011

SQL> show con_name

    CON_NAME
    ------------------------------
    PDB01

●cdb011 -> cdb012 セッション・フェール・オーバーテスト

・接続インスタンス確認

SQL> select instance_name from v$instance;

  INSTANCE_NAME
  ----------------
  cdb011

・接続インスタンスcdb011障害実行

[root@rac19c01 ~]# ps -ef | grep ora_pmon
  oracle   77339     1  0  8月22 ?      00:00:26 ora_pmon_cdb011


[root@rac19c01 ~]# kill -9 77339

・接続インスタンスのセッションフェールオーバ確認

SQL> select instance_name from v$instance;

  INSTANCE_NAME
  ----------------
  cdb012

SQL> show con_name

  CON_NAME
  ------------------------------
  PDB01

●cdb012 -> cdb011 セッション・フェールオーバー・テスト

・接続インスタンスcdb012障害実行

[root@rac19c02 ~]# ps -ef | grep ora_pmon
  oracle   14530     1  0  8月22 ?      00:00:29 ora_pmon_cdb012


[root@rac19c02 ~]# kill -9 14530

・接続インスタンスのセッションフェールオーバー確認

SQL> select instance_name from v$instance;

    INSTANCE_NAME
    ----------------
    cdb011

■AC トランザクション・フェールオーバー・テスト

●CREATE TABLE実行

SQL> CREATE TABLE test_tbl01 (col1 number, col2 varchar2(10));

    Table created.

●INSERT (No Commit)実行

・INSERT実行

SQL> INSERT INTO test_tbl01 VALUES(1,'AAA');

    1 row created.

SQL> INSERT INTO test_tbl01 VALUES(2,'BBB');

    1 row created.

SQL> INSERT INTO test_tbl01 VALUES(3,'CCC');

    1 row created.

・INSERT確認

SQL> select * from test_tbl01;

      COL1 COL2
---------- ----------
     1 AAA
     2 BBB
     3 CCC

・接続インスタンス確認

    SQL> select instance_name from v$instance;

    INSTANCE_NAME
    ----------------
    cdb011

    SQL> show con_name

    CON_NAME
    ------------------------------
    PDB01

●接続インスタンス障害実行

・接続インスタンス障害実行

[root@rac19c01 ~]# ps -ef | grep ora_pmon
    oracle   43617     1  0 13:12 ?        00:00:00 ora_pmon_cdb011

[root@rac19c01 ~]# kill -9 43617

・接続インスタンスのセッション・フェールオーバー確認

SQL> select instance_name from v$instance;

    INSTANCE_NAME
    ----------------
    cdb012

    SQL> show con_name

    CON_NAME
    ------------------------------
    PDB01

・INSERTデータ確認

SQL> select * from test_tbl01;

      COL1 COL2
---------- ----------
     1 AAA
     2 BBB
     3 CCC

・COMMIT実行

SQL> commit;

    Commit complete.

■AC SELECT文フェールオーバー・テスト

dba_objectsなど件数の多いテーブルをSELECT中に 接続インスタンスのプロセスをKillしてインスタンス・ダウン障害を発生させ、SELECTが途中でエラーせず処理完了することを確認し、別ノードのインスタンスに接続していることを確認します

①接続インスタンス確認

SQL> select instance_name from v$instance;

    INSTANCE_NAME
    ----------------
    cdb011

②SELECT文実行

SQL> select * from dba_objects;
    ・・・・

③接続インスタンス障害実行
ここではpmonプロセスをkillしてインスタンス障害を発生させます

[oracle@rac19c01 ~]$ ps -ef | grep pmon
    oracle   50093     1  0 15:49 ?        00:00:00 ora_pmon_cdb011

[oracle@rac19c01 ~]$ kill -9 50093

④SELECT文正終了確認
SELECT文が正常終了したことを確認します

    ・・・・

    72425 rows selected.


SQL>

⑤接続インスタンス確認
v$instanceで接続インスタンスを確認し、SELECT実行した別のインスタンス・ノードへ自動接続フェールオーバーしていることを確認します

SQL> select instance_name from v$instance;

    INSTANCE_NAME
    ----------------
    cdb012

■参考

管理およびデプロイメント・ガイド:6 アプリケーション・コンティニュイティの確保
Oracle Database 12c Release 2のアプリケーション・コンティニュイティ

shirok
自宅から専用線を引きたい今日この頃 ※ここでの発言は私個人の見解であり、所属する会社&組織の見解を反映したものではありません。ご了承ください。
oracle
Oracle Cloudは、最先端の機能をSoftware as a Service、Platform as a ServiceおよびInfrastructure as a ServiceおよびData as a Serviceとして提供します。
https://cloud.oracle.com/ja_JP/home
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away