๐ก ์ค๋ผํด ๋ฆฌ์์ค ๋งค๋์ ๋ผ๋ ๊ธฐ๋ฅ์ด ์๋ค. ์ด๊ฒ์ ํน์ ์ธ์ ์ด database์ ์์์ ๋ฌดํํ ์ฌ์ฉํ์ง ๋ชปํ๋๋ก ์ ํ์ ๊ฑฐ๋ ๊ธฐ๋ฅ์ด๋ค.
โ๏ธ ์์(Resource) ์ฌ์ฉ ์ ํ์ ๊ฑฐ๋ ์ค๋ผํด ๊ธฐ๋ฅ 2๊ฐ์ง
- ํ๋กํ์ผ (Profile)
- ์์๊ด๋ฆฌ
- ํจ์ค์๋
- ๋ฆฌ์์ค ๊ด๋ฆฌ (Resource Manager)
- ํ๋กํ์ผ ๋ณด๋ค ๋ ๋ง์ ์์ ์ฌ์ฉ์ ๋ํ ์ ํ์ ๊ฑธ ์ ์๋ค.
- ์ด๋ ํ ์ ํ์ ํ ์ ์๋๊ฐ?
- ์ ์ฑ SQL์ด ์คํ ์๋๋๋ก ์ ํ
- lock waiting ํ์์ ๋ํ ์ ํ
- ๋ณ๋ ฌ์ฒ๋ฆฌ์ ๋ํ ์ ํ
(ex: select /*_ parallel 4 */ ...)
โก๏ธ ๋ณธ์ธ์ ๋น ๋ฅด์ง๋ง ๋ค๋ฅธ์ฌ๋๋ค์ ๋๋ ค์ง๋ค! (๋ณ๋ ฌ๋ : cpu_count * 2)- Undo ์ฌ์ฉ์ ๋ํ ์ ํ - ๊ณผ๋ํ DML ์์ ์ ํ์ง ๋ชปํ๊ฒ!
(ex: ๋๊ตฐ๊ฐ๊ฐ sales ํ ์ด๋ธ ๊ฐ์ ํฐ ํ ์ด๋ธ์ update ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด undo tablespace ํ๋๋ค.)
update sales -- 2์ต๊ฑด ์ด์ ์๋ ํ ์ด๋ธ์ด๋ค. set amount_sold=9000; -- ์์ฒ๋ผ ํด์ ์๋๋ค๊ณ ํ๋ฉด where์ ์จ์ ํ๋์ฉ ํ์์ค ๋ผ๊ณ ๋งํด์ค๋ค.
- Active session (waiting ํ๋ ์ธ์ ) ๋ค์ ์ ํ - ์ง๊ธ ์ํํ๋ ค๋ SQL์ ์ ์ฑ SQL์ ๋๋ค. ๋ค์ ์ง์ธ์ ๋ผ๋ ๋ฉ์ธ์ง๋ฅผ ์ถ๋ ฅํ๊ฒ ํ๋ฉด์ ์์ ์ ์ฑSQL์ ๋์ง ๋ชปํ๊ฒ ํ๋ค.
- Idle ์๊ฐ์ ๋ํ ์ ํ (db์ ์ํด๋๊ณ ์๋ฌด๊ฒ๋ ์ํ๋ ์ธ์ ๋ค์ ๋์ด๋ฒ๋ฆผ)
- execution ์๊ฐ์ ๋ํ ์ ํ
โ 4๋ฒ๊น์ง๋ ํ์คํ๊ฒ ํด๋์์ผ ์ผ์ด ํ๋ค์ง ์๋ค..!
ex ) ํ๋์นด๋ dba์ ์ฌ์ฉ ์$ sh daytime.sh ์ ํํ ๋ณ๋ ฌ๋๋ ? 4 ์ ํํ undo ์ฌ์ฉ๋์? 50m ์ ํํ execution time(์ด)? ์ ํํ idle time(์ด)? 600 ์ ํํ blocking idle time(์ด)? 10 ๋ฝ waiting์ด 10์ด ์ด์ ๋๋ฉด ์๋์ผ๋ก lock holder๋ฅผ kill ์ํด.
(p16-4)
1. resource plan : ๋ฆฌ์์ค ํ ๋น์ ๋ํ ์ฒญ์ฌ์ง(ํฐ ๊ณํ)
2. resource consumer group : ๋ฆฌ์์ค์ ์๊ตฌ์ฌํญ์ด ์ ์ฌํ ๊ทธ๋ฃนdba ๊ทธ๋ฃน, ๊ฐ๋ฐ์ ๊ทธ๋ฃน, ์ธ๋ถ ์์ง๋์ด ๊ทธ๋ฃน, ์ด์์ ๊ทธ๋ฃน
3. resource plan directive : ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฐฐํ๋ ๋ฐฉ๋ฒ์ ์ง์
- cpu
- locl waiting time
- undo
- degree (๋ณ๋ ฌ๋)
- active session์ ๊ฐฏ์
- idle time
โ๏ธ SYSTEM user๋ก ์ ์ํ์ฌ consumer group ONLINE_USERS ๋ฅผ ์์ฑํ๋ค
SQL> conn system/oracle SYSTEM> exec dbms_resource_manager.create_pending_area(); -- ๋ฆฌ์์ค ๋ฉ๋์ ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ์์ญ์ ์ค์ ํ๊ฒ ๋ค.
โ๏ธ ์ปจ์๋จธ ๊ทธ๋ฃน ์์ฑ (ONLINE_USERS) / SYS_GROUP ๊ณผ OTHER_GROUP๋ ํญ์ ๋ํดํธ๋ก ์๋ค.
SYSTEM> exec dbms_resource_manager.create_consumer_group('ONLINE_USERS','Users for Online'); -- SYS_GROUP ๊ณผ OTHER_GROUP ์ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ONLINE_USERS ๋ง ์์ฑํ๋ค. โ โ dba๊ถํ ์ ์ ๋ค ๋ฆฌ์์ค ์ฌ์ฉ์ ๋ํ ์ ํ์ด ๋์ ์ ์ ๋ค
๐ก db ์ ๋ง๋ค์ด์ ธ์๋ Consumer ๊ทธ๋ฃนํ์ธํ๋ ๋ช ๋ น์ด
select consumer_group from dba_rsrc_consumer_groups where consumer_group like '%ONLINE%'; CONSUMER_GROUP ------------------------------ ONLINE_USERS
โ๏ธ resource plan DAYTIME ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ํ view๋ฅผ ํตํด ํ์ธํ๋ค.
A. SYS_GROUP : CPU_P1=100 B. ONLINE_USERS : CPU_P2=70, MAX_IDEL_BLOCKER_TIME=30 -- MAX_IDEL_BLOCKER_TIME : lock wating time ์ 30์ด๋ก ์ ํํ๊ฒ ๋ค. C. OTHER_GROUPS : CPU_P2=30, PARALLEL_DEGREE_P1=4 -- PARALLEL_DEGREE_P1 : ๋ณ๋ ฌ๋๋ฅผ 4๋ก ์ ํํ๊ฒ ๋ค select /*+ parallel(emp, 8) */ count(*) from emp;
โ๏ธ ๋ฆฌ์์ค ํ๋ ์์ฑ (daytime)
SQL> begin dbms_resource_manager.create_plan('DAYTIME','Plan for day'); end; / PL/SQL procedure successfully completed.
โ๏ธ ์์์ ์์ฑํ daytime plan ์ด ์์ฑ๋์๋์ง ํ์ธํ์์ค !
select plan from dba_rsrc_plans;
โ๏ธ ๋ฆฌ์์ค ๋๋ ํฐ๋ธ ์์ฑ (๋๋ ํฐ๋ธ : ๋ถ๋ฐฐ๋ฐฉ๋ฒ)
1. ๊ธฐ์กด์ ์ด๋ฏธ ์๋ SYS_GROUP์ CPU๋ฅผ 1์์๋ก 100% ์ฌ์ฉํ๋๋ก ์ง์์ด ์์ฑSQL> begin dbms_resource_manager.create_plan_directive('DAYTIME', 'SYS_GROUP','1st Group Set', cpu_p1=>100); end; / PL/SQL procedure successfully completed.
- online_users ๊ทธ๋ฃน์ lock blocking time์ 30์ด๋ก ์ง์ , cpu ์ฌ์ฉ ์ฐ์ ์์ 2๋ฒ์งธ ์ด๊ณ 70%๋ง ์ฌ์ฉ
begin dbms_resource_manager.create_plan_directive('DAYTIME', 'ONLINE_USERS','2nd Group set', cpu_p2=>70,max_idle_blocker_time=>30); end; /
- other_groups ๋ ๋ณ๋ ฌ๋๋ฅผ 4๋ก ์ง์ , cpu ์ฌ์ฉ์จ ์ฐ์ ์์๊ฐ 2๋ฒ์งธ์ด๊ณ 30%๋ง ์ฌ์ฉํ๋๋ก ์ค์
begin dbms_resource_manager.create_plan_directive('DAYTIME', 'OTHER_GROUPS','3rd Group', cpu_p2=>30,parallel_degree_limit_p1=>4); end; /
โก๏ธ 2, 3๋ฒ cpu_p2 (cpu ์ฌ์ฉ)์ด ๋๊ฐ๊ฐ ํฉ์ณ์ 100% ์ด ๋์ด์ผ ๊ฒ์ฆ์์ ์๋ฌ๋์ง์๋๋ค.
โ๏ธ ๊ฒ์ฆ ์์
SYSTEM> exec dbms_resource_manager.validate_pending_area(); PL/SQL procedure successfully completed.
โ๏ธ ๊ตฌํ
SYSTEM> exec dbms_resource_manager.submit_pending_area(); PL/SQL procedure successfully completed. SYSTEM> alter system set resource_manager_plan=daytime;
๐ก๋ด๊ฐ ์ด๋ป๊ฒ ์ค์ ํ๋์ง ์กฐํํ๋ ๋ฐฉ๋ฒ
SQL> select plan, group_or_subplan, cpu_p1, cpu_p2, parallel_degree_limit_p1 dop, max_idle_blocker_time block_t from dba_rsrc_plan_directives where plan='DAYTIME' order by 1,2;
โ๏ธ SCOTT user๋ฅผ consumer group ONLINE_USERS๋ก ์ง์ ํ๊ณ default consumer group์ผ๋ก ์ง์ ํ๋ค.SQL> exec dbms_resource_manager_privs.grant_switch_consumer_group('SCOTT', 'ONLINE_USERS', true); PL/SQL procedure successfully completed. -- ์ง๊ธ ๋น์ฅ consumer group์ด ONLINE_USERS๊ฐ ๋๋ ๊ฒ. SQL> exec dbms_resource_manager.set_initial_consumer_group('SCOTT', 'ONLINE_USERS'); PL/SQL procedure successfully completed.
online_users ๊ทธ๋ฃน์ lock blocking time์ 30์ด๋ก ์ง์ , cpu ์ฌ์ฉ ์ฐ์ ์์ 2๋ฒ์งธ ์ด๊ณ 70%๋ง ์ฌ์ฉํ๋๊ฑธ๋ก ์์์ ์ค์ ํ๋ค.
๋ฌธ์
scott ํฐ๋ฏธ๋ ์ฐฝ 2๊ฐ๋ฅผ ์ด๊ณ ๋ค์๊ณผ ๊ฐ์ด update๋ฅผ ์ํํด์ lock์ด 30์ด ํ์ ํ๋ฆฌ๋์ง ํ์ธํ๊ธฐ
SYS> alter system set resource_manager_plan=daytime;
#scott ํฐ๋ฏธ๋ ์ฐฝ1 #scott ํฐ๋ฏธ๋ ์ฐฝ2
update emp
set sal = 0
where ename ='ALLEN'; update emp
set sal = 6000
where ename ='ALLEN';
lock์ ๋จผ์ ์ก์ ์ธ์
์ ์ฃฝ์๋ค.
๋ฌธ์
์์ max_idle_bloker_time์ 60์ด๋ก ๋ณ๊ฒฝํ๊ธฐ
SYSTEM> exec dbms_resource_manager.create_pending_area(); SYSTEM> begin dbms_resource_manager.update_plan_directive( plan=>'DAYTIME', group_or_subplan=>'ONLINE_USERS', new_max_idle_blocker_time=>60); end; / SQL> select plan, group_or_subplan, cpu_p1, cpu_p2, parallel_degree_limit_p1 dop, max_idle_blocker_time block_t from dba_rsrc_plan_directives where plan='DAYTIME' order by 1,2; SYSTEM> exec dbms_resource_manager.submit_pending_area();
๋ฌธ์
max_idle_time์ ์์ ํด์ scott์ ์ ๋ก ์ ์ํด์ 10์ด๋์ ์๋ฌด๋ฐ ์์
์ ํ์ง ์์ผ๋ฉด ์๋์ผ๋ก ์ ์์ด ๋๊ธฐ๋๋ก ์ค์
SYS @ orcl3 > conn system/oracle; SYSTEM> exec dbms_resource_manager.create_pending_area(); SYSTEM> begin dbms_resource_manager.update_plan_directive( plan=>'DAYTIME', group_or_subplan=>'ONLINE_USERS', new_max_idle_time=>10); end; / SYSTEM> exec dbms_resource_manager.submit_pending_area(); SQL> select plan, group_or_subplan, cpu_p1, cpu_p2, max_idle_time, parallel_degree_limit_p1 dop, max_idle_blocker_time block_t from dba_rsrc_plan_directives where plan='DAYTIME' order by 1,2;
โก๏ธ ๋ฐ๋๊ฒ์ ํ์ธ
โก๏ธ scott์ ์ ์ํด์ 10์ด๋์ ๊ฐ๋งํ ์์ผ๋ ๋๊ฒจ์๋ค.
๋ฌธ์
๊ทธ๋ผ ๋ค์ idle_time์ ์ํฅ์ ๋ฐ๊ณ ๊ณ์ ์ ์ํ ์ ์๋๋ก ์ค์ ํ๊ธฐ
SYS @ orcl3 > conn system/oracle; SYSTEM> exec dbms_resource_manager.create_pending_area(); SYSTEM> begin dbms_resource_manager.update_plan_directive( plan=>'DAYTIME', group_or_subplan=>'ONLINE_USERS', new_max_idle_time=>-1); end; / SYSTEM> exec dbms_resource_manager.submit_pending_area(); SQL> select plan, group_or_subplan, cpu_p1, cpu_p2, max_idle_time, parallel_degree_limit_p1 dop, max_idle_blocker_time block_t from dba_rsrc_plan_directives where plan='DAYTIME' order by 1,2;
๋ฌธ์
scott ์ ์ ๊ฐ undo ์ฌ์ฉ๋์ ์ ํํ๊ฒ๋ ์ค์
new_undo_pool =>10
SYS> grant select on sales to scott;
SCOTT> create table sales500
as
select * from sh.sales;
SCOTT> delete from sales500;
SYS @ orcl3 > conn system/oracle; SYSTEM> exec dbms_resource_manager.create_pending_area(); SYSTEM> begin dbms_resource_manager.update_plan_directive( plan=>'DAYTIME', group_or_subplan=>'ONLINE_USERS', new_undo_pool=>10); end; / SYSTEM> exec dbms_resource_manager.submit_pending_area(); SQL> select undo_pool, plan, group_or_subplan, cpu_p1, cpu_p2, max_idle_time, parallel_degree_limit_p1 dop, max_idle_blocker_time block_t from dba_rsrc_plan_directives where plan='DAYTIME' order by 1,2;
์ ์ฌ์๊ฐ ๋ฌธ์
๋ค์ undo๋ฅผ ์ ํ์์ด ์ธ ์ ์๋๋ก ์ค์ !
SYS @ orcl3 > conn system/oracle; SYSTEM> exec dbms_resource_manager.create_pending_area(); SYSTEM> begin dbms_resource_manager.update_plan_directive( plan=>'DAYTIME', group_or_subplan=>'ONLINE_USERS', new_undo_pool=>-1); end; / SYSTEM> exec dbms_resource_manager.submit_pending_area(); SQL> select undo_pool, plan, group_or_subplan, cpu_p1, cpu_p2, max_idle_time, parallel_degree_limit_p1 dop, max_idle_blocker_time block_t from dba_rsrc_plan_directives where plan='DAYTIME' order by 1,2;
select * from v$rsrc_consumer_group;
OTHER_GROUPS -- sys, system user (cpu_p1, 100%)
SYS_GROUP -- scott (cpu_p2, 70%)
ONLINE_USERS -- hr, sh user (cpu_p2, 30%)
select name, consumed_cpu_time, cpu_wait_time
from v$rsrc_consumer_group;
SYSTEM @ orcl3 > save cpu.sql
Created file cpu.sql
โ consumed_cpu_time
: ์๋นํ cpu ์๊ฐ
โ cpu_wait_time
: cpu๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ณ ๋๊ธฐํ ์๊ฐ
๋ฌธ์
scott ์ ์ ๋ก ์ ์ํ์ฌ ์
์ฑSQL์ ์ํํด์ CPU ์ฌ์ฉ์จ์ ๋์ธ ํ cpu.sql์ ์ํํ๊ณ online_users ๊ทธ๋ฃน์ cpu ์ฌ์ฉ์จ์ด ์ฌ๋ผ๊ฐ๋์ง ํ์ธํ๊ธฐ
SCOTT @ orcl3 > select count(*)from sh.sales, sh.sales;
โก๏ธ scott ํผ์ ๋ค ์ฐ๋๊ฒ์ด๋ค. ๋ง์ฝ sys, system ์ ์ ๊ฐ ์ฌ์ฉ์ค์ด์๋ค๋ฉด scott์ ๋จ์์๋ ๊ฒ ๊ฐ์ง๊ณ ์ฐ๋๊ฒ์
๋ฌธ์
system ์ ์ ์์ ์๋์ ์
์ฑ SQL์ ์ํํํ scott ์ ์ ์์ ๋๊ฐ์ด ์๋์ ์
์ฑSQL์ ์ํํ๊ณ ๋ค๋ฅธ ํฐ๋ฏธ๋ ์ฐฝ์ ์ด์ด์ @cpu๋ฅผ ์ํํ๋ค. ๋๊ฐ ๋ cpu๋ฅผ ๋ง์ด ์ฐ๋์ง ํ์ธํด๋ณด์!
SCOTT @ orcl3 > select count(*)from sh.sales, sh.sales;
SYS @ orcl3 > select count(*)from sh.sales, sh.sales;
โก๏ธ ์๊ฐ๊ณผ ๋ค๋ฅด๊ฒ scott์ด ๋ cpu๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
โ ๋ณ๋ ฌ๋ก ์์ ํ๋ค๋ ๊ฒ์?
select /* parallel(emp 4) */ ename, sal
from emp;
8์ฝ์ด ~ 24์ฝ์ด, ์ค๋ผํด 1 ์ฝ์ต์ฉ 5์ต์ฉ ๋ฐใด๋๋ค.
24์ฝ์ด๋ฉด 120์ต์ ์ค์ผ ์ค๋ผํด ์ธ ์ ์๊ฑฐ, ๋งค๋
๊ตฌ์
๊ฐ๊ฒฉ์ 3%๋ฅผ ์ ์ง๋ณด์๋ก ๋ด์ผํ๋ค.
1. ๋ณ๋ ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ณ ๋ณ๋ ฌ ํ๋ก์ธ์๋ค์ด ์ ๋ ์๋์ง ํ์ธํ์์ค.
SCOTT> select /*+ parallel(s1,2) parallel(s2,2) */ count(*)
from sh.sales s1, sh.sales s2;
2. sys user์์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๋ ฌ ํ๋ก์ธ์๋ค์ด ๋ ์๋์ง ํ์ธ !
SYS> col program for a25
SYS> col process for a10
SYS> select process, program
from v$session
where program like '%(P0%';
3. scott user๊ฐ ๋ณ๋ ฌ๋๋ฅผ ๋ง์๊ป ๋ณ๋ ฌ๋๋ฅผ ์ค ์ ์๋๋ก ์ค์ ํ๊ธฐ!
SYS @ orcl3 > conn system/oracle; SYSTEM> exec dbms_resource_manager.create_pending_area(); SYSTEM> begin dbms_resource_manager.update_plan_directive( plan=>'DAYTIME', group_or_subplan=>'ONLINE_USERS', new_parallel_degree_limit_p1=>-1); end; / SYSTEM> exec dbms_resource_manager.submit_pending_area(); SQL> select undo_pool, plan, group_or_subplan, cpu_p1, cpu_p2, max_idle_time, parallel_degree_limit_p1 dop, max_idle_blocker_time block_t from dba_rsrc_plan_directives where plan='DAYTIME' order by 1,2; SCOTT> select /*+ parallel(s1,6) parallel(s2,6) */ count(*) from sh.sales s1, sh.sales s2;
-- SYSTEM user์์ ํ์ธ SYSTEM> select process, program from v$session where program like '%(P0%';
1. SYSTEM ์ ์ ์์ ์๋์ ๊ฐ์ด ์ค์
SYS @ orcl3 > conn system/oracle; SYSTEM> exec dbms_resource_manager.create_pending_area(); SYSTEM> begin dbms_resource_manager.update_plan_directive( plan=>'DAYTIME', group_or_subplan=>'ONLINE_USERS', new_max_est_exec_time=>120); end; / SYSTEM> exec dbms_resource_manager.submit_pending_area(); SQL> select undo_pool, plan, group_or_subplan, cpu_p1, cpu_p2, max_idle_time, parallel_degree_limit_p1 dop, max_idle_blocker_time block_t from dba_rsrc_plan_directives where plan='DAYTIME' order by 1,2;
โก๏ธ ๋ฎ์๊ฐ์๋ ์๋ฒ์ ๋ถํ๋ฅผ ์ฃผ๋ ๋ฌด๊ฑฐ์ด SQL์ ์ํ๋์ง ๋ชปํ๊ฒ ๋ง๋๊ฒ!
๋ฌธ์
์ ์์ ์คํ์๊ฐ์ 5๋ถ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ
SYS @ orcl3 > conn system/oracle; SYSTEM> exec dbms_resource_manager.create_pending_area(); SYSTEM> begin dbms_resource_manager.update_plan_directive( plan=>'DAYTIME', group_or_subplan=>'ONLINE_USERS', new_max_est_exec_time=>600); end; / SYSTEM> exec dbms_resource_manager.submit_pending_area(); SQL> select undo_pool, plan, group_or_subplan, cpu_p1, cpu_p2, max_idle_time, parallel_degree_limit_p1 dop, max_idle_blocker_time block_t from dba_rsrc_plan_directives where plan='DAYTIME' order by 1,2;
๋ฌธ์
๋ค์ ๋ชจ๋ ๋ฆฌ์์ค ๋งค๋์ ๋ก ์ ํ๋ ๊ธฐ๋ฅ์ ํ์ด์ค๋๋ค.
: ๋ฐค์๋ ์ ํ๋ ๊ธฐ๋ฅ์ ํ์ด์ค ์ ์๋๋ก ์๋ ๋ช
๋ น์ผ๋ก ํ์ด์ค๋ค. ์์ด๋ dbms ์ค์ผ์ค์ ์ด์ฉํ์ฌ ๊ฑธ์ด์ค๋ค.
SYSTEM> alter system set resource_manager_plan='';
๋ค์ ์์นจ์ ์ ๋ฌด์๊ฐ์ด ๋๊ธฐ ์ ์ resource_manager_plan์ daytime์ผ๋ก ์ง์ ํ๋ค. ๋ฐค์๋ ๋ฐฐ์น ์์ ์ด ์ํ๋๋ฉด ํ๋ฃจ ๊ฒฐ์ฐ์ ํ๊ฑฐ๋ ํ๋ ์์ฃผ ๋ฌด๊ฑฐ์ด SQL ๋ค์ด ๋ง์ด ์๋์ผ๋ก ๋๋๋ค. (์์นจ์ ๊ฑธ๊ณ , ๋ฐค์๋ ํ๊ณ !)
โก๏ธ ์ ๊ธฐ๋ฅ์ ์๋์ผ๋ก ํ๋ ๋ฐฉ๋ฒ
1. ๋ฆฌ๋ ์ค์ crotab์ ์ด์ฉ
2. ์ค๋ผํด์ dbms_job ๋๋ dbms_scheduler๋ฅผ ์ด์ฉ
๋ฌธ์
resource manager์ ๋ํ ์ฌ์ฉ์ ํธํ๊ฒ ํ ์ ์๋ ํ๋ก์์ ๋ฅผ ์์ฑํ๊ธฐ (์ต๋ช
PL/SQL ์์ฑ)
SYSTEM> @resource.sql
์ ํํ ๋ณ๋ ฌ๋๋? new_paralle_degree_limit_p1
์ ํํ undo ์ฌ์ฉ๋์? new_undo_pool
์ ํํ execution time(์ด)? new_max_est_exec_time
์ ํํ idle time(์ด)? new_max_idle_time
์ ํํ blocking idle time(์ด)? new_max_idle_blocker_time
accept p_degree prompt '์ ํํ ๋ณ๋ ฌ๋๋ ? ' accept p_undo prompt '์ ํํ undo ์ฌ์ฉ๋์? ' accept p_exec prompt '์ ํํ execution time(์ด) ? ' accept p_idle prompt '์ ํํ idle time(์ด) ? ' accept p_block prompt '์ ํํ blocking idle time(์ด) ? ' exec dbms_resource_manager.create_pending_area(); begin dbms_resource_manager.update_plan_directive( plan=>'DAYTIME', group_or_subplan=>'ONLINE_USERS', new_parallel_degree_limit_p1 => &p_degree, new_undo_pool => &p_undo, new_max_est_exec_time => &p_exec, new_max_idle_time => &p_idle, new_max_idle_blocker_time => &p_block ); end; / exec dbms_resource_manager.submit_pending_area(); alter system set resource_manager_plan= 'daytime';
alter system set resource_manager_plan= '';
๋ก ๋๊ธฐ
๋ฌธ์
nighttime์ด๋ผ๋ resouce_manager_plan์ ์์ฑํ๊ธฐ ๊ทธ๋ฆฌ๊ณ hr ๊ณ์ ์์ ์ด ํ๋์ ์ง์ ํ์ธ์
์ ํํ ๋ณ๋ ฌ๋๋? 4 new_paralle_degree_limit_p1
์ ํํ undo ์ฌ์ฉ๋์? 500๋ฐ์ดํธ new_undo_pool
์ ํํ execution time(์ด)? 300 new_max_est_exec_time
์ ํํ idle time(์ด)? 10 new_max_idle_time
์ ํํ blocking idle time(์ด)? 5 new_max_idle_blocker_time
โ๏ธ SYSTEM user๋ก ์ ์ํ์ฌ consumer group ONLINE_USERS2 ๋ฅผ ์์ฑํ๋ค
SQL> conn system/oracle SYSTEM> exec dbms_resource_manager.create_pending_area(); -- ๋ฆฌ์์ค ๋ฉ๋์ ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ์์ญ์ ์ค์ ํ๊ฒ ๋ค.
โ๏ธ ์ปจ์๋จธ ๊ทธ๋ฃน ์์ฑ (ONLINE_USERS2) / SYS_GROUP ๊ณผ OTHER_GROUP๋ ํญ์ ๋ํดํธ๋ก ์๋ค.
SYSTEM> exec dbms_resource_manager.create_consumer_group('ONLINE_USERS2','Users for Online2'); -- SYS_GROUP ๊ณผ OTHER_GROUP ์ ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ONLINE_USERS ๋ง ์์ฑํ๋ค. โ โ dba๊ถํ ์ ์ ๋ค ๋ฆฌ์์ค ์ฌ์ฉ์ ๋ํ ์ ํ์ด ๋์ ์ ์ ๋ค
๐ก db ์ ๋ง๋ค์ด์ ธ์๋ Consumer ๊ทธ๋ฃนํ์ธํ๋ ๋ช ๋ น์ด
select consumer_group from dba_rsrc_consumer_groups where consumer_group like '%ONLINE%'; CONSUMER_GROUP ------------------------------ ONLINE_USERS2
โ๏ธ ๋ฆฌ์์ค ํ๋ ์์ฑ (nighttime)
SQL> begin dbms_resource_manager.create_plan('NIGHTTIME','Plan for night'); end; / PL/SQL procedure successfully completed.
โ๏ธ ์์์ ์์ฑํ nighttime plan ์ด ์์ฑ๋์๋์ง ํ์ธํ์์ค !
select plan from dba_rsrc_plans;
โ๏ธ ๋ฆฌ์์ค ๋๋ ํฐ๋ธ ์์ฑ (๋๋ ํฐ๋ธ : ๋ถ๋ฐฐ๋ฐฉ๋ฒ)
1. ๊ธฐ์กด์ ์ด๋ฏธ ์๋ SYS_GROUP์ CPU๋ฅผ 1์์๋ก 100% ์ฌ์ฉํ๋๋ก ์ง์์ด ์์ฑSQL> begin dbms_resource_manager.create_plan_directive('NIGHTTIME', 'SYS_GROUP','1st Group Set', cpu_p1=>100); end; / PL/SQL procedure successfully completed.
์ ํํ ๋ณ๋ ฌ๋๋? 4 new_paralle_degree_limit_p1 ์ ํํ undo ์ฌ์ฉ๋์? 500๋ฐ์ดํธ new_undo_pool ์ ํํ execution time(์ด)? 300 new_max_est_exec_time ์ ํํ idle time(์ด)? 10 new_max_idle_time ์ ํํ blocking idle time(์ด)? 5 new_max_idle_blocker_time
- online_users2 ๊ทธ๋ฃน์ lock blocking time์ 30์ด๋ก ์ง์ , cpu ์ฌ์ฉ ์ฐ์ ์์ 2๋ฒ์งธ ์ด๊ณ 70%๋ง ์ฌ์ฉ
begin dbms_resource_manager.create_plan_directive('NIGHTTIME', 'ONLINE_USERS2','2nd Group set', cpu_p2=>70, parallel_degree_limit_p1=>4, undo_pool=>500, max_est_exec_time=>300, max_idle_time=>10, max_idle_blocker_time=>5); end; /
- other_groups ๋ ๋ณ๋ ฌ๋๋ฅผ 4๋ก ์ง์ , cpu ์ฌ์ฉ์จ ์ฐ์ ์์๊ฐ 2๋ฒ์งธ์ด๊ณ 30%๋ง ์ฌ์ฉํ๋๋ก ์ค์
begin dbms_resource_manager.create_plan_directive('NIGHTTIME', 'OTHER_GROUPS','3rd Group', cpu_p2=>30,parallel_degree_limit_p1=>4); end; /
โก๏ธ 2, 3๋ฒ cpu_p2 (cpu ์ฌ์ฉ)์ด ๋๊ฐ๊ฐ ํฉ์ณ์ 100% ์ด ๋์ด์ผ ๊ฒ์ฆ์์ ์๋ฌ๋์ง์๋๋ค.
โ๏ธ ๊ฒ์ฆ ์์
SYSTEM> exec dbms_resource_manager.validate_pending_area(); PL/SQL procedure successfully completed.
โ๏ธ ๊ตฌํ
SYSTEM> exec dbms_resource_manager.submit_pending_area(); alter system set resource_manager_plan=nighttime; PL/SQL procedure successfully completed.
๐ก๋ด๊ฐ ์ด๋ป๊ฒ ์ค์ ํ๋์ง ์กฐํํ๋ ๋ฐฉ๋ฒ
SQL> select plan, group_or_subplan, cpu_p1, cpu_p2, parallel_degree_limit_p1 dop, max_idle_blocker_time block_t from dba_rsrc_plan_directives where plan='NIGHTTIME' order by 1,2;
โ๏ธ HR user๋ฅผ consumer group ONLINE_USERS2๋ก ์ง์ ํ๊ณ default consumer group์ผ๋ก ์ง์ ํ๋ค.
SQL> exec dbms_resource_manager_privs.grant_switch_consumer_group('HR', 'ONLINE_USERS2', true); PL/SQL procedure successfully completed. -- ์ง๊ธ ๋น์ฅ consumer group์ด ONLINE_USERS๊ฐ ๋๋ ๊ฒ. SQL> exec dbms_resource_manager.set_initial_consumer_group('HR', 'ONLINE_USERS2'); PL/SQL procedure successfully completed.
๐ก os์ crontab๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ค๋ผํด์์ ๊ตฌํํ๊ฒ. ํน์ ์๊ฐ์ ํน์ ์์ ์ด ์๋์ผ๋ก ์ํ๋๋๋ก ์ค์ ํ๋ ๊ธฐ๋ฅ!
โ๏ธ ์ค์ผ์ค๋ฌ์ ์ข ๋ฅ 2๊ฐ์ง?
- time base ์ค์ผ์ค๋ฌ : ํน์ ์๊ฐ์ ํน์ ์์ ์ด ์ํ๋๋๋ก
- event base ์ค์ผ์ค๋ฌ : ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํน์ ์์ ์ด ์ํ๋๋๋ก
โก๏ธ dba ์์ ์ด ์ค์ผ์ค๋ฌ ์ฌ์ฉ์ ์ ์ฉํ ๊ฒฝ์ฐ
1. ๋งค์ผ๋ฐค ๋๋ ๋งค์ ๋ง์ผ์ ์๋ง ์์ (ํต๊ณ ์ ๋ณด ์์ง)์ ์๋ํ
2. database ๋ฐฑ์ ์ ์๋ํ
3. ํ ์ด๋ธ ํต๊ณ์ ๋ณด ์์ง ์๋ํ
4. invalid๋ ์ธ๋ฑ์ค๋ ํ๋ก์์ ๋ฅผ ๋ค์ valid์ํค๋ ์์ ์ด ํน์ ์๊ฐ์ ์๋์ผ๋ก ์ํ๋๊ฒ ํ ๋โก๏ธ crontab๊ณผ ๋น๊ตํด์ ๋ ์ข์ ๊ธฐ๋ฅ
1. ์์ ์ํ๊ณผ์ ์ด ์ ์งํ๋๊ณ ์๋์ง ๋ชจ๋ํฐ๋ง ๊ฐ๋ฅ
2. ์์ ์ํ ์ด๋ ฅ์ ํ์ธํ ์ ์๋ค.
3. ์ค์ผ์ค์ ์ค์ ํ๋๊ฒ ํจ์ฌ ๋ ์์ธํ ์ค์ ํ ์ ์๋ค.
(์: ์, ์, ๊ธ ๋ฐค 10์์ ํน์ ์์ ์ด ์ํ๋๊ฒ ํด๋ผ! / ๋งค์ ๋ง์ผ ๋ฐค 10์์ ์์ ์ด ์ํ๋๊ฒ ํ๋ผ!)
(dbms_scheduler.create_program)
(dbms_scheduler.create_scheduler)
(dbms_scheduler.create_job)
(dbms_scheduler_job_run_details)
0. scott ์๊ฒ dba ๊ถํ์ ๋ถ์ฌํ๊ณ ,scott์ ์ ์์ emp01 ํ ์ด๋ธ์ ์์ฑ
SYS> grant dba to scott; SCOTT> create table emp01 ( hiredate date );
1. scott ์ผ๋ก ์ ์ํด์ ์ค์ผ์ค์ ์์ฑํ๋ค.
SCOTT> begin dbms_scheduler.create_schedule( schedule_name=>'scott_insert_sch', repeat_interval=>'freq=secondly; interval=5'); end; /
โก๏ธ ์ด๋ฆ์
scott_insert_sch
์ด๊ณ ,repeat_interval=>'freq=secondly; interval=5
๋ 5์ด๋ง๋ค ํ๋ฒ์ฉ ์๋๋๋ ์ค์ผ์ค ์ด๋ผ๋ ๊ฒ์ด๋ค!2. ํ๋ก๊ทธ๋จ ์์ฑ
SCOTT> begin dbms_scheduler.create_program( program_name=>'scott_insert_prog', program_type=>'PLSQL_BLOCK', program_action=>'begin insert into emp01(hiredate) values (sysdate); end;'); end; /
โก๏ธ
program_action
begin, end์ฌ์ด์ ์๋๊ฒ์ ์ํํ ๊ฒ์ด๋ค.๊ทธ๊ฒ์ด emp01 ํ ์ด๋ธ์ ์ค๋ ๋ ์ง๋ฅผ ์ ๋ ฅํ๋ ํ๋ก๊ทธ๋จ ์์ฑ3. ์์ (job) ์์ฑ
SCOTT> begin dbms_scheduler.create_job( job_name=>'scott_insert', program_name=>'scott_insert_prog', schedule_name=>'scott_insert_sch' ); end; /
4. ์์ , ํ๋ก๊ทธ๋จ enable ์ํค๊ธฐ
SCOTT> exec dbms_scheduler.enable('scott_insert'); SCOTT> exec dbms_scheduler.enable('scott_insert_prog');
5. ๊ฒฐ๊ณผ ํ์ธ
SCOTT> select * from emp01;
6. ์ค์ผ์ค์ด ์ ๋๋์ง ํ์ธํ์์ค !select * from dba_scheduler_job_run_details WHERE owner='SCOTT';
๋ฌธ์
scott_insert job์ ์ค์ง์ํค๊ธฐ
SCOTT> exec dbms_scheduler.disable('scott_insert');
๋ฌธ์
scott_insert job์ drop ์ํค์์ค!
SCOTT> exec dbms_scheduler.drop_job('scott_insert');
๋ฌธ์
scott_insert_sch ์ค์ผ์ค์ dropํ๊ธฐ!
SCOTT> exec dbms_scheduler.drop_schedule('scott_insert_sch');
๋ฌธ์
scott_insert_prog ํ๋ก๊ทธ๋จ์ dropํ๊ธฐ!
SCOTT> exec dbms_scheduler.drop_program('scott_insert_prog');
๋ฌธ์
์๋์ ๋ก๊ทธ์ค์์น๋ฅผ ์ผ์ผํค๋ pl/sql์ด 5์ด์ ํ๋ฒ์ฉ ์ํ๋๊ฒ ์ค์ผ์ค, ํ๋ก๊ทธ๋จ, ์์
(job)์ ๋ง๋์์ค!
begin execute immediate 'alter system switch logfile'; end; --์๋ฅผ 5์ด์ ํ๋ฒ์ฉ ์ํ๋๋๋ก!!! 'begin execute immediate ''alter system switch logfile''; end;'
1. scott ์ผ๋ก ์ ์ํด์ ์ค์ผ์ค์ ์์ฑํ๋ค.
SCOTT> begin dbms_scheduler.create_schedule( schedule_name=>'scott_logs_sch', repeat_interval=>'freq=secondly; interval=5'); end; /
โก๏ธ ์ด๋ฆ์
scott_logs_sch
์ด๊ณ ,repeat_interval=>'freq=secondly; interval=5
๋ 5์ด๋ง๋ค ํ๋ฒ์ฉ ์๋๋๋ ์ค์ผ์ค ์ด๋ผ๋ ๊ฒ์ด๋ค!2. ํ๋ก๊ทธ๋จ ์์ฑ
SCOTT> begin dbms_scheduler.create_program( program_name=>'scott_logs_prog', program_type=>'PLSQL_BLOCK', program_action=>'begin execute immediate ''alter system switch logfile''; end;'); end; /
โก๏ธ
program_action
begin, end์ฌ์ด์ ์๋๊ฒ์ ์ํํ ๊ฒ์ธ๋ฐ ๊ทธ๊ฒ์ ๋ก๊ทธ์ค์์น๊ฐ ์ผ์ด๋๋ ๊ฒ !3. ์์ (job) ์์ฑ
SCOTT> begin dbms_scheduler.create_job( job_name=>'scott_logs', program_name=>'scott_logs_prog', schedule_name=>'scott_logs_sch' ); end; /
4. ์์ , ํ๋ก๊ทธ๋จ enable ์ํค๊ธฐ
SCOTT> exec dbms_scheduler.enable('scott_logs'); SCOTT> exec dbms_scheduler.enable('scott_logs_prog');
5. ๊ฒฐ๊ณผ ํ์ธ - alert log file ํ์ธ
$ tail -f alert*
6. ์ค์ผ์ค์ด ์ ๋๋์ง ํ์ธํ์์ค !select * from dba_scheduler_job_run_details WHERE owner='SCOTT';
7. ๋ค์ disable์ํค๊ธฐSCOTT> exec dbms_scheduler.disable('scott_logs');
์ค๋์ ๋ง์ง๋ง ๋ฌธ์
dept table์ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๋ ์๋์ ํ๋ก์์ ๋ฅผ ์ํํ์์ค!
create or replace procedure dept_insert
is
v_deptno dept.deptno%type;
begin
select max(deptno) + 10 into v_deptno
from dept;
insert into dept(deptno, dname, loc)
values(v_deptno, 'aaa','bbb');
end;
/
------------------------------------------------
exec dept_insert
1. scott ์ผ๋ก ์ ์ํด์ ์ค์ผ์ค์ ์์ฑํ๋ค.
SCOTT> begin dbms_scheduler.create_schedule( schedule_name=>'scott_dept_insert_sch', repeat_interval=>'freq=secondly; interval=5'); end; /
2. ํ๋ก๊ทธ๋จ ์์ฑ
SCOTT> begin dbms_scheduler.create_program( program_name=>'scott_dept_insert_prog', program_type=>'STORED_PROCEDURE', program_action=>'dept_insert'); end; / SCOTT @ orcl3 > begin dbms_scheduler.create_program( program_name=>'scott_dept_insert_prog', program_type=>'PLSQL_BLOCK', program_action=>'begin dept_insert; end;'); end; /
โก๏ธ
program_action
begin, end์ฌ์ด์ ์๋๊ฒ์ ์ํ!3. ์์ (job) ์์ฑ
SCOTT> begin dbms_scheduler.create_job( job_name=>'scott_insert_dept', program_name=>'scott_dept_insert_prog', schedule_name=>'scott_dept_insert_sch' ); end; /
4. ์์ , ํ๋ก๊ทธ๋จ enable ์ํค๊ธฐ
SCOTT> exec dbms_scheduler.enable('scott_insert_dept'); SCOTT> exec dbms_scheduler.enable('scott_dept_insert_prog');
5. ๊ฒฐ๊ณผ ํ์ธ
SCOTT> select * from dept;
6. ์ค์ผ์ค์ด ์ ๋๋์ง ํ์ธํ์์ค !
select * from dba_scheduler_job_run_details WHERE owner='SCOTT';
7. ๋ค์ disable์ํค๊ธฐ
SCOTT> exec dbms_scheduler.disable('scott_insert_dept');
exec dbms_scheduler.drop_program('scott_dept_insert_prog');
exec dbms_scheduler.drop_schedule('scott_dept_insert_sch');
exec dbms_scheduler.drop_job('scott_insert_dept');