Loadエラーの修正 - Parallel Transporter

Teradata Parallel Transporter ユーザー ガイド

Product
Parallel Transporter
Release Number
16.20
Published
2018年4月
Language
日本語
Last Update
2018-09-07
dita:mapPath
ja-JP/eho1512702793064.ditamap
dita:ditavalPath
ja-JP/eho1512702793064.ditaval
dita:id
B035-2445
Product Category
Teradata Tools and Utilities

以下の手順を使用して、ロード エラーを訂正します(対象となるエラー テーブルによって手順は若干異なります)。

  1. エラー情報をTeradata Databaseのエラー テーブルから取得します。
  2. その内容を評価して修正します。
  3. 修正したレコードを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属性で定義される取得フェーズ エラー テーブルに記録されたエラーを修正します。

  1. 次の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列に表示される値は、エラーを発生したフィールドの名前です。
  2. 次の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
  3. 手順1で返されたErrorCodeとErrorFieldName情報および手順2で返されたDataParcel情報を使用して修正するレコードを決め、Teradata Databaseにデータを再ロードします。

    個々のエラー状態を修正する方法は、発生したエラーの数と種類によって異なります。

  4. エラーを修正した後、次の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バイトを無視します。
  5. ErrorTable1のエラー条件すべてを解決するまで、手順2~4を繰り返します。
  6. エラーをすべて解決したら、Teradata DatabaseからErrorTable1テーブルを削除します。

適用エラー テーブル

以下の手順を使用して、適用エラー テーブルに記録されたエラーを訂正します(適用エラー テーブルはErrorTable2で定義されます)。

  1. 次のTeradata SQL文を使用して、第2エラー テーブルのすべての行を取得します。ここで、ttname_UVは第2エラー テーブルの名前を、cnameはテーブルの固有プライマリ インデックスを示します。
       SELECT * FROM  ttname_UV  ORDER BY  cname  ;
    ErrorTable2のデフォルト名にはttname_UVを使用し、オペレータ定義がErrorTable2属性を指定している場合は、上記のSELECT文に指定した名前を含める必要があります。

    BTEQは、第2エラー テーブルの内容をプライマリ インデックス列の値順に並べた一覧を返します。

  2. 次のTeradata SQL文を使用して、プライマリ インデックスの値が第2エラー テーブルから取得した行と一致するLoad TargetTableの各行を取得します。ここで、ttnameはLoad TargetTableの名前を、cnameはLoad TargetTableのインデックスを、errorvalueは第2エラー テーブルから取得したインデックス値を示します。
       SELECT * FROM  ttname  WHERE  cname  =  errorvalue
  3. ErrorTable2とターゲット テーブルから選択した行を比較し、修正する行を決めます。
    • ErrorTable2が正しい場合は、以下のいずれかを実行します。

      DELETE文を使用して、ターゲット テーブルの不正な行を削除する。

      INSERT文を使用して、正しい行を挿入する。

    • TargetTableが正しい場合は、DELETE文を使用して、ErrorTable2テーブルから対応する行を削除します。
  4. ErrorTable2テーブルの全行を修正するまで、手順2と3を繰り返します。
  5. エラーをすべて解決したら、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ジョブは、エラー メッセージを表示します。 エラーを修正し、ジョブを再実行してください。

エラーを修正できず、ターゲット テーブル、エラー テーブル、ログ テーブルを手動で削除せずにロードを一時停止状態でなくする場合、以下の手順に従います。

  1. 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に進みます。
  2. LoadオペレータをStandaloneオペレータとして使用するジョブを実行します。

    ジョブの実行時に、ロードは追加データを送信せずに完了します。

  3. ターゲット テーブルが選択可能であることを検証します。

    BTEQなどのユーティリティを使用して、ターゲット テーブルを選択します。

    ターゲット テーブルを選択するためのサンプル要求を以下に示します。

    SELECT COUNT(*) FROM <MyTargetTable>;

    行数を取得する必要があります。つまり、ロードは一時停止状態ではなくなりました。

    結果は以下のTeradata Databaseエラーを返しません。

    RDBMS 2652: Operation not allowed: <table name> is begin Loaded.

アプリケーション フェーズの後

アプリケーション フェーズの後、Loadオペレータは以下を行ないます。

  • エラー テーブルとログ テーブルを削除する(ユーザーが削除しないことを要求した場合を除く)
  • Teradata Databaseからセッションをログオフする

修正処置:

  1. BTEQなどのユーティリティを使用して、エラー テーブルまたはログ テーブルを削除します。 ユーザーが削除を要求しなかった場合、このステップはスキップします。
  2. セッションがTeradata Databaseに残っている場合、システム管理者にセッションの削除を依頼するか、20分待ちます。 20分後、セッションはTeradata Databaseゲートウェイによってログオフされます。

    ジョブを再実行する必要はありません。