アクセスが集中する時間帯や、大量のバッチが一斉に走るタイミングで、こんなエラーが返ってくることがあります。
SQL1224N The database manager is not able to accept new requests,
has terminated all requests in progress, or has terminated the
specified request because of an error. SQLSTATE=55032
SQL1224N ―― メッセージは抽象的ですが、実体は「接続を捌くためのエージェント(プロセス)を起動できなかった、または起動済みのものが切られた」という状態です。SQL30081N(通信そのものが成立しない)とは違い、Db2までは到達しているのに、Db2側が受け付けられなかったという点がポイントです。
原因の多くは、次の3つに集約されます。①接続数・エージェント数の上限に達した、②メモリが枯渇してエージェントを作れない、③サーバ側が停止・強制切断した。この記事では、この3系統をどう切り分け、どのコマンドで犯人を特定するかを解説します。
- ピーク時間帯だけ
SQL1224Nが出る、という間欠障害を追っている人 - 接続数の上限設計(
MAX_CONNECTIONS等)の勘所を掴みたい人 - 「接続が勝手に切れる」現象の原因を、サーバ側から確認したい人
対象は Db2 LUW(Linux/UNIX/Windows)です。コマンドは Db2 11.x / 12.x で確認しています。
まず結論:エージェントは「上限」か「メモリ」か「停止」で作れなくなる
Db2はクライアント接続を コーディネーター・エージェントという単位で処理します。このエージェントが作れない/維持できないと SQL1224N になります。作れなくなる理由は次のとおりです。
| 系統 | 典型的な原因 | 効いてくる設定 |
|---|---|---|
| ①上限到達 | 同時接続/エージェント数が上限に達した | MAX_CONNECTIONS / MAX_COORDAGENTS / MAXAPPLS |
| ②メモリ枯渇 | エージェント用メモリが確保できない | INSTANCE_MEMORY / OSの ulimit |
| ③サーバ停止 | db2stop / QUIESCE / FORCE で切られた | (運用操作・障害) |
間欠的に「ピーク時だけ出る」なら①か②、「ある時刻から一斉に出た」なら③を先に疑う、というのが当たりの付け方です。
系統①:接続数・エージェント数の上限に達していないか
まず現在の上限設定を確認します。Db2の接続まわりは複数のパラメーターが連動するので、まとめて見ます。
# 接続・エージェント関連の上限をまとめて確認
db2 "GET DBM CFG" | grep -iE "MAX_CONNECTIONS|MAX_COORDAGENTS|MAXAGENTS|NUM_POOLAGENTS"
# データベース単位の最大接続数
db2 "GET DB CFG FOR <DB名>" | grep -i MAXAPPLS
| パラメーター | 意味 |
|---|---|
MAX_CONNECTIONS |
インスタンスが受け付ける最大の論理接続数 |
MAX_COORDAGENTS |
同時に動けるコーディネーター・エージェントの最大数 |
MAXAPPLS |
データベースごとの最大同時接続数(AUTOMATIC推奨) |
次に、今どれだけ接続を使っているかを見て、上限に張り付いていないかを確認します。ここは MON_GET 表関数が使えます。
# 現在の接続数(アプリケーション単位)
db2 "SELECT COUNT(*) AS CONNECTIONS
FROM TABLE(MON_GET_CONNECTION(NULL, -2)) AS T"
# エージェントの使用状況(プール・実行中の内訳)
db2pd -agents | head -20
「上限に張り付いている」とき、上限を上げる前に接続がきちんとクローズされているかを疑ってください。アプリがコネクションプールから借りた接続を返さない(リークする)と、じわじわ接続が積み上がり、あるとき上限に達して SQL1224N が噴き出します。上限を上げても、リークがあれば時間が延びるだけで再発します。接続開始が古いまま居座り続けている接続がないか、下のクエリで確認しましょう(CONNECTION_START_TIME が古い=長く生き残っている接続)。
db2 "SELECT APPLICATION_HANDLE, APPLICATION_NAME,
CLIENT_IPADDR, CONNECTION_START_TIME
FROM TABLE(MON_GET_CONNECTION(NULL, -2)) AS T
ORDER BY CONNECTION_START_TIME ASC
FETCH FIRST 20 ROWS ONLY"
系統②:メモリが足りずエージェントを作れないケース
接続数に余裕があるのに SQL1224N が出るなら、エージェント用のメモリが確保できていない可能性があります。INSTANCE_MEMORY の上限に達している、あるいはOS側の ulimit(プロセス数・メモリ)で頭打ちになっているパターンです。
# インスタンスメモリの上限と使用量を確認
db2 "SELECT MEMORY_SET_TYPE,
MEMORY_SET_USED / 1024 / 1024 AS USED_MB,
MEMORY_SET_SIZE / 1024 / 1024 AS SIZE_MB
FROM TABLE(MON_GET_MEMORY_SET('DBMS', NULL, -2)) AS T"
# db2diag.log にメモリ/エージェント生成失敗が出ていないか
db2diag -g "message:=agent" -H 1d
このとき db2diag.log には、メモリ確保失敗やエージェント生成失敗を示すメッセージ(ADM系や Resource temporarily unavailable など)が出ているはずです。OSの ulimit -a(特に max user processes と max memory)も、Db2インスタンスユーザーで確認します。
系統③:サーバ側の停止・強制切断で切られたケース
「ある時刻を境に、全接続が一斉に SQL1224N になった」なら、サーバ側の操作・障害を疑います。次のような操作は、進行中のリクエストを打ち切ります。
db2stop(特にdb2stop force):インスタンス停止。メンテナンスや障害復旧の最中に起きがち。QUIESCE(静止化):メンテナンスのためにDB/インスタンスを静止させると、一般ユーザーの新規要求はSQL1224N相当で弾かれます。UNQUIESCEのかけ忘れが地味に多い落とし穴です。FORCE APPLICATION:特定接続の強制切断。切られた側にエラーが返ります。- 異常終了(トラップ):db2sysc の異常終了。
db2diag.logやdb2dump配下のトラップファイルを確認します。
# インスタンス/DBが静止化(QUIESCE)されていないか、稼働状態を確認
db2 "SELECT DB_STATUS FROM TABLE(MON_GET_DATABASE(-2)) AS T"
# db2diag.log から停止・強制・異常のイベントを時刻付きで抽出
db2diag -H 1d | grep -iE "quiesce|force|db2stop|panic|trap"
SQL1224N はサーバ側の状態が原因であることがほとんどです。アプリのログだけを睨んでいても答えは出ません。発生時刻を持ってサーバの db2diag.log を突き合わせる――この一手で、①〜③のどれなのかがたいてい判明します。監視の仕組みがあれば、接続数・メモリ・DB状態を時系列で見返せて、切り分けが一段速くなります。
SQL1224N が出たときのチェックリスト
- 症状を確認:ピーク時だけ(①②)か、ある時刻から一斉(③)か
MAX_CONNECTIONS/MAX_COORDAGENTS/MAXAPPLSの上限を確認MON_GET_CONNECTION/db2pd -agentsで現在の使用量が上限に張り付いていないか見る- 上限に張り付いているなら、上げる前に接続リーク(返し忘れ・長時間アイドル)を疑う
- 接続に余裕があるなら
INSTANCE_MEMORYと OSのulimit、db2diag.logのメモリ/エージェント失敗を確認 - 一斉発生なら
db2stop/QUIESCE/FORCE/ 異常終了を サーバ側db2diag.logで確認
db2topでは見えない「なぜ詰まっているのか」を掴む――MON_GET表関数によるリアルタイム監視の実践を、本書 第11章「MON_GET表関数によるリアルタイム監視」にまとめています。
現場で引ける Db2 の教科書
現場で引ける!Db2実践エンジニア・バイブル
Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ――
そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。
アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。
Db2の運用で踏んだ地雷や、この記事で扱ってほしいテーマがあれば、ぜひコメントで教えてください。次の記事のネタにさせてもらいます。