TAKEOVER
ここまでで、1行だけですが、新規でデータが入った状態になりました。
プライマリーへの接続を保ったまま、スタンバイ側で TAKEOVER コマンドを実行します、ポイントはプライマリーへは接続したままであることです。
$ db2 "TAKEOVER HADR ON DATABASE HADRDB"
正常に完了したら、再度 SQL を実行してみます。
$ db2 "SELECT * FROM TEST_TAB1" SQL30108N 自動クライアント・リルート環境において接続が 失敗しました。トランザクションはロールバックされました 。 ホスト名または IP アドレス: "10.146.0.8"。サービス名またはポート番号: "50000"。理由コード: "1"。 接続失敗コード: "2"。基になっているエラー: "*"。 SQLSTATE=08506
SQL30108N のエラーが帰りました、こりずにもう1度SQLを実行してみます。
$ db2 "SELECT * FROM TEST_TAB1" COL1 ---------- TEST 1 レコードが選択されました。
今度は正常に結果が返りました。
ちょっとわかり難いんですが、マニュアルには以下のようにあります。
接続が成功すると、通信障害の後にデータベース接続が再確立されたことを示す SQL30108N が戻されます。ホスト名または IP アドレスと、サービス名またはポート番号が戻されます。
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.ha.doc/doc/c0011976.html
つまり、SQL30108N は通信障害が発生したけど再接続に成功したよっていうメッセージなので、アプリケーションで受け取った場合はエラーで exit するのではなくて、SQL を再発行できる状態って事なんですよね。では、接続先が切り替わっているか確認してみます。旧プライマリー、スタンバイで以下のコマンドを実行ます。
$ db2 "LIST APPLICATIONS"
旧プライマリーでは
SQL1611W データベース・システム・モニターからデータが戻されませんでした。
が出力され、旧スタンバイ(現プライマリー)ではアプリケーション接続状態が出力されます。
HADR で TAKEOVER 発生後、クライアント・リルート機能で接続先も自動で切り替わっている事が確認できました。今度は旧プライマリーで ”TAKEOVER” 実施し、元の状態に戻しておきます。
$ db2 "TAKEOVER HADR ON DATABASE HADRDB"
テスト用に作成したテーブルを削除しておきます。
$ db2 “CONNECT TO HADRDB_R USER db2inst1 USING <パスワード>”
$ db2 “DROP TABLE TEST_TAB1”
$ db2 "TERMINATE" $ db2 "FORCE APPLICATON ALL" $ db2 "DEACTIVATE DB HADRDB" $ db2stop force