oracle resource manager - ghdrako/doc_snipets GitHub Wiki
Oracle Resource Manager składa się z następujących komponentów:
- Resource Consumer Group: Grupa sesji bazy danych o jednakowych lub podobnych potrzebach dotyczących zasobów. Zasoby są przypisywane grupom konsumentów, a nie indywidualnym sesjom.
- Resource Plan: Kontener dla dyrektyw, które określają, jakie zasoby mają być przypisane grupom konsumentów.
- Resource Plan Directive: Łączy grupę konsumentów z planem zasobów i określa, jak mają być przypisywane zasoby.
Uprawnienia
Domyślnie tylko użytkownik SYS ma prawo zarządzać planami zasobów. W tym przykładzie użytkownik MITP ma otrzymać to prawo.
EXEC DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SYSTEM_PRIVILEGE(grantee_name => 'MITP', admin_option => TRUE);
Weryfikacja czy resource manager włączony
SELECT VALUE
FROM V$PARAMETER
WHERE NAME = 'resource_manager_plan';
SHOW PARAMETER RESOURCE_MANAGER_PLAN;
Jeśli wynik to (null) lub pusty → Resource Manager jest wyłączony
Właczenie tranzakcji resource manager - wymagane przy zmianach w resource manager
Pending Area to tymczasowy obszar roboczy do konfiguracji. Dopóki konfiguracja znajduje się w Pending Area, plan nie jest jeszcze aktywowany. Przed zmianami w Resourec Manager utwórz Pending Area. Zmiany można w dowolnym momencie anulować, wywołując procedurę CLEAR_PENDING_AREA
.
EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
Bez tego zmiany w resource manager spowoduja blad: ORA-29364: pending area is not active
Utworzenie consumer grupy
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
CONSUMER_GROUP => 'TABLEAU_GROUP',
COMMENT => 'Grupa dla użytkownika Tableau');
END;
/
Przypisz użytkownika do tej grupy
BEGIN
DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING(
ATTRIBUTE => 'ORACLE_USER',
VALUE => 'TABLEAU_USER',
CONSUMER_GROUP => 'TABLEAU_GROUP');
END;
/
Utwórz plan zasobów (Resource Plan)
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN(
PLAN => 'LIMIT_TABLEAU_CPU',
COMMENT => 'Plan ograniczający Tableau do 10% CPU');
END;
/
Utworzenie planu z dynamicznym throttlingiem CPU
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN => 'LIMIT_TABLEAU_CPU',
GROUP_OR_SUBPLAN=> 'TABLEAU_GROUP',
COMMENT => 'Ograniczenie Tableau – niski priorytet',
MGMT_P1 => 1);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN => 'LIMIT_TABLEAU_CPU',
GROUP_OR_SUBPLAN=> 'OTHER_GROUPS',
COMMENT => 'Reszta systemu – wysoki priorytet',
MGMT_P1 => 9);
END;
/
Zatwierdzenie zmian w planie
EXEC DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
EXEC DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
Właczenie planu zasobow
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'LIMIT_TABLEAU_CPU' SCOPE=BOTH;
Weryfikacja
select name, cpu_managed from v$rsrc_plan where is_top_plan = 'TRUE';
SELECT PLAN, STATUS FROM DBA_RSRC_PLANS WHERE PLAN = 'LIMIT_TABLEAU_CPU'; -- STATUS = ACTIVE => plan jest aktywny
SELECT CONSUMER_GROUP FROM DBA_RSRC_CONSUMER_GROUPS WHERE CONSUMER_GROUP = 'TABLEAU_GROUP'; -- weryfikacja istnienia grupy
SELECT * FROM DBA_RSRC_GROUP_MAPPINGS WHERE ATTRIBUTE = 'ORACLE_USER' AND VALUE = 'TABLEAU_USER'; -- weryfikacja czu user przypisany do grupy
Weryfikacja ograniczen planu:
SELECT GROUP_OR_SUBPLAN, CPU_P1
FROM DBA_RSRC_PLAN_DIRECTIVES
WHERE PLAN = 'LIMIT_TABLEAU_CPU';
SELECT SESSION_ID, CONSUMER_GROUP
FROM V$RSRC_SESSION_INFO
WHERE CONSUMER_GROUP = 'TABLEAU_GROUP';
Oracle nie raportuje wprost % CPU per user, ale możesz użyć:
SELECT s.username, r.consumer_group, r.cpu_waits, r.cpu_wait_time
FROM v$session s
JOIN v$rsrc_session_info r ON s.sid = r.session_id
WHERE s.username = 'TABLEAU_USER';
CPU_WAITS i CPU_WAIT_TIME pokazują, jak często sesja musiała czekać na przydział CPU – co oznacza throttling.
-- Wejdź do trybu modyfikacji (pending area)
BEGIN
DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA;
DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;
END;
/
-- Utwórz plan zasobów (jeśli nie istnieje)
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN(
plan => 'LIMIT_TABLEAU_CPU',
comment => 'CPU throttling for Tableau only');
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -20001 THEN -- already exists
RAISE;
END IF;
END;
/
-- Utwórz grupę TABLEAU_GROUP (jeśli nie istnieje)
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
consumer_group => 'TABLEAU_GROUP',
comment => 'Group for Tableau user');
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -20001 THEN
RAISE;
END IF;
END;
/
-- Dyrektywa: Twardy limit 10% CPU dla TABLEAU
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => 'LIMIT_TABLEAU_CPU',
group_or_subplan => 'TABLEAU_GROUP',
comment => 'Strict 10% CPU cap for Tableau',
utilization_limit => 10);
END;
/
-- Dyrektywa: OTHER_GROUPS – bez ograniczeń
BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
plan => 'LIMIT_TABLEAU_CPU',
group_or_subplan => 'OTHER_GROUPS',
comment => 'No CPU limit for rest of system');
END;
/
-- Walidacja i zatwierdzenie planu
BEGIN
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA;
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA;
END;
/
-- Przypisz TABLEAU_USER do grupy
BEGIN
DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
grantee_name => 'TABLEAU_USER',
consumer_group => 'TABLEAU_GROUP',
grant_option => TRUE);
DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP(
user_name => 'TABLEAU_USER',
consumer_group => 'TABLEAU_GROUP');
END;
/
-- Włącz plan zasobów
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'LIMIT_TABLEAU_CPU' SCOPE=BOTH;