透過的アプリケーションフェイルオーバー(TAF)の設定について

RACでTAFの設定をする場合、クライアント側に設定を入れる方法とサーバ側に設定を入れる方法の2つのやり方がある。

クライアント側に設定を入れる場合

接続先のサービスリソースを事前に作成して起動。特にTAF関連の設定は行わない。

$ srvctl add service -db TEST -service testsvc -preferred TEST1,TEST2
$ srvctl start service -db TEST -service testsvc

クライアントのtnsnames.oraには接続記述子に以下のような設定を行う。

TAFTEST =
   (DESCRIPTION =
     (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = physrac-scan.dn.home)(PORT = 1521)))
     (CONNECT_DATA = (SERVICE_NAME = TESTSVC)
        (FAILOVER_MODE = (TYPE = SELECT)(METHOD = BASIC)(RETRIES = 5)(DELAY = 1)))
   )

動作確認。上記接続記述子を使ってクライアントから接続する。

$ sqlplus system/oracle@TAFTEST
:
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
TEST1

ここでは、インスタンス1に接続されているため、インスタンス1を停止する。

$ srvctl stop instance -db TEST -instance TEST1 -force

再度クライアント側でSELECTすると特にエラーになることなく自動的にインスタンス2に接続されて結果が返る。

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
TEST2

この時、v$session からセッションがフェイルオーバーされているものか確認することも可能。

SQL> select inst_id, username, failover_type, failover_method, failed_over from gv$session where service_name = 'testsvc';

   INST_ID USERNAME   FAILOVER_TYPE FAILOVER_M FAI
---------- ---------- ------------- ---------- ---
         2 SYSTEM     SELECT        BASIC      YES

TAF設定を行わなかった場合の挙動

もしtnsnames.oraにTAFの設定を行わずに接続先のインスタンスが停止した場合、以下のようなエラーが返る。

SQL> select instance_name from v$instance;
select instance_name from v$instance
*
行1でエラーが発生しました。:
ORA-03113: 通信チャネルでend-of-fileが検出されました プロセスID:
20588
セッションID: 156、シリアル番号: 57160

サーバ側に設定を入れる場合

サーバ側でサービスリソース自体にTAFの設定を行う。以下のようにサービスリソースを作成する。

$ srvctl add service -db TEST -service testsvc -preferred TEST1,TEST2 -tafpolicy BASIC -failovertype SELECT -failoverretry 5 -failoverdelay 1
$ srvctl start service -db TEST -service testsvc

設定を確認すると、以下のようにサービスリソースそのものに設定が行われる。

$ srvctl config service -db TEST -service testsvc
サービス名: testsvc
:
フェイルオーバー・タイプ: SELECT
フェイルオーバー・メソッド: 
フェイルオーバー再試行: 5
フェイルオーバー遅延: 1
フェイルオーバー・リストア: NONE
:
TAFポリシー仕様: BASIC

クライアントのtnsnames.oraには接続記述子にTAFの設定を行わない。

TAFTEST =
   (DESCRIPTION =
     (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = physrac-scan.dn.home)(PORT = 1521)))
     (CONNECT_DATA = (SERVICE_NAME = TESTSVC))
   )

動作確認。上記接続記述子を使ってクライアントから接続する。

[oracle@oracli admin]$ sqlplus system/oracle@TAFTEST
:
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
TEST2

ここでは、インスタンス2に接続されているため、インスタンス2を停止する。

$ srvctl stop instance -db TEST -instance TEST2 -force

再度クライアント側でSELECTすると特にエラーになることなく自動的にインスタンス1に接続されて結果が返る。

SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
TEST1

この時、v$session からセッションがフェイルオーバーされているものか確認することも可能。

SQL> select inst_id, username, failover_type, failover_method, failed_over from gv$session where service_name = 'testsvc';

   INST_ID USERNAME   FAILOVER_TYPE FAILOVER_M FAI
---------- ---------- ------------- ---------- ---
         1 SYSTEM     SELECT        BASIC      YES

コメント