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
コメント