資料庫資源管理器(Database Resource Manager)

tonyzhou_cn發表於2012-10-29

資料庫資源管理  
從Oracle8i開始, oracle  提供了一個新的功能:資料庫資源管理器(Database Resource Manager),它增強了資料庫資源的管理能力。下面是簡單的介紹:

§1.資源管理概述
資源管理器有三個部件組成:資源使用者組(Resource consumer group )、資源規劃(Resource plan )、資源分配方法(Resource allocation method)及資源計劃目錄(Resource plan directives) 。它們的功能如下:

部件        說明
資源使用者組        根據資料庫資源處理需求,將使用者會話分成組
資源規劃        指定哪些資源分配給資源使用者的命令
資源分配方法        資料庫資源管理器分配特殊資源時採用的方法,由資源使用者組和資源規劃來使用。
資源規劃命令        管理員使用這些命令將資源使用者組與特殊規劃連線起來,並在資源使用者組之間分配資源。

資料庫資源管理器可以完成:

l        確保某些使用者處理少量的資源,不考慮對系統的載入和使用者的數量。
l        按比例將CPU時間分配給不同的使用者和程式,分配有效的處理資源。
l        限制一組使用者可以使用的並行度。
l        對例項進行配置,使其能使用特殊的資源分配方法。例如,DBA不用關閉資料庫例項就可以動態地改變這些配置方法。


§2. 配置資料庫資源管理器
要配置Oracle8i的資料庫管理員,使用者必須有ADMINISTER_RESOURCE_MANAGER許可權。一般的ADMIN都有這樣的許可權。
ADMINISTER_RESOURCE_MANAGER是一個程式包,它包括有下面的過程:

過程        描述
CREATE_PLAN        命名資源規劃並指定分配的方法
UPDATE_PLAN        更新資源規劃的註釋
DELETE_PLAN        刪除資源規劃及命令
DELETE_PLAN_CASCADE        刪除資源規劃及所有分支
CREATE_CONSUMER_GROUP        命名資源使用者組並指定其分配方法
UPDATE_CONSUMER_GROUP        更新資源使用者組的註釋
DELETE_CONSUMER_GROUP        刪除資源使用者組
CREATE_PLAN_DIRECTIVE        指定一個規劃中或多級規劃模式命令
UPDATE_PLAN_DIRECTIVE        更新規劃命令
DELETE_PLAN_DIRECTIVE        刪除規劃命令
CREATE_PENDING_AREA        在建立規劃中掛起
VALIDATE_PENDING_AREA        確定掛起的規劃
CLEAR_PENDING_AREA        清除掛起的規劃
SUBMIT_PENDING_AREA        提交所有的規劃模式
SET_INITIAL_CONSUMER_GROUP        為使用者設定初始化使用者組
SWITCH_CONSUMER_GROUP_FOR_SESS        切換指定會話的使用者組
SWITCH_CONSUMER_GROUP_FOR_USES        切換屬於指定使用者的所有會話的使用者組


作為ADMIN管理員,可能需要將管理員的許可權授予其他的使用者或角色。那麼管理員還要具有DBMS_RESOURCE_MANAGER_PRIVS程式包的執行權。下表是該包的過程說明:

過程        描述
GRANT_SYSTEM_PRIVILEGE        授權ADMINISTER_RESOURCE_MANAGER系統許可權給使用者或角色
REVOKE_SYSTEM_PRIVILEGE        取消使用者或角色的ADMINISTER_RESOURCE_MANAGER系統許可權
GRANT_SWITCH_CONSUMER_GROUP        授權“許可”給使用者、角色或PUBLIC,以便可切換到該指定的資源使用者組
REVOKE_SWITCH_CONSUMER_GROUP        取消使用者、角色或PUBLIC切換到指定的資源使用者組的“許可”


例1:給SCOTT使用者授權系統許可權:

EXECUTE DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SYSTEM_PRIVILEGE
(GRANTEE_NAME=>;’SCOTT’,
PRIVILEGE_NAME=>;’ADMINISTER_RESOURCE_MANAGER’,
ADMIN_OPTION=>;FALSE);

要取消SCOTT使用者的許可權,只能用
EXECUTE DBMS_RESOURCE_MANAGER_PRIVS.REVOKE_SYSTEM_PRIVILEGE來進行。如:

例2:取消SCOTT使用者授權系統許可權:
EXECUTE DBMS_RESOURCE_MANAGER_PRIVS. REVOKE _SYSTEM_PRIVILEGE
(GRANTEE_NAME=>;’SCOTT’,
PRIVILEGE_NAME=>;’ADMINISTER_RESOURCE_MANAGER’);


§3 建立和管理資源規劃
一旦將系統的適當許可權分配給了使用者,則接下來就是用資料庫資源管理器來建立資料庫的物件(元素)。即建立:

l        資源使用者組
l        資源規劃命令
l        資源規劃

這些規劃建立完後,規劃資訊被存放在資料字典的表中。下圖是資源規劃和使用者組的形象圖:

                                     


                                                 圖 28-1  一個簡單的規劃

上面的圖是一個規劃只包括一層資源使用者組的情況。實際情況可以是一個規劃包括其它的規劃(子規劃);子規劃再對應到使用者組。如下圖:

                                     

 

§3.1 為建立規劃模式使用掛起區域
為建立和修改規劃模式,使用者首先要建立掛起區域。這是一個臨時的區域,在該區域裡允許使用者進行變化。

建立一個掛起區域:

使用下面語句建立一個掛起的區域:

EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;

使用者可以啟用掛起的區域,並將所有現存的、活動規劃模式載入到掛起的區域。這樣可以實現更新或增加新的規劃。活動規劃模式是那些已由資料庫管理器儲存在資料字典中準備執行的模式。也就是說,使用者得先啟用掛起的區域才能更新規劃或增加規劃。規劃的活動情況可以從資料庫檢視中查到(見後面章節)。

驗證變化(validating changes):

當使用者掛起區域的所有改變時,可以用下面過程來進行驗證:

EXEC DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA;

例子:

SQL>; EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;

PL/SQL procedure successfully completed.

SQL>; exec dbms_resource_manager.validate_pending_area;

PL/SQL procedure successfully completed.


提交變化:

在驗證變化沒有問題之後,可以用提交過程來將變化進行提交:

EXEC DBMS_RESOURCE_MANAGER_SUNMIT_PENDING_AREA;

提示:提交也需要驗證,所以一般可以與其他的操作一起驗證。


清除掛起區域:

一般使用者在重新進行改變前都需要清除掛起區域。它有下面過程來實現:

EXEC DBAMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA;


$3.2 建立資源規劃
建立資源規劃時可以指定下面的引數:

引數        描述
PLAN        規劃的名稱
COMMENT        任何註釋
CPU_MTH        CPU分配方法。EMPPHSIS是Oracle版本的預設方法。
MAX_ACTIVE_SESS_TARGET_MTH        為以後版本預六的引數
PARALLEL_DEGREE_LIMIT_MTH        操作並行度限制。預設為:PARALLEL_DEGREE_LIMIT_ABSOLUTE


建立一個規劃:

使用CREATE_PLAN過程可以建立一個規劃。如:

EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN=>;’great_bread’,comment=>;’great plan’);

更新一個規劃:

可以用UPDATE_PLAN過程來修改一個規劃。如:

EXEC DBMS_RESOURCE_MANAGER.UPDATE_PLAN(
PLAN=>;’great_bread’,
NEW_COMMENT=>;’great plan for great bread’);

刪除一個規劃:

當不需要某個規劃時,可以用DELETE_PLAN過程來刪除一個規劃。如:

EXEC DBMS_RESOURCE_MANAGER.DELETE_PLAN(PLAN=>;’great_bread’);

§3.3 建立使用者組
資源應用組(Resource consumer group)用於定義一個應用的使用者組。這裡使用者組非常類似於原來的Oracle角色。差別在應用組是用來管理資源;然而角色是用來管理資料庫物件和系統許可權。在預設下,每個應用使用者組都屬於至少一個資源應用組。這些應用使用者組是:


SQL>;select * from DBA_RSRC_CONSUMER_GROUPS

CONSUMER_GROUP       CPU_METHOD     COMMENTS                                              STATUS    MAN
----------------------    -----------        ---------------------------------------- -------- ---
OTHER_GROUPS           ROUND-ROBIN   consumer group for users not included in     ACTIVE   YES
                                                                any group in the active top-plan
DEFAULT_CONSUMER_GROUP  ROUND-ROBIN consumer group for users not assigned to  ACTIVE   YES
                                                               any group
SYS_GROUP               ROUND-ROBIN      Group of system sessions                                 ACTIVE   NO
LOW_GROUP              ROUND-ROBIN      Group of low priority sessions                         ACTIVE   NO
OTHER_GROUPS           ROUND-ROBIN    consumer group for users not included in   PENDING  YES
                                                                 any group in the active top-plan
DEFAULT_CONSUMER_GROUP ROUND-ROBIN consumer group for users not assigned to  PENDING  YES
                                                                  any group
SYS_GROUP               ROUND-ROBIN        Group of system sessions                             PENDING  NO
LOW_GROUP              ROUND-ROBIN       Group of low priority sessions                      PENDING  NO

8 rows selected.

資源組名稱        描述
SYS_GROUP        這個組有很高的優先權,sys和system使用者都指定到這個組。
LOW_GROUP        這個組有很低的優先權,每個使用者都房屋這個組。
DEFAULT_CONSUMER_GROUP        不明確的使用者都可以被指定到這個組。
OTHER_GROUP        沒有被指定到規劃中的所有使用者組都屬於這個組。


下表是建立使用者組時可以指定的引數:
引數        描述
CONSUMER_GROUP        使用者組名稱
COMMENT        任何註釋
CPU_MTH        為資源使用者組分配CPU資源的方法,確定為ROUND_ROBIN,這是唯一的方法


建立一個使用者組:

使用CREATE_CONSUMER_GROUP 過程實現建立一個資源使用者組。如:

EXEC DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(
Consumer_group=>;’sales’
Comment=>;’retail and wholesale sales’);

更新一個使用者組:

使用UPDATE_CONSUMER_GROUP 過程實現更新一個資源使用者組的資訊。如:

EXEC DBMS_RESOURCE_MANAGER.UPDATE_CONSUMER_GROUP(
Comment=>;’retail and wholesale sales !!’);

刪除一個使用者組:

使用DELETE_CONSUMER_GROUP 過程實現刪除一個資源使用者組的資訊。


§3.4 指定資源規劃指令
資源規劃指令可為使用者組指定資源規劃和資源引數。在指定資源規劃時可以用下面引數來為使用者指定引數:


引數        描述
PLAN        資源規劃名稱
GROUP_OR_SUBPLAN        資源使用者組或子規劃的名稱
COMMENT        任何註釋
CPU_P1        指出第1級CPU的百分比
CPU_P2        指出第2級CPU的百分比
CPU_P3        指出第3級CPU的百分比
CPU_P4        指出第4級CPU的百分比
CPU_P5        指出第5級CPU的百分比
CPU_P6        指出第6級CPU的百分比
CPU_P7        指出第7級CPU的百分比
CPU_P8        指出第8級CPU的百分比
MAX_ACTIVE_SESS_TARGET_P1        為以後版本保留的引數
PARALLEL_DEGREE_LIMIT_P1        設定對任何作業系統並行度的限制


多級CPU資源分配提供了在一級規劃模式中按照優先次序使用CPU的方法,第二級只得第一級分配之後的資源。注意,任何使用者組都不得使用超過百分比的可用的CPU資源。

建立資源規劃指令:

用CREATE_RESOURCE_PLAN 過程可以建立資源規劃。看下面例子:

EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN=>;’great_bread’,
GROUP_OR_SUBPLAN=>;’sale’,
COMMENT=>;’Sales group’,
CPU_P1=>;60,
PARALLEL_DEGREE_LIMIT_P1=>;4 );

參照 “圖 28-1  一個簡單的規劃” ,可以用下面語句來完成:

BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(
PLAN=>;’great_bread’,
GROUP_OR_SUBPLAN=>;’market’,
COMMENT=>;’market 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;


更新資源規劃組指令:

可以用DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE來更新資源規劃的資訊。如:

EXEC DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE(
PLAN=>;’great bread’,
GROUP_OR_SUBPLAN=>;’develop’, NEW_CPU_P1=15 );

刪除資源規劃組指令:

可以用DBMS_RESOURCE_MANAGER.DELETE_PLAN_DIRECTIVE來刪除資源規劃的資訊。


§4管理資源使用者組
使用者在啟用資料庫資源管理器前,必須要將資源使用者組分配給使用者。DBMS_RESOURCE_MANAGER程式包除了提供建立、更新或刪除資料庫管理器所使用的資源外,還包含將資源使用者組分配給使用者的過程及提供臨時將使用者會話切換給其它資源使用者的過程。

§4.1 指定初始資源使用者組
一個初始使用者組就是該使用者最初建立會話所歸屬的使用者組。如果沒有為使用者指定初始使用者組,則該 使用者的初始使用者組為DEFAULT_CONSUMER_GROUP使用者組。
在將使用者組指定給使用者前,先要切換許可權給該使用者。命令如下:

EXEC DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWTCH_CONSUMER_GROUP(
‘scott’, ‘sales’,TRUE);

EXEC DBMS_RESOURCE_MANAGER_INITIAL_CONSUMER_GROUP(‘scott’,’sales’);

§4.2 改變資源使用者組
有兩種改變的操作:

切換會話:

可以用SWITCH_CONSUMER_GROUP_FOR_SESS過程來將某個會話立即切換到指定的資源使用者組上,以實現提高或降低優先權。

例:將sid=7,serial#=1234 的會話切換到high_prioity使用者組上:

EXEC DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_SESS(‘7’,’1234’,
‘High_priority’ ) ;

為使用者切換會話:

同樣可以用SWITCH_CONSUMER_GROUP_FOR_SESS過程來將某個使用者的會話切換到指定的資源使用者組上。如:

例:
EXEC DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_SESS(
‘scott’,’low_group’);


§4.3 授予“切換許可權”
Oracle的DBMS_RESOURCE_MANAGER_PRIVS過程包將切換許可權授予一個使用者、角色或PUBLIC或者從使用者、角色、PUBLIC中撤消許可權。

授予切換許可權:

EXEC DBMS_RESOURCE_MANAGER_PRIVS.GRANT_SWITCH_CONSUMER_GROUP(
‘scott’,’bug_batch_group’,TRUE );

取消切換許可權:

EXEC DBMS_RESOURCE_MANAGER_PRIVS.REVOKE_SWITCH_CONSUMER_GROUP(
‘scott’,’bug_batch_group’  );

除此之外,也可以用DBMS_SESSION程式包來完成切換使用者組。另見PL/SQL包參考。


§5啟動資料庫資源管理器

透過設定RESOURCE_MANAGER_PLAN引數來實現啟動資料庫資源管理器的使用。如:

ALTER SYSTEM SET RESOURCE_MANAGER_PLAN=mydb_plan;


§6資料庫資源管理器檢視

與資料庫資源管理器有關的資料字典有:

檢視        描述
DBA_RSRC_CONSUMER_GROUP_PRIVS        所有資源使用者組和使用者及授權給它們的角色
DBA_RSRC_CONSUMER_GROUPS        資料庫中所有資源使用者組
DBA_RSRC_MANAGER_SYSTEM_PRIVS        所有授予資料庫資源許可權的使用者和角色
DBA_RSRC_PLAN_DIRECTIVES        資料庫中所有資源規劃指令
DBA_RSRC_PLANS        資料庫中所有資源規劃資訊
DBA_USERS        資料庫中所有使用者資訊
USER_RSRC_CONSUMER_GROUP_PRIVS        授權給使用者的資源使用者組
USER_RSRC_MANAGER_SYSTEM_PRIVS        授予資料庫資源許可權的使用者和角色
USER_USERS        當前使用者的有關資訊
V$PARALLEL_DEGREE_LIMIT_MTH        有效的並行度限制
V$RSRC_CONSUMER_GROUP        調整活動資源使用者組的有關資訊
V$RSRC_CONSUMER_GROUP_CPU_MTH        所有有效的CPU資源的分配方法
V$RSRC_PLAN        當前活動的資源規劃的名稱
V$RSRC_PLAN_CPU_MTH        資源規劃的所有有效CPU資源的分配方法
V$SESSION        當前每個會話的資訊


§7資料庫資源管理器例子


下面例子參考圖28-2的結構進行說明,詳細見a76956:Oracle8i  Administrator’s Guide中的 25 Database Resource Manager 。

BEGIN
DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN =>'bugdb_plan',COMMENT => 'Resource plan/method for bug users sessions');
DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN =>'maildb_plan',COMMENT => 'Resource plan/method for mail users sessions');
DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN =>'mydb_plan',COMMENT => 'Resource plan/method for bug and mail users sessions');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Bug_Online_group',COMMENT => 'Resource consumer group/method for online bug users sessions');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Bug_Batch_group',COMMENT => 'Resource consumer group/method for bug users sessions who run batch jobs');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Bug_Maintenance_group',COMMENT => 'Resource consumer group/method for users sessions who maintainthe bug db');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Mail_users_group',COMMENT => 'Resource consumer group/method for mail users sessions');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Mail_Postman_group',COMMENT => 'Resource consumer group/method for mail postman');
DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP => 'Mail_Maintenance_group',COMMENT => 'Resource consumer group/method for users sessions who maintain the maildb');
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'bugdb_plan', GROUP_OR_SUBPLAN =>'Bug_Online_group',COMMENT => 'online bug users sessions at level 1', CPU_P1 => 80, CPU_P2=> 0,PARALLEL_DEGREE_LIMIT_P1 =>8);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'bugdb_plan', GROUP_OR_SUBPLAN =>'Bug_Batch_group',COMMENT => 'batch bug users sessions at level 1', CPU_P1 => 20, CPU_P2 => 0,PARALLEL_DEGREE_LIMIT_P1 => 2);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'bugdb_plan', GROUP_OR_SUBPLAN =>'Bug_Maintenance_group',COMMENT => 'bug maintenance users sessions at level 2', CPU_P1 => 0, CPU_P2 => 100,PARALLEL_DEGREE_LIMIT_P1 => 3);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'bugdb_plan', GROUP_OR_SUBPLAN =>'OTHER_GROUPS',COMMENT => 'all other users sessions at level 3', CPU_P1 => 0, CPU_P2 => 0, CPU_P3 =>100);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'maildb_plan', GROUP_OR_SUBPLAN =>'Mail_Postman_group',COMMENT => 'mail postman at level 1', CPU_P1 => 40, CPU_P2 => 0,PARALLEL_DEGREE_LIMIT_P1 => 4);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'maildb_plan', GROUP_OR_SUBPLAN =>'Mail_users_group',COMMENT => 'mail users sessions at level 2', CPU_P1 => 0, CPU_P2 => 80,PARALLEL_DEGREE_LIMIT_P1 => 4);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'maildb_plan', GROUP_OR_SUBPLAN =>'Mail_Maintenance_group',COMMENT => 'mail maintenance users sessions at level 2', CPU_P1 => 0, CPU_P2 => 20,PARALLEL_DEGREE_LIMIT_P1 => 2);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'maildb_plan', GROUP_OR_SUBPLAN =>'OTHER_GROUPS',COMMENT => 'all other users sessions at level 3', CPU_P1 => 0, CPU_P2 => 0, CPU_P3 =>100);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'mydb_plan', GROUP_OR_SUBPLAN =>'maildb_plan',COMMENT=> 'all mail users sessions at level 1', CPU_P1 => 30);
DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN => 'mydb_plan', GROUP_OR_SUBPLAN =>'bugdb_plan',COMMENT => 'all bug users sessions at level 1', CPU_P1 => 70);
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();end;

這裡的VALIDATE_PENDING_AREA可以省去,因為SUBMIT_PENDING_AREA已經隱含地執行。


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27038344/viewspace-747861/,如需轉載,請註明出處,否則將追究法律責任。

相關文章