以下の手順を使用して、ロード エラーを訂正します(対象となるエラー テーブルによって手順は若干異なります)。
- エラー情報をデータベースのエラー テーブルから取得します。
- その内容を評価して修正します。
- 修正したレコードをLoadターゲット テーブルに挿入します。
Loadオペレータは空のテーブルだけを使用するため、ジョブが完了した後、BTEQなどのユーティリティを使用して、データベースにアクセスする必要があります。 以下に示す手順および例は、BTEQが実行中で、さらにユーザーがデータベースにログオンしていることを前提としています。
BTEQの詳細な使用方法については、Basic Teradata® Queryリファレンス, B035-2414を参照してください。
取得エラー テーブル
Teradata PT Error Table Extractorコマンドを使用して、Loadオペレータ ジョブのスキーマにすべてのVARCHAR列が含まれている場合にLoadオペレータの取得フェーズ エラー テーブルからエラー情報を抽出します。
Teradata PT Error Table Extractorコマンドを使用する場合、手順1と2をスキップして下記のステップ3に進むことができます。
Teradata PT Error Table Extractorコマンドの詳細については、<Teradata® Parallel Transporterリファレンス, B035-2436>の「twbertbl」を参照してください。
Teradata PT Error Table Extractorコマンドを使用しない場合、以下の手順に従って、ErrorTable1属性で定義される取得フェーズ エラー テーブルに記録されたエラーを修正します。
- 次のTeradata SQL文を使用して、第1エラー テーブルのエラーごとにエラー コードとフィールド名を取得します。ここで、etname1はErrorTable1エラー テーブルに対して指定した名前を示します。
SELECT ErrorCode, ErrorFieldName FROM etname1 ORDER BY ErrorCode ;
オペレータ定義でErrorTable1属性に名前が指定されていない場合、デフォルトではエラー テーブルは<TargetTableName>_ETという名前になります。詳細については、<Teradata® Parallel Transporterリファレンス, B035-2436>の「Loadオペレータ」を参照してください。BTEQは、エラー コードとそのフィールド名の一覧を次の形式で返します。
***Query completed. 2 rows found. 2 columns returned. ***Total elapsed time was 1 second. ErrorCode ErrorFieldName --------- ------------------ 2679 A 2679 A
- ErrorCode列に表示された値は、オペレーティング システム環境のメッセージ リファレンス マニュアルで指定されている内容に沿って、エラー条件ごとに返したコードです。
- ErrorFieldName列に表示される値は、エラーを発生したフィールドの名前です。
- 次のBTEQコマンドとTeradata SQL文を使用して、第1エラー テーブルのエラーごとにデータ レコードを取得し、クライアント システムに指定したerr.outファイルに格納します。
- ErrorCode列の値が制約違反を示している場合、レコード モードでDataParcelジョブを取得します。
.SET RECORDMODE ON .EXPORT DATA FILE=err.out SELECT DataParcel FROM etname1
- ただし、ErrorCode列の値が「AMP停止状態」を示している場合は、RECORDMODEコマンドを使用しないでください。
.EXPORT DATA FILE=err.out SELECT DataParcel FROM etname1
- ErrorCode列の値が制約違反を示している場合、レコード モードでDataParcelジョブを取得します。
- 手順1で返されたErrorCodeとErrorFieldName情報および手順2で返されたDataParcel情報を使用して修正するレコードを決め、データベースにデータを再ロードします。
個々のエラー状態を修正する方法は、発生したエラーの数と種類によって異なります。
- エラーを修正した後に、以下のBTEQコマンドとTeradata SQL文を使用して、修正済みのレコードをデータベース上のLoadテーブルに挿入します。
- BTEQ IMPORTコマンドを使用して、データをデータベースに転送します。
- Teradata SQL USING修飾子を使用して、各レコードのフィールドを定義します。
- Teradata SQL INSERT文を使用して、レコードをLoadテーブルに挿入します。
データベースからレコード モードでエクスポートされたデータ レコードのINSERT文の先頭の2バイトを参照しないでください。その代わりに、USING修飾子の先頭フィールド(可変長パラメータ)をダミーのSMALLINTフィールドにします。レコード モードでデータを選択した場合、可変長のすべての列の先頭には、データ フィールド長を表わす値である2バイトのフィールドが付加されています。ただし、ErrorTable1テーブルのDataParcel列は可変長フィールドとして定義されているため、先頭の2バイトは常にデータ フィールド長を表わしています。INSERT文でこのフィールドを参照していない場合、データベースは入力データ内の各レコードの先頭の2バイトを無視します。 - ErrorTable1のエラー条件すべてを解決するまで、手順2~4を繰り返します。
- エラーをすべて解決したら、データベースからErrorTable1テーブルを削除します。
適用エラー テーブル
以下の手順を使用して、適用エラー テーブルに記録されたエラーを訂正します(適用エラー テーブルはErrorTable2で定義されます)。
- 次のTeradata SQL文を使用して、第2エラー テーブルのすべての行を取得します。ここで、ttname_UVは第2エラー テーブルの名前を、cnameはテーブルの固有プライマリ インデックスを示します。
SELECT * FROM ttname_UV ORDER BY cname ;
ErrorTable2のデフォルト名にはttname_UVを使用し、オペレータ定義がErrorTable2属性を指定している場合は、上記のSELECT文に指定した名前を含める必要があります。BTEQは、第2エラー テーブルの内容をプライマリ インデックス列の値順に並べた一覧を返します。
- 次のTeradata SQL文を使用して、プライマリ インデックスの値が第2エラー テーブルから取得した行と一致するLoad TargetTableの各行を取得します。ここで、ttnameはLoad TargetTableの名前を、cnameはLoad TargetTableのインデックスを、errorvalueは第2エラー テーブルから取得したインデックス値を示します。
SELECT * FROM ttname WHERE cname = errorvalue
- ErrorTable2とターゲット テーブルから選択した行を比較し、修正する行を決めます。
- ErrorTable2が正しい場合は、以下のいずれかを実行します。
DELETE文を使用して、ターゲット テーブルの不正な行を削除する。
INSERT文を使用して、正しい行を挿入する。
- TargetTableが正しい場合は、DELETE文を使用して、ErrorTable2テーブルから対応する行を削除します。
- ErrorTable2が正しい場合は、以下のいずれかを実行します。
- ErrorTable2テーブルの全行を修正するまで、手順2と3を繰り返します。
- エラーをすべて解決したら、BETQを次のように使用して、データベースからErrorTable2テーブルを削除します。ここで、etname2は第2エラー テーブルの名前を示します。
DROP TABLE etname2
失敗したLoadオペレータの復元
- 取得フェーズの前
- 取得フェーズ中
- アプリケーション フェーズ中
- アプリケーション フェーズの後
取得フェーズの前
- ジョブの属性の値を検証する
- データベースにログオンする
- データベースにINSERT要求を送信する
修正処置:TPTジョブは、エラー メッセージを表示します。 エラーを修正し、ジョブを再実行してください。
取得フェーズ中またはアプリケーション フェーズ中
- コマンドをデータベースに送信し、取得フェーズを開始する
- データをデータベースに送信する
- コマンドをデータベースに送信して、取得フェーズを終了する
- コマンドをデータベースに送信し、アプリケーション フェーズを実行する
取得フェーズまたはアプリケーション フェーズで失敗が発生すると、ロードは一時停止状態になります。 一時停止状態とは、データベースが、失敗が修正された後にロードが再開されるのを待機していることです。 ロードが一時停止されている間、ターゲット テーブルにアクセスすることはできません。
修正処置:TPTジョブは、エラー メッセージを表示します。 エラーを修正し、ジョブを再実行してください。
エラーを修正できず、ターゲット テーブル、エラー テーブル、ログ テーブルを手動で削除せずにロードを一時停止状態でなくする場合、以下の手順に従います。
- LoadオペレータをStandaloneオペレータとして使用し、新しいTPTジョブを作成します。
LoadオペレータをStandaloneオペレータとして使用するサンプルTPTジョブを以下に示します。
DEFINE JOB FINISH_LOAD_OPERATOR_JOB ( DEFINE OPERATOR LOAD_OPERATOR TYPE LOAD STANDALONE ATTRIBUTES ( VARCHAR PrivateLogName = 'loadoper_privatelog', INTEGER MaxSessions = 1, VARCHAR TargetTable = 'MyTargetTable', VARCHAR TdpId = 'MyTdpId', VARCHAR UserName = 'MyUserName', VARCHAR UserPassword = 'MyPassword', VARCHAR ErrorTable1 = 'MyErrorTable1', VARCHAR ErrorTable2 = 'MyErrorTable2', VARCHAR LogTable = 'MyLogTable' ); APPLY TO OPERATOR (LOAD_OPERATOR [1] ); );
ターゲット テーブル名、エラー テーブル名、ログ テーブル名、ユーザー名、パスワード、tdpid名など、サンプル ジョブを必要に応じて修正します。 複数のセッションは不要です。
ターゲット テーブル名、エラー テーブル名、ログ テーブル名、ユーザー名、パスワード、tdpid名は、失敗した元のロード ジョブで利用可能である必要があります。
- ステップ1は、FastLoadによるBEGIN LOADING/END LOADINGの実行と同じステップです。
- ステップ1はオプションです。 その他のオプションは、ターゲット テーブル、エラー テーブル、ログ テーブルを削除し、最初からジョブを再開することです。 その他のオプションを選択する場合、ステップ2をスキップしてステップ3に進みます。
- LoadオペレータをStandaloneオペレータとして使用するジョブを実行します。
ジョブの実行時に、ロードは追加データを送信せずに完了します。
- ターゲット テーブルが選択可能であることを検証します。
BTEQなどのユーティリティを使用して、ターゲット テーブルを選択します。
ターゲット テーブルを選択するためのサンプル要求を以下に示します。
SELECT COUNT(*) FROM <MyTargetTable>;
行数を取得する必要があります。つまり、ロードは一時停止状態ではなくなりました。
結果は以下のエラーを返しません。
RDBMS 2652: Operation not allowed: <table name> is begin Loaded.
アプリケーション フェーズの後
- エラー テーブルとログ テーブルを削除する(ユーザーが削除しないことを要求した場合を除く)
- データベースからセッションをログオフする
修正処置:
- BTEQなどのユーティリティを使用して、エラー テーブルまたはログ テーブルを削除します。 ユーザーが削除を要求しなかった場合、このステップはスキップします。
- セッションがデータベースに残っている場合は、システム管理者にそのセッションの削除を依頼するか、20分間待ちます。20分経過すると、セッションはデータベース ゲートウェイによってログオフされます。
ジョブを再実行する必要はありません。