db2look と db2move で別のデータベースへ移したあと、一部の表が空だったり、表を読もうとすると次のエラーになったりすることがあります。
SQL0668N Operation not allowed for reason code "1" on table "MV.EMP". SQLSTATE=57007
db2move の画面には警告が1行出るだけで、どの行がなぜ落ちたかは出ません。
まず見る(結論)
db2move を実行したディレクトリにある表ごとの tabN.msg と、移行先のチェック・ペンディングの表を確認します。
# 行が落ちた理由(表と tabN の対応は db2move.lst)
grep -E 'SQL3550W|SQL3[0-9]{3}N' tab*.msg
# 使えなくなっている表
db2 "SELECT TABSCHEMA, TABNAME, STATUS FROM SYSCAT.TABLES WHERE STATUS = 'C'"
SQL3550W ... GENERATED ALWAYS が出ていれば、IDENTITY 列を GENERATED ALWAYS で定義した表の行が全部 Rejected になっています。
症状 → 原因 → 対処(逆引き)
| 症状 | よくある原因 | まず打つ手 |
|---|---|---|
表が0件。tabN.msg に SQL3550W |
IDENTITY 列が GENERATED ALWAYS で、ファイルの値を受け付けない |
LOAD FROM tabN.ixf OF IXF MODIFIED BY IDENTITYOVERRIDE REPLACE INTO 表名 |
移行後に読み書きで SQL0668N 理由コード1 |
LOAD 後のチェック・ペンディング | SET INTEGRITY FOR 表名 IMMEDIATE CHECKED |
SET INTEGRITY が SQL3603N |
親表が空のまま、子表に行が入った | 親表を入れ直してから SET INTEGRITY を流し直す |
IMPORT で IDENTITYOVERRIDE が SQL3016N |
IMPORT にはこの修飾子が無い | 列を SET GENERATED BY DEFAULT にして IMPORT し、ALWAYS に戻す |
DDL を流すと SQL0204N "表スペース名" |
db2look -e だけでは表スペースが出ない |
db2look -e -l で取り直す。権限も要るなら -x |
-l の DDL で SQL1582N |
移行先の既定ページサイズが移行元と違う | 移行先を CREATE DB ... PAGESIZE で移行元に合わせて作る |
移行後最初の INSERT で SQL0803N |
IDENTITY 列の次の値が 1 に戻っている | ALTER TABLE ... ALTER COLUMN ... RESTART WITH で最大値より大きくする |
db2move import -io REPLACE_CREATE で表ごと作らせると、外部キー・CHECK 制約・ビュー・権限は作られません。DDL は db2look で先に流します。
それでも切り分けられないとき(実機ログつきの詳解)
db2move load の実際の出力、SQL3550W が出る .msg の中身、IDENTITYOVERRIDE で復旧するまでの手順と、db2look のオプションごとに移行先に何ができるかの比較は、Zennのフル記事にまとめています。
この記事のような現場のTIPSを、Db2運用の全体像として12章に体系化しました。公式マニュアルには載らない「あのとき知っていれば」を減らすための1冊です。
現場で引ける Db2 の教科書
現場で引ける!Db2実践エンジニア・バイブル
Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。
アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集。