Linux および macOS でのデータ アクセスのトレース

ODBC ドライバーのダウンロード

この記事では、LinuxとmacOSでunixODBCドライバーマネージャーのトレースを設定する方法を紹介しています。 トレースはDriver Managerを通じて行うODBCのAPI呼び出しを記録します。 Microsoft ODBCドライバーの内部イベントを追跡するわけではありません。 診断記録とトレース層の違いについては、 ODBC診断を参照してください。

odbcinst.iniの[ODBC]セクションは、unixODBCシステム構成を使用するアプリケーションのトレーシングを制御します。 Trace=Yesを設定し、TraceFileの絶対パスを指定します:

[ODBC]
Trace=Yes
TracePid=No
TraceFile=/home/myappuser/odbc-trace.ABC123/odbc.log

このパスはあくまで一例です。以下の手順で生成されるプライベートな絶対パスを使用してください。

アプリケーションで必要なドライバー登録エントリは、この odbcinst.ini ファイルに保存してください。 [ODBC]セクションは構成全体に適用されます。 ドライバー固有のセクションに Trace=Yes を追加しても、unixODBCドライバーマネージャーのトレースがそのドライバーにスコープされるわけではありません。

デフォルトのトレース ファイルのパスは、アプリケーションごとに限定されるものではありません。 代わりにプライベートディレクトリと明示的なトレースファイルパスを使いましょう。 トレーシングはパフォーマンスに影響を与える可能性があり、出力にはアプリケーションデータが含まれることもあります。 ファイルへのアクセスを制限し、必要な呼び出しだけをキャプチャしてください。

upstreamの診断トレースバッファ修正を含むunixODBCビルドを使いましょう。 ベンダーパッケージにはバックポートを含めることができます。バージョン番号だけに頼らず、パッケージのパッチを確認してください。 この修正を行わない場合、マネージャーがトレース用のネイティブ エラーを生成している間に、アプリケーションが SQLGetDiagRec で異常終了する可能性があります。

1回のアプリ起動をトレース

専用のBashシェルを開き、同じターミナルセッション内でこの手順のシェルコマンドを実行してください。 最初のコマンドはフェイルファスト処理を有効にするため、ディレクトリの作成、権限の変更、または設定のコピーのいずれかが失敗した場合、アプリケーションの起動前に処理が停止します。 後の手順のためにシェルを開いたままにし、クリーンアップ後に exit と入力してください。

  1. odbcinst -jを実行し、システムドライバーおよびシステムデータソースファイルのパスを記録してください。 プライベート設定ディレクトリとトレースディレクトリを作成し、システム設定ファイルをコピーします。 例のファイルパスを、システム上で表示されるものに置き換えてください:

    set -eu
    config_dir=$(mktemp -d "$HOME/odbc-trace-config.XXXXXX")
    trace_dir=$(mktemp -d "$HOME/odbc-trace.XXXXXX")
    if [ "$(printf '%s' "$trace_dir/odbc.log" | wc -c)" -gt 62 ]; then
        printf 'Use a shorter parent path for the trace directory (log path exceeds 62 bytes).\n' >&2
        rmdir "$trace_dir" "$config_dir"
        exit 1
    fi
    driver_file=/etc/odbcinst.ini
    data_sources_file=/etc/odbc.ini
    chmod 700 "$config_dir" "$trace_dir"
    cp "$driver_file" "$config_dir/odbcinst.ini"
    if [ -f "$data_sources_file" ]; then
        cp "$data_sources_file" "$config_dir/odbc.ini"
    else
        printf '[ODBC Data Sources]\n' > "$config_dir/odbc.ini"
    fi
    chmod 600 "$config_dir/odbcinst.ini" "$config_dir/odbc.ini"
    printf '%s\n' "$trace_dir/odbc.log"
    

    ピンされた UnixODBCトレース構成実装 は レジストレーションプロファイルリーダーに64バイトのバッファを提供します。 そのリーダーは、最大 62 バイトのパスとその null 終端文字を安全にコピーします。 長い経路の場合、その切り詰め分岐はヌル終端文字を付加しません。 LinuxとmacOSのUnixODBC 2.3.14で確認したところ、62バイトで正しいトレース作成が確認されました。 ガードはバイト数をカウントし、生成されたパスが長すぎる場合は起動前に停止します。 もし停止したら、trace_dir コマンドでより短い書き込み可能な親パスを使い、mktemp -dを保ち、手順を再開してください。

    アプリケーションに必要なすべてのドライバー登録エントリは、コピーした odbcinst.ini に保持してください。 アプリケーションがシステムデータソース名(DSN)を使用している場合は、コピーした odbc.iniにその定義を保持してください。 その Driver の値が登録名である場合は、その一致する定義をコピーされた odbcinst.ini に保持します。 値が絶対ライブラリパスであれば、そのライブラリが存在し、そのパスでアクセス可能であることを確認しましょう。 ピン留めされたUnixODBCリビジョンでは、 / で始まる値がライブラリパスとして使われ、他の値はドライバ登録によって解決されます。 詳細については、unixODBC のodbc.ini マニュアル およびピン留めされた ドライバー検索実装をご覧ください。 コマンドはユーザーのDSN設定をそのまま維持します。

  2. プライベート odbcinst.ini 内で、グローバルの [ODBC] セクションを追加または更新してください。 前のコマンドで表示された絶対パスを TraceFile に使い、2つ目の [ODBC] セクションは作成しないでください:

    [ODBC]
    Trace=Yes
    TracePid=No
    TraceFile=/home/myappuser/odbc-trace.ABC123/odbc.log
    

    例のパスを前のステップで表示された正確なパスに置き換えます。 コピーされた設定で有効になっている場合でも、TracePid=No を構成してください。これにより、トレースではここに示されている単一のファイルが使用されます。

  3. プライベートシステム設定ディレクトリを使用してアプリケーションを起動します:

    if (umask 077; ODBCSYSINI="$config_dir" ODBCINSTINI=odbcinst.ini \
        ODBCSEARCH=ODBC_BOTH_DSN ./your-app); then
        :
    else
        app_status=$?
        printf 'Application exited with status %s\n' "$app_status" >&2
    fi
    

    トレースファイルにはODBC API呼び出しとそのリターンコードを含めるべきです。 この条件文により、アプリケーションがエラーで終了した場合でも、後処理のためにシェルが閉じられずに残ります。 unixODBCドライバーマネージャーは ODBCSYSINIからシステム設定ディレクトリを読み込みます。 この子プロセスに ODBCINSTINI=odbcinst.ini を設定し、継承された registration-filename のオーバーライドがコピーされたファイルをバイパスしないようにしてください。 ファイル名の検索については、固定された unixODBC の構成の実装を参照してください。

    ODBCSEARCH=ODBC_BOTH_DSN この起動では、継承されたユーザー専用またはシステム専用のDSN検索モードを上書きします。 これらの設定は既存のユーザーDSNファイルをそのまま維持します。 unixODBCはシステムとユーザーのDSNファイルの両方を検索し、同じ名前が両方に存在する場合はユーザーDSNが優先されます。 アプリケーションがコピーしたシステム DSN と異なる設定を使用しているように見える場合は、重複するユーザー DSN がないか確認してください。 アプリケーションが意図的に制限検索モードを必要とする場合は、そのモードを保持し、選択したDSNファイルに必要な定義が含まれているか確認してください。 詳細については、固定された unixODBC の検索モードの実装、isql マニュアル、および odbc.ini マニュアルを参照してください。

再生が終了したら、アプリケーションを終了して、その ODBC 環境のハンドルを解放します。 再度起動する前に、Trace=No を設定するか、[ODBC] のトレース設定を解除します。 ログを点検または共有する前に、ログへのアクセスを制限してください:

if [ -f "$trace_dir/odbc.log" ]; then
    chmod 600 "$trace_dir/odbc.log"
else
    printf 'No trace file was created. Check that the application started and allocated an ODBC environment.\n' >&2
fi

ODBC環境を割り当てる前に起動に失敗したり、終了したりするアプリケーションは、トレースファイルを作成しないことがあります。 このチェックでは、欠落しているファイルが報告され、専用シェルからクリーンアップ操作を実行できるようになります。

トレースを共有する前に機密性の高い内容をマスクしてください。 不要になったらログを削除してください。 プライベート設定ファイルやディレクトリは、このトレース用に作成し、その内容が不要になった場合にのみ削除してください。

以下のコマンドは、この手順で作成されたファイルとディレクトリのみを削除します:

rm -f "$trace_dir/odbc.log" "$config_dir/odbcinst.ini" "$config_dir/odbc.ini"
rmdir "$trace_dir" "$config_dir"

ドライバーマネージャーで使用される設定ファイルを探す

システムおよびユーザーの設定パスを表示するために odbcinst -j を実行します。 パスはプラットフォームやUnixODBCのビルドによって異なる場合があります。 ユーザー DSN は特定のユーザーのみが使用できます。 システムDSNは システム上のユーザーが利用可能であり、管理には管理者権限が必要です。 両方のファイルに同じDSN名が存在する場合、ユーザーのDSNが優先されます。 詳細については、unixODBC のドキュメントを参照してください。