最近、SQL ServerODBCドライバーを使用してOracleをSQLServerに接続していたお客様が、問題を解決するのが難しいという問題を経験しました。
お客様は、DG4ODBCが使用されるたびにODBC Driver Managerログを取得していたため、パフォーマンスが低下しました。ODBC呼び出しのログには、パフォーマンスコストがかかります。顧客は、ログを有効にするエントリについてodbcinst.iniファイルを確認しました。これらのエントリは存在しませんでした。
この問題を解決するために、straceツールを使用して、DG4ODBCが使用されているときに「舞台裏」で何が起こっていたかを発見しました。
DG4ODBCはアプリケーションではなくライブラリであるため、DG4ODBCに関連付けられた操作をトレースするには、Oracleリスナープロセス(DG4ODBCの「親」アプリケーション)にstraceをアタッチする必要がありました。
トレースファイルには、odbcinst.iniのどのコピーがロギングを有効にしているかが示されていました。
straceをOracleリスナーにアタッチするために実行した手順は次のとおりです。
$ ps -aef | grep tns* oracle 16242 1 0 15:02 ? 00:00:00 /u01/app/oracle/product/11.2.0/xe/bin/tnslsnr LISTENER -inherit $ sudo strace -p 16242 -f -o /tmp/mytracefile
(別のターミナルウィンドウ内):
$ ./sqlplus / as sysdba $ select * from mytable@mylink;
Oracleが「内部で」行ったことは、/ tmp/mytracefileにキャプチャされるようになりました。次に、ctrl-cを使用してstraceを停止し、/ tmp / mytracefileでsql.log(ODBC Driver Managerログファイル)を検索しました。私たちの場合、これは次のことを示しています:
16436 open("/etc/odbcinst.ini", O_RDONLY) = 7 16436 fstat(7, {st_mode=S_IFREG|0644, st_size=1365, ...}) = 0 16436 read(7, "[ODBC]\nTrace=Yes\nTraceFile=/tmp/"..., 4096) = 1365 16436 read(7, "", 4096) = 0 16436 close(7) = 0 16436 open("/u01/app/oracle/.odbcinst.ini", O_RDONLY) = -1 ENOENT (No such file or directory) 16436 open("/tmp/sql.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 7