共計(jì) 6850 個(gè)字符,預(yù)計(jì)需要花費(fèi) 18 分鐘才能閱讀完成。
本篇內(nèi)容介紹了“數(shù)據(jù)庫(kù)用戶資源管理涉及到的數(shù)據(jù)包有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓丸趣 TV 小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
用戶資源管理 DBMS_RESOURCE_MANAGER
用戶資源管理涉及到的數(shù)據(jù)包主要有兩個(gè):DBMS_RESOURCE_MANAGER 和 DBMS_RESOURCE_MANAGER _PRIVS。
其中包 DBMS_RESOURCE_MANAGER 主要是用于建立資源計(jì)劃,建立資源用戶組,建立資源分配方法等用戶資源相關(guān)的管理;而 DBMS_RESOURCE_MANAGER _PRIVS 的主要用途是進(jìn)行用戶資源管理的權(quán)限控制。
一、前言
資源管理器有三個(gè)部件組成:資源用戶組(Resource consumer group)、資源規(guī)劃(Resource plan)、資源分配方法(Resource allocation method)及資源計(jì)劃目錄 (Resource plan directives)。它們的功能如下:
部件說明:
資源用戶組: 根據(jù)數(shù)據(jù)庫(kù)資源處理需求,將用戶會(huì)話分成組
資源規(guī)劃: 指定哪些資源分配給資源用戶的命令
資源分配方法: 數(shù)據(jù)庫(kù)資源管理器分配特殊資源時(shí)采用的方法,由資源用戶組和資源規(guī)劃來使用。
資源規(guī)劃命令: 管理員使用這些命令將資源用戶組與特殊規(guī)劃連接起來,并在資源用戶組之間分配資源。
數(shù)據(jù)庫(kù)資源管理器可以完成:
1.確保某些用戶處理少量的資源,不考慮對(duì)系統(tǒng)的加載和用戶的數(shù)量。
2.按比例將 CPU 時(shí)間分配給不同的用戶和程序,分配有效的處理資源。
3.限制一組用戶可以使用的并行度。
4.對(duì)實(shí)例進(jìn)行配置,使其能使用特殊的資源分配方法。例如,DBA 不用關(guān)閉數(shù)據(jù)庫(kù)實(shí)例就可以動(dòng)態(tài)地改變這些配置方法。
二、概述
用戶資源管理涉及到的數(shù)據(jù)包主要有兩個(gè):DBMS_RESOURCE_MANAGER 和 DBMS_RESOURCE_MANAGER _PRIVS。
其中包 DBMS_RESOURCE_MANAGER 主要是用于建立資源計(jì)劃,建立資源用戶組,建立資源分配方法等用戶資源相關(guān)的管理;而 DBMS_RESOURCE_MANAGER _PRIVS 的主要用途是進(jìn)行用戶資源管理的權(quán)限控制。
對(duì)于一個(gè)簡(jiǎn)單的用戶資源管理計(jì)劃來說,僅僅使用 DBMS_RESOURCE_MANAGER 包就足夠了,所以下面僅僅對(duì) DBMS_RESOURCE_MANAGER 的使用進(jìn)行詳細(xì)的說明。
三、舉例
下面通過一個(gè)簡(jiǎn)單的用戶資源管理計(jì)劃的建立來讓大家熟悉下 DBMS_RESOURCE_MANAGER 包的使用方法。
(1)用戶資源管理示意圖
DW-PLAN DB_DEV OTHER_GROUPS TMP_DATA CPU 80% LEVEL 1 CPU 100% LEVEL 2 CPU 20% LEVEL 1
上面就是一個(gè)數(shù)據(jù)倉(cāng)庫(kù)的簡(jiǎn)單的用戶資源管理計(jì)劃示意圖。資源用戶管理計(jì)劃的名字是 DW_PLAN,在這個(gè)資源管理計(jì)劃下有三個(gè)資源用戶組,分別 DB_DEV,TMP_DATA,OTHER_GROUPS。
這個(gè)資源管理計(jì)劃里面僅僅包括對(duì) CPU 的控制,其中用戶組 DB_DEV 可以獲得的資源 CPU 80% LEVEL 1,用戶組 TMP_DATA 可以獲得的資源是 CPU 20% LEVEL 1,而用戶組 OTHER_GROUPS 可以獲得的資源是 CPU 100% LEVEL 2。
CPU 的百分比很好理解的,比如說 DB_DEV 可以獲得 80% 的 CPU 資源,他的級(jí)別是 LEVEL 1。關(guān)于這個(gè) LEVEL 是很讓人迷惑的,其實(shí) LEVEL 就是資源獲取的優(yōu)先級(jí)別,拿上面的例子來說,假設(shè) DB_DEV 和 TMP_DATA 分別獲得了系統(tǒng)的 80% 和 20% 的 CPU 資源,那么作為下一級(jí) LEVEL 2 的 OTHER_GROUPS 將不會(huì)獲得任何 CPU 的資源。當(dāng) DB_DEV 和 TMP_DATA 分別獲得了系統(tǒng)的 40% 和 10% 的 CPU 資源,那么作為下一級(jí) LEVEL 2 的 OTHER_GROUPS 將會(huì)獲得 50% 的 CPU 資源。
換句話說,LEVEL 2 所能獲得的全部資源就是 LEVEL 1 所未能使用的那部分資源。優(yōu)先級(jí):LEVEL1 LEVEL 2 LEVEL 3……LEVEL N-1 LEVEL N
需要強(qiáng)調(diào)的一點(diǎn)是 OTHER_GROUPS 這個(gè)資源用戶組。任何一個(gè)資源計(jì)劃必須要包括這個(gè) OTHER_GROUPS 用戶組,如果你的資源計(jì)劃沒有包括這個(gè)用戶組,那么將會(huì)得到一個(gè) ORA-07453 的錯(cuò)誤,要求你必須添加此用戶組。這個(gè)用戶組的作用就是作為一個(gè)后選項(xiàng),當(dāng)一個(gè)沒有匹配到任何資源用戶組的 SESSION 連接到數(shù)據(jù)庫(kù)的時(shí)候會(huì)自動(dòng)的匹配到 OTHER_GROUPS 下面,按照 OTHER_GROUPS 的資源限定執(zhí)行 SQL。
另外一個(gè)需要強(qiáng)調(diào)的是用戶資源限定的生效條件。拿上面的例子來說,當(dāng)系統(tǒng)的 CPU 使用率沒有達(dá)到 100% 的時(shí)候,DW_PLAN 這個(gè)資源計(jì)劃并不會(huì)生效,各個(gè)資源用戶也不會(huì)按照限定來分配 CPU 的使用。僅僅當(dāng) CPU 的使用率為 100% 的時(shí)候,資源計(jì)劃才可以發(fā)揮功效,來限制各個(gè)資源用戶組的 CPU 分配。這點(diǎn)是常常被大家忽略的,一定特別注意下。
資源計(jì)劃代碼如下:
EXEC DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN(PLAN= DW_PLAN ,COMMENT= Resource plan/method for DW
EXEC DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP= DB_DEV ,COMMENT = Resource plan user group for DB_DEV
EXEC DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP=
TMP_DATA ,COMMENT = Resource plan user group for TMP_DATA
EXEC DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP(CONSUMER_GROUP=
OTHER_GROUPS ,COMMENT = Resource plan user group for
OTHER_GROUPS
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN= DW_PLAN ,GROUP_OR_SUBPLAN
= DB_DEV ,COMMENT = DB_DEV ,CPU_P1 = 80);
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN= DW_PLAN ,GROUP_OR_SUBPLAN
= TMP_DATA ,COMMENT = TMP_DATA ,CPU_P1 = 20);
EXEC DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE(PLAN= DW_PLAN ,GROUP_OR_SUBPLAN
= OTHER_GROUPS ,COMMENT = OTHER_GROUPS ,CPU_P1 = 0,
CPU_P2 = 100);
EXEC DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
EXEC DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
執(zhí)行過程說明:
1.DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA();
創(chuàng)建一掛起區(qū)域,每次對(duì)資源計(jì)劃進(jìn)行操作之前都必須要執(zhí)行掛起操作,申請(qǐng)一塊內(nèi)存。
2,DBMS_RESOURCE_MANAGER.CREATE_PLAN
創(chuàng)建一個(gè)資源計(jì)劃,參數(shù) PLAN 表示資源計(jì)劃的名字,COMMENT 為該資源計(jì)劃的注釋信息
3,DBMS_RESOURCE_MANAGER.CREATE_CONSUMER_GROUP
創(chuàng)建一個(gè)資源用戶組,參數(shù) CONSUMER_GROUP 為資源用戶組名字,COMMENT 為該資源用戶組的注釋信息
4,DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE
創(chuàng)建一個(gè)資源分配方法,參數(shù) PLAN 為資源計(jì)劃的名字,,GROUP_OR_SUBPLAN 為下層資源用戶的名字,COMMENT 為資源分配方法的注釋信息,CPU_P1 表示該資源用戶組在 LEVEL 上的 CPU 分配方案。
5,DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA()
驗(yàn)證用戶資源計(jì)劃的有效性
6,DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA()
提交用戶資源計(jì)劃
(2)當(dāng)建立好用戶資源計(jì)劃之后,就需要將特定的用戶與特定的資源計(jì)劃相關(guān)聯(lián)。
DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING (DBMS_RESOURCE_MANAGER.ORACLE_USER, CNODS , DB_DEV)
通過這條命令就可以將用戶 CNODS 分配到資源組 DB_DEV 下。
(3)關(guān)聯(lián)好之后就可以將新建立的用戶資源管理置為有效
dbms_resource_manager.switch_plan(plan_name = DW_PLAN , sid = ORCL)
通過這條命令將當(dāng)前的用戶資源管理計(jì)劃設(shè)置為 DW_PLAN
SQL show parameter resource
NAME TYPE VALUE
———————————— ———– ——————————
resource_limit boolean FALSE
resource_manager_cpu_allocation integer 1
resource_manager_plan string DW_PLAN
SQL
(4)接下來檢查初始化參數(shù) resource_limit,將其設(shè)置為 TRUE
sys@ORCL show parameter resource_limit
NAMETYPEVALUE
———————————— ———– ——————————
resource_limitbooleanTRUE
sys@ORCL alter system set resource_limit=true scope=both;
系統(tǒng)已更改。
經(jīng)過上面的步驟,就可以使用新生成的用戶資源計(jì)劃了。
上面僅僅介紹了關(guān)于 CPU 的資源管理,其實(shí)用戶資源管理包還可以對(duì)相同用戶的活動(dòng) SESSION 數(shù)量,SESSION 空閑時(shí)間,UNDO 空間進(jìn)行管理。下面就分別詳細(xì)的說明下各個(gè)管理的使用方法和注意事項(xiàng)。
四、ACTIVE_SESS_POOL_P1
這個(gè)參數(shù)控制的是資源用戶組內(nèi)的用戶同時(shí)可以運(yùn)行的最大的活動(dòng) SESSION 的數(shù)量。這里值得強(qiáng)調(diào)的是 ACTIVE_SESS_POOL_P1 并不限制那些非活動(dòng)的 SESSION,僅僅對(duì)那些活動(dòng)的 SESSION 有限制,因?yàn)橐话阏f來只有那些活動(dòng)的 SESSION 才會(huì)消耗系統(tǒng)的資源。
DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE(PLAN
= dw_plan ,GROUP_OR_SUBPLAN =
TEST_GROUP ,NEW_ACTIVE_SESS_POOL_P1 =
上面這條語(yǔ)句表示資源用戶組 TEST_GROUP 內(nèi)的用戶同時(shí)僅能存在一個(gè)活動(dòng)的事務(wù)。
舉例:
假設(shè) TEST 用戶的資源組是 TEST_GROUP
SESSION1:
test@ORCL CONN TEST/TEST
test@ORCL SELECT COUNT(*)FROM DBA_OBJECTS,DBA_OBJECTS;
SESSION2:
test@ORCL CONNN TEST/TEST
可以發(fā)現(xiàn)此時(shí) SESSION2 被阻塞了,僅僅當(dāng) SESSION1 的 SQL 執(zhí)行完畢,變成 INACTIVE 狀態(tài)后,SESSION2 才可以連接到數(shù)據(jù)庫(kù)。那么這這個(gè)時(shí)候就有兩個(gè) SESSION 連接到數(shù)據(jù)庫(kù),但當(dāng)一個(gè)執(zhí)行 SQL 的時(shí)候,另一個(gè) SESSION 會(huì)立刻被掛起。
對(duì)我們數(shù)據(jù)倉(cāng)庫(kù)來說,這個(gè)參數(shù)的意義比較重大。因?yàn)槲覀円刂频氖窍到y(tǒng)的資源,而系統(tǒng)的絕大部分資源被那些 ACTIVE 的 SESSION 所占據(jù)著,那么只要限定了并發(fā)的 ACTIVE 的 SESSION 數(shù)量,系統(tǒng)的資源就得到了有效的控制。
五、QUEUEING_P1
這個(gè)參數(shù)控制的是 SESSION 的等待時(shí)候,一個(gè) SESSION 被放到等待隊(duì)列中,那么正常的情況下,他會(huì)一直等待所需要的資源,當(dāng)設(shè)置了 QUEUEING_P1 以后,當(dāng)超過了 QUEUEING_P1 指定的時(shí)間后,系統(tǒng)會(huì)報(bào)錯(cuò)誤 ORA-07454,提醒已經(jīng)等待超時(shí)。
DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE(PLAN
= dw_plan ,GROUP_OR_SUBPLAN = TEST_GROUP
,NEW_ACTIVE_SESS_POOL_P1 = 1,NEW_QUEUEING_P1 = 10);
SESSION1
CONN TEST/TEST
SESSION2:
CONNN TEST/TEST
SESSION1
test@ORCL SELECT COUNT(*)FROM DBA_OBJECTS,DBA_OBJECTS;
SESSION2:
test@ORCL select sysdate from dual;
select sysdate from dual
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-07454: 隊(duì)列超時(shí), 已超過 10 秒
這個(gè)參數(shù)的用途很象 SELECT * FROM XXX FOR UPDATE, 避免用戶一直等待。
六、PARALLEL_DEGREE_LIMIT_P1
這個(gè)參數(shù)就沒什么好說的了,是限制用戶執(zhí)行 SQL 時(shí)候的并行度,就不舉例說明了,調(diào)用方法如下:
DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE(PLAN
= dw_plan ,GROUP_OR_SUBPLAN = TEST_GROUP
,NEW_ACTIVE_SESS_POOL_P1 = 1,NEW_QUEUEING_P1 = 10,NEW_PARALLEL_DEGREE_LIMIT_P1 =
七、SWITCH_GROUP,NEW_SWITCH_TIME,NEW_SWITCH_ESTIMATE
這個(gè)三個(gè)參數(shù)之所以一起介紹,是因?yàn)樗麄児餐暮献魍瓿梢豁?xiàng)很重要的功能。
DBMS_RESOURCE_MANAGER.UPDATE_PLAN_DIRECTIVE(PLAN
= dw_plan ,GROUP_OR_SUBPLAN = DW_TEST , NEW_SWITCH_GROUP
=‘dw_sys’, NEW_SWITCH_TIME = 300, NEW_SWITCH_ESTIMATE =
‘true’);
上面這個(gè)條語(yǔ)句完成的功能是,如果一個(gè) SESSION 的資源用戶組是屬于 DW_TEST,他如果執(zhí)行一個(gè)很復(fù)雜的 SQL,系統(tǒng)估計(jì)這個(gè)條 SQL 的執(zhí)行時(shí)間會(huì)超過 300 秒的時(shí)候,自動(dòng)把這個(gè) SESSION 切換到用戶組 dw_sys 上,這樣該 SESSION 會(huì)獲得更多的資源,更快的執(zhí)行完成這個(gè) SQL。但是執(zhí)行完成之后,這個(gè) SESSION 就在以后的時(shí)間保留在切換的組中。
另外一個(gè)和 NEW_SWITCH_TIME 對(duì)立的參數(shù)是 NEW_SWITCH_TIME_IN_CALL,如果使用了這個(gè)參數(shù),那么在執(zhí)行完成后,切換回原來的資源用戶組。
八、MAX_EST_EXEC_TIME
這個(gè)參數(shù)控制一個(gè)事務(wù)最大的執(zhí)行時(shí)間。如果一個(gè)事務(wù)很復(fù)雜,執(zhí)行時(shí)間很長(zhǎng),那么他就不會(huì)被系統(tǒng)執(zhí)行。
九、UNDO_POOL
這個(gè)參數(shù)很讓人迷惑,開始的時(shí)候我以為這個(gè)參數(shù)控制的一個(gè)用戶在回滾表空間內(nèi)最大的 UNDO 段的大小,因?yàn)?UNDO 段的塊是循環(huán)使用的,所以只要單個(gè)事務(wù)產(chǎn)生的回滾信息不超過這個(gè)最大值就應(yīng)該沒有問題。
可實(shí)際上經(jīng)過測(cè)試,這個(gè)參數(shù)控制的是個(gè)總量,即該用戶產(chǎn)生的總的 UNDO 數(shù)量不能超過這個(gè)值,如果超過這個(gè)值就會(huì)報(bào)錯(cuò)。注意是總的 UNDO,是個(gè)累加的值。
十、MAX_IDLE_TIME
這個(gè)參數(shù)控制的一個(gè)用戶的 SESSION 最大的空閑時(shí)間,如果空閑時(shí)間超過這個(gè)限定,該 SESSION 會(huì)被終止。
十一、MAX_IDLE_BLOCKER_TIME
這個(gè)參數(shù)是控制那些占有資源的空閑 SEESION 的,當(dāng)一個(gè)占有資源的 SESSION 空閑時(shí)間超過了 MAX_IDLE_BLOCKER_TIME 的限制,那么系統(tǒng)會(huì)要求他釋放所占有的資源,一般就是 ROLLBACK 操作。
“數(shù)據(jù)庫(kù)用戶資源管理涉及到的數(shù)據(jù)包有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編將為大家輸出更多高質(zhì)量的實(shí)用文章!