Retrouver les informations relatives à ma session

Je veux savoir quelle est ma session au niveau de v$session et à quel processus OS elle correspond

La requête à passer est la suivante :

set pages 0 lines 230 newp none emb on

col machine for a25

select v.SID, v.USERNAME, v.MACHINE, v.PROGRAM, v.TERMINAL, SPID "OS PID", v.process
from v$session v inner join v$process p on v.paddr=p.addr
where v.AUDSID=USERENV('SESSIONID')
and v.MACHINE=SYS_CONTEXT('USERENV','HOST')
and v.TERMINAL=USERENV('TERMINAL')
/

Son résultat :

       
SID        USERNAME                       MACHINE                   
---------- ------------------------------ ------------------------- 
       633 SYS                            srvorcl.ojo.fr            
       
PROGRAM                                          TERMINAL                       
------------------------------------------------ ------------------------------      
sqlplus@srvorcl.ojo (TNS V1-V3)                  pts/2                          

OS PID                   PROCESS
------------------------ ------------------------  
147476                   147469       

On a OS PID qui correspond à l’identifiant du process de connexion de SQLPLUS à la base de données et process qui correspond l’indentifiant du process sqlplus

ps -edf | grep 147476 | grep -v grep
oracle   147476 147469  0 15:12 ?        00:00:00 oracleTECH (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

ps -edf | grep 147469 | grep -v grep
oracle   147469 197784  0 15:12 pts/2    00:00:00 sqlplus
oracle   147476 147469  0 15:12 ?        00:00:00 oracleORCL (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

Pour tuer la connexion sans tuer sqlplus (et se retrouver en mode nolog) c’est le process 147476 qu’il faut tuer.

C’était pourtant pas si compliqué

Effacer des vieux fichiers

Une commande de base qu’on oublie tout le temps

La commade pour effacer les fichiers de plus de 3 jours d’une sous arborescence.

find . -mtime +3 -exec rm {} \;

Utile pour purger les fichers d’uadit par exemple
C’était pourtant pas si compliqué

system state dump

Lancer un system state dump

Ma base est bloquée et je ne sais pas pourquoi … J’ouvre une SR, et forcé”ment pour qu’il y ait un peu de répondant il faut que j’envoie un hanganalyze et un systemstate dump. Les instructions :

connect / as sysdba
oradebug setmypid
oradebug unlimit
oradebug hanganalyze 3
-- wait 90 seconds
oradebug hanganalyze 3
oradebug dump systemstate 266
-- wait 90 seconds
oradebug dump systemstate 266
-- wait 90 seconds
oradebug dump systemstate 266

C’était pourtant pas si compliqué

Vérifier le paramétrage CBO spécifique à une instance

Normalement on sait comment se comporte l’optimiseur Oracle, mais quand on a des surprises, c’est parfois tout simplement lié au paramétrage CBO, donc avant de sauter aux conclusions un petit check-up n’est pas du luxe.

Deux requêtes pour ça, les premières, basées sur v$sys_optimizer_env, pour vérifier le paramétrage, la dernière, basée sur v$system_fix_control pour voir si on a modifié le patchset :

select NAME
     , VALUE
     , DEFAULT_VALUE 
from v$sys_optimizer_env 
where VALUE <> DEFAULT_VALUE ;

Résultat (pour exemple de pourquoi ce con m’a mis optimizer_index_caching à 100 ? )

NAME                                     VALUE                     DEFAULT_VALUE
---------------------------------------- ------------------------- -------------------------
_pga_max_size                            4194200 KB                2048000 KB
optimizer_index_cost_adj                 10                        100
optimizer_index_caching                  100                       0

Si on a la possibilité d’effectuer la requête en tant que SYS, on peut aller un peu plus loin avec la ‘fixed table’ x$qkscesys :

select pname_qkscesyrow NAME
     , PVALUE_QKSCESYROW VALUE
     , DEFPVALUE_QKSCESYROW default_value
from x$qkscesys 
where PVALUE_QKSCESYROW != DEFPVALUE_QKSCESYROW
union 
select name
     , value
     , default_value 
from v$sys_optimizer_env
where VALUE <> DEFAULT_VALUE ;

Il est à noter que l’on peut aussi travailler au niveau des sessions avec x$qksceses et v$ses_optimizer_env, attention cependant, ces vues renseignent les SID (Session ID) mais pas les valeurs par défaut.

select VALUE
     , DESCRIPTION
     , OPTIMIZER_FEATURE_ENABLE
from V$SYSTEM_FIX_CONTROL
where IS_DEFAULT=0 ;

C’était pourtant pas si compliqué.

Commenter le spfile ou les profiles SQL

Mais pourquoi est-ce que ce paramètre est positionné à cette valeur ? Qui ne s’est pas posé la question devant un optimizer_index_cost_adj qui n’est pas à 100 ou un NLS_SORT qui n’est pas à Binary. Le vilain qui a fait le coup n’a pas commenté. Alors que pour le faire il suffit de passer les bonnes commandes

Pour commenter une valeur que l’on passe au niveau du SPFILE (Commentaire de 255 caractères maximum):

alter system set PARAMETRE=VALEUR 
    comment='Gagne 42 minutes, le 25 mai 2001, D. N. Adams'  
    scope=spfile 
    sid='*' ;

Pour commenter un SQL_PROFILE existant (Commentaire de 500 caractères maximum):

begin
 sys.dbms_sqltune.ALTER_SQL_PROFILE( 'nomDuProfile'
                                   , 'COMMENT'
                                   , 'Souci sur V$OGONS, 
contourne 0RA-1952, 11 mars 2013, Z. Beeblebrox' ) ;
end;
/

C’était pourtant pas si compliqué

Identifier sa session

En PL/SQL

exec sys.dbms_session.set_identifier          ('identifiant de session')
exec sys.dbms_application_info.set_client_info('info client')
exec sys.dbms_application_info.set_module     ('module', 'action')

Eventuellement, si l’on veut ne changer que l’action

exec sys.dbms_application_info.set_action('action')

En PHP

<?php 
 oci_set_client_identifier($db , 'identifiant de session'); 
 oci_set_client_info      ($db , 'info client'); 
 oci_set_module_name      ($db , 'module'); 
 oci_set_action           ($db , 'action'); 
?>

Retrouver ces informations

select sys_context('USERENV', 'CLIENT_IDENTIFIER') as "client identifier"
     , sys_context('USERENV', 'CLIENT_INFO') as "client info"
     , sys_context('USERENV', 'MODULE') as module
     , sys_context('USERENV', 'ACTION') as action
from sys.dual ;

Avec un peu de mise en forme

SQL> col "client identifier" for a25
SQL> col "client info" for a17
SQL> col module for a17
SQL> col action for a17

SQL> /

client identifier         client info       MODULE            ACTION
------------------------- ----------------- ----------------- -----------------
identifiant de session    info client       module            action

C’était pourtant pas si compliqué

PS: On peut aussi le faire en java ou en .Net si tant est qu’on utilise encore des trucs aussi dépassés ou encore en C via la bibliothèque OCI1 si l’on est résolument moderne. Tout cela est détaillé dans l’excellent Troubleshooting Oracle Performance de Christian Antognini paru chez APress au chapitre 2 pages 45 à 48. Et de manière plus cryptique et éparpillée dans la documentation de l’éditeur.


1. OCI pour Oracle Call Interface, livré par Oracle avec tous les “clients”

Lister les structures mémoire

La structure mémoire (X$…) qui garde la trace des structures mémoires est x$kqfta pour les lister c’est la requête suivante :

select KQFTANAM from x$kqfta

ou, plus simple encore :

select name from v$fixed_table

C’est tout de même plus simple que de passer par un code perl qui ne va pas forcément s’avérer complet

Toujours intéressant à lire sur le sujet : http://www.orafaq.com/wiki/X$_Table ou encore http://yong321.freeshell.org/computer/x$table.html

Trouver le DDL d’une vue dynamique (V$… ou GV$…)

On utilise v$fixed_view_definition

SELECT * 
FROM v$fixed_view_definition 
where view_name = upper('v$fixed_view_definition')

On obtient :

V$FIXED_VIEW_DEFINITION
SELECT * FROM gv$fixed_view_definition where inst_id = USERENV('Instance')

Et donc, comme on a autre chose que du fromage blanc entre les oreille on passe la requête suivante :

SELECT * 
FROM v$fixed_view_definition 
where view_name = upper('gv$fixed_view_definition')

Pour finalement obtenir :

GV$FIXED_VIEW_DEFINITION
select i.inst_id,kqfvinam,kqftpsel from x$kqfvi i, x$kqfvt t where i.indx = t.indx

C’était pourtant pas si compliqué

Passer un processus déjà actif en nohup

C’est la commande disown sous Linux ou HP-UX qui s’occupe d’effectuer ce travail:

process_long

[ctrl+z]

bg

ps
   PID TTY         TIME CMD
 25098 pts/1       0:00 sh
 25549 pts/1       0:00 ksh
  9605 pts/1       0:00 ps
 25099 pts/1       0:00 process_long

disown -h 25099

Si le processus ne répond pas à [ctrl+z] on peut, à partir d’une autre session effectuer un ps aux pour récupérer son PID et ensuite faire un kill -20 PID suivi d’un kill -18 PID.

Kill -20 a pour effet de stopper le processus
Kill -18 a pour effet de le relancer en tâche de fond

Et si on n’est ni sous Linux, ni sous HP-UX ?
Pour Solaris et AIX la commande nohup -p fait la même chose que disown, le reste fonctionne.

C’était pourtant pas si compliqué

Rediriger le port HTTP (80) vers le port HTTPS (443) avec Apache

Apache doit écouter sur les ports 443 et 80

 

Listen 80
Listen 443

Attention cependant, la ligne Listen 443 est eut-être déjà présente dans le fichier ssl.conf (ou un autre) c’est à vérifier.

 

J’utilise pour le faire un hôte virtuel ( Virtual Host )

 

NameVirtualHost *:80
&lt;VirtualHost *:80&gt;
   ServerName alpha-ori.it
   Redirect permanent / https://alpha-ori.it/
&lt;/VirtualHost&gt;

 

C’était pourtant pas si compliqué.