1. データベース - IBM DB2 - トラブルシュート - エラーコード

 
1.1 SQL0668N 理由コード "1"
1.2 SQL0668N 理由コード "3"
1.3 SQL0668N 理由コード "7"
1.4 SQL1477N
1.5 SQL1116N
1.6 SQL1655C
1.7 SQL20054N 理由コード "23"

1.1 SQL0668N 理由コード "1"

 テーブルにアクセスしようとしたら (SELECT なんですが)

SQL0668N  理由コード "1" のため、表 "テーブル名" に対する操作は許可されません。
 というエラーが表示されてアクセスできませんでした。  sql で (Windows系であれば clpplus を起動)

SET INTEGRITY FOR テーブル名 IMMEDIATE CHECKED;
 とやるとアクセスできるようになるようです。

1.2 SQL0668N 理由コード "3"

 前項と同じ状況で、理由コードが "3" のときは、データベースのリストアの直後であったり、テーブルのデータをロードしている途中に処理を中止したり、データベースを停止したりすると発生する状態です。  ロードペンディングという状態になっています。  もし、ロード途中で停止したようなときは、ロードの処理を完了する必要があります。  ロードペンディング状態のテーブルは、データベースに CONNECT して、以下の SQL で調べることができます。

db2 "SELECT VARCHAR(TABSCHEMA,30) TABSCHEMA,VARCHAR(TABNAME,30) TABNAME, LOAD_STATUS, NO_LOAD_RESTART FROM SYSIBMADM.ADMINTABINFO WHERE LOAD_STATUS <> 'NULL'"
 結果は以下のような形式で表示されます。

TABSCHEMA                      TABNAME                        LOAD_STATUS  NO_LOAD_RESTART
------------------------------ ------------------------------ ------------ ---------------
スキーマ名                     テーブル名                    PENDING      N
 リストアやロードが完了している状態であれば、データベースに CONNECT して

db2 ROLLFORWARD DB データベース名 TO END OF LOGS AND STOP
 で完了させてやれば、アクセスできるようになります。

1.3 SQL0668N 理由コード "7"

 テーブルにアクセスしようとしたら

SQL0668N  理由コード "7" のため、表 "テーブル名" に対する操作は許可されません。
 というエラーが表示されてアクセスできないときがあります。  この現象は、たいてい対象のテーブルに対して「ALTER TABLE」等で変更をかけた後に発生します。  sql で (Windows系であれば clpplus を起動)

REORG TABLE テーブル名 INDEX インデックス名;
 を行うと解消します。

1.4 SQL1477N

 テーブルにアクセスしようとしたら

SQL1477N  表 "テーブル名" で、表スペース "テーブルスペース番号" 内のオブジェクト "オブジェクト番号" にはアクセスできません。
 というエラーが表示されてアクセスできませんでした。  IBM のサイトであれこれ能書きを垂れていますが、どうららテーブルをドロップして作成しなおすしかなさそうです。  もし、同一のテーブル構成を持っている他のデータベースが存在するならば「テーブルをコピーする」の手順でどうぞ。

1.5 SQL1116N

 Windows の DB2 サーバで「DB2 コマンドウィンドウ - 管理者」から db2 connect しよううとするとエラーになりました。

C:¥ db2 connect to データベース名
SQL1116N データベース "データベース名" は BACKUP PENDING 状態になっているため。そのデータベースへの接続、またはそのデータベースのアクティブ化は失敗しました。  SQLSTATE=57019
 これは、一度、データベースのバックアップをとると解消します。  データベースのバックアップについては「バックアップ・リストア」を参照してください。

1.6 SQL1655C

 テーブルにアクセスしようとすると

SQL1655C ディスク上のデータ・アクセス・エラーのために、操作を完了できませんでした。
 これが一番、始末が悪い状態です。IBM さんのサイトを読んでもちっとも要領を得ません。  ものすごく運が良ければ、アクセス対象のテーブルを全件 DELETE して、バックアップからインポートするだけで回復します。  次に運が良ければ、アクセス対象のテーブルをいったん DROP して、CREATE しなおしてバックアップからインポートすると回復します。  上記の方法で駄目な場合は、データベース全体を DROP して再構築する必要があります。  (このケースが非常に多いのですがね。なんてこった! まあ試験用に VMWare 上の試用版 Windows Server 2008R2 で試用版の DB2 を動作させているのでどこにも文句も言えないし、そもそもそういう環境に問題があるのだといわれたらぐぅの音も出ないんですがね)

1.7 SQL20054N 理由コード "23"

 スクリプトを作成して流していたらば

SQL20054N  表 "テーブル名" が無効な状態にあるため、操作できません。 理由コード = "23"
 これ、スクリプトの方は

ALTER TABLE テーブル名 DROP COLUMN 列名;
 を羅列してるだけなんですけどね。  調べてみると「REORG の推奨対象となる ALTER の実行回数が最大数に達しています。 REORG の推奨対象となる操作は最大 3 回まで許可されています。それに達したら REORG を実行して、現在のスキーマと一致するよう表の行を更新しなければなりません。」とのこと。  ちょこちょこ REORG を挟まなければ (3行に1回?) ならないようです。  よくわからないのは

ALTER TABLE テーブル名 ADD COLUMN 列名 ...;
 の方は、数十行、一気に実行してもエラーにならないんですよね。首尾一貫しない DB ですこと。