AIエージェントがデータベース障害に対応できる範囲と、人間が判断すべき範囲
公開日 2026-08-13 · 更新日 2026-08-13 · 最終検証日 2026-08-13
結論
AIエージェントが強いのは検知と切り分けです。常時監視と相関、定型の確認クエリを一気に流して事実を集める作業は自動化できます。一次対応は条件付きで、影響が可逆かつ対象が限定された操作に限られます。恒久対応と構成変更は人間の判断が必要です。理由は3つあり、操作の不可逆性、影響範囲の見積りの難しさ、そして「サービスを止めるか、遅いまま継続するか」が技術判断ではなく業務判断であることです。
この文書の適用条件
| 対象製品 | SQL Server / MySQL / Aurora MySQL(トリアージクエリの対象) |
|---|---|
| 確認バージョン | SQL Server 2012 以降、MySQL 5.7 / 8.0 系および Aurora MySQL 2 / 3 |
| 適用環境 | オンプレミス、EC2、Amazon RDS、Aurora、Azure |
| 必要権限 | SQL Server は `VIEW SERVER STATE`。MySQL は `PROCESS` 権限。`KILL` には別途 `ALTER ANY CONNECTION` 相当が必要 |
| 実行影響 | トリアージクエリは参照のみ。`KILL` の例は変更を伴い、人間の承認が必要 |
| 再起動 | 不要 |
| 最終検証日 | 2026-08-13 |
そのまま実行できるコマンド
- 対象
- SQL Server 2012 以降 / Amazon RDS for SQL Server / Azure SQL Managed Instance
- 権限
- VIEW SERVER STATE
- 変更作業
- なし(参照のみ)
- Production実行
- 可能
-- 対象: SQL Server 2012 以降 / Amazon RDS for SQL Server
-- 権限: VIEW SERVER STATE
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT
r.session_id,
r.blocking_session_id, -- 0 以外なら、この値のセッションに待たされている
r.status,
r.command,
r.wait_type,
r.wait_time AS wait_time_ms,
r.wait_resource,
DB_NAME(r.database_id) AS database_name,
s.login_name,
s.host_name,
s.program_name,
r.total_elapsed_time AS elapsed_ms,
SUBSTRING(t.text, 1, 500) AS sql_text
FROM sys.dm_exec_requests AS r
INNER JOIN sys.dm_exec_sessions AS s
ON r.session_id = s.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
WHERE r.blocking_session_id <> 0
OR r.session_id IN (
SELECT blocking_session_id
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0
)
ORDER BY r.wait_time DESC;ブロッキングの起点は `blocking_session_id` をたどった先で、自身が誰にも待たされていないセッションです。連鎖の途中を止めても解消しません。なお、待たせている側が実行中でない場合は `sys.dm_exec_requests` に行が出ないため、`sys.dm_exec_sessions` 側で該当 session_id の状態も確認してください。
- 対象
- MySQL 5.7 / 8.0 系、Aurora MySQL 2 / 3
- 権限
- PROCESS 権限(他ユーザーのセッションを見るために必要)
- 変更作業
- なし(参照のみ)
- Production実行
- 可能
-- 対象: MySQL 5.7 / 8.0 系、Aurora MySQL 2 / 3
-- 権限: PROCESS 権限
-- 変更作業: なし(参照のみ)
-- Production 実行: 可能
SELECT
trx.trx_id,
trx.trx_state,
trx.trx_started,
TIMESTAMPDIFF(SECOND, trx.trx_started, NOW()) AS trx_age_sec,
trx.trx_mysql_thread_id AS thread_id,
trx.trx_rows_locked,
trx.trx_rows_modified, -- 大きいほどロールバックに時間がかかる
p.user,
p.host,
p.db,
p.command,
p.time AS thread_time_sec,
p.state,
LEFT(COALESCE(trx.trx_query, p.info), 500) AS current_sql
FROM information_schema.INNODB_TRX AS trx
LEFT JOIN information_schema.PROCESSLIST AS p
ON p.ID = trx.trx_mysql_thread_id
ORDER BY trx.trx_started ASC;
-- 補助: トランザクションを持たない接続も含めて全体を見る
SHOW FULL PROCESSLIST;`trx_state` が `RUNNING` でも、`current_sql` が空なら「トランザクションは開いたままだが、いまクエリは流れていない」状態です。アプリケーション側のコミット漏れや、接続プールが保持したままの接続を疑います。`trx_rows_modified` はロールバック時間の見積りに使えます。
- 対象
- SQL Server 2012 以降 / MySQL 5.7 以降・Aurora MySQL
- 権限
- SQL Server は ALTER ANY CONNECTION(または `sysadmin` / `processadmin`)、MySQL は CONNECTION_ADMIN 相当
- 変更作業
- あり(実行中セッションの強制終了と、そのトランザクションのロールバック)
- Production実行
- 人間の承認を得た場合のみ実行可能
-- 対象: SQL Server 2012 以降 / MySQL 5.7 以降・Aurora MySQL
-- 権限: SQL Server は ALTER ANY CONNECTION、MySQL は CONNECTION_ADMIN 相当
-- 変更作業: あり(セッションの強制終了とトランザクションのロールバック)
-- Production 実行: 人間の承認を得た場合のみ
-- 実行前に、以下の6項目すべてを確認する。1つでも未確認なら実行しない。
-- 1. 対象がブロッキング連鎖の起点か(他に待たされていないセッションか)
-- 2. そのセッションが何をしているか(定常のアプリ処理・バッチ・DDL のいずれか)
-- 3. ロールバックの想定時間(更新行数が多いほど長く、その間ロックは解放されない)
-- 4. 呼び出し元が再試行するか。しない場合、業務データが欠落しないか
-- 5. 止める代わりに待つ選択肢が取れないか(業務側の許容時間の確認)
-- 6. 承認者は誰か。実行の記録をどこに残すか
-- SQL Server: セッションIDを指定(値はサンプル)
KILL 57;
-- ロールバックの進捗を確認する(KILL 後に実行する参照専用クエリ)
-- KILL 57 WITH STATUSONLY;
-- MySQL / Aurora MySQL: PROCESSLIST の ID を指定(値はサンプル)
-- KILL 12345;`KILL` はロールバックを発生させます。更新行数が多いトランザクションでは、ロールバックが元の処理より長くかかることがあり、その間ロックは解放されません。「止めれば早く終わる」とは限らない点が、この操作を自動実行の対象にできない主な理由です。SQL Server では `KILL <spid> WITH STATUSONLY` でロールバックの進捗を確認できます。
結果の読み方
| 列 | 意味 | 確認するポイント |
|---|---|---|
| 検知 | 異常が起きていることに気づく段階 | AIが得意。常時監視、閾値超過の検出、複数メトリクスの相関、過去パターンとの照合 |
| 切り分け | 事実を集めて原因の範囲を絞る段階 | AIが得意。定型の参照クエリを一気に流し、結果を突き合わせて事実関係を整理する |
| 一次対応 | 影響を止める、または軽減する段階 | 条件付き。影響が可逆で対象がallowlistで限定された操作のみ。それ以外は人間の承認 |
| 恒久対応・構成変更 | 再発しないように仕組みを変える段階 | 人間の判断が必要。スキーマ変更、パラメータ変更、構成変更は影響範囲の見積りを伴う |
| 事後分析 | 何が起きたかを記録し、対策を決める段階 | AIが下書き、人間が確定。時系列とログの整理は自動化でき、原因の断定と対策の決定は人が行う |
| blocking_session_id | このセッションを待たせている相手のセッションID | 0以外の値をたどり、誰にも待たされていないセッション(連鎖の起点)を特定する |
| wait_type / state | 何を待っているか | ロック待ちかI/O待ちかCPU待ちかで、次に見る場所が変わる |
| trx_rows_modified | そのトランザクションが変更した行数 | 大きいほどロールバックに時間がかかる。`KILL` の判断材料になる |
| trx_age_sec / elapsed_ms | トランザクションの経過時間 | 長時間開いたままのものは、コミット漏れや接続プールの保持を疑う |
| program_name / host | 接続元 | 特定のアプリやバッチに偏っていないか。偏りは原因の絞り込みに直結する |
こういう状況で使います
- アプリケーションからのタイムアウトが急増し、データベースが原因かどうか切り分けできていない
- 特定のテーブルへの更新だけが待たされている
- 深夜に発生した異常に誰も気づかず、朝になって発覚した
- 監視は入っているが、アラートが多すぎてどれが本物か判断できない
- 障害のたびに、確認するクエリを毎回思い出しながら実行している
- 一次対応をAIに任せたいが、どこまで任せてよいか線引きできていない
考えられる原因(可能性の高い順)
01
検知の仕組みはあるが、切り分けの手順が人の記憶に依存している
確認すべきクエリが手順として整理されていないと、対応者によって集める事実が変わります。フェーズのうち最も自動化しやすいのがこの部分です。
02
一次対応の可否が事前に決まっていない
どの操作なら自動で実行してよいかが決まっていないと、安全側に倒して全て人手になるか、逆に危険な操作まで自動化されるかのどちらかになります。
03
不可逆な操作が可逆な操作と同じ扱いになっている
セッションの終了、データの削除、レプリケーションの初期化は、いずれも「対応」と呼ばれますが取り消しやすさが異なります。区別せずに扱うと事故につながります。
04
停止判断の権限者が決まっていない
サービスを止めて復旧を優先するか、遅いまま継続するかは業務判断です。判断権限者が決まっていないと、技術担当が判断を抱え込み、対応が遅れます。
確認手順
- 1
ブロッキング連鎖を確認する
参照のみ上記の参照専用クエリで、待っているセッションと待たせているセッションを一覧化し、連鎖の起点を特定します。
- 2
アクティブなセッションと接続元を確認する
参照のみ接続元のアプリケーションやホストに偏りが無いかを見ます。偏りがあれば、そのアプリの直近の変更を確認します。
- 3
待機事象を集計する
参照のみロック待ち、I/O待ち、CPU待ちのどれが支配的かを確認します。次に見る場所がここで決まります。
- 4
トランザクションログの使用状況を確認する
参照のみログの空き容量が枯渇していると、更新処理全体が停止します。長時間トランザクションがログの再利用を妨げていないかを確認します。
- 5
レプリケーションの遅延を確認する
参照のみ参照系をレプリカに向けている場合、遅延によって業務影響が出ます。遅延の大きさと増加傾向を確認します。
- 6
直近の変更を確認する
参照のみデプロイ、バッチの追加、パラメータ変更が直前に無かったかを確認します。時系列の一致は有力な手がかりです。
対応方法
すぐに実施できる低リスクの対応
トリアージクエリ集を手順として固定する
参照のみ障害時に流すクエリを一覧化し、エージェントが自動で一括実行できるようにします。参照専用なので自動化しても影響がありません。
事実の要約を自動生成する
参照のみ収集した結果を時系列で整理し、対応者が読む形にまとめます。断定はせず、事実と観測値だけを並べます。
停止判断の権限者を明記する
低サービス停止を伴う判断を誰が行うかを、対応手順の冒頭に書きます。障害時に探さないで済むようにします。
事前検討が必要な変更
自動実行してよい一次対応を定義する
中影響が可逆で対象が限定された操作(読み取り専用の確認、キャッシュの再読み込み、参照系の切り離しなど)を列挙し、それ以外は承認を必須にします。
事後分析の下書きを自動化する
低時系列、収集した観測値、実行した操作を自動でまとめ、原因の断定と対策の決定は人が行います。
監視の対象をサービスの成立条件に合わせる
中プロセスの死活だけでなく、実際の処理経路が成立しているかを見る監視を追加します。
専門家のレビューが必要な作業
ブロッキングの起点セッションを終了する
専門家レビュー必須ロールバックが発生し、更新行数によっては元の処理より長くかかります。上記の6項目を確認し、承認を得てから実行してください。
レプリカへの切り替え(フェイルオーバー)を行う
専門家レビュー必須遅延中のレプリカへ切り替えるとデータの欠落が起きる可能性があります。遅延量と業務要件を確認したうえで、人が判断してください。
構成やパラメータを変更して恒久対応する
専門家レビュー必須影響範囲の見積りと切り戻し手順が必要です。障害対応中の変更は、変更自体が新たな障害要因になり得ます。
!注意事項
- 人間の承認なしにAIエージェントが実行してはならない操作: データ削除、`KILL`、`SHRINK`、強制Failover、Replicationの初期化、CDCの再設定、インデックスの全体再構築、大規模な統計更新、パラメータ変更、スキーマ変更、DBの再起動、ファイアウォールおよび権限の変更、binlogの初期化、バックアップの削除。
- 線引きの理由は3つです。第一に不可逆性で、実行後に元の状態へ戻せないか、戻すのに別の復旧作業を要します。第二に影響範囲の見積りが難しく、対象データベース以外の連携先まで波及します。第三に「サービスを止めるか、遅いまま継続するか」は技術判断ではなく業務判断であり、技術的な正しさだけでは決められません。
- `KILL` は必ず状況を改善するとは限りません。ロールバックが発生し、更新行数が多い場合は元の処理より時間がかかることがあります。その間ロックは解放されません。
- 障害対応中の構成変更は、変更自体が新たな障害要因になります。恒久対応は復旧後に、影響調査と切り戻し手順を用意してから実施してください。
- 参照専用のクエリであっても、極端に高負荷な状態のインスタンスでは応答が返らないことがあります。取得するデータ量を絞り、タイムアウトを設定してください。
- AIが提示した原因は仮説です。事後分析の確定と対策の決定は人が行ってください。
バージョン・環境による違い
これで解決しない場合に確認すること
直近の障害で、検知から切り分け完了までにかかった時間を確認する
時間の大半が「何を見るか思い出す」ことに費やされているなら、トリアージの自動化が効きます。
一次対応で実行した操作を可逆・不可逆で分類する
不可逆な操作を承認なしで実行していた場合、それが次の事故要因です。
停止判断が誰の権限かを確認する
権限者が不在の時間帯にどうするかまで決まっているかを確認します。
アラートの精度を確認する
直近のアラートのうち、実際に対応が必要だった割合を数えます。低い場合、本物の異常が埋もれます。
事後分析の記録が次の障害で参照されているかを確認する
記録が読まれていないなら、形式か置き場所を見直してください。
この文書の根拠と限界
一般的な技術説明
トリアージクエリは SQL Server の動的管理ビューおよび MySQL の `information_schema` の公開仕様に基づきます。フェーズごとの線引きは、操作の可逆性と影響範囲にもとづく一般的な運用設計です。「GIIP対応範囲」の段落のみ GIIP 自身の運用形態の記述であり、顧客事例ではありません。復旧時間・障害件数・自動化率などの数値は検証できないため記載していません。
よくある質問
AIエージェントに障害対応をどこまで任せられますか?
検知と切り分けは任せられます。一次対応は、影響が可逆で対象が明示的に限定された操作に限られます。恒久対応と構成変更、そしてサービスを止めるかどうかの判断は人間が行ってください。
なぜ `KILL` を自動実行してはいけないのですか?
ロールバックが発生し、更新行数によっては元の処理より長くかかるためです。その間ロックは解放されず、状況が悪化することがあります。加えて、止められた処理を呼び出し元が再試行しない場合、業務データが欠落する可能性があります。
人間の専門家が担当すべき作業は具体的に何ですか?
不可逆な操作の実行判断、サービス停止の可否、影響範囲が複数システムにまたがる場合の判断、恒久対応の設計、そして事後分析の確定です。いずれも技術的な正しさだけでは決まらず、業務影響と責任の所在が関わります。
トリアージクエリは本番環境で実行できますか?
本記事の1つ目と2つ目のクエリは参照専用のため実行できます。ただし極端に高負荷な状態では応答が返らないことがあるため、取得件数を絞り、タイムアウトを設定してください。3つ目の `KILL` は変更を伴うため、承認が必要です。
一次対応を自動化する場合、何を用意すればよいですか?
対象のallowlist、変更前スナップショット、ロールバック手順、監査ログ、停止スイッチです。これらが揃っていない操作は自動実行の対象にしないでください。
AIが提示した原因をそのまま採用してよいですか?
仮説として扱ってください。収集した事実の整理は自動化できますが、原因の断定は観測されていない要素の影響を受けます。事後分析はAIが下書きし、人が確定する形が適しています。
この文書がカバーする質問
- AI運用で人間の専門家が担当すべき作業は何か
- AIエージェントにデータベースの一次対応を任せてよいか
- DB障害時にまず流すべき確認クエリを知りたい
リスク表示の意味
- 参照のみデータと設定を変更しません。
- 低影響は限定的ですが、権限と負荷の確認が必要です。
- 中性能・ロック・コストに影響する可能性があります。
- 高障害・データ損失・復旧作業が発生する可能性があります。
- 専門家レビュー必須本番適用前に別途レビューが必須です。
GIIPの対応範囲
上記のフェーズ分けと線引きは、特定のサービスを使わずに自組織で実装できます。GIIP では AWS と Azure 上の複数データベースおよび約30の Web サービスを、AI エージェントと人間の専門家が継続的に監視・運用しており、検知と切り分けはAIエージェントが実行し、上に列挙した不可逆な操作と停止判断は人間の担当者が承認してから実行する形をとっています。自組織で線引きを決める際に、どの操作を可逆と見なせるかの判断が難しい場合は、現在の構成と過去の障害記録をもとに整理することもできます。
執筆・技術検証
GIIP プロダクション運用チーム
大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。
SQL Serverで長時間開いたままのトランザクションを確認するSQL
sys.dm_tran_active_transactions 系のDMVで、開始時刻・セッション・最後に実行したSQLまで含めて放置トランザクションを特定する手順です。
aurora-mysqlAurora MySQLで特定のクエリが遅くなったときの確認手順
スロークエリログ・PROCESSLIST・EXPLAIN・ダイジェスト集計の順に、危険度の低い確認から遅いクエリを特定する手順です。performance_schemaが無効な環境の代替手段も示します。
monitoringサーバーとデータベースを24時間監視するときに設定する項目
24時間監視を設計する際の監視対象・しきい値の考え方・エスカレーション体制・外形監視の必要性を、層ごとに整理したチェックリストです。
ai-operationsAIの自動実行に承認とロールバックが必要な理由と、その設計方法
自動実行の設計要素(スナップショット・承認ゲート・dry-run分離・allowlist・冪等性・監査ログ・段階的展開・停止スイッチ)と、承認なしに実行してはならない操作の線引きを整理します。
関連サービス
障害時の一次対応の線引きを整理する
同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。
障害時の一次対応の線引きを整理する