Loadエラーの修正 - Parallel Transporter

Teradata® Parallel Transporter ユーザー ガイド

Product
Parallel Transporter
Release Number
17.20
Published
2022年6月
Language
日本語
Last Update
2022-08-22
dita:mapPath
ja-JP/uzp1645128359760.ditamap
dita:ditavalPath
ja-JP/tvt1507315030722.ditaval
dita:id
B035-2445
Product Category
Teradata Tools and Utilities

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

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

  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列に表示された値は、オペレーティング システム環境のメッセージ リファレンス マニュアルで指定されている内容に沿って、エラー条件ごとに返したコードです。
    • 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情報を使用して修正するレコードを決め、データベースにデータを再ロードします。

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

  4. エラーを修正した後に、以下のBTEQコマンドとTeradata SQL文を使用して、修正済みのレコードをデータベース上のLoadテーブルに挿入します。
    • BTEQ IMPORTコマンドを使用して、データをデータベースに転送します。
    • Teradata SQL USING修飾子を使用して、各レコードのフィールドを定義します。
    • Teradata SQL INSERT文を使用して、レコードをLoadテーブルに挿入します。
    データベースからレコード モードでエクスポートされたデータ レコードのINSERT文の先頭の2バイトを参照しないでください。その代わりに、USING修飾子の先頭フィールド(可変長パラメータ)をダミーのSMALLINTフィールドにします。レコード モードでデータを選択した場合、可変長のすべての列の先頭には、データ フィールド長を表わす値である2バイトのフィールドが付加されています。ただし、ErrorTable1テーブルのDataParcel列は可変長フィールドとして定義されているため、先頭の2バイトは常にデータ フィールド長を表わしています。INSERT文でこのフィールドを参照していない場合、データベースは入力データ内の各レコードの先頭の2バイトを無視します。
  5. ErrorTable1のエラー条件すべてを解決するまで、手順2~4を繰り返します。
  6. エラーをすべて解決したら、データベースから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を次のように使用して、データベースからErrorTable2テーブルを削除します。ここで、etname2は第2エラー テーブルの名前を示します。
    DROP TABLE etname2

失敗したLoadオペレータの復元

Loadオペレータ ジョブの以下の段階で失敗が発生する可能性があります。
  • 取得フェーズの前
  • 取得フェーズ中
  • アプリケーション フェーズ中
  • アプリケーション フェーズの後

取得フェーズの前

取得フェーズの前に、Loadオペレータは以下を行ないます。
  • ジョブの属性の値を検証する
  • データベースにログオンする
  • データベースにINSERT要求を送信する

修正処置:TPTジョブは、エラー メッセージを表示します。 エラーを修正し、ジョブを再実行してください。

取得フェーズ中またはアプリケーション フェーズ中

取得フェーズ中、Loadオペレータは以下を行ないます。
  • コマンドをデータベースに送信し、取得フェーズを開始する
  • データをデータベースに送信する
  • コマンドをデータベースに送信して、取得フェーズを終了する
アプリケーション フェーズ中、Loadオペレータは以下を行ないます。
  • コマンドをデータベースに送信し、アプリケーション フェーズを実行する

取得フェーズまたはアプリケーション フェーズで失敗が発生すると、ロードは一時停止状態になります。 一時停止状態とは、データベースが、失敗が修正された後にロードが再開されるのを待機していることです。 ロードが一時停止されている間、ターゲット テーブルにアクセスすることはできません。

修正処置: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>;

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

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

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

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

アプリケーション フェーズの後、Loadオペレータは以下を行ないます。
  • エラー テーブルとログ テーブルを削除する(ユーザーが削除しないことを要求した場合を除く)
  • データベースからセッションをログオフする

修正処置:

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

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