Traccia dell'accesso ai dati in Linux e macOS

Scaricare il driver ODBC

Questo articolo ti mostra come configurare la traccia del Driver Manager unixODBC su Linux e macOS. Il tracciato registra le chiamate API ODBC che effettui tramite il Driver Manager. Non traccia gli eventi interni del driver Microsoft ODBC. Per la differenza tra record diagnostici e livelli di tracciamento, vedi diagnostica ODBC.

La sezione [ODBC] di odbcinst.ini controlla il tracciamento per le applicazioni che utilizzano la configurazione di sistema unixODBC. Imposta Trace=Yes e specifica un percorso assoluto per TraceFile:

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

Il percorso è illustrativo; usa il percorso assoluto privato generato nella procedura seguente.

Conserva le voci di registrazione del driver richieste dalla tua applicazione in questo file odbcinst.ini. La [ODBC] sezione è globale rispetto alla configurazione. Aggiungere Trace=Yes a una sezione specifica del driver non limita la traccia del Driver Manager unixODBC a quel driver.

Il percorso predefinito del file di traccia non è associato alla tua applicazione. Usa invece una directory privata e un percorso esplicito del file di traccia. Il tracciamento può influenzare le prestazioni e l'output può contenere dati applicativi. Limita l'accesso al file e cattura solo le chiamate di cui hai bisogno.

Usa una build unixODBC che includa la correzione upstream del buffer di traccia diagnostica. I pacchetti dei fornitori possono includere un backport; controlla le patch del pacchetto invece di affidarti solo al numero di versione. Senza la correzione, l'applicazione può abortire in SQLGetDiagRec mentre il manager formatta un errore nativo per il tracciamento.

Avvia l'applicazione Trace One

Apri una shell Bash dedicata, poi esegui i comandi della shell in questa procedura nella stessa sessione terminale. Il primo comando consente una gestione con interruzione immediata in caso di errore, quindi un errore nella creazione della directory, nella modifica dei permessi o nella copia della configurazione interrompe il processo prima dell'avvio dell'applicazione. Tieni la shell aperta per i passaggi successivi e scrivi exit dopo la pulizia.

  1. Esegui odbcinst -j e annota i percorsi del driver di sistema e dei file dell'origine dati di sistema. Crea directory private di configurazione e traccia, poi copia i file di configurazione del sistema. Sostituisci i percorsi dei file di esempio con quelli riportati sul tuo 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"
    

    L'implementazione bloccata della configurazione di traccia unixODBC fornisce un buffer di 64 byte al reader del profilo di registrazione. Quel lettore copia in sicurezza un percorso di massimo 62 byte, incluso il terminatore nullo. Per percorsi più lunghi, il suo ramo di troncamento non aggiunge un terminatore nullo. I controlli con unixODBC 2.3.14 su Linux e macOS hanno confermato la creazione corretta delle tracce a 62 byte. Il controllo conta i byte e si ferma prima del lancio se il percorso generato è troppo lungo. Se si ferma, usa un percorso genitore scrivibile più corto nel trace_dir comando, tieni mktemp -d, e riavvia la procedura.

    Conserva tutte le voci di registro del driver di cui l'applicazione ha bisogno nella copia odbcinst.ini. Se l'applicazione utilizza un nome di sorgente dati di sistema (DSN), mantieni la sua definizione nel odbc.ini copiato. Se il suo valore Driver è un nome di registrazione, mantenere quella definizione corrispondente nel/la odbcinst.ini copiato/a. Se il valore è un percorso assoluto della libreria, confermare che la libreria esiste ed è accessibile in quel percorso. Nella revisione unixODBC fissata, un valore che inizia con / viene utilizzato come percorso della libreria; gli altri valori vengono risolti tramite una registrazione del driver. Per maggiori informazioni, consulta il manuale odbc.ini di unixODBC e l'implementazione della ricerca driver appuntata. I comandi lasciano invariata la configurazione DSN dell'utente.

  2. Nella sezione privata odbcinst.ini, aggiungi o aggiorna la sezione globale [ODBC] . Usa il percorso assoluto stampato dal comando precedente per TraceFile; non creare una seconda [ODBC] sezione:

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

    Sostituisci il percorso di esempio con quello esatto stampato nel passaggio precedente. Imposta TracePid=No anche se la configurazione copiata lo abilita, così la traccia utilizza il singolo file mostrato qui.

  3. Avvia l'applicazione con la directory di configurazione di sistema privata:

    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
    

    Il file trace dovrebbe contenere chiamate API ODBC e i loro codici di ritorno. La condizione mantiene la shell aperta per la pulizia anche se l'applicazione esce con un errore. Il Driver Manager unixODBC legge la sua directory di configurazione di sistema da ODBCSYSINI. Impostare ODBCINSTINI=odbcinst.ini per questo processo figlio in modo che una sovrascrittura del nome del file di registrazione ereditata non bypassi il file copiato. Per la ricerca del nome file, vedi la implementazione della configurazione unixODBC bloccata.

    ODBCSEARCH=ODBC_BOTH_DSN sovrascrive una modalità di ricerca DSN ereditata solo per l'utente o solo per il sistema per questo lancio. Queste impostazioni lasciano il file DSN utente esistente in posizione. unixODBC cerca sia nei file DSN di sistema che in quelli dell'utente, e il DSN utente ha precedenza quando lo stesso nome esiste in entrambi. Controlla se è presente un DSN utente duplicato se l'applicazione sembra utilizzare impostazioni diverse rispetto al DSN di sistema copiato. Se l'applicazione richiede intenzionalmente una modalità di ricerca limitata, conservare quella modalità e verificare che il file DSN selezionato contenga la definizione richiesta. Per ulteriori informazioni, consulta l'implementazione della modalità di ricerca di unixODBC, il manuale isql e il manuale odbc.ini.

Quando l'esecuzione termina, esci dall'applicazione per rilasciare i suoi handle dell'ambiente ODBC. Configura Trace=No o rimuovi le impostazioni di tracciamento [ODBC] prima di un altro avvio. Restringi l'accesso al registro prima di ispezionarlo o condividerlo:

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

Un'applicazione che non si avvia o esce prima di allocare un ambiente ODBC potrebbe non creare un file trace. Il controllo segnala il file mancante e mantiene accessibile la procedura di pulizia nella shell dedicata.

Oscura i contenuti sensibili prima di condividere il trace. Elimina il log quando non ne hai più bisogno. Rimuovi i file di configurazione e le directory private solo se che hai creato per questa traccia e non hai più bisogno del loro contenuto.

I seguenti comandi rimuovono solo i file e le directory creati in questa procedura:

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

Trova i file di configurazione usati dal Driver Manager

Esegui odbcinst -j per visualizzare i percorsi di configurazione di sistema e dell’utente. I percorsi possono variare a seconda della piattaforma e della build unixODBC. I DSN dell'utente sono disponibili per un utente specifico. Le DSN di sistema sono disponibili per gli utenti sul sistema e la loro gestione può richiedere permessi da parte degli amministratori. Quando lo stesso nome DSN esiste in entrambi i file, il DSN utente ha la precedenza. Per altre informazioni, vedere la documentazione di unixODBC.