Describe 자원관리 here {{{ SQL> CONN SYSTEM/MANAGER 연결되었습니다. SQL> COL PROFILE FORMAT A20 SQL> COL RESOURCE_NAME FORMAT A30 SQL> COL LIMIT FORMAT A20 SQL> SELECT * FROM DBA_PROFILES 2 WHERE RESOURCE_TYPE = 'KERNEL'; PROFILE RESOURCE_NAME RESOURCE_TYPE LIMIT -------------------- ------------------------------ ---------------- ----------- DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED YASI_PROFILE COMPOSITE_LIMIT KERNEL DEFAULT DEFAULT SESSIONS_PER_USER KERNEL UNLIMITED YASI_PROFILE SESSIONS_PER_USER KERNEL DEFAULT DEFAULT CPU_PER_SESSION KERNEL UNLIMITED YASI_PROFILE CPU_PER_SESSION KERNEL DEFAULT DEFAULT CPU_PER_CALL KERNEL UNLIMITED YASI_PROFILE CPU_PER_CALL KERNEL DEFAULT DEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITED YASI_PROFILE LOGICAL_READS_PER_SESSION KERNEL DEFAULT DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED YASI_PROFILE LOGICAL_READS_PER_CALL KERNEL DEFAULT DEFAULT IDLE_TIME KERNEL UNLIMITED YASI_PROFILE IDLE_TIME KERNEL DEFAULT DEFAULT CONNECT_TIME KERNEL UNLIMITED YASI_PROFILE CONNECT_TIME KERNEL DEFAULT DEFAULT PRIVATE_SGA KERNEL UNLIMITED YASI_PROFILE PRIVATE_SGA KERNEL DEFAULT 18 개의 행이 선택되었습니다. SQL> SELECT * FROM DBA_PROFILES 2 WHERE RESOURCE_TYPE = 'KERNEL' 3 AND PROFILE = 'DEFAULT'; PROFILE RESOURCE_NAME RESOURCE_TYPE LIMIT -------------------- ------------------------------ ---------------- ----------- DEFAULT COMPOSITE_LIMIT KERNEL UNLIMITED DEFAULT SESSIONS_PER_USER KERNEL UNLIMITED DEFAULT CPU_PER_SESSION KERNEL UNLIMITED DEFAULT CPU_PER_CALL KERNEL UNLIMITED DEFAULT LOGICAL_READS_PER_SESSION KERNEL UNLIMITED DEFAULT LOGICAL_READS_PER_CALL KERNEL UNLIMITED DEFAULT IDLE_TIME KERNEL UNLIMITED DEFAULT CONNECT_TIME KERNEL UNLIMITED DEFAULT PRIVATE_SGA KERNEL UNLIMITED 9 개의 행이 선택되었습니다. SQL> COL RESOURCE_NAME FORMAT A30 SQL> COL "설명" FORMAT A60 SQL> COL "레벨" FORMAT A15 SQL> SELECT RESOURCE_NAME, 2 DECODE(RESOURCE_NAME, 3 'COMPOSITE_LIMIT', '자원의 복수제한(여러개 짬뽕한 값)', 4 'SESSIONS_PER_USER', '한 사용자가 접속할 수 있는 세션수', 5 'CPU_PER_SESSION', '한 세션의 총 CPU 시간(초)', 6 'CONNECT_TIME', '세션을 열은 후 최대 접속시간(분)', 7 'IDLE_TIME', '한 세션에서 아무런 짓거리 안하고 있을 있는 시간(분)', 8 'LOGICAL_READS_PER_SESSION', '세션당 논리적 읽기를 할 수있는 블록수', 9 'PRIVATE_SGA', '오라클 MTS에서의 개인 PGA 영역', 10 'CPU_PER_CALL', '하나의 데이타베이스 CALL CPU TIME(1/100초)', 11 'LOGICAL_READS_PER_CALL', '하나의 데이타베이스 CALL당 논리적 읽기를 할 수있는 블록수') "설명", 12 DECODE(RESOURCE_NAME, 13 'COMPOSITE_LIMIT', 'COMPOSITE LIMIT', 14 'SESSIONS_PER_USER', 'SESSION LEVEL', 15 'CPU_PER_SESSION', 'SESSION LEVEL', 16 'CONNECT_TIME', 'SESSION LEVEL', 17 'IDLE_TIME', 'SESSION LEVEL', 18 'LOGICAL_READS_PER_SESSION', 'SESSION LEVEL', 19 'PRIVATE_SGA', 'SESSION LEVEL', 20 'CPU_PER_CALL', 'CALL LEVEL', 21 'LOGICAL_READS_PER_CALL', 'CALL LEVEL') "레벨" 22 FROM DBA_PROFILES 23 WHERE RESOURCE_TYPE = 'KERNEL' 24 AND PROFILE = 'DEFAULT'; RESOURCE_NAME 설명 레벨 ------------------------------ ------------------------------------------------------------ -------- COMPOSITE_LIMIT 자원의 복수제한(여러개 짬뽕한 값) COMPOSITE LIMIT SESSIONS_PER_USER 한 사용자가 접속할 수 있는 세션수 SESSION LEVEL CPU_PER_SESSION 한 세션의 총 CPU 시간(초) SESSION LEVEL CPU_PER_CALL 하나의 데이타베이스 CALL CPU TIME(1/100초) CALL LEVEL LOGICAL_READS_PER_SESSION 세션당 논리적 읽기를 할 수있는 블록수 SESSION LEVEL LOGICAL_READS_PER_CALL 하나의 데이타베이스 CALL당 논리적 읽기를 할 수있는 블록수 CALL LEVE IDLE_TIME 한 세션에서 아무런 짓거리 안하고 있을 있는 시간(분) SESSION LEVEL CONNECT_TIME 세션을 열은 후 최대 접속시간(분) SESSION LEVEL PRIVATE_SGA 오라클 MTS에서의 개인 PGA 영역 SESSION LEVEL 9 개의 행이 선택되었습니다. SQL> 위에 설명까지 되어 있습니다.. 약간더 보충한다면 세션레벨 제한은 접속시 즉, CREATE SESSION을 했을때 시스템에 대한 자원의 제한이 설정되는 것이고, 콜 레벨 제한은 SQL문 실행시 제한을 걸게되는 것입니다. 또한 논리적 읽기를 하려면 반드시 물리적 읽기가 적어도 한번은 실행 되어야 하는데 여기서는 이러한 물리적 읽기까지 포함하는 값입니다.. 또한, PROFILE은 초기화 파라미터의 RESOURCE_LIMIT = TRUE 해야지만 활성화 됩니다.. 해당 세션에서 프로파일을 활성화 하려면 ALTER SYSTEM SET RESOURCE_LIMIT = TRUE; 하면 됩니다.. 이제 CREATE PROFILE에 대한 문법을 살펴보겠습니다.. CREATE PROFILE profile LIMIT { resource_parameters | password_parameters } [ resource_parameters | password_parameters ]...; resource_parameters::= { { SESSIONS_PER_USER | CPU_PER_SESSION | CPU_PER_CALL | CONNECT_TIME | IDLE_TIME | LOGICAL_READS_PER_SESSION | LOGICAL_READS_PER_CALL | COMPOSITE_LIMIT } { integer | UNLIMITED | DEFAULT } | PRIVATE_SGA { integer [ K | M ] | UNLIMITED | DEFAULT } } password_parameters::= { { FAILED_LOGIN_ATTEMPTS | PASSWORD_LIFE_TIME | PASSWORD_REUSE_TIME | PASSWORD_REUSE_MAX | PASSWORD_LOCK_TIME | PASSWORD_GRACE_TIME } { expr | UNLIMITED | DEFAULT } | PASSWORD_VERIFY_FUNCTION { function | NULL | DEFAULT } } 저의 어리버리함을 달래줄...원래 메뉴얼의 설명입니다.. SESSIONS_PER_USER Specify the number of concurrent sessions to which you want to limit the user. CPU_PER_SESSION Specify the CPU time limit for a session, expressed in hundredth of seconds. CPU_PER_CALL Specify the CPU time limit for a call (a parse, execute, or fetch), expressed in hundredths of seconds. CONNECT_TIME Specify the total elapsed time limit for a session, expressed in minutes. IDLE_TIME Specify the permitted periods of continuous inactive time during a session, expressed in minutes. Long-running queries and other operations are not subject to this limit. LOGICAL_READS_PER_SESSION Specify the permitted number of data blocks read in a session, including blocks read from memory and disk. LOGICAL_READS_PER_CALL Specify the permitted the number of data blocks read for a call to process a SQL statement (a parse, execute, or fetch). PRIVATE_SGA Specify the amount of private space a session can allocate in the shared pool of the system global area (SGA), expressed in bytes. Use K or M to specify this limit in kilobytes or megabytes. SQL> CREATE PROFILE YASI_PROFILE LIMIT 2 SESSIONS_PER_USER UNLIMITED 3 CPU_PER_SESSION UNLIMITED 4 CPU_PER_CALL 3000 5 CONNECT_TIME 45 6 LOGICAL_READS_PER_SESSION DEFAULT 7 LOGICAL_READS_PER_CALL 1000 8 PRIVATE_SGA 15K 9 COMPOSITE_LIMIT 5000000; CREATE PROFILE YASI_PROFILE LIMIT * 1행에 오류: ORA-02379: YASI_PROFILE 프로파일이 이미 존재합니다 SQL> ALTER PROFILE YASI_PROFILE LIMIT 2 SESSIONS_PER_USER UNLIMITED 3 CPU_PER_SESSION UNLIMITED 4 CPU_PER_CALL 3000 5 CONNECT_TIME 45 6 LOGICAL_READS_PER_SESSION DEFAULT 7 LOGICAL_READS_PER_CALL 1000 8 PRIVATE_SGA 15K 9 COMPOSITE_LIMIT 500000; 프로파일이 변경되었습니다. SQL> COMPOSITE_LIMIT 에서는 비용을 따진 수치입니다..복수제한에서 제한할 수 있는 자원은 CPU_PER_SESSION, CONNECT_TIME, PRIVATE_SGA, LOGICAL_READS_PER_SESSION의 4가지 입 니다. 위의 예에서 보는 것처럼 수치가 큰 이유는 이들 4가지 값을 계산하여서 적용하 는 것이기 때문입니다.. 여기서 각각의 자원을 관리하기 위해서 ALTER RESOURCE COST 문을 사용합니다.. 이것은 COMPOSITE_LIMIT에 할당된 값에 대한 값들의 모임이라고 생각하면 됩니다.. 즉, COMPOSITE_LIMIT 에 영향을 끼치는 것은 CREATE PROFILE에 나타난 값들이 아니라 아래의 ALTER RESOURCE COST 에서 결정한 값이라고 할 수 있습니다. ALTER RESOURCE COST { CPU_PER_SESSION | CONNECT_TIME | LOGICAL_READS_PER_SESSION | PRIVATE_SGA } integer [ {CPU_PER_SESSION | CONNECT_TIME | LOGICAL_READS_PER_SESSION | PRIVATE_SGA } integer ] ... ; COMPOSITE_LIMIT 에 적용하는 값에 대한 계산 방법은 다음과 같습니다. 만약 다음과 같이 RESOURE_COST를 설정했다고 하면.. SQL> ALTER RESOURCE COST 2 CPU_PER_SESSION 500 3 LOGICAL_READS_PER_SESSION 100 4 CONNECT_TIME 10; 자원 비용이 변경되었습니다. 만약.. A라는 사용자가 CPU를 5초 사용했고, 3000 블록을 읽었으며, 접속시간이 60분이고, MTS기반이 아니라면... 다음과 같이 계산된다. 주의할 것은 단위이다.. CPU_PER_SESSION --> 1/100 초단위 LOGICAL_READS_PER_SESSION --> 블록단위 CONNECT_TIME --> 분단위 PRIVATE_SGA --> KB단위 TOTAL COST = (CPU_PER_SESSION + LOGICAL_READS_PER_SESSION + CONNECT_TIME + PRIVATE_SGA) CPU_PER_SESSION --> 5초 --> 500 LOGICAL_READS_PER_SESSION --> 3000 블록 CONNECT_TIME --> 60분 SQL> SELECT RESOURCE_NAME, LIMIT 2 FROM DBA_PROFILES 3 WHERE RESOURCE_NAME = 'COMPOSITE_LIMIT' 4 AND PROFILE = 'YASI_PROFILE'; RESOURCE_NAME LIMIT ------------------------------ -------------------- COMPOSITE_LIMIT 500000 SQL> SQL> SELECT (500* 500) + (3000*100) + (60*10) TOTAL_COST FROM DUAL; TOTAL_COST ---------- 550600 SQL> 사용제한 수치를 넘었으므로 A사용자의 작업은 롤백이 됩니다. 중요한 것은 자원사용의 제한에 걸리기 전에 COMMIT한 작업은 모두 정상적으로 되나, 자원의 제한에 걸려서 진행 한 작업은 COMMIT 될 수 없다는 것입니다. 참고... COL RESOURCE_NAME FORMAT A30 COL "설명" FORMAT A60 COL "레벨" FORMAT A15 SELECT RESOURCE_NAME, DECODE(RESOURCE_NAME, 'COMPOSITE_LIMIT', '자원의 복수제한(여러개 짬뽕한 값)', 'SESSIONS_PER_USER', '한 사용자가 접속할 수 있는 세션수', 'CPU_PER_SESSION', '한 세션의 총 CPU 시간(초)', 'CONNECT_TIME', '세션을 열은 후 최대 접속시간(분)', 'IDLE_TIME', '한 세션에서 아무런 짓거리 안하고 있을 있는 시간(분)', 'LOGICAL_READS_PER_SESSION', '세션당 논리적 읽기를 할 수있는 블록수', 'PRIVATE_SGA', '오라클 MTS에서의 개인 PGA 영역', 'CPU_PER_CALL', '하나의 데이타베이스 CALL CPU TIME(1/100초)', 'LOGICAL_READS_PER_CALL', '하나의 데이타베이스 CALL당 논리적 읽기를 할 수있는 블록수') "설명", DECODE(RESOURCE_NAME, 'COMPOSITE_LIMIT', 'COMPOSITE LIMIT', 'SESSIONS_PER_USER', 'SESSION LEVEL', 'CPU_PER_SESSION', 'SESSION LEVEL', 'CONNECT_TIME', 'SESSION LEVEL', 'IDLE_TIME', 'SESSION LEVEL', 'LOGICAL_READS_PER_SESSION', 'SESSION LEVEL', 'PRIVATE_SGA', 'SESSION LEVEL', 'CPU_PER_CALL', 'CALL LEVEL', 'LOGICAL_READS_PER_CALL', 'CALL LEVEL') "레벨" FROM DBA_PROFILES WHERE RESOURCE_TYPE = 'KERNEL' AND PROFILE = 'DEFAULT'; }}}