Search notes:

Oracle Database Resource Manager

The Database Resource Manager (DBRM) allows to
Oracle recommends to use DBRS when using parallel statement execution in concurrent environments.
begin
--
-- Prevent ORA-29370: pending area is already active:
--
-- dbms_resource_manager requires the corresponding privileges
--
   dbms_resource_manager.clear_pending_area;
--
   dbms_resource_manager.create_pending_area;
end;
/
dbms_resource_manager.create_pending_area seems to set all resource consumer group categories categories to PENDING:
select * from dba_rsrc_categories where status = 'PENDING';
begin
   dbms_resource_manager.create_consumer_group(
        consumer_group   => 'limit_exec_time_grp',
        comment          => 'Don''t let users run statements for longer than a given amoun of time'
   );
end;
/

select * from dba_rsrc_consumer_groups where lower(consumer_group) = 'limit_exec_time_grp';
begin
   dbms_resource_manager.create_plan(
        plan             => 'limit_exec_time_pln',
        comment          => 'Kill a statement when it exceeds the permitted execution time'
   );
end;
/
The plan was created, but no plan directives were added:
select
   pln.num_plan_directives,
   pln.*
from
   dba_rsrc_plans pln
where
   lower(pln.plan) = 'limit_exec_time_pln';
begin
   dbms_resource_manager.create_plan_directive(
        plan             => 'limit_exec_time_pln',
        group_or_subplan => 'limit_exec_time_grp',
        switch_time      =>  3                   , -- After three seconds, switch to 
        switch_group     => 'CANCEL_SQL'         , -- CANCEL_SQL, which is one of the predefined resource manager consumer groups
        switch_estimate  =>  false               ,
        switch_for_call  =>  true                ,
        comment          => 'Kill a statement when it exceeds the permitted execution time'
   );
end;
/

select * from dba_rsrc_plan_directives where lower(plan) = 'limit_exec_time_pln';
begin
--
-- Fallback for non-impacted users.
-- OTHER_GROUPS needs to be included in each top plan,
-- otherwise, validate_pending_area throws
--   ORA-29377: consumer group OTHER_GROUPS is not part of top-plan
--
   dbms_resource_manager.create_plan_directive(
        plan             => 'limit_exec_time_pln',
        group_or_subplan => 'OTHER_GROUPS',
        comment          => 'Don''t impact others'
   );
end;
/
begin
   dbms_resource_manager.validate_pending_area;
   dbms_resource_manager.submit_pending_area;
end;
/
begin
   dbms_resource_manager_privs.grant_switch_consumer_group(
        grantee_name     => 'RENE',
        consumer_group   => 'limit_exec_time_grp',
        grant_option     =>  false
   );

end;
/
select * from dba_rsrc_consumer_group_privs where granted_group = 'LIMIT_EXEC_TIME_GRP';
begin
   dbms_resource_manager.set_initial_consumer_group(
        user             => 'RENE',
        consumer_group   => 'limit_exec_time_grp');
end;
/
select
   usr.initial_rsrc_consumer_group
from
   dba_users usr
where
   usr.username = 'RENE';
alter system
      set resource_manager_plan = limit_exec_time_pln
      scope                     = memory;
Force the session to be terminated so that we can start with a new session:
alter session set events 'immediate crash';
connect rene/rene
select
   username,
   resource_consumer_group 
from
   v$session
where
   sid = sys_context('userenv', 'sid');
Execute an SQL statement that takes a long time. It will throw ORA-00040: active time limit exceeded - call aborted after approximately 3 seconds:
select count(*) from dba_objects, dba_objects, dba_objects, dba_objects;
But this one runs ok:
begin
   dbms_session.sleep(10);
end;
/
So does this one:
with
   function f(s integer) return integer is
   begin
      dbms_session.sleep(s);
      return s;
   end f;
select f(2) from dual union all
select f(3) from dual union all
select f(4) from dual
/
Cleaning up:
alter system
      set resource_manager_plan = ''
      scope                     = memory;

begin
   dbms_resource_manager.create_pending_area;
   dbms_resource_manager.delete_plan('limit_exec_time_pln');
   dbms_resource_manager.delete_consumer_group('limit_exec_time_grp');
   dbms_resource_manager.validate_pending_area;
   dbms_resource_manager.submit_pending_area;
end;
/

TODO

begin
   dbms_resource_manager.switch_consumer_group_for_sess (
      session_id     => to_number(substr(dbms_session.unique_session_id, 1, 4),'XXXX'),
      session_serial => to_number(substr(dbms_session.unique_session_id, 5, 4),'XXXX'),
      consumer_group =>'limit_exec_time_grp'
   );
end;
/
select * from v$rsrc_consumer_group;
select * from v$rsrc_plan;
select * from v$rsrc_plan_history;
select * from v$rsrc_session_info;

See also

dbms_resource_manager, dbms_resource_manager_privs
dba_rsrc_plans, dba_rsrc_plan_directives
v$rsrc_*
resource_manager_plan
ORA-00040: active time limit exceeded - call aborted
The object type RESOURCE PLAN.

Index

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 8 attempt to write a readonly database in /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php:78 Stack trace: #0 /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php(78): PDOStatement->execute(Array) #1 /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php(30): insert_webrequest_('/notes/developm...', 1758199476, '216.73.216.150', 'Mozilla/5.0 App...', NULL) #2 /home/httpd/vhosts/renenyffenegger.ch/httpsdocs/notes/development/databases/Oracle/Resource-Manager/index(247): insert_webrequest() #3 {main} thrown in /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php on line 78