oracle resource manager - ghdrako/doc_snipets GitHub Wiki

obraz

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;