[Oracle] DB 서버의 리소스 사용 제한 (profile)

·2025년 9월 3일

오라클 관리

목록 보기
83/163


[이론1] 프로파일(profile)이란?

💡 유저의 패스워드를 더 엄격하게 관리하고 싶거나 유저의 db 리소스 사용을 제한하고 싶을 때 사용


을지로에 있는 모 은행의 사례:
업무시간에 악성 SQL이 자꾸 수행 되어서 오라클에 접속한 유져들이 아무것도 못하는 일이 반복되니까
그 은행 DBA가 아침 9:00 ~ 저녁 6:00 까지는 악성 SQL 자체가 아예 실행 안되게 막아 버림


[이론2] profile로 관리 할 수 있는 기능 2가지

💡
1. 리소스(resource) 관리(리소스 소비 제어)
★ resource_limit 파라미터에 영향을 받음
 
2. 패스워드(password) 관리(계정 상태 및 암호 만료 관리)
★ resource_limit 파라미터에 영향을 받지 않음 (ocp시험문제)


[실습1] 리소스(resource) 관리 프로파일을 실습하기

0. sqlplus에 scott 으로 접속해서 다음과 같이 조회합니다.

[oracle@ora19c ~]$ sqlplus scott/tiger

SQL*Plus: Release 19.0.0.0.0 - Production on93 14:10:47 2025
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

마지막 성공한 로그인 시간: 화 902 2025 14:49:07 +09:00

다음에 접속됨:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SCOTT @ ORA19 > set autot on

SCOTT @ ORA19 >
SCOTT @ ORA19 >
SCOTT @ ORA19 > select *
  2             from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON


Execution Plan
----------------------------------------------------------

---------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)|
---------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     4 |   120 |     3   (0)|
|   1 |  TABLE ACCESS FULL| DEPT |     4 |   120 |     3   (0)|
---------------------------------------------------------------

Note
-----
   - 'PLAN_TABLE' is old version


Statistics
----------------------------------------------------------
         29  recursive calls
         15  db block gets
         66  consistent gets
          6  physical reads
       3108  redo size
        858  bytes sent via SQL*Net to client
        391  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
          4  rows processed



1. 오랜지에 scott으로 접속해서 dept 테이블을 select 했을 때 읽어들이는 블럭의 갯수를 확인하시오

select * from dept; 


2. sys 유져로 들어와서 악성 sql이 수행 안되게 profile을 적용합니다.

[oracle@ora19c ~]$ connect / as sysdba

SYS @ ORA19 > alter profile  default  limit
 			  logical_reads_per_call 30;

SYS @ ORA19 > show parameter resource_limit

SYS @ ORA19 > alter  system  set resource_limit=true;


3. scott 으로 접속해서 악성 sql을 수행해봅니다. 

SYS @ ORA19 > connect scott/tiger
연결되었습니다.

SCOTT @ ORA19 > select count(*)
  2  from emp, emp, emp, emp, emp, emp, emp, emp;
from emp, emp, emp, emp, emp, emp, emp, emp
     *
2행에 오류:
ORA-02395: IO 사용에 대한 호출 한계치를 초과했습니다


4. 다시 악성 SQL이 수행될 수 있도록 하시오 

SCOTT @ ORA19 > connect / as sysdba
연결되었습니다.
SYS @ ORA19 > alter profile default limit
  2  	 	  logical_reads_per_call unlimited;

프로파일이 변경되었습니다.


5. scott 으로 접속해서 악성 SQL을 수행합니다.

SYS @ ORA19 > connect scott/tiger
연결되었습니다.
SCOTT @ ORA19 > select count(*) from emp, emp, emp, emp;

  COUNT(*)
----------
     38416

SCOTT @ ORA19 >

  • set autot on
    : auto trace를 활성화시키겠다는 의미

문제1. 아래의 SQL도 수행이 안되게 default 프로파일을 변경하시오

select * from dept; 

답:

SYS @ ORA19 > alter profile default limit
  2  logical_reads_per_call 3;

프로파일이 변경되었습니다.

SYS @ ORA19 > show parameter resource_limit

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
resource_limit                       boolean     TRUE
SYS @ ORA19 > alter system set resource_limit=true;

시스템이 변경되었습니다.

SYS @ ORA19 > connect scott/tiger
연결되었습니다.
SCOTT @ ORA19 > select count(*)
  2  from dept, dept,dept,dept,dept,dept,dept,dept,dept,dept;
from dept, dept,dept,dept,dept,dept,dept,dept,dept,dept
     *
2행에 오류:
ORA-02395: IO 사용에 대한 호출 한계치를 초과했습니다


SCOTT @ ORA19 > connect / as sysdba
연결되었습니다.
SYS @ ORA19 > alter profile default limit
  2  		  logical_reads_per_call unlimited;

프로파일이 변경되었습니다.

SYS @ ORA19 > connect scott/tiger
연결되었습니다.
SCOTT @ ORA19 > select count(*) from dept, dept, dept, dept;

  COUNT(*)
----------
       256

SCOTT @ ORA19 >

[실습2] 1분동안 아무것도 안하고 있으면 자동으로 접속이 끊기게 default 프로파일을 변경하시오

SYS @ ORA19 > connect / as sysdba
연결되었습니다.
SYS @ ORA19 >
SYS @ ORA19 > alter profile default limit idle_time 1;

프로파일이 변경되었습니다.

SYS @ ORA19 >
SYS @ ORA19 > connect scott/tiger
연결되었습니다.

SCOTT @ ORA19 >
SCOTT @ ORA19 > select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

SCOTT @ ORA19 > select count(*) from emp;

  COUNT(*)
----------
        13
        
        
        
-- 1분동안 아무것도 하지 않음


SCOTT @ ORA19 > /
select count(*) from emp
*
1행에 오류:
ORA-02396: 최대 유휴(idle) 시간을 초과했음. 다시 연결하십시오

SCOTT @ ORA19 > connect / as sysdba
연결되었습니다.
SYS @ ORA19 >
SYS @ ORA19 > alter profile default limit idle_time unlimited;

프로파일이 변경되었습니다.

0개의 댓글