13
5

More than 1 year has passed since last update.

Oracle Database: SQL*PlusでApplication Continuity(AC)接続してみてみた

Last updated at Posted at 2019-08-26

■ 目的

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に設定します

● アプリケーション・コンティニュイティのサービス設定確認

サービスに関するビュー DBA_SERVICES(ALL_SERVICES, CDB_SERVICES)
・FAILOVER_TYPE TAF/AC/TACのモード
・COMMIT_OUTCOME トランザクション・ガード

SQL> select name, failover_type, commit_outcome from dba_services;
	NAME	   FAILOVER_TYPE	COMMIT_OUTCOME
	---------- -------------------- --------------------
	PDB				NO
	PDB01_AC	   AUTO 		YES

● SQL*NET設定

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

1) 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)
        )
    )

2) 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 セッション・フェール・オーバーテスト

1) 接続インスタンス確認

SQL> select instance_name from v$instance;

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

2) 接続インスタンス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

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

SQL> select instance_name from v$instance;

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

SQL> show con_name

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

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

1) 接続インスタンス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

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

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)実行

1) 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.

2) INSERT確認

SQL> select * from test_tbl01;

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

3) 接続インスタンス確認

    SQL> select instance_name from v$instance;

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

    SQL> show con_name

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

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

1) 接続インスタンス障害実行

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

[root@rac19c01 ~]# kill -9 43617

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

SQL> select instance_name from v$instance;

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

    SQL> show con_name

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

3) 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が途中でエラーせず処理完了することを確認し、別ノードのインスタンスに接続していることを確認します

1) 接続インスタンス確認

SQL> select instance_name from v$instance;

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

2) SELECT文実行

SQL> select * from dba_objects;
    ・・・・

3) 接続インスタンス障害実行

ここでは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

4) SELECT文正終了確認

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

    ・・・・
    
    72425 rows selected.


SQL>

5) 接続インスタンス確認

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

SQL> select instance_name from v$instance;

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

■ 参考

 ・管理およびデプロイメント・ガイド:6 アプリケーション・コンティニュイティの確保
 ・Oracle Database 12c Release 2のアプリケーション・コンティニュイティ
 ・アプリケーション・コンティニュイティの最新情報
 ・19c Oracle Databaseのアプリケーション・コンティニュイティ(PDF)
 ・19c アプリケーション・コンティニュイティ実装チェックリスト(PDF)

13
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
5