Database
 sql >> Base de Dados >  >> RDS >> Database

Usando strace como uma ferramenta de depuração DG40DBC no Linux


Recentemente, um cliente que estava usando nosso driver ODBC do SQL Server para conectar o Oracle ao SQL Server enfrentou um problema que se mostrou difícil de resolver.

O cliente recebia um log do ODBC Driver Manager sempre que o DG4ODBC era usado, com uma redução resultante no desempenho — o registro de chamadas ODBC tem um custo de desempenho. O cliente verificou o arquivo odbcinst.ini em busca de entradas que habilitam o log; essas entradas não estavam presentes.

Para ajudar a resolver esse problema, usamos a ferramenta strace para descobrir o que estava acontecendo "nos bastidores" quando DG4ODBC estava em uso.

Como o DG4ODBC é uma biblioteca em vez de um aplicativo, tivemos que anexar strace ao processo do ouvinte Oracle (aplicativo "pai" do DG4ODBC) para rastrear as operações associadas ao DG4ODBC.

O arquivo de rastreamento mostrou qual cópia do odbcinst.ini estava habilitando o log.

Estas são as etapas que tomamos para anexar strace ao ouvinte 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

(Em uma janela de terminal separada):
$ ./sqlplus / as sysdba

$ select * from mytable@mylink;

O que a Oracle fez "nos bastidores" agora é capturado em /tmp/mytracefile. Em seguida, usamos ctrl-c para parar o strace e procuramos por sql.log (o arquivo de log do Gerenciador de Driver ODBC) em /tmp/mytracefile. No nosso caso, isso mostrou:
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