HADRのテイクオーバーを実行したら失敗する、あるいは応答が返ってこない。そのとき返るのがこれです。
SQL1770N Takeover HADR cannot complete. Reason code = "1".
テイクオーバーの失敗は理由コードとHADRの状態を見れば機械的に切り分けられます。失敗する理由はほぼ「peer状態でない」か「撃つノードが違う」かのどちらかです。この記事では判断の順序を逆引きでまとめます。
まず見る(結論)
テイクオーバーには2種類あります。計画切替(TAKEOVER HADR ON DATABASE <db>)はスタンバイ側で実行し、peer状態が前提です。緊急切替(... BY FORCE)はpeerでなくても昇格できますが、データロストのリスクがあります。
撃つ前に、状態とログギャップを確認します。
SELECT HADR_STATE, HADR_CONNECT_STATUS, HADR_LOG_GAP,
LOG_HADR_WAIT_TIME, HADR_SYNCMODE
FROM TABLE(MON_GET_HADR(NULL)) AS T;
db2pd -db SAMPLE -hadr
HADR_STATE = PEER かつ HADR_CONNECT_STATUS = CONNECTED なら計画切替が可能な状態です。REMOTE_CATCHUP などのときに計画切替を撃つと理由コード1で弾かれます。
症状 → 原因 → 対処(逆引き)
| 理由コード / 症状 | 原因 | まず打つ手 |
|---|---|---|
| 4 | プライマリ側で通常テイクオーバーを実行した(既にプライマリ) | スタンバイ側で実行し直す。害はないがロールも変わらない |
| 1 | スタンバイがpeer状態でない(プライマリ不達・カタチアップ中) | HADR_STATE を確認。プライマリ生存なら追いつかせる、障害なら BY FORCE |
| 応答がなかなか返らない | ログギャップが大きくスタンバイが追いつけていない | HADR_LOG_GAP / LOG_HADR_WAIT_TIME を確認。まずネットワーク帯域を疑う |
BY FORCE 後、旧プライマリがスタンバイとして起動しない |
ログが分岐している | 旧プライマリは捨て、新プライマリのバックアップから作り直す |
切り替え後にアプリが SQL30108N で落ちる |
再接続の通知をエラー扱いしている | DB側の問題ではない。アプリの例外処理を見直す |
BY FORCE を撃つ前に確認すること
BY FORCE は同期を待たずに昇格します。旧プライマリにあってスタンバイへ未転送のログは失われ、失われる量は HADR_LOG_GAP とsync modeに依存します(ASYNC / SUPERASYNC ほどリスクが大きい)。撃つ前にログギャップを確認し、プライマリが本当に落ちていることを確かめてください。プライマリ稼働中に撃つとスプリットブレインになります。
BY FORCE の後は、旧プライマリを新プライマリのスタンバイとして再統合します。ログが分岐していると START HADR ... AS STANDBY が拒否されるので、BY FORCE は「後で作り直す覚悟」とセットで考えます。
それでも切り分からないとき(実機ログつきの詳解)
2ノードHADR環境での失敗再現、BY FORCE 昇格後の状態、旧プライマリの再統合手順、計画切替の正常系まで含めた詳しい解説は、Zennのフル記事にまとめています。
関連: SQL30108N はエラーではない(ACRの扱い) / Db2 強制TKO後のスプリットブレイン時の動作 / db2cm を使用した Pacemaker の構成
HADRは設定より「切り替え後に何が起きるか」が本番の勝負どころです。テイクオーバー後の再接続対応まで、本書 第5章「HADRの構築と切り替え運用」で扱っています。
現場で引ける Db2 の教科書
現場で引ける!Db2実践エンジニア・バイブル
Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。
アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。