13 Resource Manager Plan - SQL Script

This section contains the contents of the Resource Manager Plan script that must be run after the upgrade, if Oracle Fusion Applications is running on an Oracle Virtual Machine (VM) environment. This script can be used to create FUSION Resource plan in Oracle 11g as well as in Oracle 12c for both PDB and Non-CDB.

To apply the FUSIONAPPS_PLAN (Resource Manager Plan) post upgrade, run the following SQL script as the privileged database user (SYSTEM/SYS):

SET LINES 200 PAGES 300
WHENEVER SQLERROR EXIT

DECLARE
comp varchar2(20);
pdbs varchar2(20);
USRROW NUMBER(2):= 0;
BEGIN
select substr(value,1,2) into comp from v$parameter where name='compatible';
SELECT COUNT(1) INTO USRROW FROM user_role_privs WHERE GRANTED_ROLE='DBA';
        IF USRROW=0 THEN
        RAISE_APPLICATION_ERROR (-20100, 'Insufficient privileges. You need DBA privileges to run this script.');
        END IF;

IF comp>11 then
select sys_context('userenv','con_name') into pdbs from dual;
   IF pdbs='CDB$ROOT' then
   RAISE_APPLICATION_ERROR (-20111, 'Please run this script connnecting as FUSION PDB, You are connected to CDB.');
   END iF;   
END IF;

  DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA();
  DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();

  --Removing FUSIONAPPS_PLAN from scheduler windows before deleting
  begin
    for REC in  (select WINDOW_NAME from DBA_SCHEDULER_WINDOWS where RESOURCE_PLAN = 'FUSIONAPPS_PLAN' )  LOOP
        DBMS_SCHEDULER.SET_ATTRIBUTE (rec.window_name,'resource_plan','');
    end LOOP;
  end;

  begin
    DBMS_RESOURCE_MANAGER.SWITCH_PLAN( PLAN_NAME => '');
    DBMS_RESOURCE_MANAGER.DELETE_PLAN('FUSIONAPPS_PLAN');
  EXCEPTION WHEN OTHERS THEN NULL;
  END;

  BEGIN
    dbms_resource_manager.delete_consumer_group(CONSUMER_GROUP => 'FUSIONAPPS_ONLINE_GROUP');
  EXCEPTION  WHEN OTHERS THEN NULL;
  END;

  BEGIN
    dbms_resource_manager.delete_consumer_group(CONSUMER_GROUP => 'FUSIONAPPS_BATCH_GROUP');
  EXCEPTION  WHEN OTHERS THEN NULL;
  END;
 
  BEGIN
    dbms_resource_manager.delete_consumer_group(CONSUMER_GROUP => 'FUSIONAPPS_DIAG_GROUP');
  EXCEPTION  WHEN OTHERS THEN NULL;
  END;
 
  dbms_resource_manager.create_consumer_group(CONSUMER_GROUP => 'FUSIONAPPS_ONLINE_GROUP', COMMENT => 'Consumer Group for online users');
  dbms_resource_manager.create_consumer_group(CONSUMER_GROUP =>'FUSIONAPPS_BATCH_GROUP', COMMENT => 'Consumer Group for batch');

  dbms_resource_manager.create_consumer_group(CONSUMER_GROUP =>'FUSIONAPPS_DIAG_GROUP', COMMENT => 'Consumer Group for FUSION_RO and FUSION_ERO');
  dbms_resource_manager.create_plan(PLAN => 'FUSIONAPPS_PLAN', COMMENT => 'Fus Applications Resource Plan');

  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( plan => 'FUSIONAPPS_PLAN', 
                                               GROUP_OR_SUBPLAN => 'FUSIONAPPS_ONLINE_GROUP', 
                                               comment => 'Online users at level 1', 
                                               MGMT_P1 => 35, 
                                               PARALLEL_DEGREE_LIMIT_P1 => 0, 
                                               SWITCH_TIME => 1200, 
                                               SWITCH_IO_MEGABYTES => 10000, 
                                               SWITCH_GROUP => 'CANCEL_SQL',
                                               switch_for_call => TRUE );

  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( plan => 'FUSIONAPPS_PLAN', 
                                               GROUP_OR_SUBPLAN => 'FUSIONAPPS_BATCH_GROUP', 
                                               comment => 'Batch users at level 1', 
                                               MGMT_P1 => 25);

  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( plan => 'FUSIONAPPS_PLAN', 
                                               GROUP_OR_SUBPLAN => 'SYS_GROUP', 
                                               comment => 'System administrator group at level 1', 
                                               MGMT_P1 => 10);

  DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( plan => 'FUSIONAPPS_PLAN', 
                                               GROUP_OR_SUBPLAN => 'OTHER_GROUPS', 
                                               comment => 'Other users at level 1', 
                                               MGMT_P1 => 5);

  --Add directives for maintenance and diag process during maintenance windows
  --Note: These allocations are only active during maintenance windows.
  
      IF pdbs<>'CDB$ROOT' and comp='12' then   
        DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( plan => 'FUSIONAPPS_PLAN', 
                                               GROUP_OR_SUBPLAN => 'ORA$AUTOTASK', 
                                               comment => 'Maintenance Tasks', 
                                               MGMT_P1 => 20);  
      ELSE IF comp<>'12' then
      DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( plan => 'FUSIONAPPS_PLAN', 
                                               GROUP_OR_SUBPLAN => 'ORA$AUTOTASK_SUB_PLAN', 
                                               comment => 'Maintenance Tasks', 
                                               MGMT_P1 => 15);                                               

      DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( plan => 'FUSIONAPPS_PLAN', 
                                               GROUP_OR_SUBPLAN => 'ORA$DIAGNOSTICS', 
                                               comment => 'Background Diag Processes', 
                                               mgmt_P1 => 5);   
     END IF;
     END IF;
                                                                                            
  
   DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( plan => 'FUSIONAPPS_PLAN', 
                                               GROUP_OR_SUBPLAN => 'FUSIONAPPS_DIAG_GROUP', 
                                               comment => 'Diagnostic users at level 1', 
                                               mgmt_P1 => 5,                                                                                          
                                               PARALLEL_DEGREE_LIMIT_P1 => 0, 
                                               SWITCH_TIME => 120, 
                                               SWITCH_IO_MEGABYTES => 10000, 
                                               SWITCH_GROUP => 'CANCEL_SQL',
                                                MAX_EST_EXEC_TIME => 100,
                                               switch_for_call => TRUE );
                                                                                           
  FOR rec IN  (SELECT username FROM dba_users WHERE (username LIKE '%FUSION%'  or username ='FMW_RUNTIME'))  LOOP
    IF (rec.username = 'FUSION_RO' OR rec.username = 'FUSION_ERO') THEN
      dbms_resource_manager.set_consumer_group_mapping(attribute => DBMS_RESOURCE_MANAGER.ORACLE_USER, value => rec.username, CONSUMER_GROUP => 'FUSIONAPPS_DIAG_GROUP');       
    ELSIF (rec.username <> 'FUSION_READ_ONLY') THEN
      dbms_resource_manager.set_consumer_group_mapping(attribute => DBMS_RESOURCE_MANAGER.ORACLE_USER, value => rec.username, CONSUMER_GROUP => 'FUSIONAPPS_BATCH_GROUP');
    END IF;
  end LOOP;
  
  begin
    DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(attribute => DBMS_RESOURCE_MANAGER.ORACLE_USER,value => 'SEARCHSYS', CONSUMER_GROUP => 'FUSIONAPPS_BATCH_GROUP');
    --Specifically for RMAN: any session running a backup/copy operation with RMAN is automatically switched to SYS_GROUP when the operation begins.
    DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING( attribute => DBMS_RESOURCE_MANAGER.ORACLE_FUNCTION, value => 'BACKUP', CONSUMER_GROUP => 'SYS_GROUP');
    DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING( attribute => DBMS_RESOURCE_MANAGER.ORACLE_FUNCTION, value => 'COPY', consumer_group => 'SYS_GROUP');    
  EXCEPTION  WHEN OTHERS THEN NULL;
  end;

  
  DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
  DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
  DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA();
  dbms_resource_manager_privs.grant_switch_consumer_group('PUBLIC','FUSIONAPPS_ONLINE_GROUP',FALSE);
  DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP('PUBLIC','FUSIONAPPS_BATCH_GROUP',false);
  DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP('PUBLIC','FUSIONAPPS_DIAG_GROUP',false);
  --Grant DBA role privilege to switch to SYS_GROUP. Assumption is that any ADMIN task (including RMAN) will be performed by user with DBA Privileges.  
  ---SYS/SYSTEM already map to SYS_GROUP by default.
  DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP('DBA','SYS_GROUP',FALSE);
 
  --Associate FUSIONAPPS_PLAN to  all defined maintenance windows 
  begin
    for REC in  (SELECT WINDOW_NAME FROM DBA_SCHEDULER_WINDOWS WHERE resource_plan IS NULL OR RESOURCE_PLAN = '' )  LOOP
        DBMS_SCHEDULER.SET_ATTRIBUTE (rec.window_name,'resource_plan','FUSIONAPPS_PLAN');
    end LOOP;
  end;

begin
    --Sets the current resource manager plan
    DBMS_RESOURCE_MANAGER.SWITCH_PLAN( PLAN_NAME => 'FUSIONAPPS_PLAN');
  end;
 
 
END;
/

--- Setting newly created FUSION resource plan.
alter system set resource_manager_plan='FUSIONAPPS_PLAN' scope=both;