夜間バッチで数百万行を入れる。投入そのものは終わったのに、別のジョブが固まる・更新だけ弾かれる——大量データ投入では、投入中と投入後の両方で別の問題が出ます。
Db2 の投入手段は IMPORT / INGEST / LOAD の3つです。この記事では症状から方式を選び直すための逆引きを最短でまとめます。
まず見る(結論)
3方式の違いは速度ではなく、ログをどれだけ書くかと他業務をどれだけ止めるかに出ます。速さで選ぶと投入後に更新が止まります。まず投入直後の表スペース状態を確認してください。
# 投入した表の表スペースが通常状態か(BACKUP PENDING になっていないか)
db2 "SELECT TBSP_NAME, TBSP_STATE FROM TABLE(MON_GET_TABLESPACE('',-2))"
症状 → 原因 → 対処(逆引き)
| 症状 | よくある原因 | まず打つ手 |
|---|---|---|
| 投入中に他業務がエラーも出さずに固まる | IMPORT を使っている。LOCKTIMEOUT = -1 だと他業務は落ちずに待ち続ける |
INGEST か LOAD ... ALLOW READ ACCESS に替える |
投入は成功したのに、その表への INSERT だけ SQL0290N |
LOAD をオプション無しで実行した。既定は COPY NO と同じで表スペースが BACKUP PENDING に入る |
その表スペースだけをオンラインバックアップする。または COPY YES / NONRECOVERABLE で投入する |
LOAD QUERY TABLE は Normal なのに更新が通らない |
BACKUP PENDING は「表」ではなく「表スペース」の状態。表状態には出ない | MON_GET_TABLESPACE.TBSP_STATE で表スペース側を見る |
投入の途中でログが溢れる(SQL0964C) |
IMPORT も INGEST も1行ずつログに書く。COMMITCOUNT で減るのは同時保持量で、総量ではない |
ログ総量を減らせるのは LOAD だけ。枯渇の回避だけなら COMMITCOUNT でよい |
INGEST が SQL0912N で異常終了し、1行も入っていない |
対象表が既定の LOCKSIZE ROW で、ロック要求が上限に達した |
LOCKLIST / MAXLOCKS を増やすか、ALTER TABLE ... LOCKSIZE TABLE |
INGEST が SQL2957N で始まらない |
既定はリスタート可能モード。進捗表 SYSTOOLS.INGESTRESTART が無いと投入自体が始まらない |
CALL SYSPROC.SYSINSTALLOBJECTS('INGEST','C',NULL,NULL) で作る。使い捨てなら RESTART OFF |
上2つは投入が成功した後に出る症状です。投入ジョブの戻り値だけを見ていると気づけません。
検証環境で計ると逆でした。300万行の LOAD が他業務を止めたのは1〜3秒程度なのに対し、50万行の IMPORT は所要時間の48秒間ずっと SELECT も INSERT もブロックしていました。危険なのはロックの強さではなく、止まっている時間の長さです。
数値で比べたい・再現手順が要るとき
3方式のログ消費量、投入中の停止時間、LOAD の COPY オプション別の表スペース状態を実機で計測した結果と、その再現手順は Zenn のフル記事にまとめています。
関連: Db2「SQL0290N」表スペースにアクセスできない原因を切り分ける / Db2「SQL0964C トランザクションログがいっぱいです」の原因を切り分ける / Db2 INGEST の使い方と進捗確認
この記事のような現場のTIPSを、Db2運用の全体像として12章に体系化しました。公式マニュアルには載らない「あのとき知っていれば」を減らすための1冊です。
現場で引ける Db2 の教科書
現場で引ける!Db2実践エンジニア・バイブル
Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。
アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。