Oracle資源管理器

流浪的野狼發表於2013-09-20

資源管理器簡介
      Oracle資源管理器(Oracle Database Resource Manager,以下簡稱DBRM)管理資料庫資源,為不同的會話分配不同的資料庫資源。DBRM管理的資源主要包括CPU時間。下面分以下幾個章節介紹:
•Oracle DBRM幫你處理哪些問題
•Oracle DBRM是怎樣處理這些問題的
•Oracle DBRM包含的內容
•Oracle DBRM資源分配方法
•Oracle DBRM的許可權管理
Oracle DBRM幫你處理哪些問題
      當資料庫伺服器資源由作業系統來分配時,你可能會遇到以下問題:
•過多的資源開銷
當伺服器程式數很多時,作業系統程式和資料庫服務程式間的來回切換會導致CPU佔用率或記憶體使用率高。
•低效的排程
作業系統排程資料庫服務時佔用暫存器,這樣做效率很低。
•資源分配的不合理
作業系統平均分配系統資源給活動的程式(對資料庫程式來說),不能判斷它們的優先順序高低。
•不能管理資料庫特有的資源,例如:並行執行的服務數和活動的會話數。
Oracle RMDB是如何解決這些問題的
      Oracle RMDB把硬體等資源的分配交給資料庫伺服器本身來解決以上問題。在某個資料庫環境中,可能同時存在著多個使用者請求資料庫服務,並且他們所要完成的任務優先順序不同,那麼我們就應該區別對待這些會話請求。Oracle RMDB能讓你根據各個會話的應用屬性,將它們分組,然後為每組分配不同的資料庫資源,最大化提高你的資料庫應用效能。
      Oracle RMDB的具體功能:
•RMDB可以在系統啟動時,限制某些會話請求只分配到最少的程式資源和使用者使用上限。
•為不同的使用者或應用分配不同的CPU時間。在一個資料倉儲應用中,ROLAP(relational online analytical processing)應用分配到的比例就應該比批處理任務高。
•限制同一組內使用者對資料庫操作的並行度。
•建立一個活動的會話池。會話池由一組使用者活動會話組成,對某一組使用者來說,同一時間活動的會話數有特別的數量上限。如果會話池滿了,新的會話請求會被放入等待佇列,而且你還可以設定一個時間上限,超過這個上限,等待佇列會被停止。會話池限制了同一時間活動的會話請求數量,保證了活動的會話請求更快的完成任務。
•管理長時間未響應的會話或請求,這些會話或請求往往佔用了很多的CPU或I/O資源。這些會話能被自動的結束掉,或者將它們換到其他低階的組去。
•最佳化器會估算請求的執行時間,如果超出了某個顯示,RMDB會阻止它的請求。
•限制一個會話的空閒等待時間。
•根據不同的資源分配需求,配置不同的模式。你可以動態的改變這些模式,例如,從白天執行模式變到夜間執行模式,而不用重啟資料庫服務。你還可以透過Oracle排程器來管理模式的改變。詳細內容請見: Chapter 26, "Oracle Scheduler Concepts"。
Oracle RDMB的組成元素
下表介紹了Oracle RDMB的組成元素。
元素                 描述
資源使用組       根據會話的資源請求將它們分為一組。RDMB按組管理會話的資源分配,而不是按單個的會話。
資源計劃          資源計劃包含一系列指令,這些指令就決定了給每個組的資源分配配置。要執行資源的分配,你只需執行相應的資源計劃。
資源計劃指令   資源計劃指令指定了資源計劃和組之間的對映關係。
       Oracle是透過儲存過程來實現這些功能的,你可以在以下包裡找到這些儲存過程:DBMS_RESOURCE_MANAGER.
資源使用組
    資源使用組由許多使用者會話組成,這些會話有相同的資源使用請求。新建立一個會話時,RDMB會根據你的設定自動把它分配到某個組。資料庫管理員還可以手動的調整某個會話所屬的組。
    下面三類特別的組是系統組,它們不能被修改或刪除。
•SYS_GROUP
•DEFAULT_CONSUMER_GROUP
•OTHER_GROUP
資源計劃指令
   RDMB根據當前活動資源計劃中的一系列資源計劃指令為資源使用組分配資源。資源計劃和指令間有著一對多的關係,資源計劃中不能包含兩條相同的指令。
   有很多種不同分配資源的指令,例如給某個組分配一定百分比的總的CPU時間,或者限制一個組內最大活動的會話數。
資源計劃
   在一個資料庫中同一時間只有一個資源計劃起作用。一個資源計劃還可以包含子資源計劃。每個資源計劃都必須包含給OTHER_GROUP分配支援的指令。
例子:一個簡單的資源計劃
   下圖顯示的是包含OLTP(online transaction processing)應用和報表系統資料庫系統的白天的資源分配計劃。
它為OLTP應用分配75%的CPU時間,為報表系統分配15%的CPU時間,剩下的是為OTHER_GROUPS分配的。

子資源計劃
       資源指令除了給組分配資源,還可以為其他資源計劃分配資源,被分配資源的計劃成為子計劃。下圖是一個包含子計劃的資源計劃的例子。
DBRM管理的內容
       資源分配方法指定資源分配給組或子計劃的百分比。DBRM管理的資源包括以下內容:
CPU Time
Active Session Pool With Queuing
       你可以設定某組的最大活動會話數,會話池滿後,新的會話會被放入等待佇列。
Degree Of Parallelism Limit
       限制並行執行的會話數。
Automatic Consumer Group Switching
       此功能類似於觸發器機制,當某個會話滿足設定的條件,它會自動被分配到其他組中去。
Cancelling SQL and Terminating Sessions
       DBRM可以取消那些長時間執行的SQL查詢或會話活動。
Excution Time Limit
       DMRM可以估算某個操作的執行時間,如果超過了設定的值,資料庫不會執行它。
Undo Pool
Idle Time Limit
      設定一個會話的最長未響應時間。
================================================================

oracle 資源管理器
 一、資源管理器(DRM)由三個要素組成:
資源消費群(resource_consumer_group)
資源計劃(resource_plan)
資源計劃指令(resource_plan_directive)
 
執行與DRM有關的操作,必須具有 administer_resource_manager 系統許可權。
 
二、未決域(pending area)
DRM的三個要素都必須建立在未決域中,然後提交。
 
1、建立未決域
exec dbms_resource_manager.create_pending_area;
 
2、驗證未決域
exec dbms_resource_manager.validate_pending_area;
驗證域中的內容是否合法。
 
3、清除未決域
exec dbms_resource_manager.clear_pending_area;
執行此命令後,未決域以及未決域中的內容一起被刪除。
 
4、提交未決域
exec dbms_resource_manager.submit_pending_area;
執行此命令後,相當於執行了驗證、提交、清除三個命令。未決域中的內容會被儲存在資料字典中,等待啟用。
 
三、資源消費群
一個使用者可以隸屬於多個消費群,但一個會話同一時間只能隸屬於一個消費群。
ORACLE 已經預定義了4個消費群:
 default_consumer_group :未分配消費群的使用者和會話。
other_groups :當前的資源計劃中沒有明確指定資源分配所有消費群。任何一個資源計劃中都必須包含此群。
sys_group 和 low_group :用於執行系統計劃的消費群。
 
1、建立、更新、刪除消費群()
 建立:
exec dbms_resource_manager.create_cosumer_group('群名','註釋');
 
更新:
exec dbms_resource_manager.update_consumer_group('群名','註釋');
 
刪除:
exec dbms_resource_manager.delete_consumer_group('群名');
執行此命令後,隸屬於此群的使用者和會話將自動轉到 default_consumer_group.
 
 2、將使用者會話分配給消費群(消費群對映)
可以基於會話的屬性將會話動態分配給消費群,成為消費群對映。
 
(1)設定對映:
dbms_resource_manager.set_consumer_group_mapping(
attribute => oracle_user,
value => 'user1,
consumer_group => 'low_group');
 
如上,當會話的oracle使用者屬性值為user1時,就將之分配給消費群low_group。
 
(2)設定對映優先權:
由於可能會出現某會話的兩個屬性分別滿足兩個不同的對映規則,那麼該服從哪個規則呢?——可以設定各個屬性的優先權,服從優先順序高的屬性。
dbms_resource_manager.set_mapping_priority(
oracle_user => 1,
client_os_user => 2);
 
(3)動態轉換會話的消費群
 基於會話的唯一標識轉換消費群:(會話唯一標識由 session_id 和 session_serial 共同組成,這兩個引數的值在 v$session 檢視中)。
dbms_resource_manager.switch_consumer_group_for_sess(
session_id => '56',
session_serial => '106',
consumer_group => 'low_group');
 
基於會話所屬的使用者轉換消費群:(將使用者下的所有會話轉換消費群)
dbms_resource_manager.switch_consumer_group_for_user(
user => 'user1',
consumer_group => 'low_group');
 
使用者轉換自己當前會話的消費群:(使用 dbms_session 包)
dbms_session.switch_current_consumer_group(
new_consumer_group => 'low_group');
 
轉換自己當前會話的消費群需要特定許可權:
dbms_resource_manager_privs.grant_switch_consumer_group(
grantee_name => 'user1',
consumer_group => 'low_group',
grant_option => 'false');
 
撤銷此許可權:
dbms_resource_manager_privs.revoke_switch_consumer_group(
grantee_name => 'user1',
consumer_group => 'low_group');
 
四、資源計劃
分為簡單資源計劃和複雜資源計劃。
 
1、簡單資源計劃
有如下特點:
(1)三要素在一個過程中定義。
(2)只能分配cpu資源。
(3)只能使用emphasis方式分配cpu資源(即百分比)。
(4)分配的消費群最大數為8個。
 
建立:
dbms_resource_manager.create_simple_plan(
simple_plan => '計劃名',
consumer_group1 => '消費群1',
group1_cpu => 50,
consumer_group2 => '消費群2',
group2_cpu => 50);
 
 
2、複雜資源計劃
特點:
(1)三要素必須單獨建立。
(2)可以巢狀子計劃。
 
建立:
dbms_resource_manager.create_plan(
plan => '計劃名',
comment => '註釋');
 
3、修改資源計劃:
dbms_resource_manager.update_plan(
plan => '計劃名',
new_屬性 => '新值');
 
4、刪除資源計劃:
dbms_resource_manager.delete_plan('計劃名');

dbms_resource_manager.delete_plan_cascade('計劃名');
加上cascade引數,刪除計劃內的要素。
 
五、計劃指令
 建立:
dbms_resource_manager.create_plan_directive(
plan => '計劃名',
group_or_subplan => '消費群或子計劃',
資源限制引數);
 
注:可以為子計劃建立指令,但只能分配cpu資源。
 
更新:
dbms_resource_manager.update_plan_directive(
兩個必需引數,
new_屬性 => '新值');
 
刪除:
dbms_resource_manager.delete_plan_directive(
兩個必需引數);
=================================================================
Oracle 11g R1中資源管理器增強-效能調優

    本文概述了Oracle 11g R1中資源管理器的所有增強內容,包括:
    (1) I/O校準
    (2) 每會話I/O限制
    (3) AWR中的資源管理器統計
    (4) 內建資源計劃
    I/O校準
    DBMS_RESOURCE_MANAGER包包括一個CALIBRATE_IO儲存過程,它透過執行一個I/O密集的只讀工作量來評估資料庫伺服器的儲存系統的I/O效能,這個評估操作應該在非業務高峰期間執行,以確保校準不影響生產的工作量,以及生產的工作量對校準結果的影響。
    只有開啟了非同步I/O時才能使用該儲存過程,否則會報下面的錯誤:

DECLARE
  *
  ERROR at line 1:
  ORA-56708: Could not find any datafiles with asynchronous i/o capability
  ORA-06512: at "SYS.DBMS_RMIN", line 453
  ORA-06512: at "SYS.DBMS_RESOURCE_MANAGER", line 1153
  ORA-06512: at line 6
  SQL>

    透過設定引數FILESYSTEMIO_OPTIONS為ASYNC或SETALL來啟用非同步I/O.

SQL>SHOW PARAMETER FILESYSTEMIO_OPTIONS
  NAME TYPE VALUE
  ----------------------------------------------- -----------------------
  filesystemio_options string none
  SQL>
  SQL>ALTER SYSTEM SET FILESYSTEMIO_OPTIONS=SETALL SCOPE=SPFILE;
  SQL>SHUTDOWN IMMEDIATE;
  SQL>STARTUP;
    該CALIBRATE_IO儲存過程接受兩個引數來指定物理磁碟(預設1)和可承受的最大延遲(預設20ms)的數目,它返回每秒最大數量I/O請求,每秒最大Mb數和真實的延遲。

SET SERVEROUTPUT ON
  DECLARE
  l_max_iops PLS_INTEGER;
  l_max_mbps PLS_INTEGER;
  l_actual_latency PLS_INTEGER;
  BEGIN
  DBMS_RESOURCE_MANAGER.calibrate_io (
  num_physical_disks => 1,
  max_latency => 20,
  max_iops => l_max_iops,
  max_mbps => l_max_mbps,
  actual_latency => l_actual_latency);
  DBMS_OUTPUT.put_line ('l_max_iops = ' || l_max_iops);
  DBMS_OUTPUT.put_line ('l_max_mbps = ' || l_max_mbps);
  DBMS_OUTPUT.put_line ('l_actual_latency = ' || l_actual_latency);
  END;
  /
  l_max_iops = 556
  l_max_mbps = 48
  l_actual_latency = 17
  PL/SQL procedure successfully completed.
  SQL>
 

    同一時間只能執行一個校準操作,在RAC環境中,工作量發起的所有節點都可以執行。
    [G]V$IO_CALIBRATION_STATUS檢視顯示了當前校準執行的狀況。在執行過程中,會顯示一個'IN PROGRESS' 的狀態'.一旦執行完成狀態切換到'READY',並且會顯示校準時間。

SQL> SELECT * FROM v$io_calibration_status;
  STATUS CALIBRATION_TIME
  ------------- -------------------------------
  IN PROGRESS
  SQL> SELECT * FROM v$io_calibration_status;
  STATUS CALIBRATION_TIME
  ---------------------------------------------------------------------------
  READY 28-JUL-2008 14:37:38.410
  1 row selected.
  SQL>
 

    透過DBA_RSRC_IO_CALIBRATE檢視可以顯示校準資訊。

SET LINESIZE 150
  COLUMN start_time FORMAT A30
  COLUMN end_time FORMAT A30
  SELECT * FROM dba_rsrc_io_calibrate;
  START_TIME END_TIME MAX_IOPS MAX_MBPS MAX_PMBPS LATENCY NUM_PHYSICAL_DISKS
  ----------------- ---------- ---------- ---------- ------------------
  28-JUL-2008 14:32:33.68 28-JUL-2008 14:37:38.40 556 48 48 17 1
  1 row selected.
  SQL>

    每會話I/O限制
    在Oracle之前的版本中,資源組自動切換完全基於單個會話的時間或單個呼叫的時間,Oracle 11g現在可以基於I/O閥值(最大請求數或M位元組)進行資源組自動切換,新的閥值透過CREATE_PLAN_DIRECTIVE儲存過程執行,其中包含了大量的改變。
    (1) CPU_P1-CPU_P8引數已經廢棄,改為使用MGMT_P1-MGMT_P8引數。
    (2) SWITCH_TIME_IN_CALL引數已被汰,換作了SWITCH_FOR_CALL引數。
    (3) SWITCH_IO_MEGABYTES和SWITCH_IO_REQS引數現在已經可用,此外還有SWITCH_TIME引數,這三個引數預設為NULL,意味著無限制。
    新的I/O引數意味著可以切換資源組了,可以基於消耗時間、I/O請求和I/O數量的任何組合來取消SQL或殺死會話,下面的例子顯示如果消耗時間超過120秒、I/O請求數量超過5000或I/O請求超過1024M,會將當前會話從資源消耗組oltp_group切換到batch_group組。

BEGIN
  DBMS_RESOURCE_MANAGER.create_plan_directive (
  plan => 'my_plan',
  group_or_subplan => 'oltp_group',
  comment => 'OLTP Group',
  mgmt_p1 => 70,
  switch_group => 'batch_group',
  switch_time => 120,
  switch_io_reqs => 5000,
  switch_io_megabytes => 1024,
  switch_for_call => TRUE);
  END;
  /

    下面的例子顯示如果I/O資源消耗超過了4096M,會話將會被殺掉。

BEGIN
  DBMS_RESOURCE_MANAGER.create_plan_directive (
  plan => 'my_plan',
  group_or_subplan => 'oltp_group',
  comment => 'OLTP Group',
  mgmt_p1 => 70,
  switch_group => 'KILL_SESSION',
  switch_io_megabytes => 4096);
  END;
  /

    AWR中的資源管理器統計
    新DBA_HIST_RSRC_PLAN和DBA_HIST_RSRC_CONSUMER_GROUP檢視已加入到V$ RSRC_PLAN_HISTORY和V$RSRC_CONS_GROUP_HISTORY檢視中,提供了一個歷史資料的檢視。
    V$RSRCMGRMETRIC_HISTORY檢視顯示取自V$RSRCMGRMETRIC檢視的一個小時的資料。
    在有完整的資源管理檢視介紹。

    內建資源計劃
    Oracle 11g包括一個內建的MIXED_WORKLOAD_PLAN資源計劃,旨在給的OLTP業務批次操作優先權,這個計劃包括兩個資源消耗組(INTERACTIVE_GROUP和BATCH_GROUP),如果分配給INTERACTIVE_GROUP組時超過60秒,就會自動切換到BATCH_GROUP組。
    RESOURCE_MANAGER_PLAN引數用來告訴例項使用哪個資源計劃。
    ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = MIXED_WORKLOAD_PLAN;
    然後你必須將資源消耗組授權給單個使用者,下面的例子顯示將兩個資源消耗組授權給TEST使用者,並指定預設的資源消耗組是INTERACTIVE_GROUP.查詢DBA_USERS檢視可以獲得已經設定好的預設設定。

BEGIN
  -- Assign users to consumer groups
  DBMS_RESOURCE_MANAGER_PRIVS.grant_switch_consumer_group(
  grantee_name => 'test',
  consumer_group => 'interactive_group',
  grant_option => FALSE);
  DBMS_RESOURCE_MANAGER_PRIVS.grant_switch_consumer_group(
  grantee_name => 'test',
  consumer_group => 'batch_group',
  grant_option => FALSE);
  DBMS_RESOURCE_MANAGER.set_initial_consumer_group('test', 'interactive_group');
  END;
  /
  SELECT initial_rsrc_consumer_group FROM dba_users WHERE username = 'TEST';
  INITIAL_RSRC_CONSUMER_GROUP
  ------------------------------
  INTERACTIVE_GROUP
  1 row selected.
  SQL>

    以TEST使用者連線到資料庫,查詢v$session檢視正在工作的資源消耗組。

CONN test/test
  SELECT resource_consumer_group
  FROM v$session
  WHERE audsid = SYS_CONTEXT('USERENV', 'SESSIONID');
  RESOURCE_CONSUMER_GROUP
  --------------------------------
  INTERACTIVE_GROUP
  1 row selected.
  SQL>

    如果我們建立一個長時間的呼叫,可以看到資源消耗組的切換。

CONN test/test
  SET SERVEROUTPUT ON
  DECLARE
  l_cg v$session.resource_consumer_group%TYPE;
  BEGIN
  SELECT resource_consumer_group
  INTO l_cg
  FROM v$session
  WHERE audsid = SYS_CONTEXT('USERENV', 'SESSIONID');
  DBMS_OUTPUT.put_line('Current Consumer Group: ' || l_cg);
  -- Sleep to cause switch based on time.
  DBMS_LOCK.sleep(65);
  SELECT resource_consumer_group
  INTO l_cg
  FROM v$session
  WHERE audsid = SYS_CONTEXT('USERENV', 'SESSIONID');
  DBMS_OUTPUT.put_line('Current Consumer Group: ' || l_cg);
  END;
  /
  Current Consumer Group: INTERACTIVE_GROUP
  Current Consumer Group: BATCH_GROUP
  PL/SQL procedure successfully completed.
  SQL>

    正如我們所期望的,呼叫最初分配的是INTERACTIVE_GROUP資源組,當呼叫超過60秒時就切換到BATCH_GROUP組了。

轉自:

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

相關文章