Rastreamento do acesso aos dados no Linux e no macOS

Baixar driver ODBC

Este artigo mostra como configurar o rastreamento do Driver Manager unixODBC no Linux e macOS. O rastreamento registra chamadas de API ODBC que você faz pelo Gerenciador de Drivers. Ele não rastreia os eventos internos do driver ODBC da Microsoft. Para a diferença entre registros diagnósticos e camadas de rastreamento, veja diagnósticos ODBC.

A seção [ODBC] de odbcinst.ini controla o rastreamento para aplicações que utilizam a configuração do sistema unixODBC. Defina Trace=Yes e especifique um caminho absoluto para TraceFile:

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

O caminho é ilustrativo; use o caminho absoluto privado gerado no procedimento a seguir.

Mantenha neste arquivo odbcinst.ini as entradas de registro de drivers exigidas pelo seu aplicativo. A seção [ODBC] é global para a configuração. Adicionar Trace=Yes a uma seção específica do driver não escopa o rastreamento do Gerenciador de Drivers do unixODBC para esse driver.

O caminho padrão do arquivo de rastreamento não é restrito ao escopo da sua aplicação. Use um diretório privado e um caminho explícito para o arquivo de rastreamento em vez disso. O rastreamento pode afetar o desempenho, e a saída pode conter dados da aplicação. Restrinja o acesso ao arquivo e capture apenas as chamadas que você precisar.

Use uma build do unixODBC que inclua a correção upstream do buffer de rastreamento de diagnóstico. Pacotes de fornecedores podem incluir um backport; verifique os patches do pacote em vez de depender apenas do número da versão. Sem a correção, a aplicação pode abortar em SQLGetDiagRec enquanto o gerenciador formata um erro nativo para rastreamento.

Iniciar o aplicativo Trace One

Abra um shell dedicado para Bash e execute, nessa mesma sessão de terminal, os comandos deste procedimento. O primeiro comando habilita o tratamento fail-fast, de modo que uma falha na criação de diretórios, na alteração de permissão ou na cópia da configuração interrompe o processo antes do lançamento do aplicativo. Mantenha o shell aberto para as etapas seguintes e digite exit após a limpeza.

  1. Execute odbcinst -j e anote os caminhos para o driver do sistema e os arquivos de fonte de dados do sistema. Crie diretórios privados de configuração e rastreio, depois copie os arquivos de configuração do sistema. Substitua os caminhos de arquivo de exemplo pelos que estão reportados no seu sistema:

    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"
    

    A implementação fixada da configuração de rastreamento do unixODBC fornece um buffer de 64 bytes ao leitor de perfil de registro. Esse leitor copia com segurança um caminho de até 62 bytes e seu terminador nulo. Para caminhos mais longos, seu ramo de truncamento não adiciona um terminador nulo. Verificações com unixODBC 2.3.14 no Linux e macOS confirmaram a criação correta do rastreamento em 62 bytes. O verificador conta bytes e para antes da execução se o caminho gerado for muito longo. Se parar, use um caminho pai gravável mais curto no trace_dir comando, mantenha mktemp -d, e reinicie o procedimento.

    Guarde todas as entradas de registro do driver que a aplicação precisa na odbcinst.ini copiada. Se a aplicação usar um nome de fonte de dados do sistema (DSN), mantenha sua definição no odbc.ini copiado. Se o valor de Driver for um nome de registro, mantenha essa definição correspondente no odbcinst.ini copiado. Se o valor for um caminho absoluto da biblioteca, confirme que a biblioteca existe e é acessível nesse caminho. Na revisão unixODBC fixada, um valor começando com / é usado como caminho da biblioteca; outros valores são resolvidos por meio de um registro de driver. Para mais informações, consulte o manual do odbc.ini do unixODBC e a implementação fixada de pesquisa de driver. Os comandos deixam a configuração DSN do usuário no lugar.

  2. Na seção privada odbcinst.ini, adicione ou atualize a seção global [ODBC] . Use o caminho absoluto impresso pelo comando anterior para TraceFile; não crie uma segunda seção [ODBC]:

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

    Substitua o caminho de exemplo pelo caminho exato impresso na etapa anterior. Defina TracePid=No mesmo que a configuração copiada a habilite, para que o rastreio use o arquivo único mostrado aqui.

  3. Inicie o aplicativo com o diretório privado de configuração do sistema:

    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
    

    O arquivo de rastreamento deve conter chamadas de API ODBC e seus códigos de retorno. O condicional mantém o shell aberto para limpeza mesmo que a aplicação saia com um erro. O Gerenciador de Drivers unixODBC lê seu diretório de configuração do sistema a partir de ODBCSYSINI. Defina ODBCINSTINI=odbcinst.ini para esse processo filho para que uma substituição herdada do nome do arquivo de registro não contorne o arquivo copiado. Para a consulta de nome de arquivo, veja a implementação de configuração destacada do unixODBC.

    ODBCSEARCH=ODBC_BOTH_DSN substitui um modo de busca DSN herdado apenas para usuário ou apenas para sistema para esta inicialização. Essas configurações deixam o arquivo DSN do usuário existente no lugar. unixODBC pesquisa tanto arquivos DSN do sistema quanto do usuário, e o DSN do usuário tem precedência quando o mesmo nome existe em ambos. Verifique se há um DSN duplicado do usuário se o aplicativo parecer usar configurações diferentes do DSN do sistema copiado. Se o aplicativo requer intencionalmente um modo de busca restrito, preserve esse modo e verifique se o arquivo DSN selecionado contém a definição necessária. Para mais informações, veja a implementação fixada do modo de busca do unixODBC, o manual isql e o manual odbc.ini.

Quando a reprodução terminar, saia da aplicação para liberar seus handles do ambiente ODBC. Defina Trace=No ou remova as [ODBC] configurações de rastreamento antes de outra inicialização. Restringa o acesso ao registro antes de inspecioná-lo ou compartilhá-lo:

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

Uma aplicação que não inicia ou fecha antes de alocar um ambiente ODBC pode não criar um arquivo de rastreamento. A verificação reporta o arquivo ausente e mantém a rotina de limpeza acessível no shell dedicado.

Elimine conteúdos sensíveis antes de compartilhar o trace. Apague o registro quando não precisar mais. Remova os arquivos de configuração e diretórios privados somente se você os criou para esse rastreamento e não precisar mais do conteúdo deles.

Os seguintes comandos removem apenas os arquivos e diretórios criados neste procedimento:

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

Encontre os arquivos de configuração usados pelo Gerenciador de Drivers

Execute odbcinst -j para exibir os caminhos de configuração do sistema e do usuário. Os caminhos podem variar conforme a plataforma e a build do unixODBC. DSNs de usuário estão disponíveis para um usuário específico. DSNs do sistema estão disponíveis para os usuários do sistema, e gerenciá-los pode exigir permissões de administrador. Quando o mesmo nome DSN existe em ambos os arquivos, o DSN do usuário tem precedência. Para saber mais, confira a documentação do unixODBC.