RAC et "profiles" des utilisateurs

Limiter les ressources à disposition d’une application est un bon moyen d’éviter les sur-accidents avec ou sans RAC! Plusieurs exemples viennent à l’esprit où un problème a dégénéré parce que l’application s’est comportée de manière inadéquate à la suite d’un incident. Dans le cas de RAC, votre base de données est censée survivre à plusieurs de ces incidents, alors…

Parmi ces exemples, un phénomène que vous avez malheureusement peut-être vécu vous-même : (1) les temps de réponse des requêtes se dégradent, (2) les serveurs d’applications allouent plus de connexions dans leurs pools, (3) de plus en plus de sessions sont actives sur les serveurs de base de données et (4) les temps de réponse des requêtes SQL sont de moins en moins bons.

Mettre en oeuvre « Resource Manager » et/ou les « Profiles » peut vous aider à limiter, à défaut de corriger, ces mauvais comportements d’une application ou d’un serveur d’applications. Mais ce n’est toutefois pas l’objet de ce post. L’objet, c’est plutôt: « Les limites des « profiles » sont-elles valables pour toute la base de données ou par instance? »

En effet, la documentation associée n’est pas très explicite; comme rien ne vaut de vérifier par soi-même, voici un extrait de mes tests:


create profile demo
limit sessions_per_user 1;

create user demo
identified by demo
profile demo;

grant create session to demo;

-- Connect with session 1:
connect demo/demo

-- Connect with session 2 on the same node:
sqlplus /nolog
connect demo/demo

ERROR:
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit

Warning: You are no longer connected to ORACLE.

-- Connect with session 2 on another node:
sqlplus /nolog
connect demo/demo

-- From a 3rd session, check the connections

col profile format a10
col resource_name format a20
col limit format a5

select profile, resource_name, limit
from dba_profiles
where profile='DEMO'
and resource_name='SESSIONS_PER_USER';

PROFILE RESOURCE_NAME LIMIT
---------- -------------------- -----
DEMO SESSIONS_PER_USER 1

select profile
from dba_users
where username='DEMO';

PROFILE
------------------------------
DEMO

-- Check the connected users:
select inst_id, count(*)
from gv$session
where username='DEMO'
group by inst_id;

INST_ID COUNT(*)
------- --------
1 1
2 1

-- Connect with session 3 on node 2:
sqlplus /nolog
connect demo/demo

ERROR:
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit

Warning: You are no longer connected to ORACLE.

-- drop the user and profile;
drop user demo;
drop profile demo

Les limites sont donc valables par instance, même si vous ne pouvez pas definir des valeurs différentes pour chacune d’entre-elles. Avant de mettre en oeuvre cette fonctionnalité, regardez l’impact sur les requêtes parallèles.