DB2 5 min read

Db2「SQL30108N」はエラーではない ― ACR(自動クライアントリルート)の正しい扱い方

HADRのテイクオーバー試験をしたら、切り替え直後にアプリが軒並み落ちた。ログを見るとこれが出ている、という場面があります。

SQL30108N  A connection failed but has been re-established.
The hostname or IP address is "db2node2" and the service name or
port number is "50000".  ...  SQLSTATE=08506

これはエラーではなく「再接続できました」という通知です。SQL30108N をエラーとして扱ったアプリが自分から処理を中断し、続行できたはずの業務を止めている、というのが実際のところです。この記事では扱い方を逆引きで整理します。

まず見る(結論)

押さえるのは2点です。

  1. SQL30108N はACRが再接続を成功させた通知。失敗したときには返らない。本当に繋がらないときは SQL30081N など通信系のエラーが返る。
  2. ただし切断時に走っていたトランザクションはロールバック済み。再接続できたから続行、ではなく、そのトランザクションは再実行が必要

代替サーバーの登録状況はサーバー側で確認します。

db2 "UPDATE ALTERNATE SERVER FOR DATABASE SAMPLE
     USING HOSTNAME db2node2 PORT 50000"

db2 "LIST DATABASE DIRECTORY"   -- 対象DBの Alternate server 欄を確認

症状 → 原因 → 対処(逆引き)

症状 原因 まず打つ手
テイクオーバー後にアプリが大量にエラー終了する SQLSTATEが 00000 以外なら一律エラー、という実装 08506 は再接続成功として扱い、そのUOWを再実行する
再接続はできたのにデータが入っていない 切断時のトランザクションがロールバックされている アプリ側で再実行する。ACRは接続の張り直しまでしかやらない
SQL30108N ではなく SQL30081N が返る 代替サーバーにも繋がっていない(本当の通信障害) 代替サーバーの登録内容とネットワークを確認
ACRを設定したのに切り替わらない 代替サーバーが未登録、または片系にしか登録していない 両系に UPDATE ALTERNATE SERVER を設定する
DB側は正常に切り替わっているのに業務が止まる アプリが SQL30108N を握りつぶしている 接続ラッパーの例外処理を見直す
ACRは「透過的フェイルオーバー」ではない

ACRがやるのは接続の張り直しまでで、走っていたトランザクションのやり直しはしません。切断された瞬間の作業は失われる前提で、再実行の責任はアプリ側に残ります。ここを期待しすぎると「切り替えたのにデータが欠けた」という話になります。

「フェイルオーバーが危ない」のではなく、「フェイルオーバー後の1件をアプリが再実行しない」だけ、というケースが多くあります。HADRを導入するときは、この扱いをアプリ開発チームと事前に合意しておきます。

それでも切り分からないとき(実機ログつきの詳解)

2ノードHADR環境での再現ログ、ACRが成功した場合と失敗した場合の挙動の違い、JDBCでの実装イメージ、アプリ開発チームと事前に握るべき項目まで含めた詳しい解説は、Zennのフル記事にまとめています。

▶ Zennで続きを読む(無料)

Db2の「SQL30108N」をエラー扱いすると障害を自作する ― ACR(自動クライアントリルート)の正しい理解


実機ログつきの詳解を読む →

関連: SQL1770N テイクオーバーできないときの切り分けSQL30081N 通信エラーの切り分けDb2 強制TKO後のスプリットブレイン時の動作

HADRは設定より「切り替え後に何が起きるか」が本番の勝負どころです。テイクオーバー後の再接続対応まで、本書 第5章「HADRの構築と切り替え運用」で扱っています。

現場で引ける Db2 の教科書

現場で引ける!Db2実践エンジニア・バイブル

Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。

アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集

Zennで読む(¥2,000)→