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)