Translate

samedi 2 avril 2016

Tracer une session bd avec truss - Option II -

Des fois un trace de base de données ne suffit pas pour retrouver un problème. Dans ce cas, je vais activer aussi un trace au niveau du système d'exploitation avec la commande truss.

##############################################
### Option II   ##############################
##############################################

Système d'exploitation :  Solaris 10
Version de base de données : 11.2.0.4

  • Créer le fichier shell :

Fichier shell : bd_truss.sh
#!/bin/sh
/usr/bin/nohup /usr/bin/truss -fldD -p $2 > /home/ora11204/$1 2>&1&

Cela va générer un fichier de trace qui sera placé dans le répertoire "/home/ora11204/" , Le nom du fichier est passé comme 1er paramètre , le 2ème paramètre correspond au "ID process".


  • Demander à votre admin Unix de donner les privilèges SUID pour le truss, en cas l'owner de votre process à tracer ne soit pas le même.(Exemple : grid et home RDBMS installés avec des comptes séparés).

root@serveur:/root# ls -l /usr/bin/truss
-r-xr-xr-x  66 root     bin        10052 Jul  6  2011 /usr/bin/truss

root@serveur:/root# chmod u+s /usr/bin/truss

root@serveur:/root# ls -l /usr/bin/truss
-r-sr-xr-x  66 root     bin        10052 Jul  6  2011 /usr/bin/truss


  • Créer un compte de test dans la base de données :

sqlplus / as sysdba
DROP USER EVTA CASCADE ;
CREATE USER EVTA IDENTIFIED BY EVTA  ;
GRANT CONNECT, RESOURCE TO EVTA ;

  • Créer la crédentiale -Puisque c'est 11gR2-

EXEC DBMS_SCHEDULER.CREATE_CREDENTIAL('CRED_EVTA','ora11204','yourpasswordunix') ;


  • Utiliser le trigger pour créer une "job"

CREATE OR REPLACE TRIGGER SYS.TRIG_TRACE_JOB
AFTER LOGON ON DATABASE
DISABLE
DECLARE
id1             VARCHAR2(30);
id2             NUMBER;
ls_username     VARCHAR2(30);
ls_osuser       VARCHAR2(30);
ls_program      VARCHAR2(64);
ls_sid          INTEGER;
ls_serial       INTEGER;
ls_schemaname   VARCHAR2(100);
ls_machine      VARCHAR2(100);
ls_spid         VARCHAR2(24);
v2              NUMBER;
result          NUMBER;

CURSOR USAGERINFO IS
   SELECT upper(A.username), A.osuser, upper(A.program), A.sid, A.serial#, A.schemaname, A.machine, B.SPID
     FROM v$session A, v$process b
    WHERE audsid = userenv('SESSIONID') and a.paddr=b.addr;
BEGIN
    -- Obtenir les informations de l'usager en cours
    OPEN USAGERINFO;
       FETCH USAGERINFO
       INTO ls_username, ls_osuser, ls_program, ls_sid, ls_serial, ls_schemaname, ls_machine, ls_spid;
       CLOSE USAGERINFO;

    if user in ('EVTA') and program like 'SQLPLUS%' then
      select user, sys_context('USERENV','SID') into id1, id2 from dual;
      execute immediate 'alter session set statistics_level=ALL';
      execute immediate 'alter session set tracefile_identifier='''||replace(id1,'$','')||'_'||id2||'''';
      execute immediate 'alter session set max_dump_file_size=40960000';
      execute immediate 'alter session set EVENTS ''10046 trace name context forever, level 12''';
      execute immediate 'BEGIN DBMS_SCHEDULER.CREATE_JOB(JOB_NAME=>'''||'JOB_EVTA'||id2||''''||',JOB_TYPE=>'||'''EXECUTABLE'''||',JOB_ACTION=>'||''''||'/home/ora11204/bd_truss.sh'||''''||',NUMBER_OF_ARGUMENTS=>2,ENABLED=>FALSE,AUTO_DROP=>TRUE,CREDENTIAL_NAME=>'||''''||'CRED_EVTA'||'''); END;' ;
      execute immediate 'BEGIN DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('''||'JOB_EVTA'||id2||''''||',1,'||''''||'trace_'||ls_spid||''''||'); END;';
      execute immediate 'BEGIN DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('''||'JOB_EVTA'||id2||''''||',2,'||''''||ls_spid||''''||'); END;';
      execute immediate 'BEGIN DBMS_SCHEDULER.ENABLE('''||'JOB_EVTA'||id2||''''||') ; END;';
    end if;
END;
/


  • Activer le trigger au moment dont vous aurez besoin


ALTER TRIGGER SYS.TRIG_TRACE_JOB ENABLE ; 

Cela va activer deux types de traces à chaque connexion du compte "EVTA", un trace de bases de données et un trace OS, ces deux fichiers pourront vous aider à détecter certains problèmes.

Aucun commentaire:

Enregistrer un commentaire