0% found this document useful (0 votes)
5 views18 pages

12c_Resource_plans

Uploaded by

anghaprapul
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views18 pages

12c_Resource_plans

Uploaded by

anghaprapul
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 18

Part One: Creating an Oracle 12c Container Database (CDB) Resource Plan

In a CDB since we have multiple pluggable databases sharing a set of common resources, we can prevent multiple workloads to compete with
each other for both system as well as CDB resources by using Resource Manager.

Let us look at an example of managing resources for Pluggable Databases (between PDB’s) at the multitenant Container database level.

The same can be achieved using 12c Cloud Control, but displayed here are the steps to be performed at the command line using the
DBMS_RESOURCE_MANAGER package.

With Resource Manager at the Pluggable Database level, we can limit CPU usage of a particular PDB as well as the number of parallel execution
servers which a particular PDB can use.

To allocate resources among PDB’s we use a concept of shares where we assign shares to particular PDB’s and a higher share to a PDB results in
higher allocation of guaranteed resources to that PDB.

At a high level the steps involved include:

 Create a Pending Area

 Create a CDB resource plan

 Create directives for the PDB’s

 Optionally update the default directives which will specify resources which any newly created PDB’s will be allocated or which will be
used when no directives have been explicitly defined for a particular PDB

 Optionally update the directives which apply by default to the Automatic Maintenance Tasks which are configured to run in the out of
the box maintenance windows

 Validate the Pending Area


 Submit the Pending Area

 Enable the plan at the CDB level by setting the RESOURCE_MANAGER_PLAN parameter

Let us look at an example.

We have 5 Pluggable databases contained in the Container database and we wish to enable resource management at the PDB level.

We wish to guarantee CPU allocation in the ratio 4:3:1:1:1 so that the CPU is distributed among the PDB’s in this manner:

PDBPROD1 : 40%
PDBPROD2: 30%
PDBPROD3: 10%
PDBPROD4 : 10%
PDBPROD5: 10%

Further for PDB’s PDBPROD3, PDBPROD4 and PDBPROD5 we wish to ensure that CPU utilization for these 3 PDB’s never crosses the 70% limit.

Also for these 3 PDB’s we would like to limit the maximum number of parallel execution servers available to the PDB.

The value of 70% means that if the PARALLEL_SERVERS_TARGET initialization parameter is 200, then the PDB cannot use more than a maximum
of 140 parallel execution servers. For PDBPROD1 and PDBPROD2 there is no limit, so they can use all 200 parallel execution servers if available.

We also want to limit the resources used by the Automatic Maintenance Tasks jobs when they do execute in a particular job window and also
want to specify a default resource allocation limit for newly created PDB’s or those PDB’s where a resource limit directive has not been explicitly
defined.

Create the Pending Area

SQL SYS@PRODCDB> exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();


PL/SQL procedure successfully completed.

Create the CDB resource plan

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(
plan => 'PRODCDB_PLAN',
comment => 'CDB resource plan for PRODCDB');
END;
/ 2 3 4 5 6

PL/SQL procedure successfully completed.

Create directives which will specify how resources are allocated to each particular PDB

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'PRODCDB_PLAN',
pluggable_database => 'PDBPROD1',
shares => 4,
utilization_limit => 100,
parallel_server_limit => 100);
END;
/ 2 3 4 5 6 7 8 9

PL/SQL procedure successfully completed.

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'PRODCDB_PLAN',
pluggable_database => 'PDBPROD2',
shares => 3,
utilization_limit => 100,
parallel_server_limit => 100);
END;
/ 2 3 4 5 6 7 8 9

PL/SQL procedure successfully completed.

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'PRODCDB_PLAN',
pluggable_database => 'PDBPROD3',
shares => 2,
utilization_limit => 70,
parallel_server_limit => 70);
END;
/ 2 3 4 5 6 7 8 9

PL/SQL procedure successfully completed.

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
2 3 plan => 'PRODCDB_PLAN',
4 pluggable_database => 'PDBPROD4',
5 shares => 1,
6 utilization_limit => 70,
7 parallel_server_limit => 70);
8 END;
9 /
SQL SYS@PRODCDB> SQL SYS@PRODCDB> SQL SYS@PRODCDB> 2 3 plan => 'PRODCDB_PLAN',
4 pluggable_database => 'PDBPROD5',
5 shares => 1,
6 utilization_limit => 70,
7 parallel_server_limit => 70);
8 END;
9 /

PL/SQL procedure successfully completed.

Update (if required) default directive applies to PDBs for which specific directives have not been defined

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER.UPDATE_CDB_DEFAULT_DIRECTIVE(
plan => 'PRODCDB_PLAN',
new_shares => 1,
new_utilization_limit => 50,
new_parallel_server_limit => 50);
END;
/ 2 3 4 5 6 7 8

PL/SQL procedure successfully completed.

Update the directive (if required) which will limit the resources available to run the Automatic Maintenance Tasks

SQL SYS@PRODCDB> BEGIN


2 DBMS_RESOURCE_MANAGER.UPDATE_CDB_AUTOTASK_DIRECTIVE(
3 plan => 'PRODCDB_PLAN',
4 new_shares => 1,
5 new_utilization_limit => 75,
6 new_parallel_server_limit => 75);
7 END;
8 /

PL/SQL procedure successfully completed.

Validate the Pending Area

SQL exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();

PL/SQL procedure successfully completed.

Submit the Pending Area

SQL exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();

PL/SQL procedure successfully completed.

Enable the CDB resource plan

SQL ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'PRODCDB_PLAN';

System altered.

If we launch Database Express (or OEM for that matter) we can now see the resource allocation to each of the PDB’s as well as the resource
utilization limit which has been imposed on some of the PDB’s.
We can also query the DBA_CDB_RSRC_PLAN_DIRECTIVES view to obtain the same information in some more detail

SQL SYS@PRODCDB> SQL SYS@PRODCDB> SQL SYS@PRODCDB> SQL SYS@PRODCDB> SELECT PLAN,
2 PLUGGABLE_DATABASE,
3 SHARES,
4 UTILIZATION_LIMIT,
5 PARALLEL_SERVER_LIMIT
6 FROM DBA_CDB_RSRC_PLAN_DIRECTIVES
7 ORDER BY PLAN;

Parallel
Pluggable Utilization Server
Plan Database Shares Limit Limit
-------------------------- ------------------------- ------ ----------- --------
DEFAULT_CDB_PLAN ORA$AUTOTASK 90 100
DEFAULT_CDB_PLAN ORA$DEFAULT_PDB_DIRECTIVE 1 100 100
DEFAULT_MAINTENANCE_PLAN ORA$AUTOTASK 90 100
DEFAULT_MAINTENANCE_PLAN ORA$DEFAULT_PDB_DIRECTIVE 1 100 100
Parallel
Pluggable Utilization Server
Plan Database Shares Limit Limit
-------------------------- ------------------------- ------ ----------- --------
ORA$INTERNAL_CDB_PLAN ORA$DEFAULT_PDB_DIRECTIVE
ORA$INTERNAL_CDB_PLAN ORA$AUTOTASK
ORA$QOS_CDB_PLAN ORA$AUTOTASK 90 100
ORA$QOS_CDB_PLAN ORA$DEFAULT_PDB_DIRECTIVE 1 100 100
PRODCDB_PLAN PDBPROD3 2 70 70
PRODCDB_PLAN PDBPROD5 1 70 70
PRODCDB_PLAN PDBPROD2 3 100 100
PRODCDB_PLAN PDBPROD1 4 100 100
PRODCDB_PLAN PDBPROD4 1 70 70

Parallel
Pluggable Utilization Server
Plan Database Shares Limit Limit
-------------------------- ------------------------- ------ ----------- --------
PRODCDB_PLAN ORA$AUTOTASK 1 75 75
PRODCDB_PLAN ORA$DEFAULT_PDB_DIRECTIVE 1 50 50

20 rows selected.

exec DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();

BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN(
plan => 'PRODCDB_PLAN',
comment => 'CDB resource plan for PRODCDB');
END;
/

BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'PRODCDB_PLAN',
pluggable_database => 'PDBPROD1',
shares => 4,
utilization_limit => 100,
parallel_server_limit => 100);
END;
/

BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'PRODCDB_PLAN',
pluggable_database => 'PDBPROD2',
shares => 3,
utilization_limit => 100,
parallel_server_limit => 100);
END;
/

BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'PRODCDB_PLAN',
pluggable_database => 'PDBPROD3',
shares => 1,
utilization_limit => 70,
parallel_server_limit => 70);
END;
/

BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'PRODCDB_PLAN',
pluggable_database => 'PDBPROD4',
shares => 1,
utilization_limit => 70,
parallel_server_limit => 70);
END;
/

BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CDB_PLAN_DIRECTIVE(
plan => 'PRODCDB_PLAN',
pluggable_database => 'PDBPROD5',
shares => 1,
utilization_limit => 70,
parallel_server_limit => 70);
END;
/

BEGIN
DBMS_RESOURCE_MANAGER.UPDATE_CDB_DEFAULT_DIRECTIVE(
plan => 'PRODCDB_PLAN',
new_shares => 1,
new_utilization_limit => 50,
new_parallel_server_limit => 50);
END;
/

BEGIN
DBMS_RESOURCE_MANAGER.UPDATE_CDB_AUTOTASK_DIRECTIVE(
plan => 'PRODCDB_PLAN',
new_shares => 1,
new_utilization_limit => 75,
new_parallel_server_limit => 75);
END;
/

exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();

exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();

ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'PRODCDB_PLAN';

Part Two: Creating an Oracle 12c Pluggable Database (PDB) Resource Plan

We have seen how a CDB resource plan allocates resources among the various PDB’s in the container database.

The PDB resource plan will now allocate resources within the database based on Consumer Groups – the method is in fact the same as what we
used for Non-CDB’s in earlier versions of the Oracle database.

Our requirement is to ensure certain Batch users do not hog the system resources when batch jobs execute and we would like to enable a PDB
resource plan which will impose limits on the amount of Undo the statement can use as well as the amount of time the statement is allowed to
run and also the amount of physical I/O resources it can use.

At a high level the steps involved are:

 Connect to the appropriate PDB where we need to create the PDB Resource Plan

 Create the Pending Area

 Create the Consumer Groups

 Map sessions to the Consumer Groups


 Create the PDB Resource Plan

 Create PDB resource plan directives

 Validate the Pending Area

 Submit the Pending Area

 Enable the PDB Resource Plan

Connect to the appropriate PDB


SQL SYS@PRODCDB> alter session set container=pdbprod4;

Session altered.

Create the Pending Area

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
END;
/ 2 3 4

PL/SQL procedure successfully completed.

Create the PDB Resource Plan


SQL SYS@PRODCDB> BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN => 'pdbprod4_plan',
COMMENT => 'Resource plan at the PDB level');
END;
/ 2 3 4 5

PL/SQL procedure successfully completed.


Create the Consumer Groups

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'batch_user_group',
COMMENT => 'Resource consumer group for batch users');
END;
/ 2 3 4 5

PL/SQL procedure successfully completed.

Create the directives which will limit resources allocated to a particular Consumer Group

Note – 20 MB of UNDO usage is a very small value – only used to illustrate the example!

SQL SYS@PRODCDB> BEGIN


2 DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'pdbprod4_plan',
3 GROUP_OR_SUBPLAN => 'batch_user_group',
4 COMMENT=>'Cancel SQL statement after exceeding either 20 MB of Undo, elapsed time of 3 minutes or limit i/o to 10
MB',
5 UNDO_POOL => 20000,
6 SWITCH_ELAPSED_TIME => 180,
7 SWITCH_IO_MEGABYTES => 10,
8 SWITCH_GROUP=>'CANCEL_SQL',
9 SWITCH_FOR_CALL=> TRUE);
10 END;
11 /

PL/SQL procedure successfully completed.

Here are some of the other common directives we can set (taken from the official documentation)

 MAX_IDLE_TIME – maxiumum session idle time in seconds


 MAX_EST_EXEC_TIME - maximum execution time (in CPU seconds) allowed for a call as determined by the CBO
 SWITCH_IO_REQS - number of physical I/O requests that a session can execute before an action is taken
 PARALLEL_SERVER_LIMIT - maximum percentage of the parallel execution server pool that a particular consumer group can use
 SWITCH_IO_LOGICAL - Number of logical I/O requests that will trigger the action specified by SWITCH_GROUP
 ACTIVE_SESS_POOL_P1 - Specifies the maximum number of concurrently active sessions for a consumer group.
 MGMT_P1 - For a plan with the MGMT_MTH parameter set to EMPHASIS, specifies the CPU percentage to allocate at the first level
 MGMT_P2 - For a plan with the MGMT_MTH parameter set to EMPHASIS, specifies the CPU percentage to allocate at the second level
Create a directive for the mandatory Consumer Group OTHER_GROUPS. This will apply to all users not mapped to the Consumer
Group BATCH_USER_GROUP
SQL SYS@PRODCDB> BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'pdbprod4_plan',
2 3 GROUP_OR_SUBPLAN => 'OTHER_GROUPS',
4 COMMENT => 'Mandatory Group covering all users not in batch group');
5 END;
6 /

Map the user SH to the Consumer Group BATCH_USER_GROUP and set the initial Consumer Group for the user SH

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
ATTRIBUTE => DBMS_RESOURCE_MANAGER.ORACLE_USER,
VALUE => 'SH',
CONSUMER_GROUP => 'batch_user_group');
END;
/ 2 3 4 5 6 7

PL/SQL procedure successfully completed.

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP ( 'SH','batch_user_group',FALSE);
END;
/ 2 3 4

PL/SQL procedure successfully completed.

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER.set_initial_consumer_group('SH', 'batch_user_group');
END;
/ 2 3 4

PL/SQL procedure successfully completed.


Validate the Pending Area

SQL SYS@PRODCDB> BEGIN


DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
END;
/

PL/SQL procedure successfully completed

Submit the Pending Area


BEGIN
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
END;
/

PL/SQL procedure successfully completed.

Enable the PDB Resource Plan


SQL SYS@PRODCDB> alter system set resource_manager_plan='pdbprod4_plan';

System altered.

SQL SYS@PRODCDB> show parameter resource_manager_plan

NAME TYPE VALUE


------------------------------------ ----------- ------------------------------
resource_manager_plan string pdbprod4_plan

Let us now test the PDB resource plan and see if the directive to limit the use of Undo to 20 MB is enforced.

Initially we can see that the user SH which belongs to the BATCH_USER_GROUP Consumer Group is not using any Undo.

SQL SYS@PRODCDB> alter system set resource_manager_plan='pdbprod4_plan';


System altered.

SQL SYS@PRODCDB> show parameter resource_manager_plan

NAME TYPE VALUE


------------------------------------ ----------- ------------------------------
resource_manager_plan string pdbprod4_plan

From another session let us connect as the user SH and execute an UPDATE statement which will cause the amount of Undo usage to exceed the
20 MB limit.

SQL SH@pdbprod4> update sh.sales set amount_sold=1;

Back to the original session we can now Undo usage is increasing – and then we see it has gone back to 0

This is because the session was cancelled as the resource limit of 20 MB Undo usage was exceeded

SQL SYS@PRODCDB> /

SESS_ID CONSUMER_GROUP CURRENT_UNDO_CONSUMPTION MAX_UNDO_CONSUMPTION


---------- -------------------------------- ------------------------ --------------------
43 BATCH_USER_GROUP 6342144 0
74 OTHER_GROUPS 0 0

SQL SYS@PRODCDB> /

SESS_ID CONSUMER_GROUP CURRENT_UNDO_CONSUMPTION MAX_UNDO_CONSUMPTION


---------- -------------------------------- ------------------------ --------------------
43 BATCH_USER_GROUP 11872540 0
74 OTHER_GROUPS 0 0

SQL SYS@PRODCDB> /

SESS_ID CONSUMER_GROUP CURRENT_UNDO_CONSUMPTION MAX_UNDO_CONSUMPTION


---------- -------------------------------- ------------------------ --------------------
43 BATCH_USER_GROUP 11872540 0
74 OTHER_GROUPS 0 0

SQL SYS@PRODCDB> /
SESS_ID CONSUMER_GROUP CURRENT_UNDO_CONSUMPTION MAX_UNDO_CONSUMPTION
---------- -------------------------------- ------------------------ --------------------
43 BATCH_USER_GROUP 11872540 0
74 OTHER_GROUPS 0 0

SQL SYS@PRODCDB> /

SESS_ID CONSUMER_GROUP CURRENT_UNDO_CONSUMPTION MAX_UNDO_CONSUMPTION


---------- -------------------------------- ------------------------ --------------------
43 BATCH_USER_GROUP 0 0
74 OTHER_GROUPS 0 0

SQL SH@pdbprod4> update sh.sales set amount_sold=1;


update sh.sales set amount_sold=1
*
ERROR at line 1:
ORA-56720: I/O data limit exceeded - call aborted

If we limit the usage of Undo now by including a WHERE clause in the UPDATE statement, we can see that the Undo usage remains below the 20
MB imposed resource limit and the statement executes successfully this time.

SQL SH@pdbprod4> update sh.sales set amount_sold=1 where rownum < 50001;

50000 rows updated.

SQL SYS@PRODCDB> /

SESS_ID CONSUMER_GROUP CURRENT_UNDO_CONSUMPTION MAX_UNDO_CONSUMPTION


---------- -------------------------------- ------------------------ --------------------
43 BATCH_USER_GROUP 9565964 0
74 OTHER_GROUPS 0 0

SQL SYS@PRODCDB> /

SESS_ID CONSUMER_GROUP CURRENT_UNDO_CONSUMPTION MAX_UNDO_CONSUMPTION


---------- -------------------------------- ------------------------ --------------------
43 BATCH_USER_GROUP 10830200 0
74 OTHER_GROUPS 0 0
SQL SYS@PRODCDB> /

SESS_ID CONSUMER_GROUP CURRENT_UNDO_CONSUMPTION MAX_UNDO_CONSUMPTION


---------- -------------------------------- ------------------------ --------------------
43 BATCH_USER_GROUP 12400376 0
74 OTHER_GROUPS 0 0

SQL SYS@PRODCDB> /

SESS_ID CONSUMER_GROUP CURRENT_UNDO_CONSUMPTION MAX_UNDO_CONSUMPTION


---------- -------------------------------- ------------------------ --------------------
43 BATCH_USER_GROUP 12400376 0
74 OTHER_GROUPS 0 0

You might also like