Db2のデータ移行でよくつまづくエラーと対策

〜EXPLAINテーブルの扱いと SQL3201N / SQL0530N の正しい理解〜

本番環境から開発環境へ Db2 のデータを移行する際、EXPORT / IMPORT を使ってテーブルデータをコピーするケースは多いと思います。
しかし、その中でも explain_instance や explain_statement といった EXPLAIN 関連テーブルを移行しようとすると、以下のようなエラーが発生することがあります。

  • SQL3201N
  • SQL0530N

この記事では、これらのエラーがなぜ発生するのか、無視してよいのか、そもそも EXPLAIN テーブルを移行すべきなのかを、実務目線でわかりやすく解説します。


  1. 発生したエラーの意味

◆ SQL0530N:外部キー制約違反

SQL0530N は 「外部キーの参照整合性が取れないため INSERT が拒否された」 というエラーです。

EXPLAIN テーブルは内部的に相互参照しているため、
本番環境で生成された EXPLAIN データを開発環境へ持ち込むと 参照整合性が崩れやすく、SQL0530N が発生するのは自然 です。


◆ SQL3201N:IMPORT 時の一般的なエラー

SQL3201N は IMPORT/LOAD 時に
「指定したデータを取り込めない」
という汎用的なエラーです。

EXPLAIN テーブルは Db2 が内部的に利用するワークテーブルであり、構造や内容が環境依存のため、移行時にエラーが出ることは珍しくありません。


  1. explain_* テーブルは移行すべきか?

◆ 結論:移行しなくてよい(むしろ移行してはいけない場合が多い)

理由は以下の通りです。

  • EXPLAIN テーブルは アクセスプラン解析用のワークテーブル
  • 本番と開発では データ量・統計情報・インデックス構成が異なるため、アクセスプランも異なる
  • 本番の EXPLAIN 結果を開発に持ってきても 意味がない
  • バージョン差や構成差で 構造不一致が起きやすい

つまり、EXPLAIN テーブルはデータ移行の対象外 と考えるのが正しい運用です。


  1. エラーは無視してよいのか?

◆ はい、無視して問題ありません。

EXPLAIN テーブルは移行対象ではないため、
IMPORT 時に SQL3201N や SQL0530N が出ても 実害はありません。


  1. 代わりに行うべき正しい手順

◆ ① 開発環境で EXPLAIN テーブルを再作成する

Db2 には EXPLAIN テーブルを自動生成するスクリプトが用意されています。

例(Linux/Unix)

db2 -tvf ~/sqllib/misc/EXPLAIN.DDL

これにより、開発環境に その環境に適した EXPLAIN テーブル が作成されます。


◆ ② 開発環境で必要な SQL に対して EXPLAIN を実行する

EXPLAIN PLAN FOR

その後、db2exfmt などでアクセスプランを確認できます。


◆ ③ 統計情報(RUNSTATS)は本番→開発でコピーしない

本番の統計情報を開発に持ち込むと、
実際のデータ量と乖離し、誤ったアクセスプランが生成される ため非推奨です。

開発環境では以下を実行するのが一般的です。

RUNSTATS ON TABLE WITH DISTRIBUTION AND SAMPLED DETAILED INDEXES ALL;


  1. まとめ:Db2 のデータ移行で覚えておくべきポイント

項目 結論
explain_instance / explain_statement の移行 不要
SQL3201N / SQL0530N の扱い 無視してよい
EXPLAIN テーブルの正しい準備方法 開発環境で再作成する
本番の EXPLAIN 結果を開発へ移行 非推奨
統計情報の移行 非推奨(開発で RUNSTATS 実行)

Db2 のデータ移行では、EXPLAIN テーブルを誤って移行しようとしてエラーに悩むケースが非常に多いです。
しかし、これらはそもそも移行対象ではなく、開発環境で再生成するのが正しい運用です。

コメントを残す