以下の手順を使用して、ロード エラーを訂正します(対象となるエラー テーブルによって手順は若干異なります)。
- エラー情報をTeradata Databaseのエラー テーブルから取得します。
- その内容を評価して修正します。
- 修正したレコードをLoadターゲット テーブルに挿入します。
Loadオペレータは空のテーブルだけを使用するため、ジョブが完了した後、BTEQなどのユーティリティを使用して、Teradata Databaseにアクセスする必要があります。 以下に示す手順および例は、BTEQが実行中で、さらにユーザーがTeradata Databaseにログオンしていることを前提としています。
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列に表示された値は、Teradata Databaseがオペレーティング システム環境のメッセージ リファレンス マニュアルで指定されている内容に沿って、エラー条件ごとに返したコードです。
- 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情報を使用して修正するレコードを決め、Teradata Databaseにデータを再ロードします。
個々のエラー状態を修正する方法は、発生したエラーの数と種類によって異なります。
- エラーを修正した後、次のBTEQコマンドとTeradata SQL文を使用して、修正したレコードをTeradata DatabaseのLoadテーブルに挿入します。
- BTEQ IMPORTコマンドを使用して、データをTeradata Databaseに転送します。
- Teradata SQL USING修飾子を使用して、各レコードのフィールドを定義します。
- Teradata SQL INSERT文を使用して、レコードをLoadテーブルに挿入します。
Teradata Databaseからレコード モードでエクスポートされたデータ レコードの場合、INSERT文の最初の2バイトは参照しません。 それに代わり、USING修飾子の最初のフィールド(可変長のパラメータ)をダミーのSMALLINTフィールドにします。 データをレコード モードで選択する場合、可変長の列には、データ フィールドの長さを示す2バイトのフィールドが先頭に入ります。 ただし、ErrorTable1テーブルのDataParcel列は可変長フィールドとして定義されているため、最初の2バイトは常にデータ フィールド長を示します。 INSERT文でこのフィールドを参照しないと、Teradata Databaseは入力データの各レコードの最初の2バイトを無視します。 - ErrorTable1のエラー条件すべてを解決するまで、手順2~4を繰り返します。
- エラーをすべて解決したら、Teradata Databaseから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を次のように使用して、Teradata DatabaseからErrorTable2テーブルを削除します。ここで、etname2は第2エラー テーブルの名前を示します。
DROP TABLE etname2
失敗したLoadオペレータの復元
Loadオペレータ ジョブの以下の段階で失敗が発生する可能性があります。
- 取得フェーズの前
- 取得フェーズ中
- アプリケーション フェーズ中
- アプリケーション フェーズの後
取得フェーズの前
取得フェーズの前に、Loadオペレータは以下を行ないます。
- ジョブの属性の値を検証する
- Teradata Databaseにログオンする
- Teradata DatabaseにINSERT要求を送信する
修正処置:TPTジョブは、エラー メッセージを表示します。 エラーを修正し、ジョブを再実行してください。
取得フェーズ中またはアプリケーション フェーズ中
取得フェーズ中、Loadオペレータは以下を行ないます。
- コマンドをTeradata Databaseに送信し、取得フェーズを開始する
- データをTeradata Databaseに送信する
- コマンドをTeradata Databaseに送信して、取得フェーズを終了する
アプリケーション フェーズ中、Loadオペレータは以下を行ないます。
- コマンドをTeradata Databaseに送信し、アプリケーション フェーズを実行する
取得フェーズまたはアプリケーション フェーズで失敗が発生すると、ロードは一時停止状態になります。 一時停止状態とは、Teradata Databaseが、失敗が修正された後にロードが再開されるのを待機していることです。 ロードが一時停止されている間、ターゲット テーブルにアクセスすることはできません。
修正処置: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>;
行数を取得する必要があります。つまり、ロードは一時停止状態ではなくなりました。
結果は以下のTeradata Databaseエラーを返しません。
RDBMS 2652: Operation not allowed: <table name> is begin Loaded.
アプリケーション フェーズの後
アプリケーション フェーズの後、Loadオペレータは以下を行ないます。
- エラー テーブルとログ テーブルを削除する(ユーザーが削除しないことを要求した場合を除く)
- Teradata Databaseからセッションをログオフする
修正処置:
- BTEQなどのユーティリティを使用して、エラー テーブルまたはログ テーブルを削除します。 ユーザーが削除を要求しなかった場合、このステップはスキップします。
- セッションがTeradata Databaseに残っている場合、システム管理者にセッションの削除を依頼するか、20分待ちます。 20分後、セッションはTeradata Databaseゲートウェイによってログオフされます。
ジョブを再実行する必要はありません。