防止資源的過度消耗:ORM可以從session級別控制CPU、Undo等系統資源的過度消耗.通過定義使用比例的方法防止CPU被某個session獨占耗光;合理調度系統資源:單獨控制各session的資源利用率,可以將寶貴的系統資源(比如CPU)按照比例分配給不同的用戶組,給一些重要的應用提供 足夠的資源,回收浪費的資源; 控制數據庫資源:通過ORM,控制數據庫的有限資源(Undo,CPU等)的分配方式; 兼容操作系統的資源調整:在一個多CPU系統中,ORM兼容OS調度分配,均衡分配CPU的使用;
Oracle Resource Manager相關內容
ORM由一系列的組件組成,這些組件的相互配合可以完成比較復雜的數據庫資源分配.
Resource Plans:定義資源配置計劃,plans是一個樹形結構的組織,可以創建多個plans,但同時只能有一個plan激活被系統使用;
Resource consumer groups:資源組定義
Resource allocation method:每個計劃中可以定義和控制分配的數據庫資源;
Resource plans directives:將每個計劃配置分配到相應的資源組;
levels:定義了CPU的優先級別,目前可以支持8個級別,當上級的group沒有消耗分配的CPU,可以順延到下個level使用;
Oracle 9i中ORM(Oracle Resource Manager)
9i對ORM進行了增強,在8i的基礎上提供了多種可控的Oracle資源.
CPU Method(8i提供)
通過該方法可以對非常稀缺的CPU資源進行分配,Oracle提供了8個levels控制CPU的使用,對不同的group按照百分比分配不同比例的CPU;上一級沒有使用完的CPU 資源會自動過度到下個level的group繼續使用;
Degree of Parallelism Limit(8i提供)
限制每個資源組並行操作的最大並行度;
Active Session Pool with Queuing
控制每個resource group可以創建的最大sessions,這裡指活動的session,如果一個session進入inactive狀態,會自動退出session pool,讓一下session進入session pool,Oracle默認利用FIFO(First In First Out)的原則維護active session pool隊列.如果一個並行的會話進入隊列,Oracle會默認其多個session為一個獨立的session.
Execution Time Limit
有時間我們需要防止一個長查詢或大事務耗光系統資源,可通過該參數定義大型查詢或事務的運行時間,如果超過了設定的時間,Oracle會自動終止查詢或事物,以秒為單位.
Automatic Consumer Group Switching
8i中允許session或user可以在資源組之間手動切換,9i增強了這一功能,允許其自動切換。9i提供了兩個參數控制資源組的自動替換:
SWITCH_GROUP:定義session或user切換的新的group;
SWITCH_TIME:以秒為單位,定義了session或user在原group中任務多長時間後還沒結束就可以切換到新的group;
Undo Pool
控制每個group可用使用的最大Undo空間,如果事務執行的過程中發現Undo消耗殆盡,後續事務會持續等待直到有可用的Undo空間.
ORM的管理
OEM:圖形化的ORM管理接口,支持創建、監控ORM等操作;
DBMS_RESOURCE_MANAGER:ORM的PL/SQL API;
DBMS_RESOURCE_MANAGER_PRIVS:ORM權限管理API
ORM相關視圖:
DBA_RSRC_PLANS
DBA_RSRC_CONSUMER_GROUPS
DBA_RSRC_PLAN_DIRECTIVES
DBA_RSRC_CONSUMER_GROUP_PRIVS
V$RSRC_PLAN
V$RSRC_CONSUMER_GROUP
ORM(Oracle Resource Manager)的權限
ORM只有ADMINISTER_RESOURCE_MANAGER系統權限,不支持通過grant,revoke的管理方式;必須通過DBMS_RESOURCE_MANAGER_PRIVS進行GRANT和REVOKE;
Oracle中使用ORM(Oracle Resource Manager)
Oracle有一個跟ORM相關的參數:RESOURCE_MANAGER_PLAN,定義好了RESOURCE PLAN之後,必須設置此參數以啟用ORM,只有一個RESOURCE PLAN可以激活使用,此參數支持ALTER SESSION/ALTER SYSTEM動態修改.
ORM舉例
REM 創建測試用戶
CREATE USER OA_USER IDENTIFIED BY iv1234
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
ACCOUNT UNLOCK;
CREATE USER OA_ADMIN IDENTIFIED BY iv1234
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP ACCOUNT UNLOCK;
GRANT CONNECT TO OA_USER;
GRANT CONNECT TO OA_ADMIN;
–創建相關的組
BEGIN
--清楚ORM臨時區域
DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA;
--創建新的ORM臨時區域
DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
CONSUMER_GROUP =>'OA_USER_ONLINE',
COMMENT =>'創建OA系統的資源管理組');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
CONSUMER_GROUP =>'OA_USER_ADMIN',
COMMENT =>'OA 系統的後台服務資源組');
--創建PLAN
DBMS_RESOURCE_MANAGER.CREATE_PLAN(
PLAN =>'OA_ORM',
COMMENT =>'OA 數據庫資源計劃');
--創建PLAN DIRECTIVES
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN =>'OA_ORM', GROUP_OR_SUBPLAN =>'OA_USER_ONLINE', COMMENT =>'oa在線用戶資源控制計劃',
CPU_P1 =>70,
CPU_P2 =>0,
ACTIVE_SESS_POOL_P1 =>3000,
PARALLEL_DEGREE_LIMIT_P1 =>2,
MAX_EST_EXEC_TIME =>900);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN =>'OA_ORM',
GROUP_OR_SUBPLAN =>'OA_USER_ADMIN',
COMMENT =>'oa在線用戶後台服務資源控制計劃',
CPU_P1 =>10,
CPU_P2 =>0,
ACTIVE_SESS_POOL_P1 =>5,
PARALLEL_DEGREE_LIMIT_P1 =>2,
MAX_EST_EXEC_TIME =>900);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN =>'OA_ORM', GROUP_OR_SUBPLAN =>'OTHER_GROUPS', COMMENT =>'其他應用的資源計劃',
CPU_P1 =>0,
CPU_P2 =>100,
PARALLEL_DEGREE_LIMIT_P1 =>2);
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA;
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA;
END;
/
–初始化OA_USER、OA_ADMIN的資源組
BEGIN
DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
GRANTEE_NAME =>'OA_USER',
CONSUMER_GROUP=>'OA_USER_ONLINE',
GRANT_OPTION=>FALSE);
DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
GRANTEE_NAME =>'OA_ADMIN',
CONSUMER_GROUP=>'OA_USER_ADMIN',
GRANT_OPTION=>FALSE);
DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP(
USER =>'OA_USER',
CONSUMER_GROUP=>'OA_USER_ONLINE');
DBMS_RESOURCE_MANAGER.SET_INITIAL_CONSUMER_GROUP(
USER =>'OA_ADMIN',
CONSUMER_GROUP=>'OA_USER_ADMIN');
--允許OA_ADMIN可以替換到GROUP OA_USER_ONLINE
DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
GRANTEE_NAME =>'OA_ADMIN',
CONSUMER_GROUP=>'OA_USER_ADMIN',
GRANT_OPTION=>FALSE);
END;
/
–查詢GROUP的切換
select username,initial_rsrc_consumer_group from dba_users WHERE username IN('OA_USER','OA_ADMIN');
USERNAME
------------------------------------------------------------
INITIAL_RSRC_CONSUMER_GROUP
------------------------------------------------------------
OA_ADMIN
OA_USER_ADMIN
OA_USER
OA_USER_ONLINE
–在數據庫中啟用OA_ORM plans
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN='OA_ORM' scope=BOTH;
System altered.
–看看session的登錄信息
select username,resource_consumer_group from v$session where username='OA_USER';
USERNAME
------------------------------------------------------------
RESOURCE_CONSUMER_GROUP
----------------------------------------------------------------
OA_USER
OA_USER_ONLINE
select username,resource_consumer_group from v$session where username='OA_ADMIN';
USERNAME
------------------------------------------------------------
RESOURCE_CONSUMER_GROUP
----------------------------------------------------------------
OA_ADMIN
OA_USER_ADMIN