piątek, 9 października 2009

Resource Manager

Ostatnio wpadła mi do rąk książka przygotuwująca do OCP :

Bob Bryla "Administration II Exam Guide"

W rozdziale przedstawiającym użycie Resource Manager, znajduje się przykład stworzenie dość prostego planu przydziału zasobów. Tworzone są dwie grupy konsumenckie, przydzielani pewni użytkownicy bazy danych. Do planu dodawane są trzy "dyrektywy" : jak między te grupy przydzielić procesor oraz jaki maksymalny stopień równoległości transakcje przez nich inicjalizowane mogą posiadać.

Script w wesji dla konsoli sh znajduje się poniżej:

#!/bin/sh

ORACLE_HOME=/oracle
ORACLE_SID=ORCL;

sqlplus / as sysdba <

EXECUTE DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
EXECUTE DBMS_RESOURCE_MANAGER.CREATE_PLAN( PLAN => 'DEVELOPERS', -
COMMENT => 'Plan developerski');

EXECUTE DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP('DEV_USER','ONLINE_DEVELOPERS');
EXECUTE DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP -('BATCH_USER','BATCH_DEVELOPERS');

EXECUTE DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( PLAN=>'DEVELOPERS', -
GROUP_OR_SUBPLAN => 'ONLINE_DEVELOPERS', -
COMMENT =>'Przydzial zasobów dla aktywnych developerów', -
CPU_P1 => 80, -
CPU_P2 => 0, -
PARALLEL_DEGREE_LIMIT_P1 => 10);

EXECUTE DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( PLAN=>'DEVELOPERS', -
GROUP_OR_SUBPLAN => 'BATCH_DEVELOPERS', -
COMMENT =>'Przydzial zasobów dla batchowych developerów', -
CPU_P1 => 20, -
CPU_P2 => 0, -
PARALLEL_DEGREE_LIMIT_P1=>5);

EXECUTE DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( PLAN=>'DEVELOPERS', -
GROUP_OR_SUBPLAN => 'OTHER_GROUPS', -
COMMENT =>'Przydzial zasobów dla pozostałych', -
CPU_P1 => 0, -
CPU_P2 => 100, -
PARALLEL_DEGREE_LIMIT_P1=>5);

BEGIN
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
EXCEPTION
WHEN OTHERS THEN
DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA();
END;
/

EOF



Kod ten działa (!). Idąc dalej, aktywując go poleceniem

ALTER SYSTEM SET resource_manager_plan='DEVELOPERS' scope=memory;

nie zauważamy żadnych problemów. Ale gdy połączy się użytkownik BATCH_USER lub DEV_USER zauważmy, że UWAGA !!! obaj są przypisani do grup OTHER_GROUPS !!!

A więc w czym tkwi problem ?

Otóż, autora zapomniał dodać uprawnienia użytkownikom do przełączenia do ich grup !

Przed instrukcją EXECUTE DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP('DEV_USER','ONLINE_DEVELOPERS') należy dodać oto taki kawałek kodu PL/SQL:



EXECUTE DBMS_RESOURCE_MANAGER_PRIVS.
GRANT_SWITCH_CONSUMER_GROUP( GRANTEE_NAME => 'DEV_USER', CONSUMER_GROUP => 'ONLINE_DEVELOPERS',GRANT_OPTION=>FALSE);

EXECUTE DBMS_RESOURCE_MANAGER_PRIVS.
GRANT_SWITCH_CONSUMER_GROUP( GRANTEE_NAME => 'BATCH_USER', CONSUMER_GROUP => 'BATCH_DEVELOPERS',GRANT_OPTION=>FALSE);

BEGIN
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
EXCEPTION
WHEN OTHERS THEN
DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA();
END;
/


Być może autor zapomniał o tym nieświadomie. Jednakże zanim stwierdzimy, że kod z książek poświęcony technologią ORACLE jest poprawny, sprawdźmy to.