Oracle - uživatelské profily a resource plan

Zpracoval: Petr Svoboda

Obsah

Uživatelské profily

Profil je pojmenovaná množina limitů, kterou lze přiřadit uživateli. Uživatelský profil umožňuje nastavit kolik jakých prostředků uživatel může spotřebovat.

Každému uživateli můžeme přiřadit vlastní profil. Uživatelé bez konktrétního profilu mají přiřazen výchozí (DEFAULT) profil.

Ve výchozím nastavení nejsou limity nastavené přes profily povoleny. Zapnout je lze dvěma způsoby:

Vytvoření profilu

K vytvoření profilu je potřeba systémové oprávnění CREATE PROFILE.

CREATE PROFILE clerk LIMIT
  SESSIONS_PER_USER 2
  CPU_PER_SESSION unlimited
  CPU_PER_CALL 6000
  LOGICAL_READS_PER_SESSION unlimited
  LOGICAL_READS_PER_CALL 100
  IDLE_TIME 30  CONNECT_TIME 480;

Všechny nenastavené limity se nastaví z výchozího profilu – profil DEFAULT. Ve výchozím nastavení jsou v něm všechny limity nastavené na UNLIMITED.

Správa profilů

Každému uživateli lze přiřadit maximálně jeden profil. Pokud je uživateli přiřazen profil a uživatel již nějaký má, starý profil se nahradí novým. Profil se uplatní až při dalším přihlášení uživatele. Profily nelze přiřazovat rolím.

Profily lze upravovat pomocí ALTER PROFILE. Hodnotu limitu lze nastavit na výchozí nastevením hodnoty DEFAULT.

ALTER PROFILE clerk LIMIT
  CPU_PER_CALL default
  LOGICAL_READS_PER_SESSION 20000;

Existuje také speciální limit COMPOSITE_LIMIT, který umožňuje nastavit limit celkové zátěže, kterou uživatel generuje. Nastavuje se v tzv. „service units“, což je vážená suma vybraných prostředků.

Způsob výpočtu „service units“ lze nastavit pomocí ALTER RESOURCE COST. Nastavit lze cenu těchto zdrojů:

ALTER RESOURCE COST
  CPU_PER_SESSION 1
  LOGICAL_READS_PER_SESSION 50;

Celkovou cenu zdrojů pak spočteme jako:

cost = (1 * CPU_PER_SESSION) + (50 * LOGICAL_READS_PER_SESSION)

Profil smažeme příkazem DROP PROFILE clerk CASCADE;.

Infomace o profilech lze zjistit např. takto:

SELECT USERNAME, PROFILE FROM DBA_USERS;
SELECT * FROM DBA_PROFILES ORDER BY PROFILE;

Další související views:

Nastavení profilu

CREATE USER jward IDENTIFIED BY aZ7bC2 PROFILE clerk;

Limity

SESSIONS_PER_USER

Specify the number of concurrent sessions to which you want to limit the user.

CPU_PER_SESSION

Specify the CPU time limit for a session, expressed in hundredth of seconds.

CPU_PER_CALL

Specify the CPU time limit for a call (a parse, execute, or fetch), expressed in hundredths of seconds.

CONNECT_TIME

Specify the total elapsed time limit for a session, expressed in minutes.

IDLE_TIME

Specify the permitted periods of continuous inactive time during a session, expressed in minutes. Long-running queries and other operations are not subject to this limit.

LOGICAL_READS_PER_SESSION

Specify the permitted number of data blocks read in a session, including blocks read from memory and disk.

LOGICAL_READS_PER_CALL

Specify the permitted the number of data blocks read for a call to process a SQL statement (a parse, execute, or fetch).

PRIVATE_SGA

Specify the amount of private space a session can allocate in the shared pool of the system global area (SGA), expressed in bytes. Use K or M to specify this limit in kilobytes or megabytes.

COMPOSITE_LIMIT

Specify the total resource cost for a session, expressed in service units. Oracle calculates the total service units as a weighted sum of CPU_PER_SESSION, CONNECT_TIME, LOGICAL_READS_PER_SESSION, and PRIVATE_SGA.

FAILED_LOGIN_ATTEMPTS

Specify the number of failed attempts to log in to the user account before the account is locked.

PASSWORD_LIFE_TIME

Specify the number of days the same password can be used for authentication. The password expires if it is not changed within this period, and further connections are rejected.

PASSWORD_REUSE_TIME

Specify the number of days before which a password cannot be reused. If you set PASSWORD_REUSE_TIME to an integer value, then you must set PASSWORD_REUSE_MAX to UNLIMITED.

PASSWORD_REUSE_MAX

Specify the number of password changes required before the current password can be reused. If you set PASSWORD_REUSE_MAX to an integer value, then you must set PASSWORD_REUSE_TIME to UNLIMITED.

PASSWORD_LOCK_TIME

Specify the number of days an account will be locked after the specified number of consecutive failed login attempts.

PASSWORD_GRACE_TIME

Specify the number of days after the grace period begins during which a warning is issued and login is allowed. If the password is not changed during the grace period, the password expires.

PASSWORD_VERIFY_FUNCTION

The PASSWORD_VERIFY_FUNCTION clause lets a PL/SQL password complexity verification script be passed as an argument to the CREATE PROFILE statement. Oracle provides a default script, but you can create your own routine or use third-party software instead.

RESOURCE PLAN

Pomocí RESOURCE PLANu lze vytvořit skupiny uživatelů a těmto skupinám nastavit, jakým způsobem mohou sdílet zdroje na serveru. Funkce pro jeho správu se nacházejí v balíčku funkcí DBMS_RESOURCE_MANAGER.

Jednoduchý RESOURCE PLAN

BEGIN DBMS_RESOURCE_MANAGER.CREATE_SIMPLE_PLAN(
  SIMPLE_PLAN => 'great_bead',
  CONSUMER_GROUP1 => 'sales',
  GROUP1_CPU => 60,
  CONSUMER_GROUP2 => 'market',
  GROUP2_CPU => 20,
  CONSUMER_GROUP3 => 'develop',
  GROUP3_CPU => 20);
END;

Skupin může být maximálně osm.

Víceúrovňový RESOURCE PLAN

Skupin může být v jednom plánu maximálně 32 a může mít maximálně 32 úrovní. Jedna skupina může být i ve více plánech.

Pending area

Před vytvořením víceúrovňového RESOURCE PLANu je nejprve potřeba vytvořit tzv. pending area, kde lze resource plan vytvořit, ověřit korektnost a teprve z ní je plán nahrán do systému. Při jejím vytvoření jsou do ní nahrány staré plány, které také možné upravovat.

EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;
EXEC DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA;
EXEC DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA;
EXEC DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA;

Validaci není potřeba volat, ale je vhodná při vlastním vytváření.

Plány Vytváření, rušení a aktualizace plánů.

EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN => 'great_bread', COMMENT => 'great plan');
EXEC DBMS_RESOURCE_MANAGER.UPDATE_PLAN(PLAN => 'great_bread', NEW_COMMENT => 'great plan for great bread');
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN(PLAN => 'great_bread');
EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN_CASCADE(PLAN => 'great_bread');

Skupiny

Vytváření, rušení a aktualizace skupin.

EXEC DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP (
  CONSUMER_GROUP => 'sales', 
  COMMENT => 'retail and wholesale sales');
UPDATE_CONSUMER_GROUP
DELETE_CONSUMER_GROUP

Po smazání skupiny se uživatel stane členem DEFAULT_CONSUMER_GROUP. Týká se to i běžících sessions.

Speciální skupiny:

Možná omezení

Čas na procesoru: kolik času může skupina strávit na procesoru, 8 úrovní priorit, skupina na nižší prioritě dostane čas na procesoru teprve tehdy, když všechny skupiny výše již vyčerpaly své zdroje.

Aktivní sessions: nastavuje, kolik může mít uživatel aktivních sessions, pokud by jejich počet překročil, je požadavek zařazen do fronty.

Stupeň paralelismu.

Automatické přepínání skupin: určuje, za jakých podmínek bude session automaticky přeřazena do jiné skupiny:

Doba běhu operace: při jejím překročení je operace přerušena.

Velikost, kterou skupina může zabrat v „undo pool“.

Výchozí plán

GroupLevel 1Level 2Level 3
SYS_GROUP100,00%--
OTHER_GROUPS-100,00%-
LOW_GROUP--100,00%

Pravidla plánu

Vytvoření ekvivalntního plánu k příkladu s jednoduchým plánem (zatím bez skupin).

BEGIN DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE (
  PLAN => 'great_bread',  GROUP_OR_SUBPLAN => 'market',
  COMMENT => 'marketing group',  CPU_P1 => 20);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE (
  PLAN => 'great_bread',  GROUP_OR_SUBPLAN => 'develop',
  COMMENT => 'development group',  CPU_P1 => 20);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE (
  PLAN => 'great_bread',  GROUP_OR_SUBPLAN => 'OTHER_GROUPS',
  COMMENT => 'this one is required',  CPU_P1 => 0, CPU_P2 => 100);
END;
GroupLevel 1Level 2Level 3
SYS_GROUP100,00%--
sales-60,00%-
market-20,00%-
develop-20,00%-
OTHER_GROUPS--100,00%

Změny pravidel plánu

EXEC DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE (
  PLAN => 'great_bread',
  GROUP_OR_SUBPLAN => 'develop',
  NEW_CPU_P1 => 15);
DELETE_PLAN_DIRECTIVE

Omezení

CPU_P1-P8 (procenta)
ACTIVE_SESS_POOL_P1 QUEUEING_P1 (timeout in s)
PARALLEL_DEGREE_LIMIT_P1 SWITCH_GROUP SWITCH_TIME (s)
SWITCH_ESTIMATE (bool)
MAX_EST_EXEC_TIME (s)
UNDO_POOL

Interakce mezi plány: pokud je jedna skupina ve více plánech - je vybrán ten nejvíce omezující, u počtu sessions a času na CPU je to součet.

Správa skupin Nastavení výchozí skupiny

EXEC DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP ('scott', 'sales', TRUE);
EXEC DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP('scott', 'sales');

Povolení resource manageru