トラブルシューティング

この章では、Teradata JDBC Driverの使用中に発生する可能性がある問題のトラブルシューティングに関する情報を提供します。

ソケット通信エラー

SQLState 08S01のError 804およびエラー メッセージ"Socket communication failure for Packet receive" (または"Packet transmit")は、ネットワーク通信エラーが発生したことを意味します。

[Error 804] [SQLState 08S01] Socket communication failure for Packet receive ...

[Error 804] [SQLState 08S01] Socket communication failure for Packet transmit ...

ネットワーク通信エラーはさまざまな理由で発生する可能性があります。以下に、確率の高いほうから低い順に、接続問題の一般的な原因の一覧を示します。

  1. Teradataセッションが、Teradata Viewpoint、Teradata Manager、PMONによって、またはセッションが非アクティブかどうかをチェックしてアイドル セッションをアボートする他の管理者プロセスによって強制的にログオフされました。この状態かどうかは、データベース ノードの/var/log/messagesを調べ、セッションがアボートされたことを示すメッセージを探すことによって確認できます。接続プールにあるJDBC接続は、その存続期間の相当の部分がアイドル状態のまま過ぎる可能性があるため、これはそのようなJDBC接続の場合の共通の問題です。データベースの管理者は、JDBC接続プールの目的が無駄になるため、プールに入れられたJDBC接続であるアイドル状態のTeradataセッションを強制的にログオフしないようにする必要があります。
  2. ネットワークの問題および/または一時的なネットワーク障害。これには、ラップトップでの有線から無線へのネットワーク接続の切り換え(またはその逆)、またはVPNとの間の接続または切断などの状況が含まれます。
  3. スイッチ、ルーター、またはロード バランサーなどのネットワーク機器の故障。
  4. データベースの再始動が発生しました。この状態かどうかは、データベース ノードの/var/log/messagesを調べ、データベースの再起動が発生したことを示すメッセージを探すことによって確認できます。

数値データ切り捨て

Teradata Database V2R6.2では、SQLデータ タイプBIGINT (64ビットINTEGER型)のサポートを導入し、Large Decimal機能も導入しました。この機能は、DECIMALデータ タイプの最大精度をDECIMAL(38)まで拡張します。Teradata Database V2R6.1以前のリリースは、DECIMAL(18)の最大精度に制限されています。

最大精度は、データベースのリリースによって違ってきます。この結果、Teradata JDBC Driverでの数値型データの処理方法が影響を受けます。Large Decimalがサポートされていない場合、BigDecimalの最大精度は18です。一方、Large Decimalがサポートされている場合、最大精度値は38になります。

Teradata JDBC Driverが変更されたため、BigDecimal値の精度値が最大精度より大きい場合にはPreparedStatement.setBigDecimalメソッドがDataTruncation例外をスローします。

PreparedStatement setBigDecimalメソッドを使用して1つのパラメータに複数の値をバインドする場合、Teradata JDBC Driverは、そのパラメータにバインドされた最大整数部桁数を決定した後、DECIMAL値の最大精度のデータベース制限内に収まるように必要に応じて各値の小数部の桁を丸めます。最大精度値が18より大きく、現在のデータベースでSQLデータ タイプBIGINTがサポートされていない場合、Teradata JDBC Driver内のPreparedStatement.setLongメソッドはDataTruncation例外をスローします。

文字エクスポート幅

Using connection parameter CHARSET=UTF8 with fixed-width CHAR data type result set column values adds trailing space padding per the database's Character Export Width behavior. The CHAR(n) data type is a fixed-width data type (holding n characters), and the database reserves a fixed number of bytes for the CHAR(n) data type in response spools and in network message traffic.

UTF8は、文字ごとに可変のバイト数が必要な可変長の文字エンコーディング スキーマです。UTF8セッション文字セットを使用する場合、データベースは応答スプールとネットワーク メッセージ トラフィックでCHAR(n)データ型が使用できる最大バイト数を予約します。UTF8セッション文字セットを使用する場合、データベースは、予約した最大サイズよりも小さいCHAR(n)値の最後に埋め込み文字を追加するため、すべてのCHAR(n)値が応答スプールとネットワーク メッセージ トラフィックで同じ固定バイト数を使用します。これに対して、UTF16セッション文字セットを使用する場合、文字の埋め込みは追加されません。

SQL SELECT文またはビューでCASTやTRIMを使用することでこの欠点を回避して、固定長のCHARデータ型をVARCHARに変換する例を以下に示します。

または、末尾スペース埋め込み文字なしに固定幅CHARデータ値を必要とするアプリケーションには、接続パラメータCHARSET=UTF16が推奨されます。

USING句

Teradata JDBC Driverは、いかなる種類のSQLリクエストでもUSING句の指定をサポートしていません。Teradata JDBC Driverは、名前付きパラメータ マーカーをサポートしません。Teradata JDBC Driverは、名前なし疑問符パラメータ マーカーのみをサポートします。

SQLリクエストでUSING句を指定すると、次のようなデータベース エラーが発生します。

[Error 3889][SQLState 42000] リクエスト内のUSING句が多すぎます。

解決策は、SQLリクエストからUSING句を削除し、名前付きパラメータ マーカーを疑問符パラメータ マーカーに置き換え、JDBC PreparedStatement/CallableStatement setXXXメソッドを使用して値を疑問符パラメータ マーカーにバインドすることです。

トランザクション分離、並列性、およびデッドロック

作成と削除

表やストアド プロシージャなど、データベース オブジェクトの作成または削除を行なうときに以下のエラーが発生する場合があります。これにはエラー コード2631とSQL状態40001が含まれますが、これは再試行可能なエラーであることを示しています。

com.teradata.jdbc.jdbc_4.util.JDBCException:[Teradata Database]: Transaction ABORTed due to deadlock.

このエラーが発生した場合、アプリケーションはしばらく待機して失敗した作成または削除の操作を再送信するかどうかを選択できます。

JDBC FastLoad

以下のエラーは、JDBC FastLoadを使用していてPreparedStatement setterメソッドを呼び出したときに発生する場合があります。これにはエラー コード2631とSQL状態40001が含まれますが、これは再試行可能なエラーであることを示しています。

com.teradata.jdbc.jdbc_4.util.JDBCException:[Teradata Database]: Transaction ABORTed due to deadlock

このエラーが発生した場合、アプリケーションはしばらく待機してPreparedStatement setterメソッドを再び呼び出すかどうかを選択できます。エラー2631は一連の例外の一部である場合がある点に注意してください。このため、エラー2631に至るまでには、必ず一連の例外を辿る必要があります。

トランザクション分離

2つの個別のアプリケーション、またはスレッドを2つ使用した単一のアプリケーションでは、各スレッドまたはアプリケーションが、データベースへそれぞれのJDBC接続を使用していると、デッドロックが発生する可能性があります。

この問題が発生するのは、一方の接続がデータを表に挿入し、もう一方の接続が同じ表からデータを読み取ろうとした場合です。

デフォルト トランザクション分離レベルであるTRANSACTION_SERIALIZABLEを使用している場合、表からデータを読み取っているスレッドまたはアプリケーション上でこの状況が発生すると、そのおよそ2~5分後に、次のエラーが表示されます。エラー コードは2631です。

com.teradata.jdbc.jdbc_4.util.JDBCException:[Teradata Database]: Transaction ABORTed due to deadlock.

このエラーが発生したら、次のどちらかを実行します。

LOBの処理

説明

データベースでは、バイナリ データ(BLOB)と文字データ(CLOB)を保存する場合に、ラージ オブジェクト(LOB)に対応しています。データベースではまた、XML、JSON、およびST_GeometryなどのLOBに基づく複雑なデータ型にも対応しています。さらに、LOBに基づいてユーザー定義型 (UDT)も作成できます。Teradata JDBC Driverはすべてのデータ型をサポートすると同時に、LOBに基づくデータ型もサポートしています。

LOBの列数

データベースの表には最大32個のLOB列を定義できます。BLOBとCLOBは、それぞれVARBYTEとVARCHARデータ型によく似ています。

LOBサイズの制限

最大サイズ2 GBのLOB値がサポートされています。LOB列を含む結果セットの場合、データベースはLOBロケーターをTeradata JDBC Driverに送信するため、LOBロケーター(LOB値ではない)のみがデータベースのResultSet行サイズに対する制限に対してカウントされます。アプリケーションは、BlobオブジェクトまたはClobオブジェクトをResultSetから取り出して、後でこれらのBlobオブジェクトまたはClobオブジェクトを別の表に挿入することができます。LOBロケーターがデータベースとTeradata JDBC Driverとの間で転送されるため、このプロセスにより、潜在的に大きいLOB値のネットワーク上での転送を避けられます。

応答制限超過エラー

データベースで次のエラーが発生する最も可能性の高い原因は、アプリケーションがResultSetオブジェクトとStatementオブジェクトを適切に閉じていない場合です。

SQLState: HY000

Message: [Teradata Database] : Response limit exceeded.

Vendor:    3130

このエラー メッセージは、SQLリクエストからの応答を指します。これは、単文SQLリクエストまたは複文SQLリクエストからの出力です。

応答制限とは、データベースによって課せられる制限のことであり、接続ごとに、開いている応答の数が最大16個に制限されることを指します。

この問題を解決するためには、アプリケーションを調べ、アプリケーションが、finallyブロックの例外処理で、ResultSetオブジェクト、Statementオブジェクト、LOB InputStreamオブジェクト、およびLOB Readerオブジェクトが必要なくなったら必ず直ちに閉じるようコーディングされているかどうか確認します。アプリケーションがLOBを変更した場合、BlobオブジェクトおよびClobオブジェクトをfinallyブロックで解放する必要があります。

Teradata JDBC Driver 14.00.00.28以降、結果セットの保持機能CLOSE_CURSORS_AT_COMMITがサポートされるようになりました。"保持可能な"結果セットはコミットを通して開いたままであり、これがTeradata JDBC Driverのデフォルトの動作になっています。保持可能な結果セットが不要なアプリケーションは、CLOSE_CURSORS_AT_COMMIT保持機能を指定して、自動コミットまたは明示的なコミットが実行された場合にTeradata JDBC Driverが結果セットを自動的に閉じるように設定できます。詳細については、Connection.setHoldabilityメソッドを参照してください。

アプリケーションは、ResultSetオブジェクト、Statementオブジェクト、LOB InputStreamオブジェクト、およびLOB Readerオブジェクトを閉じるのにガベージ コレクションに依存できません。これは、Javaプログラミング言語が、ガベージ コレクションのタイムリー性を保証しないからです。FINALIZE_AUTO_CLOSE接続パラメータは、Teradata JDBC Driverバージョン14.00.00.08から使用できます。FINALIZE_AUTO_CLOSE接続パラメータは、ガベージ コレクション時のTeradata JDBC Driverの動作を制御します。詳細は、「データベース接続の作成」を参照してください。

Teradata JDBC Driverバージョン14.00.00.08以降、LOG=INFO接続パラメータが指定されると、Teradata JDBC Driverは、データベース エラー3130が発生した場合に、開いている未解決のすべての応答に関する情報をログに記録します。記録される情報には、開いている応答の要求番号、実行依頼の日付/時間、実行依頼元のスレッドID、SQLリクエストテキスト、および実行依頼元のコール スタックがそれぞれ含まれます。この情報は、アプリケーション開発者が、アプリケーション内のどの場所でSQLリクエストを実行依頼して、それ以降それらの要求を閉じていないかを特定するのに役立ちます。

...
2011-12-21.08:56:41.701 TERAJDBC4 INFO [Thread-8] com.teradata.jdbc.jdk6.JDK6_SQL_Connection@17757ad Response limit exceeded.Open response 11 of 16 is request number 154 submitted 2011-12-21.08:56:40.562 by [Thread-8]
SELECT * FROM MyTable ORDER BY 1
at com.teradata.jdbc.jdbc_4.ResponseTracker.notifyReceiveResponse(ResponseTracker.java:64)
at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.action(StatementReceiveState.java:168)
at com.teradata.jdbc.jdbc_4.statemachine.StatementController.runBody(StatementController.java:121)
at com.teradata.jdbc.jdbc_4.statemachine.StatementController.run(StatementController.java:112)
at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:373)
at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:315)
at com.teradata.jdbc.jdbc_4.TDStatement.doNonPrepExecuteQuery(TDStatement.java:303)
at com.teradata.jdbc.jdbc_4.TDStatement.executeQuery(TDStatement.java:1067)
at ...

場合によっては、ResultSetオブジェクトとStatementオブジェクトを適切に閉じていないアプリケーションを変更できないことがあります。例えば、アプリケーションがサードパーティのアプリケーションであるため、ソース コードを入手できない場合が挙げられます。

アプリケーションでLOBを使用しない場合、アプリケーションでScrollable Result Setを使用しない場合、アプリケーションでUpdatable ResultSetsを使用しない場合、アプリケーションで接続ごとに16個より多い応答を開いておく必要がある場合、回避策として接続パラメータLOB_SUPPORT=OFFを使用できます。LOB_SUPPORT接続パラメータの詳細については、「データベース接続の作成」を参照してください。

データベースは、ResultSet LOB列をLOBロケーターとしてTeradata JDBC Driverに送信します。データベースでは、LOBロケーターと連携してKeepResponseモードを使用する必要があります。

KeepResponseモードを使用しない場合、応答が次の場合にデータベースは自動的に応答を閉じます。

接続パラメータLOB_SUPPORT=OFFが指定されている場合、Teradata JDBC DriverはKeepResponseモードを使用しません。つまり、LOBを使用できません。この結果、上記の2つの状況でデータベースは自動的に応答を閉じます。これは、データベースでアプリケーションが接続ごとに開いておける上限の16個に達するのを回避するのに役立ちます。

接続パラメータLOB_SUPPORT=OFFが指定されている場合、Scrollable Result SetおよびUpdatable Result Setを使用できません。Scrollable Result SetまたはUpdatable Result Setを要求すると、データベース エラーが発生するため、例外がスローされます。

[Teradata Database] : Parcel kind or ordering is invalid.

接続パラメータLOB_SUPPORT=OFFが指定されている場合、Teradata JDBC DriverはKeepResponseモードを使用しないため、データベースのMerge Prefetch機能はStatement.setFetchSizeメソッドまたはResultSet.setFetchSizeメソッドで指定された値を無視する場合があります。

classpathのトラブルシューティング

Teradata JDBC Driver 16.20.00.11以降では、classpathにterajdbc4.jarをリストする必要があります。

Teradata JDBC Driverの古いバージョンでは、classpathにterajdbc4.jarおよびtdgssconfig.jarをリストする必要があります。

com.teradata.jdbc.TeraDriverのClassNotFoundExceptionを受信した場合、classpathが設定されていない、または正しくclasspathが設定されていないことによって、terajdbc4.jarが見つからないといった問題が発生しています。terajdbc4.jarファイルはclasspathにリストされている必要があります。

Teradata JDBC Driver 16.20.00.11以降では、tdgssconfig.jarは使用されなくなり、classpathにリストされるべきではありません。

Teradata JDBC Driverの古いバージョンでは、tdgssconfig.jarがclasspathにリストされている必要があります。

"UserFile parameter null"エラーが発生した場合は、classpathが設定されていないか、またはclasspathが正しく設定されていないためにtdgssconfig.jarが見つからないことが原因の可能性があります。

次の例外のうちの1つを受信した場合、

classpathが設定されていない、または正しくclasspathが設定されていないことによって、tdgssconfig.jarが見つからないといった問題が発生しています。

classpathは以下のように多くの箇所に設定されている可能性があります(ただし、以下が全てではありません)。

COP検出のトラブルシューティング

DNSまたは/etc/hostsファイルで次のエントリをチェックします。

パフォーマンスの向上

アプリケーションのパフォーマンスが非常に低下しているような場合には、次のような対処法があります。

Linux ItaniumのJVMエラー

Linux Red Hat Advanced Server 2.1/3.0 Itaniumでは、Teradata JDBC Driver 3.2を使用するいくつかのクライアント アプリケーションの場合に、Sun Java HotSpot 64-Bit Server Virtual Machineエラー(HotSpot仮想マシン エラーID:4E4154495645294E53543F494116140E435050006F)の発生が観測されています。

このJVMエラーは、以下のシステム構成の場合に観測されます。

Linux RedHat Advanced Server 2.1/3.0 Itaniumプラットホーム上のこのHotSpot JVMエラーは、Sun Microsystemバグ レポート システムに報告されています(インシデント レビュー ID:311761)。

セキュリティのトラブルシューティング

ユーザーID、パスワード、またはアカウントの無効

エラー メッセージ: [Teradata Database] : The UserId, Password or Account is invalid.

エラー コード: 8017

この例外の一般的な原因は、ユーザー、パスワード、またはアカウント情報が無効なことです。ただし、次の場合も例外が発生することがあります。

原因

Browser、JWT、Kerberos、またはLDAPログオン メカニズムを使用している場合、ユーザーには "logon with null password"権限がありません。

対処

"grant logon with null password"コマンドを使用してユーザーに権限を付与します。

原因

LOGMECH=LDAPが指定されていて、ユーザー名/パスワードのクレデンシャルがLOGDATAと別の接続パラメータの両方で冗長的に指定されています。

対処

LOGDATAを使用するか、別のユーザー名/パスワード パラメータを使用してLDAPを識別します。両方を同時に使用しないでください。

原因

データベースが日本語サポート モードの場合に、EBCDICバリアント セッション文字セットの1つが指定されています。また、ユーザーID、パスワード、またはアカウントがKanji文字セットで指定されています。

対処

ユーザーID、パスワード、またはアカウントがKanji文字セットで指定されている場合は、非EBCDICバリアント セッション文字セットを指定します。

Kerberosのトラブルシューティング

Kerberosを適切に使用しているにもかかわらず問題が発生する場合は、次のテーブルの共通エラーに対するメッセージと対処を確認してください。

エラー メッセージ

GSS Exception: No valid credentials provided

(Mechanism level: Failed to find any Kerberos Ticket)

原因

kinitが実行されていません。

対処

Java JDKのjre/binディレクトリにあるkinitプログラムを実行します。

エラー メッセージ

java.lang.SecurityException:Unable to locate a login configuration

原因

設定ファイルの指定に失敗しました。

対処

JVMオプションの-Djava.security.auth.login.configを使用するか、適切なjava.securityファイルを変更して、構成ファイルを指定します。このための手順については、「Kerberos前提条件の合致」を参照してください。

エラー メッセージ

javax.security.auth.login.Login Exception:No Login Modules configured for com.sun.security.jgss.initiate

原因

以下の情報が、設定情報に記載されていないか、または誤って記載されています。

com.sun.security.jgss.initiate

{

  com.sun.security.auth.module.Krb5LoginModule sufficient useTicketCache=true; 

};

対処

上記の情報がログイン設定情報にあることを確認します。ログイン設定の詳細については、「Kerberos前提条件の合致」を参照してください。

エラー メッセージ

javax.security.auth.login.LoginException:Pre-authentication information was invalid

原因

原因は以下の内のいずれかです。

  • C:\winntの構成ファイルが不良。
  • 無効なユーザー名が使用された。
  • 無効なパスワードが使用された。

対処

c:/winntの設定ファイルで、有効なユーザー名とパスワードが使用されているか検証します。ユーザー名はWindowsのActive Directoryユーザーに表示されるとおりに正しく指定する必要があります。

エラー メッセージ

[Teradata Database]:Invalid password

原因

無効なパスワードは、以下の場合にKerberosのシングル サインオンを使用すると発生します。

  • データベース ユーザーがシステム ログオン パスワードと同じパスワードで定義されていなかった。
  • データベース ユーザーがSSOを使用するように設定されていなかった。

対処

システムのログオンとデータベース ユーザー パスワードに同じパスワードが使用されていることを確認します。Kerberosを使用せずにユーザー名とパスワードでログオンすることによって確認できます。それが原因でない場合は、データベース ユーザーが"grant logon with null password"コマンドによりシングル サインオンできるようにデータベース管理者が構成する必要があります。

エラー メッセージ

GSSException:No valid credentials provided

(Mechanism level: Failed to find any Kerberos Ticket)

原因

-Djavax.security.auth.useSubjectCredsOnly=falseを指定しませんでした。

対処

-Djavax.security.auth.useSubjectCredsOnly=falseをアプリケーションを実行するスクリプトに追加します。

エラー メッセージ

KrbException:Invalid option setting in ticket request.(101)

(Mechanism level: Failed to find any Kerberos Ticket)

原因

kinitは、"-f"またはforwardableオプションを使用して実行されませんでした。

対処

forwardableオプションを設定した状態で、Java JDKの"jre/bin"ディレクトリにあるkinitプログラムを実行します。例: kinit -f

エラー メッセージ

GSSException: Invalid name provided (Mechanism level: Could not load configuration file C:\Documents and Settings\Administrator\WINDOWS\krb5.ini (The system can not find the file specified))

原因

Microsoft Windowsを使用していて、ターミナル サービスが有効な場合は、検索対象のkrb5.iniファイルの場所が変更された可能性があります。

対処

krb5.iniファイルをc:\winntに維持したい場合は、Javaプログラム

-Djava.security.krb5.conf=C:/WINNT/krb5.ini

を実行するためのコマンド ラインに以下のオプションを追加します。それ以外の場合は、krb5.iniファイルが保持されている場所に合わせて-Djava.security.krb5.confを設定します。

エラー メッセージ

GSSException: Defective token detected (Mechanism level: AP_REP token id does not match!)

原因

コンピュータのクロック同期の問題が原因の可能性があります。デフォルトの許容クロック スキュー値は、通常5分です。

対処

関与するシステムのシステム時間を確認します。それらのシステムの時間を同期します。

エラー メッセージ

The security of this connection may be compromised because a missing token was discovered during decryption

原因

次の行がkrb5.confファイルの [libdefaults] エントリにない場合、このエラーがLinuxクライアントで発生する可能性があります。

    default_tkt_enctypes = arcfour-hmac rc4-hmac
    default_tgs_enctypes = arcfour-hmac rc4-hmac

対処

上記のようにdefault_tkt_enctypesおよびdefault_tgs_enctypesを、krb5.confファイルの[libdefaults]エントリの下に追加します。

z/OSでのLDAP認証の未サポート

LDAPは、z/OSからのTeradata JDBC Driverログオンをサポートしていません。

LDAPメカニズムを使用してログオンしようとすると、(URLまたはDataSourceを使用して設定した) LOGDATAパラメータに有効な情報が指定されていても、SQLExceptionとなり、次のエラーが表示されます。

SQLState:28000 Error code:8017 Message: [Teradata Database]:The UserId, Password or Account is invalid.

JDBC FastLoadのトラブルシューティング

JDBC FastLoadの実行中にSQLExceptionが起こった場合、一連のSQL例外の一部である場合があります。SQLExceptionの原因の全体像を把握するには、一連のSQL例外全体を辿る必要があります。

同様に、JDBC FastLoadの実行中にSQLWarningが起こった場合、一連のSQL警告の一部である場合があります。SQLWarningの原因の全体像を把握するには、一連のSQL警告の全体を辿る必要があります。

例:

try {

    PreparedStatement pstmt = con.prepareStatement("INSERT INTO ...");

    try {

        SQLWarning w = con.getWarnings();

        while (w != null) {

            StringWriter sw = new StringWriter();

            w.printStackTrace(new PrintWriter(sw, true));

            System.out.println("SQL State = " + w.getSQLState() +

                               ", Error Code = " + w.getErrorCode() +

                               "\n" + sw.toString());

            w = w.getNextWarning();

        }

        // using JDBC FastLoad

        w = pstmt.getWarnings();

    } finally {

        pstmt.close();

    }

} catch (SQLException e) {

    while (e != null) {

        StringWriter sw = new StringWriter();

        e.printStackTrace(new PrintWriter(sw, true));

        System.out.println("SQL State = " + e.getSQLState() +

                           ", Error Code = " + e.getErrorCode() +

                           "\n" + sw.toString());

        e = e.getNextException();

    }

}

JDBC FastLoadの使用中、データ エラーに関する詳細は、上記の一連のSQL例外に含まれる場合があります。データ エラーの詳細の中には、非常に長いものがあります。これらは、「JDBC FastLoad使用時の考慮事項」に記載している2つの一時エラーテーブルのいずれかで示しています。2つの一時エラーテーブルの形式の詳細については、『Teradata FastLoadリファレンス』の「エラーテーブルの形式」セクションを参照してください。

なぜJDBC FastLoadがアクティブでなかったかに関する情報は、接続のSQLWarningにあります。これは、場合によっては一連のSQL警告に含まれています。SQLWarningの原因の全体像を把握するには、一連のSQL警告の全体をスクロール必要があります。

なぜJDBC FastLoadがアクティブでなかったかに関する情報は、URL接続文字列でLOG=INFOと指定することによっても取得できます。結果のLOG出力で"FastLoad "(FastLoadの後のスペースに注意)を検索してください。同じ検索は、JDBC FastLoadがアクティブであったかどうかを知るためにも利用できます。

以下は、JDBC FastLoadがアクティブでなかったことを示すLOG出力のサンプルです。

Cannot FastLoad because statement is NOT an INSERT!

以下は、JDBC FastLoadがアクティブであったことを示すLOG出力のサンプルです。

FastLoad found 2 AMP(s) in anmpc2 and created 2 FastLoadConnection(s) and 2 FastLoadPreparedStatement(s) with SESSIONS=8.

JDBC FastExportのトラブルシューティング

JDBC FastExportの実行中にSQLExceptionが起こった場合、一連のSQL例外の一部である場合があります。SQLExceptionの原因の全体像を把握するには、一連のSQL例外全体を辿る必要があります。同様に、JDBC FastExportの実行中にSQLWarningが起こった場合、一連のSQL警告の一部である場合があります。SQLWarningの原因の全体像を把握するには、一連のSQL警告全体を辿る必要があります。

例:

try {

    PreparedStatement pstmt = con.prepareStatement("SELECT ... FROM     ...");

    try {

        // using JDBC FastExport

        SQLWarning w = pstmt.getWarnings();

        while (w != null) {

            StringWriter sw = new StringWriter();

            w.printStackTrace(new PrintWriter(sw, true));

            System.out.println("SQL State = " + w.getSQLState() +

                               ", Error Code = " + w.getErrorCode() +

                               "\n" + sw.toString());

            w = w.getNextWarning();

        }

    } finally {

      pstmt.close();

    }

} catch (SQLException e) {

    while (e != null) {

        StringWriter sw = new StringWriter();

        e.printStackTrace(new PrintWriter(sw, true));

        System.out.println("SQL State = " + e.getSQLState() +

                           ", Error Code = " + e.getErrorCode() +

                           "\n" + sw.toString());

        e = e.getNextException();

    }

}

なぜJDBC FastExportがアクティブでません かに関する情報は、接続のSQLWarningにあります。これは、場合によっては一連のSQL警告に含まれています。SQLWarningの原因の全体像を把握するには、一連のSQL警告全体を辿る必要があります。

なぜJDBC FastExportがアクティブでなかったかに関する情報は、URL接続文字列でLOG=INFOと指定することによっても取得できます。

JDBC Monitorのトラブルシューティング

JDBC MonitorでSQLExceptionが起こった場合、一連のSQL例外の一部である場合があります。SQLExceptionの原因の全体像を把握するには、一連のSQL例外の全体を辿る必要があります。

同様に、JDBC MonitorでSQLWarningが起こった場合、一連のSQL警告の一部である場合があります。SQL Warningの原因の全体像を把握するには、一連のSQL警告の全体を辿る必要があります。

以下は例です。

try {

    PreparedStatement pstmt = con.prepareStatement("MONITOR VERSION");

    try {

        //bind input values (not shown)

        boolean resultSetAvailable = pstmt.execute();

        //get ResultSet (not shown)

        SQLWarning w = pstmt.getWarnings();

        while (w != null)

            StringWriter sw = new StringWriter();

            w.printStackTrace(new PrintWriter(sw,true));

            System.out.printIn("SQL State = " + w.getSQLState() +

                               ", Error Code = " + w.getErrorCode() +

                               "\n" + sw.toString());

            w = w.getNextWarning();

        }

    } finally {

        pstmt.close();

    }

} catch (SQLException e) {

    while (e != null) {

        StringWriter sw = new StringWriter();

        e.printStackTrace(new PrintWriter(sw, true));

        System.out.printIn("SQL State = " + e.getSQLState() +

                           ", Error Code = " + e.getErrorCode() +

                           "\n" + sw.toString());

        e = e.getNextException();

    }

}

DatabaseMetaDataのパフォーマンス

DatabaseMetaDataメソッドはデータベース データ ディクショナリ ビューに対するクエリーを作成します。データ ディクショナリ ビューに対するクエリーのパフォーマンスが遅い場合、正確な最新の統計情報が不足していることが考えられます。

データベース管理者は次のSQLコマンドを定期的に実行し、データ ディクショナリ列と索引に関する統計情報を収集することが推奨されます。

collect statistics on DBC.AccessRights column (DatabaseId)

collect statistics on DBC.AccessRights column (FieldId)

collect statistics on DBC.AccessRights column (GrantorId)

collect statistics on DBC.AccessRights column (Partition)

collect statistics on DBC.AccessRights column (Partition, UserId)

collect statistics on DBC.AccessRights column (UserId)

collect statistics on DBC.AccessRights column (UserId, DatabaseId)

collect statistics on DBC.AccessRights column (UserId, TVMId)

collect statistics on DBC.AccessRights column (TVMId)

collect statistics on DBC.AccessRights column (TVMId, DatabaseId)

collect statistics on DBC.AccessRights index (UserId, DatabaseId) -- TD 14.10以前

collect statistics on DBC.AccessRights index (UserId) -- TD 15.0以降

collect statistics on DBC.AccessRights index (TVMId) -- TD 14.10以前

 

collect statistics on DBC.DatasetSchemaInfo column (DatasetSchemaId) -- TD 16.0以降

 

collect statistics on DBC.DBase column (DatabaseId)

collect statistics on DBC.DBase column (DatabaseId, DatabaseName)

collect statistics on DBC.DBase column (DatabaseId, ZoneId) -- TD 15.0以降

collect statistics on DBC.DBase column (DatabaseName)

collect statistics on DBC.DBase column (DatabaseName, DatabaseId)

collect statistics on DBC.DBase column (DatabaseNameI)

collect statistics on DBC.DBase column (JournalId)

collect statistics on DBC.DBase index (DatabaseId)

 

collect statistics on DBC.Indexes column (CreateUID)

collect statistics on DBC.Indexes column (FieldId)

collect statistics on DBC.Indexes column (IndexNumber)

collect statistics on DBC.Indexes column (IndexType)

collect statistics on DBC.Indexes column (LastAlterUID)

collect statistics on DBC.Indexes column (TableId, DatabaseId)

collect statistics on DBC.Indexes column (TableId, FieldId)

collect statistics on DBC.Indexes column (TableId, IndexNumber, DatabaseId)

collect statistics on DBC.Indexes column (UniqueFlag)

collect statistics on DBC.Indexes column (UniqueFlag, CreateUID)

collect statistics on DBC.Indexes column (UniqueFlag, FieldId)

collect statistics on DBC.Indexes column (UniqueFlag, LastAlterUID)

collect statistics on DBC.Indexes index (TableId)

 

collect statistics on DBC.ObjectUsage column (DatabaseId) -- TD 14.0以降

collect statistics on DBC.ObjectUsage column (DatabaseId, ObjectId) -- TD 14.0以降

collect statistics on DBC.ObjectUsage column (DatabaseId, ObjectId, IndexNumber) -- TD 14.0以降

collect statistics on DBC.ObjectUsage column (FieldId) -- TD 14.0以降

collect statistics on DBC.ObjectUsage column (IndexNumber) -- TD 14.0以降

collect statistics on DBC.ObjectUsage column (ObjectId) -- TD 14.0以降

collect statistics on DBC.ObjectUsage column (ObjectId, FieldId) -- TD 14.0以降

collect statistics on DBC.ObjectUsage column (UsageType) -- TD 14.0以降

 

collect statistics on DBC.Owners column (OwneeId)

collect statistics on DBC.Owners column (OwnerId, OwneeId)

collect statistics on DBC.Owners index (OwnerId)

 

collect statistics on DBC.RoleGrants column (RoleId)

collect statistics on DBC.RoleGrants index (GranteeId)

collect summary statistics on DBC.RoleGrants -- TD 14.0以降

 

collect statistics on DBC.Roles column (RoleId)

collect statistics on DBC.Roles column (RoleNameI)

 

collect statistics on DBC.StatsTbl column (IndexNumber) -- TD 13.0以降

collect statistics on DBC.StatsTbl column (StatsType) -- TD 13.0以降

 

collect statistics on DBC.TempTables column (BaseTableId)

collect summary statistics on DBC.TempTables -- TD 14.0以降

 

collect statistics on DBC.TVFields column (CreateUID)

collect statistics on DBC.TVFields column (DatabaseId)

collect statistics on DBC.TVFields column (DatasetSchemaId) -- TD 16.0以降

collect statistics on DBC.TVFields column (FieldId)

collect statistics on DBC.TVFields column (FieldName)

collect statistics on DBC.TVFields column (FieldName, TableId)

collect statistics on DBC.TVFields column (FieldType)

collect statistics on DBC.TVFields column (LastAlterUID)

collect statistics on DBC.TVFields column (TableId)

collect statistics on DBC.TVFields column (TableId, DatabaseId)

collect statistics on DBC.TVFields column (TableId, FieldId)

collect statistics on DBC.TVFields column (TableId, FieldId, DatabaseId)

collect statistics on DBC.TVFields column (TableId, FieldName)

collect statistics on DBC.TVFields column (UDTypeId) -- V2R6.1以降

collect statistics on DBC.TVFields column (UDTName) -- V2R6.1以降

 

collect statistics on DBC.TVM column (CommitOpt) -- TD 12.0以降

collect statistics on DBC.TVM column (CreateUID)

collect statistics on DBC.TVM column (CreatorName)

collect statistics on DBC.TVM column (DatabaseId)

collect statistics on DBC.TVM column (DatabaseId, TVMId)

collect statistics on DBC.TVM column (LastAlterUID)

collect statistics on DBC.TVM column (TableKind)

collect statistics column (TableKind (char(1), character set latin, casespecific)) as ST_TVM_TK0 on DBC.TVM -- TD 15.0以降

collect statistics column (TableKind (char(1), character set latin, not casespecific)) as ST_TVM_TK1 on DBC.TVM -- TD 15.0以降

collect statistics on DBC.TVM column (TVMId)

collect statistics on DBC.TVM column (TVMId, TVMName)

collect statistics on DBC.TVM column (TVMName)

collect statistics on DBC.TVM column (TVMNameI)

collect statistics on DBC.TVM column (DatabaseId, TVMName)

collect statistics on DBC.TVM index (DatabaseId, TVMNameI)

 

collect statistics on DBC.UDFInfo column (DatabaseId)

collect statistics on DBC.UDFInfo column (DatabaseId, FunctionName)

collect statistics on DBC.UDFInfo column (FunctionId)

collect statistics on DBC.UDFInfo column (FunctionName)

collect statistics on DBC.UDFInfo column (FunctionType)

collect statistics using MaxValueLength 1 column (FunctionType, FunctionName) on DBC.UDFInfo -- TD 14.0以降

collect statistics using MaxValueLength 5 column (FunctionType, FunctionName) on DBC.UDFInfo -- TD 14.0以降

 

collect statistics on DBC.UDTInfo column (TypeId) -- V2R6.1以降

collect statistics on DBC.UDTInfo column (TypeKind) -- V2R6.1以降

collect statistics on DBC.UDTInfo column (TypeName) -- V2R6.1以降

Linuxの遅延ログオン

注: Linuxの遅延ログオンの問題を回避するには、Teradata JDBC Driver 15.00.00.13以降にアップグレードしてください。

Linuxシステムを実行している場合、Teradata JDBC Driverを使用しているJavaアプリケーションは、数秒から数分にわたる遅延ログオン プロセスを経験することがあります。これは、Teradata JDBCへのJDBC接続のデフォルト メカニズムであるTD2メカニズムを使用している場合に生じます。原因は乱数生成に関わる下位の問題であり、次のJava Bugに説明があります。

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6202721 /dev/urandomが選択されてもSHA1PRNGが/dev/randomから読み込む

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6366924 securerandom.sourceまたはjava.security.egd、またはこの両方が1.5.0_05で機能しない

この問題が原因で、すべてのログオンが遅延するわけではありません。問題が生じないまま、問題を再現するテスト プログラムを何度も実行できる場合があります。この問題が疑われる場合は、次のJavaプログラムを実行してください。

問題がなければ、プログラムは数秒で終了します。遅延ログオンがある場合は、プログラムの実行に数分かかります。プログラムはテストの実行ごとに繰返し回数を出力するため、このような遅延はプログラムの出力に見られる一時停止で判断できます。

// This program tests to see if there are delay problems associated the

// use of SecureRandom

import java.security.SecureRandom;

import java.util.*;

import java.math.*;

class secRandomPrb {

  public static void main(String args[]) throws Exception {

    System.out.println();

    System.out.println("Pass 1: getInstance:");

    runit(true);

    System.out.println();

    System.out.println("Pass 2: secureRandom:");

    runit(false);

  }

  public static void runit(boolean secRand) {

    SecureRandom srand;

    BigInteger x;

    int ctr = 0;

    try {

      for (ctr = 0; ctr < 1000; ctr++) {

        if (secRand == true)

          srand = SecureRandom.getInstance("SHA1PRNG");

        else

          srand = new SecureRandom();

        byte[] seed = srand.generateSeed(8);

        srand.setSeed(seed);

        x = new BigInteger(512, srand);

        int i = x.intValue();

        System.out.print(ctr + " ");

      }

    }

    catch (Exception ex) {

      System.out.println("Exception: " + ex);

    }

  }

}

Linuxの遅延ログオンの問題を解決する最善の方法は、Teradata JDBC Driver 15.00.00.13以降にアップグレードすることです。

Teradata JDBC Driverの古いバージョンを使用する場合は、Linuxの遅延ログオンの問題は/dev/./urandomを/dev/randomのリンクとして、またはsecurerandom.sourceとして指定することで回避できます。

これは、「コマンド ライン引数の使用 」または「/dev/randomのシンボリック リンクへの変更 」に従って実行できます。

コマンド ライン引数の使用

推奨される回避策は、Java JVMを開始するコマンド ライン引数を指定する方法です。これにより、この問題が発生する可能性のあるJavaプログラムにのみ変更を加えることができます。コマンド ライン設定

-Djava.security.egd=file:/dev/./urandom

は、この問題を回避します。devとurandomの間にある余分な"."ディレクトリに注意してください。これは必須です。上記のテスト プログラムはこの設定で次のように実行できます。

java -Djava.security.egd=file:/dev/./urandom secRandomPrb

これと同じプロパティが$JAVA_HOME/jre/lib/security/java.securityファイルのセキュリティ ファイルでも使える点に注意してください。通常、java.securityファイルへの変更は同じ効果が得られるはずですが、テストからこのファイルを変更しても、問題を解決できません ことがわかっているのが、JDK 5.0を使っている場合です。

/dev/randomのシンボリック リンクへの変更

この変更にはroot権限が必要です。システムの全プログラムについて、/dev/randomの設定を変更します。rootとしてログインすれば、次のコマンドを実行できます。

mv /dev/random /dev/random.real

ln -s /dev/./urandom /dev/random

この変更がされると、遅延ログオンの問題が回避されます。上記のテスト プログラムを実行して修正されているかどうか確認してください。