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.