##############################################
### Option II ##############################
##############################################
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