Oracle® Database Administrator's Guide 11g Release 1 (11.1)
Oracle® Database PL/SQL Packages and Types Reference 11g Release 1 (11.1)
Oracle® Database Reference 11g Release 1 (11.1)
The OCM 11G Upgrade Objective is:
Set up and configure Resource Manager to control active sessions, number of I/Os, execution time..etc
My reading of this and the experience of the 11G exam leads me to say that there are several possible sub-tasks:
Use a Sample Plan
Rather than create a resource plan from scratch, I used a sample predefined plan called MIXED_WORKLOAD_PLAN
from An Oracle-Supplied Mixed Workload Plan.
Although it would be nice to go through the agony of creating a new resource plan via PL/SQL, I think that the OEM interface is sufficiently robust to create a resource plan painlessly.
Activate Resource Plans
According to Enabling Oracle Database Resource Manager and Switching Plans, the system parameter, RESOURCE_MANAGER_PLAN
, needs to be set to a valid plan in order for Resource Plans to work:
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = MIXED_WORKLOAD_PLAN SCOPE = BOTH;
Ensure that MIXED_WORKLOAD_PLAN Plan is Active
The current active plan can be determined in one of two (2) ways. The first is to query the dynamic view, V$RSRC_PLAN
, to see what the top plan is:
SQL> SELECT * FROM v$rsrc_plan;
Or, by the system parameter, RESOURCE_MANAGER_PLAN
,
SQL> show parameter resource_manager_plan
NAME
resource_manager_plan
TYPE
string
VALUE
MIXED_WORKLOAD_PLAN
Or, if the maintenance window is currently active, the output is:
NAME
resource_manager_plan
TYPE
string
VALUE
SCHEDULER[0x2C0B]:DEFAULT_MAINTENANCE_PLAN
I want to see the switching between resource groups in action. The chosen resource plan, MIXED_WORKLOAD_PLAN
, switches between the INTERACTIVE_GROUP
and the BATCH_GROUP
when limits are exceeded.
The following SQL is a resource hog:
select sum( dbms_random.value() ) from dual connect by level < 10000000;
The obvious user is SH
who will need access to the following groups:
INTERACTIVE_GROUP
and;BATCH_GROUP
Change the Resource Group Mapping
Initially, the user, SH
, is mapped to the DEFAULT_CONSUMER_GROUP
:
SQL> SELECT username, initial_rsrc_consumer_group FROM dba_users WHERE username = 'SH';
USERNAME
SH
INITIAL_RSRC_CONSUMER_GROUP
DEFAULT_CONSUMER_GROUP
Since the resource plan, MIXED_WORKLOAD_PLAN
, does not mention the group, DEFAULT_CONSUMER_GROUP
, explictly, users in this group are mapped to the rule for OTHER_GROUPS
in the plan.
Instead of running in the OTHER_GROUPS
, the user, SH
, will be mapped to the INTERACTIVE_GROUP
and thereby be affected by possible group switching. This is done through the SET_CONSUMER_GROUP_MAPPING
procedure:
BEGIN dbms_resource_manager.clear_pending_area(); dbms_resource_manager.create_pending_area(); dbms_resource_manager.set_consumer_group_mapping( dbms_resource_manager.oracle_user, 'SH', 'INTERACTIVE_GROUP' ); dbms_resource_manager.submit_pending_area(); END;
Checking the initial resource consumer group is now correct via the DBA_USERS
view:
SQL> SELECT username, initial_rsrc_consumer_group FROM dba_users WHERE username = 'SH';
USERNAME
SH
INITIAL_RSRC_CONSUMER_GROUP
INTERACTIVE_GROUP
The user, SH
, has to be granted access to the following groups:
INTERACTIVE_GROUP
; andBATCH_GROUP
.Without giving the permission to switch into the BATCH_GROUP
, we get an error as follows when I try using the SWITCH_CURRENT_CONSUMER_GROUP
procedure:
SQL> connect sh/sh Connected. SQL> VARIABLE old_consumer_group VARCHAR2(32) SQL> EXEC DBMS_SESSION.switch_current_consumer_group( 'BATCH_GROUP', :old_consumer_group, TRUE ) Attempting to switch to BATCH_GROUP from current group BEGIN DBMS_SESSION.switch_current_consumer_group( 'BATCH_GROUP', :old_consumer_group, TRUE ); END; * ERROR at line 1: ORA-01031: insufficient privileges ORA-06512: at "SYS.DBMS_SESSION", line 130 ORA-06512: at line 1
Granting Group Switching Rights
According to Granting and Revoking the Switch Privilege,:
Using the DBMS_RESOURCE_MANAGER_PRIVS
PL/SQL package, you can grant or revoke the switch privilege to a user, role, or PUBLIC. The switch privilege enables a user or application to switch a session to a specified resource consumer group. It also enables the database to automatically switch a session to a consumer group specified in a session-to–consumer group mapping rule or specified in the SWITCH_GROUP parameter of a resource plan directive.
Emphasis Mine
Thus, I need to grant the privilege to switch into the target groups to the SH
user through the GRANT_SWITCH_CONSUMER_GROUP Procedure procedure as follows:
BEGIN dbms_resource_manager_privs.grant_switch_consumer_group( 'SH', 'INTERACTIVE_GROUP', FALSE ); dbms_resource_manager_privs.grant_switch_consumer_group( 'SH', 'BATCH_GROUP', FALSE ); END; /
Now, I test the ability of the SH
user to switch between groups by again using the SWITCH_CURRENT_CONSUMER_GROUP
procedure:
SQL> connect sh/sh Connected. SQL> select initial_rsrc_consumer_group from user_users; INITIAL_RSRC_CONSUMER_GROUP ------------------------------ INTERACTIVE_GROUP SQL> VARIABLE old_consumer_group VARCHAR2(32) SQL> exec DBMS_SESSION.switch_current_consumer_group( 'BATCH_GROUP', :old_consumer_group, TRUE ) PL/SQL procedure successfully completed. SQL> print old_consumer_group OLD_CONSUMER_GROUP -------------------------------------------------------------------------------- SQL> exec DBMS_SESSION.switch_current_consumer_group( 'BATCH_GROUP', :old_consumer_group, TRUE ) PL/SQL procedure successfully completed. SQL> print old_consumer_group OLD_CONSUMER_GROUP -------------------------------------------------------------------------------- SQL> exec DBMS_SESSION.switch_current_consumer_group( 'INTERACTIVE_GROUP', :old_consumer_group, TRUE ) PL/SQL procedure successfully completed. SQL> print old_consumer_group OLD_CONSUMER_GROUP -------------------------------------------------------------------------------- BATCH_GROUP
Note: The first switch says that the old consumer group is NULL even though the initial resource consumer group is not.
SQL for Experiment
The SQL to be tested is a guaranteed CPU hog:
select sum( dbms_random.value() ) from dual connect by level < 10000000;
Lower Thresholds for Group Switching
The supplied resource plan, MIXED_WORKLOAD_PLAN
, switches to BATCH_GROUP
after 60 seconds of CPU. I want to lower the switching threshold to five (5) CPU seconds by using UPDATE_PLAN_DIRECTIVE
procedure:
BEGIN DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA; DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE ( plan => 'MIXED_WORKLOAD_PLAN', group_or_subplan => 'INTERACTIVE_GROUP', new_switch_time => 5, new_switch_for_call => TRUE); DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA; DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA; END; /
Result of Experiment
Confimed that the SH
user is in the correct initial resource group:
select resource_consumer_group from v$session where username = 'SH';
RESOURCE_CONSUMER_GROUP
INTERACTIVE_GROUP
Run the SQL:
SQL> select sum( dbms_random.value() ) from dual connect by level < 10000000; SUM(DBMS_RANDOM.VALUE()) ------------------------ 4998828.87 Elapsed: 00:01:58.72
Statistics from the Experiment
The data from the dynamic view, V$RSRC_CONS_GROUP_HISTORY
, shows the group switching having occurred because the SQL exceeded the CPU quantum:
SELECT name, requests, consumed_cpu_time, switches_in_cpu_time, switches_out_cpu_time, sql_canceled, active_sess_killed FROM v$rsrc_cons_group_history WHERE sequence# = (SELECT MAX(sequence#) FROM V$RSRC_CONS_GROUP_HISTORY) AND name NOT LIKE 'ORA%' AND name <> '_ORACLE_BACKGROUND_GROUP_' ORDER BY name;
Here we see two (2) switches out of the INTERACTIVE_GROUP
and one (1) switch back in due to CPU threshold. And the reverse is true for the BATCH_GROUP
. It would appear that the switch from BATCH_GROUP
to INTERACTIVE_GROUP
is due to the SWITCH_AFTER_CALL
flag in the resource plan directive.
We confirm the resource consumer group after the call is back to the original:
SQL> select resource_consumer_group from v$session where username = 'SH';
RESOURCE_CONSUMER_GROUP
INTERACTIVE_GROUP
Update Plan Directive
To cancel the SQL statement after running for more than five (5) CPU seconds, the MIXED_WORKLOAD_PLAN
plan is updated to set the NEW_SWITCH_GROUP
to CANCEL_SQL
via the UPDATE_PLAN_DIRECTIVE
procedure:
BEGIN DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA; DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE ( plan => 'MIXED_WORKLOAD_PLAN', group_or_subplan => 'INTERACTIVE_GROUP', new_switch_time => 5, new_switch_group => 'CANCEL_SQL'); DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA; DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA; END; /
Run the Experiment Again
The same SQL is used again with the following results:
SQL> select sum( dbms_random.value() ) from dual connect by level < 10000000; select sum( dbms_random.value() ) from dual connect by level < 10000000 * ERROR at line 1: ORA-00040: active time limit exceeded - call aborted Elapsed: 00:00:05.30
Statistics from the Experiment
The data from the dynamic view, V$RSRC_CONS_GROUP_HISTORY
, shows the group switching having occurred because the SQL exceeded the CPU quantum:
SELECT name, requests, consumed_cpu_time, switches_in_cpu_time, switches_out_cpu_time, sql_canceled, active_sess_killed FROM v$rsrc_cons_group_history WHERE sequence# = (SELECT MAX(sequence#) FROM V$RSRC_CONS_GROUP_HISTORY) AND name NOT LIKE 'ORA%' AND name <> '_ORACLE_BACKGROUND_GROUP_' ORDER BY name;
This shows that the statistics are reset (actually given a new SEQUENCE#
) whenever the resource plan is updated.
Here we see the SQL being cancelled is being recorded for the INTERACTIVE_GROUP
.
I cannot make sense of the CONSUMED_CPU_TIME
value.
Update Plan Directive
To cancel the session whenever the SQL statement after running for more than five (5) CPU seconds, the MIXED_WORKLOAD_PLAN
plan is updated to set the NEW_SWITCH_GROUP
to KILL_SESSION
via the UPDATE_PLAN_DIRECTIVE
procedure:
BEGIN DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA; DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE ( plan => 'MIXED_WORKLOAD_PLAN', group_or_subplan => 'INTERACTIVE_GROUP', new_switch_time => 5, new_switch_group => 'KILL_SESSION'); DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA; DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA; END; /
Performance Problem
This change in Resource Plan Directive took a very long time (about 40 minutes to complete). The OEM top activity showed the following graph:
The ASH report for the period, 03:10 to 03:50, is attached as ASH_report_1327656054538.html
. The Top User Events were:
Run the Experiment Again
The same SQL is used again with the following results:
SQL> select sum( dbms_random.value() ) from dual connect by level < 10000000; select sum( dbms_random.value() ) from dual connect by level < 10000000 * ERROR at line 1: ORA-00041: active time limit exceeded - session terminated Elapsed: 00:00:05.80
Statistics from the Experiment
The data from the dynamic view, V$RSRC_CONS_GROUP_HISTORY
, shows the group switching having occurred because the SQL exceeded the CPU quantum:
SELECT name, requests, consumed_cpu_time, switches_in_cpu_time, switches_out_cpu_time, sql_canceled, active_sess_killed FROM v$rsrc_cons_group_history WHERE sequence# = (SELECT MAX(sequence#) FROM V$RSRC_CONS_GROUP_HISTORY) AND name NOT LIKE 'ORA%' AND name <> '_ORACLE_BACKGROUND_GROUP_' ORDER BY name;
And we see the statistic, ACTIVE_SESS_KILLED
, has a value of one (1) for when the session was killed.
Used the following SQL to restore the MIXED_WORKLOAD_PLAN
plan back to its original state:
BEGIN DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA; DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE ( plan => 'MIXED_WORKLOAD_PLAN', group_or_subplan => 'INTERACTIVE_GROUP', new_switch_time => 60, new_switch_group => 'BATCH_GROUP', new_switch_for_call => TRUE); DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA; DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA; END; /
This demonstration of the Resource Manager is far in excess of what is expected on the OCM 11G upgrade exam, but I wanted to explore as much as possible. I have demonstrated:
This was only done for CPU.
The performance of the plan updating is problematic. Probably a bug in Oracle RDBMS 11.1.0.6.
The values displayed in CONSUMED_CPU_TIME
of the V$RSRC_CONS_GROUP_HISTORY
dynamic view do not make any sense.