OCP读书笔记(16) - 管理资源
使用者組
創(chuàng)建資源用戶組OLTP_GRP,將用戶HR,OE加入此組:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.create_consumer_group(
consumer_group => 'OLTP_GRP',
comment => '',
cpu_mth => 'ROUND-ROBIN'
);
dbms_resource_manager.submit_pending_area();
BEGIN
dbms_resource_manager_privs.grant_switch_consumer_group('HR', 'OLTP_GRP', false);
dbms_resource_manager_privs.grant_switch_consumer_group('OE', 'OLTP_GRP', false);
END;
END;
創(chuàng)建資源用戶組BATH_GRP,將用戶BI,SH加入此組:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.create_consumer_group(
consumer_group => 'BATH_GRP',
comment => '',
cpu_mth => 'ROUND-ROBIN'
);
dbms_resource_manager.submit_pending_area();
BEGIN
dbms_resource_manager_privs.grant_switch_consumer_group('BI', 'BATH_GRP', false);
dbms_resource_manager_privs.grant_switch_consumer_group('SH', 'BATH_GRP', false);
END;
END;
將HR,OE的初始化用戶組制定為OLTP_GRP
BEGIN
dbms_resource_manager.set_initial_consumer_group(
user => 'HR',
consumer_group => 'OLTP_GRP'
);
END;
BEGIN
dbms_resource_manager.set_initial_consumer_group(
user => 'OE',
consumer_group => 'OLTP_GRP'
);
END;
將BI,SH的初始化用戶組制定為BATH_GRP
BEGIN
dbms_resource_manager.set_initial_consumer_group(
user => 'BI',
consumer_group => 'BATH_GRP'
);
END;
BEGIN
dbms_resource_manager.set_initial_consumer_group(
user => 'SH',
consumer_group => 'BATH_GRP'
);
END;
創(chuàng)建一個(gè)資源計(jì)劃“MY_DAY_PLAN”,并對CPU進(jìn)行資源分配:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.create_plan( 'MY_DAY_PLAN', '');
dbms_resource_manager.create_plan_directive(
plan => 'MY_DAY_PLAN',
group_or_subplan => 'BATH_GRP',
comment => '',
cpu_p1 => NULL, cpu_p2 => 20, cpu_p3 => NULL, cpu_p4 => NULL,
cpu_p5 => NULL, cpu_p6 => NULL, cpu_p7 => NULL, cpu_p8 => NULL,
parallel_degree_limit_p1 => NULL,
active_sess_pool_p1 => NULL,
queueing_p1 => NULL,
switch_group => '',
switch_time => NULL,
switch_estimate => false,
max_est_exec_time => NULL,
undo_pool => NULL,
max_idle_time => NULL,
max_idle_blocker_time => NULL,
switch_time_in_call => NULL
);
dbms_resource_manager.create_plan_directive(
plan => 'MY_DAY_PLAN',
group_or_subplan => 'OLTP_GRP',
comment => '',
cpu_p1 => NULL, cpu_p2 => 80, cpu_p3 => NULL, cpu_p4 => NULL,
cpu_p5 => NULL, cpu_p6 => NULL, cpu_p7 => NULL, cpu_p8 => NULL,
parallel_degree_limit_p1 => NULL,
active_sess_pool_p1 => NULL,
queueing_p1 => NULL,
switch_group => '',
switch_time => NULL,
switch_estimate => false,
max_est_exec_time => NULL,
undo_pool => NULL,
max_idle_time => NULL,
max_idle_blocker_time => NULL,
switch_time_in_call => NULL
);
dbms_resource_manager.create_plan_directive(
plan => 'MY_DAY_PLAN',
group_or_subplan => 'OTHER_GROUPS',
comment => '',
cpu_p1 => NULL, cpu_p2 => NULL, cpu_p3 => 100, cpu_p4 => NULL,
cpu_p5 => NULL, cpu_p6 => NULL, cpu_p7 => NULL, cpu_p8 => NULL,
parallel_degree_limit_p1 => NULL,
active_sess_pool_p1 => NULL,
queueing_p1 => NULL,
switch_group => '',
switch_time => NULL,
switch_estimate => false,
max_est_exec_time => NULL,
undo_pool => NULL,
max_idle_time => NULL,
max_idle_blocker_time => NULL,
switch_time_in_call => NULL
);
dbms_resource_manager.create_plan_directive(
plan => 'MY_DAY_PLAN',
group_or_subplan => 'SYS_GROUP',
comment => '',
cpu_p1 => 100, cpu_p2 => NULL, cpu_p3 => NULL, cpu_p4 => NULL,
cpu_p5 => NULL, cpu_p6 => NULL, cpu_p7 => NULL, cpu_p8 => NULL,
parallel_degree_limit_p1 => NULL,
active_sess_pool_p1 => NULL,
queueing_p1 => NULL,
switch_group => '',
switch_time => NULL,
switch_estimate => false,
max_est_exec_time => NULL,
undo_pool => NULL,
max_idle_time => NULL,
max_idle_blocker_time => NULL,
switch_time_in_call => NULL
);
dbms_resource_manager.submit_pending_area();
dbms_resource_manager.switch_plan( plan_name => 'MY_DAY_PLAN', sid => 'orcl' );
END;
確認(rèn)用戶的初始化用戶組:
conn /as sysdba
alter user hr account unlock identified by hr;
alter user oe account unlock identified by oe;
alter user bi account unlock identified by bi;
alter user sh account unlock identified by sh;
grant select on v_$session to hr,oe,bi,sh;
grant select on v_$mystat to hr,oe,bi,sh;
conn hr/hr
select resource_consumer_group from v$session where sid=(select sid from v$mystat where rownum=1);
conn bi/bi
select resource_consumer_group from v$session where sid=(select sid from v$mystat where rownum=1);
我們不僅可以通過指定用戶與資源用戶組的映射關(guān)系,從而指定用戶所產(chǎn)生的session所屬的用戶組,我們還可以通過其他映射關(guān)系來指定session屬于哪個(gè)用戶組
資源管理器提供了很多種映射用戶組的方法,比如我們可以指定某個(gè)特定的客戶端計(jì)算機(jī)名稱登錄到數(shù)據(jù)庫產(chǎn)生的session屬于某個(gè)用戶組,也可以指定通過某個(gè)特定的應(yīng)用程序登錄到數(shù)據(jù)庫所產(chǎn)生的session屬于某個(gè)用戶組等
由于我們可以設(shè)置登錄到操作系統(tǒng)的用戶所對應(yīng)的用戶組(比如oracle對應(yīng)os_grp組),同時(shí)設(shè)置登錄數(shù)據(jù)庫用戶所對應(yīng)的用戶組(比如用戶HR對應(yīng)OLTP_GRP),因此就存在一個(gè)問題,當(dāng)這兩種設(shè)置存在矛盾時(shí),應(yīng)該怎么辦?比如,我們以oracle用戶登錄操作系統(tǒng),然后以HR用戶登錄到數(shù)據(jù)庫,這時(shí)產(chǎn)生的session到底屬于哪個(gè)用戶組呢?
通過設(shè)定這些映射的優(yōu)先級來解決這個(gè)問題,默認(rèn)情況下,操作系統(tǒng)用戶映射關(guān)系的優(yōu)先級比數(shù)據(jù)庫用戶映射關(guān)系低
測試對CPU的限制
在hr和bi下分別運(yùn)行死循環(huán):
conn hr/hr
declare
i number;
j number;
begin
i := 0;
loop
j := sqrt(i);
i := i + 1;
end loop;
end;
conn bi/bi
declare
i number;
j number;
begin
i := 0;
loop
j := sqrt(i);
i := i + 1;
end loop;
end;
對并行度的限定
在沒有對BATH_GRP進(jìn)行限定之前:
conn sh/sh
select sid from v$mystat where rownum=1;
select /*+parallel(sales,6)*/ * from sales;
conn /as sysdba
select sid, qcsid, degree from v$px_session where qcsid=159;
對其限定后:
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'MY_DAY_PLAN',
group_or_subplan => 'BATH_GRP',
new_comment => '',
new_parallel_degree_limit_p1 => 3
);
dbms_resource_manager.submit_pending_area();
END;
conn sh/sh
select sid from v$mystat where rownum=1;
select /*+parallel(sales,6)*/ * from sales;
conn /as sysdba
select sid, qcsid, degree from v$px_session where qcsid=140;
可以看到,雖然只指定了并行度為6,但是使用資源管理器對其限定后,只產(chǎn)生3個(gè)從屬進(jìn)程
設(shè)置活動(dòng)的會(huì)話數(shù)(session個(gè)數(shù))
當(dāng)用戶組里某個(gè)用戶所產(chǎn)生的會(huì)話數(shù)超過了session數(shù)的限定值時(shí),如果還要再產(chǎn)生session,則會(huì)將session放入隊(duì)列,直到當(dāng)前正在活動(dòng)的session變?yōu)椴换顒?dòng)時(shí),等待活動(dòng)的session才開始活動(dòng),該隊(duì)列為先進(jìn)先出的規(guī)則,注意,并行執(zhí)行時(shí)產(chǎn)生的從屬進(jìn)程不算作活動(dòng)的session,我們可以控制試圖活動(dòng)的session在隊(duì)列里存放的時(shí)間長度,這叫超時(shí)。如果在隊(duì)列里的session等待時(shí)間超過指定的時(shí)間,則該session被切斷。
對OLTP_GRP進(jìn)行限定
conn /as sysdba
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'MY_DAY_PLAN',
group_or_subplan => 'BATH_GRP',
new_comment => '',
new_active_sess_pool_p1 => 2,
new_queueing_p1 => 5
);
dbms_resource_manager.submit_pending_area();
END;
以bi用戶連入數(shù)據(jù)庫,開兩個(gè)會(huì)話,并運(yùn)行死循環(huán)
conn bi/bi
declare
i number;
j number;
begin
i := 0;
loop
j := sqrt(i);
i := i + 1;
end loop;
end;
conn bi/bi
declare
i number;
j number;
begin
i := 0;
loop
j := sqrt(i);
i := i + 1;
end loop;
end;
開第三個(gè)session
conn bi/bi
ERROR:
ORA-07454: queue timeout, 5 second(s), exceeded
select sysdate from dual;
select sysdate from dual
*
ERROR at line 1:
ORA-07454: queue timeout, 5 second(s), exceeded
將其中一個(gè)session,kill掉
select sysdate from dual;
產(chǎn)生UNDO的數(shù)量
conn /as sysdba
grant select on dba_objects to hr;
conn hr/hr
create table test as select * from dba_objects;
conn /as sysdba
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'MY_DAY_PLAN',
group_or_subplan => 'OLTP_GRP',
new_comment => '',
new_undo_pool => 1
);
dbms_resource_manager.submit_pending_area();
END;
超出了限制,報(bào)錯(cuò)。
update test set OBJECT_NAME=lpad('abc',100);
update test set OBJECT_NAME=lpad('abc',100)
*
ERROR at line 1:
ORA-30027: Undo quota violation - failed to get 60 (bytes)
估計(jì)執(zhí)行時(shí)間的上限
當(dāng)session還沒開始較長時(shí)間的操作之前就被終止
conn hr/hr
create table test as select * from dba_objects;
conn /as sysdba
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'MY_DAY_PLAN',
group_or_subplan => 'OLTP_GRP',
new_comment => '',
new_max_est_exec_time => 1
);
dbms_resource_manager.submit_pending_area();
END;
conn hr/hr
select count(*) from test;
ERROR at line 1:
ORA-07455: estimated execution time (2 secs), exceeds limit (1 secs)
使用者組切換
當(dāng)session執(zhí)行時(shí)間的上限超過了指定的值后,切換到另一個(gè)組
conn /as sysdba
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'MY_DAY_PLAN',
group_or_subplan => 'OLTP_GRP',
new_comment => '',
new_switch_group => 'BATH_GRP',
new_switch_time => 10
);
dbms_resource_manager.submit_pending_area();
END;
以HR用戶打開一個(gè)session,執(zhí)行死循環(huán)
conn hr/hr
declare
i number;
j number;
begin
i := 0;
loop
j := sqrt(i);
i := i + 1;
end loop;
end;
打開監(jiān)視器,10秒鐘后發(fā)現(xiàn)以hr登錄的session被切換到了BATH_GRP
設(shè)置空閑時(shí)間的上限
conn /as sysdba
BEGIN
dbms_resource_manager.clear_pending_area();
dbms_resource_manager.create_pending_area();
dbms_resource_manager.update_plan_directive(
plan => 'MY_DAY_PLAN',
group_or_subplan => 'OLTP_GRP',
new_comment => '',
new_max_idle_time => 5,
new_max_idle_blocker_time => 10
);
dbms_resource_manager.submit_pending_area();
END;
conn hr/hr
連接到數(shù)據(jù)庫后,什么都不干,超過5秒運(yùn)行任何操作都報(bào)錯(cuò)如:
select sysdate from dual;
ERROR at line 1:
ORA-02396: exceeded maximum idle time, please connect again
conn hr/hr
update employees set first_name='aaa' where employee_id=108;
conn hr/hr
update employees set first_name='aaa' where employee_id=108;
當(dāng)超過10秒后,第一個(gè)session會(huì)被中斷,第二個(gè)session被執(zhí)行
轉(zhuǎn)載于:https://www.cnblogs.com/thlzhf/p/3382814.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的OCP读书笔记(16) - 管理资源的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度:土豪投机移动互联
- 下一篇: 高性能的MySQL(5)索引策略-索引和