今回は静的リスナー構成をしているとハマりがちな現象を備忘録として残す。
概要
オラクルにはリスナー経由での接続方式があり、そのリスナーの構成は動的構成、静的構成の二種類がある。
静的リスナー構成の場合、リスナーはデータベースの状態を把握していない。
この場合の不都合な点は、本来データベースが停止していてフェイルオーバーしてほしいのに、
リスナーがデータベースの状態を把握していないがために
フェイルオーバーがされないといった事態が起きてしまう点である。
たとえば、ネットサービス名にFAILOVERの記述をしてあったとしても、接続先のリスナーが静的構成をされていて
サービスを受け付けている場合は、データベースが実際には停止していてもtnspingなどではOKが出るため(リスナーはサービスを認識しているため)、FAILOVERがされない。それを備忘録として残しておく。
環境
oracle 12c ( Single Instance )
今回はシングルインスタンスのデータガード構成とする(スタンバイはフィジカルスタンバイ)。
ホストの情報
information |
プライマリ |
スタンバイ |
hostname |
test1 |
test2 |
IP |
192.168.56.109 |
192.168.56.110 |
DBの情報
DB_NAME : testdb
parameter |
プライマリ |
スタンバイ |
DB_UNIQUE_NAME |
testdb |
stestdb |
ORACLE_SID |
testdb |
stestdb |
リスナー
静的リスナー構成 ( サービスteeestを受け付ける )
ポート番号:1521
1. 静的リスナー構成
listener.oraにて以下のように記述し静的リスナー構成にする。
2. 実験用ネットサービス名の作成
tnsnames.oraを作成する。
さて、これにて準備完了。
3. 舞台を整える
下準備完了したので、以下の手順を実施し通常時の状態をつくる。
- DBの起動(プライマリ、スタンバイ側両方)
- リスナーの起動(プライマリ、スタンバイ側両方)
- 接続の確認
DBの起動
リスナーの起動
ちなみに静的リスナー構成の場合は、リスナーはインスタンス(データベース)の状態を把握していないため
状態UNKNOWNと表示されるので、これで静的リスナー構成であることを確認できる。
プライマリ側も同様にDB、リスナーを起動する。
接続の確認
プライマリ、スタンバイ、両方のデータベース、リスナーを起動したところで
まずはDBへの接続が問題ないことを確認する。
4. フェイルオーバーに失敗するケースの確認
いよいよ確認に入る。
まずはスタンバイデータベースを停止する。
では、再度接続を試す。
エラーが起きて接続に失敗した。
念のために簡易接続ネーミングを利用した接続にてプライマリDBには問題なく接続できることを確認する。
このことから、ネットサービス名hogehogeで記載しているtestdbへのFAILOVERがされていないことがわかる。
これは一重に、静的リスナー構成をしているために起こる現象である。
接続先リスナーがサービスを認識しているがためFAILOVERは発動されず
ただ、実際にはインスタンス(データベース)は停止しているためエラーを返す。
最後に
データガード構成の際、特にRAC構成の場合、
スタンバイDB構築の際にRMANを用いてプライマリDBからduplicateを実施するために
一時的にASM側のリスナーを静的構成にして起動する必要があるが
スタンバイDB構築後もこのリスナーを静的構成のままにしていたりすると
プライマリ、スタンバイ側で起動しているインスタンスのノードや数の違いによっては
スイッチオーバーのテストの際など、FAILOVER句が発動されず頭を抱えることになる。
FAILOVERがされないときは静的リスナー構成になっていないか確認すると良い。