Help us understand the problem. What is going on with this article?

DB2のLOADコマンド

More than 1 year has passed since last update.

DB2におけるLOADコマンドについてまとめておく。
対象テーブルの全データを入れ替え、パフォーマンス重視のためフォワードリカバリーは考慮しないものとする。

コマンド

LOAD FROM filename OF filetype
  MODIFIED BY file-type-mod
  WARNINGCOUNT n
  MESSAGES message-file
  REPLACE INTO table-name
  NONRECOVERABLE
パラメータ 説明
filename ロードするデータファイル
filetype データのフォーマット
file-type-mod ファイルタイプ修飾子
n 警告回数の上限(※1)
message-file 警告及びエラーメッセージの出力先
table-name ロード先テーブル名

※1…指定した回数を超えた警告が出た場合、自動的にロード処理を中止する。

ID列が存在しない場合のロードコマンドの例

LOAD FROM /work/SCHEMA.FOO_TBL.DEL OF DEL
  WARNINGCOUNT 100
  MESSAGES /work/SCHEMA.FOO_TBL.MSG
  REPLACE INTO SCHEMA.FOO_TBL
  NONRECOVERABLE

NONRECOVERABLEを付けない場合はバックアップペンディングとなるため、ロード後にBACKUP DATABASEコマンドでバックアップを取得する必要がある。バックアップペンディング状態で放置すると、対象の表スペース(対象テーブルではない)が更新できなくなる。
NONRECOVERABLEを付けた場合でも、ロード完了時点から次のバックアップまでの間リストアができなくなるため、基本的にロード完了後にバックアップを取得するのが望ましい。

バックアップペンディング状態の確認

LIST TABLESPACES

出力結果の状態の値が0x0000以外の表スペースが存在する場合、その表スペースに問題が生じていることがわかる。
現在はLIST TABLESPACESコマンドは推奨されなくなっているようで、代替となるMON_GET_TABLESPACE表関数を使用する場合はTBSP_STATE列の値を参照する。

ID列が存在する場合のロードコマンドの例

ID列が存在する場合はロード前後に追加作業が必要になる。

あらかじめIdentity列の最大値+1を取得しておく。

SELECT MAX(Identity列名)+1 FROM スキーマ名.テーブル名

ロードする前にIDENTITY制約をOFFにする。

SET INTEGRITY FOR スキーマ名.テーブル名 OFF

対象テーブルをロードする。identityoverrideはデータファイルにID列の値も含まれている場合に指定する修飾子。

LOAD FROM /work/SCHEMA.FOO_TBL.DEL OF DEL
  MODIFIED BY identityoverride
  WARNINGCOUNT 100
  MESSAGES /work/SCHEMA.FOO_TBL.MSG
  REPLACE INTO SCHEMA.FOO_TBL
  NONRECOVERABLE

ロード後にIDENTITY制約をONに戻す。IMMEDIATE CHECKEDをつけて必要な整合性処理を行い、テーブルのSET INTEGRITYペンディング状態を解除する。

SET INTEGRITY FOR スキーマ名.テーブル名 IMMEDIATE CHECKED

Identity列の開始値を設定する。開始値には、ロード前に取得しておいたIdentity列の最大値+1の値を指定する。

ALTER TABLE スキーマ名.テーブル名 ALTER COLUMN Identity列名 RESTART WITH 開始値

ロードにおける注意事項

ロード時の文字化け

EXPORTやIMPORTコマンドと同様に、DBと接続クライアントとの文字セットの違いがあると投入データが文字化けすることがある。あらかじめ環境変数でLANGやDB2CODEPAGEを設定した上で、LOADコマンドを実行する。

ロードペンディング状態

ロード中に強制的に処理を中断させた場合、テーブルがロードペンディング状態になってアクセスできなくなる。この場合、LOAD REPLACEでテーブルが空の状態からロードを再実行すればよい。なお、テーブルがロード再始動不可となっていない場合は、LOAD RESTARTでロードを再実行することができる。

テーブルのロードペンディング状態を確認するには、以下のコマンドを実行する。ロードペンディングとなっているテーブルはLOAD_STATUSが'PENDING'になっていて、ロード再始動不可のテーブルはNO_LOAD_RESTARTが'Y'になっている。

SELECT
  VARCHAR(TABSCHEMA, 30) TABSCHEMA,
  VARCHAR(TABNAME, 30) TABNAME,
  LOAD_STATUS, NO_LOAD_RESTART 
FROM SYSIBMADM.ADMINTABINFO
WHERE LOAD_STATUS IS NOT NULL

参考

LOADにあたり、DBの状態を取得する方法を挙げておく。

DB2のトランザクション状態の取得

db2pd -db データベース名 -transaction

出力結果のLocksでロック状態が、AppHandlで対象のアプリケーションIDが分かる。アプリケーションIDは以下のコマンドで取得できる。

db2 list applications (show detail)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away