ORACLE/ADMIN2008. 11. 19. 14:12
반응형
1. 기존의 datafile을 resize하여 늘리는 경우.

datafile size를 증가하는 경우는 disk에 free space만 있다면 다음과 같이 간단합니다.
다음과 같이 늘리면 되나 줄일 경우는 계산을 하여 줄여야 합니다.

SQL>alter database datafile   '/oracle/dbs/toolsORA.dbf' resize 100M;

2. 기존의 datafile을 줄이는 경우.

만일 지정한 size만큼 data가 있다면 error가 발생되고 resize되지 않습니다.
SQL> alter database datafile   '/oracle/dbs/toolsORA.dbf' resize 100M;
alter database datafile   '/oracle/dbs/toolsORA.dbf' resize 100M'
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value

[방법 1]
1) 줄이고자하는 file id를 확인합니다.
SVRMGR> select file_id, file_name from dba_data_files;

2) 얼마를 사용했는지 확인합니다.
SVRMGR> select block_id, blocks from dba_extents
     2> where file_id='FILE_ID' order by block_id;
     FILE_ID 대신에 줄이려는 file id를 기술합니다.

3)현재 사용중인 db block size를 확인합니다.
SVRMGR> show parameter db_block_size

만일 2048일 경우 다음과 같이 계산합니다.

2)에서 조회된 마지막의 block_id, blocks 값을 가지고 계산합니다.
block_id * 2048 + blocks * 2048 의 결과에 한 block더한 값만큼만 줄이는
것이 가능합니다.
만일 마지막으로 조회된 값이 block_id가 578261, blocks가 515일 경우
578261*2048 + 515*2048 =1185333248로 최소한 1.2GB이상은 써야 합니다.

4) 실제 datafile을 줄입니다.
svrmgr>alter database datafile   '/oracle/dbs/toolsORA.dbf' resize
1200M;

[방법 2]
1) 기존의 data export
exp username/password file=filename owner=username log=username.log

2) tablespace drop
svrmgr>drop tablespace tbs including contents;
rm datafile

tbs대신에 작게 만드시려는 tablespace name을 기술합니다.
datafile대신에 tablespace와 연계된 모든 datafile을 remove합니다.

3) tablespace재생성
svrmgr>create tablespace tbs
             datafile '...' size 100M;
원하시는 size로 줄입니다.

4) data import
imp username/password file=filename fromuser=username touser=username
commit=y log=imp.log


[자료출처 :
www.oracle.co.kr]

반응형
Posted by [PineTree]
OS/LINUX2008. 11. 17. 01:03
반응형
1. 해커가 침투했다면 부팅관련 init를 변경했을 위험이 있다.
    만약 변경되었다면 부팅이 되지 않는다.

/etc/rc.d 에 보면 init가 있다.

서버 전원넣으면 바이오스에서 하드웨어 감지하고, 마스터 하드로 점핑해주죠.
마스터 하드(부팅관련)점핑되면 lilo에서 해당 커널을 올려줘요
그러면 해당 커널로 로딩되면서 /etc/init.d/에 있는 런레벨 스크립트를 실행하죠
만약 init가 엉망이면 부팅 실패되면 컴퓨터 멈춰버리죠

이럴 경우는 복원모드로 들어가서 작업해줘야 되죠

                복원모드는 linux rescue

** 참고

파티션 구성하는 부분에서 중요데이터가 있는 파티션을 제외한 나머지는 새로 잡아줘서 재설치해주면 되요.
그래서 리눅스 셋팅시 파티션 계획이 아주 중요하죠.(이것도 내공은 약하지만 정리해서 공개할께요)
/database, /log, /home 등은 독립파티션으로~
위의 중요파티션을 제외하고 나머지는 새로 파티션 잡고 설치한 후 취약한 부분 패치해주고 이런식이죠

2. 변경되어있는 명령어 있나 확인

lsattr /bin/* | more 해서 변경되어있는 명령어 있나 확인

lsattr /sbin/* | more

만약에 변경되어 있다면,
rpm -qf 변경된명령어  하면 변경된명령어가 포함된 패키지명이 나온다

이것을 강제로 재설치해주면 되는데, 이것이 해킹당한 명령어 복원해주는 기술이다.

예를들어서 /bin/su 명령어가 변경되었을 경우,

[root@ecweb-7 tmp]# rpm -qf /bin/su 해보면

coreutils-4.5.3-19.0.2  패키지명이 출력되죠

이것을 재설치해주면 된다.

참고사이트 http://www.blocus-zone.com/modules/news/print.php?storyid=639


3. 백도어 찾기

find /dev -type f 해서

MAKEDEV 요것만 나오면 정상이고, 다른거 나오면 100% 백도어임


4. 프로세서 검색

netstat -tnapu |grep LISTEN 해서 이상한 프로세서 띄워져 있으면,

프로세스 PID 값을 복사하여 커멘드라인에서 ls -al /proc/pic값 주면
스크립트 돌아가고 있는 디렉토리 위치 보여짐

여기에서 rm -rf 명령을 이용하여 삭제

** PID값이란?
프로세스가 시작될 때 커널에서 부여해주는 값으로, 참고로 PID값은 모두 다르다.

예를들어서,

ps -aux 했을 때 아래의 프로세스가 악성일 경우

nobody  13338  0.3  0.8 17084 9272 ?        S    13:06  1:13 /usr/local/apache/bin/httpd

ls -al /proc/13338 해보면

lrwxrwxrwx    1 root    1001            0  9월 17 18:17 exe -> /usr/local/apache/bin/httpd
식으로 경로추적되요

대부분 nobody 사용자로 불법접근해서 루트 따먹기 위해 악성코드 돌리는데

exe -> 위치가 /var/tmp 혹은 /tmp 이에요

요런건 바로 삭제해줘야죠

이제 어설픈 해커나 크래커들에게 당하고 울지 않기를~~~
부타카케~~ 부타카케~~ 상처받지 않기를~~~

====================================================================================================

find /dev -type f 해서
/dev/.udev.tdb
출력이 되는데요.

이는 백도어가 아니라고 합니다. 참조링크

http://linux-sarang.net/board/?p=read&table=qa&no=211741

http://linuxfromscratch.org/pipermail/lfs-dev/2004-September/049089.html

http://wiki.kldp.org/wiki.php/BooyoLiveCD/RcdotSysinit?action=raw
반응형

'OS > LINUX' 카테고리의 다른 글

Linux 성능 조정 - tcp  (0) 2009.03.13
RHEL 4 에 YUM 설치  (0) 2009.02.10
RPM src install  (0) 2008.06.24
rpm 아키택쳐 버젼까지 확인방법  (0) 2008.05.31
linux bonding  (0) 2008.04.19
Posted by [PineTree]
ORACLE/ORACLE TOOL2008. 11. 11. 17:30
반응형

SQL Developer

문서화와 모니터링, 그리고 관리

 

Oracle SQL Developer 1.5의 새로운 기능 활용하기

 

Oracle SQL Developer 1.5에서는다양한기능들이새롭게선보였다. 처 음에는사소한것처럼보이는기능조차도사용자들의일상적인작업에상 당히유용한도움을줄수있다. 본기사에서는Oracle Database의객체와 스키마를 문서화하고 관리할 수 있도록 돕는 Oracle SQL Developer 1.5 기능에대해다루고있다. 여기에서는다음을배울수있다.

 

•프로젝트 내 다른 참가자와 손쉽게 객체 세부 사항 공유

•인스턴트 보고서를 이용하여 데이터베이스 세션 및 테이블스페이 스에 대한 상세 내역을 입수하고 세션을 종료하며 데이터베이스를 닫을 수 있음

•복사및내보내기유틸리티를활용하여손쉽게여러스키마와연동 할 수 있음

 

본 기사의 예제는 Oracle SQL Developer 1.5.1을 필요로 한다. Oracle SQL Developer 1.5의 프로덕션 릴리스를 설치했다면, 이를 열고 Help - > Check For Updates를이용하여Oracle SQL Developer 1.5.1로업데 이트한다. 아니면OTN에서 전체 Oracle SQL Developer 1.5.1 설치를 다운로드하여 새로운 빈 폴더로 압축을 해제한다(기존 Oracle SQL Developer 폴더에서압축을해제하면안된다).

 

설치가진행되는동안Oracle SQL Developer 1.2.x 또는1.5에서Oracle SQL Developer 1.5.1로 데이터베이스 커넥션 및 환경 설정을 마이그레 이션할수있다. 환경설정을마이그레이션하기를원치않는경우, 설치이 후 모든 이전 릴리스에서 데이터베이스 커넥션을 가져올 수 있다. 커넥션 을가져오려면,

 

1. Oracle SQL Developer의 이전 릴리스를 시작한다.

2. Connections Navigator에서 Connections을 선택한다.

3. 오른쪽 마우스 버튼을 클릭하고 Export Connections을 선택한다.

4. 적절한 위치로 브라우저하고 connections.xml과 같은 파일명을 입력한 다음, Save를 클릭 한다.

5. 이전 릴리스를 닫고 Oracle SQL Developer 1.5.1을 시작한다.

6. Connections Navigator에서 Connections을 선택한다.

7. 오른쪽 마우스 버튼을 클릭하고 Import Connections을 선택한다

8. 파일로 브라우저하고 Open을 클릭한 다음, OK를 클릭한다.

 

본 기사에서는 Oracle Database 인스턴스 내HR 및OE 예제 스키마에 액세스해야한다.

 

데이터베이스 문서 작성하기

 

여러분은 자신만의 리뷰 또는 다른 사람과의 공유를 위해HTML 포맷으 로스키마에대한문서를작성할수있다. 다음과같은단계에따라스키마 문서를작성하고볼수있다.

 

1. 현재 HR 스키마에 대한 커넥션이 없다면, 하나를 만들어 HR_ORCL라고 명명한다(커넥션을 만드는 데 대한 상세 정보는“http://www.oracle.com/technology/oramag/oracle/08 -sep/o58sql.html#next#next”에서 확인할 수 있으며“, http://www.oracle.com/technology /oramag/oracle/08-may/o38sql.html”에서도 설명하고 있다).

2. HR_ORCL 커넥션을 오른쪽 마우스 버튼을 누르고 Generate DB Doc를 선택한다.

3. 만들어진 파일을 위해 적당한 위치를 선택하거나 \working과 같은 폴더를 만든다. 만들어 진 파일을 다른 사람들과 공유할 계획이라면 공유 파일 서버 위치를 이용한다(이 파일을 이 동하거나 복사할 수 있다).

 

기본브라우저에index.html 파일이자동으로열리게된다. 자동으로열리 지않으면브라우저에서\working\index.html 파일을탐색해이를연다. HTML 문서내모든데이터베이스객체에대한상세내역을보려면, 상단 좌측에있는스키마패널의객체유형을선택한다. 그러면, 해당유형의모 든 객체 목록이 스키마 패널 아래의 패널에 나타난다. 여기에서 객체를 선 택해해당상세내역을중앙패널에표시한다. 예를들어EMPLOYEES 테 이블의 상세 내역을 디스플레이하고, 최상위 패널에서 Tables와그아래 패널의

EMPLOYEES를선택한다(<그림1> 참조).

 

 

보고서를 이용한 모니터링 및 관리

 

Oracle SQL Developer’s View -> Reports 기능으로 여러 표준 시스템 보고서를선택하여데이터베이스및스키마의상세내역을볼수있다. 또한 손쉽게액세스할수있도록Tools 메뉴와Connections Navigator에서각 각2개의보고서가제공된다. 이들모두SYSTEM 또는SYS와같은권한이 높은(privileged users) 사용자에게 적합하다(일부 제약 조건을 가진HR 와같은권한이낮은-nonprivileged user-사용자로서도실행할수있음). Sessions 보고서는현재의활성및비활성세션에대한상세내역을보여준 다. 다음과같은단계에따라Sessions 보고서를표시할수있다.

 

1. SYSTEM 사용자를 위해 SYSTEM_ORCL라는 새로운 커넥션을 만든다.

2. Tools -> Monitor Sessions을 선택한다.

3. Select Connection 대화 상자에서 SYSTEM_ORCL를 선택하고 OK를 클릭하여 보고서를 연다.

 

예를 들어 사용자의 세션이 분명하게 닫히지 않은 경우, 권한이 높은 사용 자는Sessions 보고서에서세션을종료할수있다(기본HR 스키마는세션 을 종료할 수 없다). 만약 실습을 진행하는 동안, HR 커넥션이 계속 활성 상태를유지하면, 금방만든Sessions 보고서내에서HR 세션을선택하여 오른쪽 마우스 버튼을 누르고 Kill Session을 선택한 다음, Apply를클릭 한다.

 

이 레벨에서 이용할 수 있는 다른 보고서는 Manage Database 보고서다. Connections Navigator 내SYSTEM_ORCL connection을 오른쪽 마 우스버튼으로누리고Manage Database를선택한다. 이보고서는여러분 의데이터베이스테이블스페이스에대한상세내역을표시한다. 이보고서를 SYS connection에서 실행하면, Oracle SQL Developer 내에서 데이 터베이스를닫고재시작할수있다(Shutdown 버튼은권한이낮은사용자 들이이용할수없다).

 

객체를 새 스키마로 복사하기

 

여러 스키마를 함께 실행하는 경우 종종 여러 스키마 간에 객체와 그 데이 터를 복제하는 작업이 이루어지게 된다. Oracle SQL Developer 내에서 이를 수행할 수 있는 많은 방법이 있으며 대표적으로 다음과 같은 방법을 들수있다.

 

•먼저 DDL(Data Definition Language)를 만들고 실행하여 테이블 을 생성한 다음, 일련의 insert 문을 실행하여 새로운 데이터를 입 력하는 방식으로 차례로 객체를 복사한다.

•Tools -> Copy를 이용하여 그 데이터를 포함한 테이블의 복사본을 만든다.

•Tools -> Database Copy를 이용하여 데이터베이스의 복사본을 만든다.

•Database Export 마법사를 이용하여 여러 테이블과 기타 데이터 베이스 객체를 위한 DDL과 insert 문을 만든다.

 

다음 예제에서는4가지 메소드를 각각 이용하여 그 강점과 한계를 비교할 것이다.

 

1. 해당 스키마를 위해 OE_ORCL라는 이름의 새로운 데이터베이스 커넥션을 만든다.

2. OE_ORCL 커넥션을 선택하고 Tables 노드를 확장한다.

3. CATEGORIES 테이블을 오른쪽 마우스 버튼으로 누르고 Export DDL -> Save to Worksheet를 선택한다(<그림 2> 참조).

 

 

SQL Worksheet에나타난SQL은OE 스키마이름을포함하고있기때문 에 새로운 스키마 내에서 실행하는 데 적합하지 않다(이 SQL 구문은 DBMS_METADATA 패키지를이용하여수집되며일련의환경설정에 따라실행된다). OE 스키마이름없이SQL을생성하려면, 다음과같은단 계를따른다.

 

1. Tools -> Preferences를 선택하고 트리 내에서 Database 노드를 확장한 다음 ObjectViewer Parameters를 선택한다.

2. Show Storage 및 Show Schema 옵션의 확인란을 지우고 Show Constraints as Alter의 확인란을 선택한다.

3. OK를 클릭한다.

4. SQL Worksheet를 비우고 이전 단계를 반복한다: CATEGORIES 테이블을 오른쪽 버튼으 로 누르고 Export DDL -> Save to Worksheet를 선택한다. SQL Worksheet 내 SQL 코드 에는 더 이상 OE prefix가 포함되어 있지 않다.

 

이제 다음과 같은 단계를 거쳐 CATEGORIES 테이블과 그 데이터를 HR_ORCL 스키마로복사한다.

 

1. SQL Worksheet Connections 목록 내 HR_ORCL 커넥션을 선택하고 Run Script를 클릭 (또는 F5 누르기)하여 HR 스키마 내에 표시된 DDL이 실행되도록 한다.

2. HR_ORCL 노드를 확장하고 새로운 CATEGORIES 테이블을 검토한다. 여기에는 그 어떤 데 이터도 포함되지 않는 점을 유념해야 한다.

3. Connections Navigator에서 OE_ORCL 커넥션의 CATEGORIES 테이블을 오른쪽 마우스 버튼으로 누르고 Export Data -> Insert를 선택한다.

4. Export Data 대화 상자에서 클립보드로 출력물을 전송하고 Apply를 클릭한다.

5. HR_ORCL 사용자를 위해 새 SQL Worksheet를 열고 Ctrl-V를 눌러 클립보드의 내용을 붙 여 넣는다.

6. Run Script를 클릭(또는 F5 누름)하고 SQL을 실행한다.

7. Commit 버튼을 클릭(또는 F11 누름)하고 HR_ORCL 커넥션 내 CATEGORIES 테이블 데이 터를 검토한다.

 

앞의단계는1개의테이블과그데이터만을복사하기위한것이다. 1개객체 와그데이터를복사하는보다빠른방법은Copy context-menu 명령이다.

 

1. OE_ORCL 커넥션의 INVENTORIES 테이블을 오른쪽 마우스 버튼으로 누르고 Table -> Copy를 선택한다.

2. Copy 대화 상자에서 HR을 새 테이블 소유자로 선택하고 New Table Name에 INVENTORIES 를 입력한 다음 Include Data의 확인란을 선택한다.

3. Apply를 클릭한다.

4. 새 INVENTORIES 테이블을 보려면 HR_ORCL 커넥션의 Tables 노드의 새로 고침을 실행 한다.

 

여러테이블과그데이터를위한DDL 코드를만드려면Database Export마법사를이용해야한다. OE 스키마에서HR 스키마로하나의테이블집 합을복사하려면다음과같은단계를따른다.

 

1. Tools -> Database Export를 선택한다. 적절한 파일 위치에 브라우징하고 기본 파일명을 그대로 둔 다음, export.sql을 내보낸다(Tools -> Preferences를 선택하고 트리 내 Database 노드를 선택한 다음, 환경 설정 내에 익스포트를 저장하는 Select 기본 경로를 설정하는 방식으로 이 파일을 위한 기본 경로를 선택할 수도 있다).

2. Export Wizard에서 OE_ORCL 커넥션을 선택하고 Storage Schema 및 Show Schema 옵 션의 확인란을 지우도록 한다. Include Drop Statement and Automatically Include Dependent Objects의 확인란을 선택한다. Next를 클릭한다.

3. Types to Export 화면에서Toggle All의 확인란을 지우고 Tables and Data의 확인란을 선 택한다. Next를 클릭한다.

4. Specify Objects 화면의 OE 목록에서 Go를 클릭하여 선택할 테이블의 목록(list of tables to select)을 채운다. OE.ORDER_ITEMS 테이블만 우측 패널로 보낸다. Next를 클릭한다.

5. Specify Data 화면에서Go를 클릭하여 테이블의 목록을 채운다. OE.ORDER_ITEMS 테이 블만 우측 패널로 보내고 이를 선택해 해당 테이블을 하이라이트 한다. 다음의 빈 상자에, order_id < 2355을 입력하고 Apply Filter를 클릭한다(<그림 3> 참조). Next, 그 다음 Finish 를 클릭한다.

 

 

이제SQL Worksheet에나타난export.sql 스크립트는추가테이블을포 함하고 있다. 이는 여기에서 만들어지지 않은 제약 조건이 이들 테이블에 종속되기때문이다. 또한, 제한된데이터집합이반환된다.

SQL Worksheet의 커넥션 목록에서HR_ORCL을 선택하고 스크립트 를 실행한다. 변경을 커밋한 다음, Database Export 마법사가OE_ORCL 스키마에서 복사한 테이블을 보려면HR_ORCL 노드의 새로 고침을 실 행한다.

 

마지막으로 Oracle SQL Developer 내Database Copy를 이용하는 것은 객체를다른스키마로복사하는데매우효과적인방법이다. insert 문의스 크립트를작성하는대신, Database Copy가백그라운드의새테이블로데 이터를입력한다. Database Copy는또한, BLOBs와CLOBs를새스키마 로복사한다.

 

이비교실습을완료하려면, Database Copy를이용하여하나의객체집합 을HR 스키마로복사한다.

 

1. Tools -> Database Copy를 선택한다. OE_ORCL for Source Connection 및 HR_ORCL for Destination Connection를 선택한다. 여러분이 여기에서 선택할 수 있는 것은 새 객체 를 생성하고 기존 객체 내 데이터를 삭제(truncate)하여 새 데이터로 대체될 수 있도록 하 거나 객체를 드롭(및 대체)하는 것뿐이다.

2. Truncate Objects를 선택하고 Next를 클릭한다. Copy Summary는 모든 테이블이 삭제될 것이라는 것을 표시한다. 이는 여러분이 원하는 것이 아니기 때문에 Back을 클릭하고 Create Objects를 선택한 다음, Next를 클릭한다. 이를 통해 기존 객체가 드롭되거나 삭제 되지 않도록 보장하게 된다.

3. Finish를 클릭한다.

4. HR_ORCL 커넥션 내에 생성된 테이블과 데이터를 검토한다.

 

Database Export와 Database Copy는 2가지 점에서 큰 차이가 있다. Database Export는내보낼객체유형을선택할수있도록하며각카테고 리 내에서 개별 객체를 제한한다. 또한, Database Export를 이용하면 GRANT 문을 생성하고DROP 문을 포함하며INSERT 문을 생성하도 록결정할수있기때문에새로운또는기존스키마를위해반환할수있는 스크립트를원하는대로생성할수있는능력을갖게된다.

 

결론

 

본 기사에서는 Oracle SQL Developer 1.5에서 소개된 일부 기능을 검토 하고있다. 여러분은데이터베이스상세내역을공유하고세션을모니터링 및관리하며여러스키마간에데이터베스객체를복사하는새로운방법으 로생산성을높일수있다.

 

 

필자소개

 

Sue Harper는 오라클의 선임 제품 매니저(senior principal product manager)로서 런던에 거주하고 있다.그의 테크니컬 블로그, sueharper.blogspot.com에서는 Oracle SQL Developer 기능 및 특징에 대해 다루고 있다.

 

 

출처 : 한국 오라클

제공 : DB포탈사이트 DBguide.net

반응형
Posted by [PineTree]
ORACLE/TUNING2008. 11. 11. 10:50
반응형

Transaction internals

 

 

목차

  • 1 Redo Layer
    • 1.1 Database Block Address (DBA)
    • 1.2 Appendix of Redo Layer
  • 2 Undo Layer
    • 2.1 Appendix of Undo Layer
  • 3 Enqueue Layer
    • 3.1 Appendix of Enqueue Layer
  • 4 Block Layer
    • 4.1 Appendix of Block Layer
  • 5 PGA Layer
    • 5.1 Appendix of PGA Layer

Redo Layer

Database Block Address (DBA)

오라클에서 제공하는 DBMS_UTILITY 패키지를 이용하여 16진수로 표시되는 DBA를 손쉽게 상대 파일 번호와 블록 번호를 확인하는 방법

SQL> set serveroutput on
DECLARE
l_dba NUMBER := TO_NUMBER ('00C00012','XXXXXXXX');
l_file NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE (l_dba);
l_block NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK (l_dba);
BEGIN
DBMS_OUTPUT.PUT_LINE ('File : '||l_file);
DBMS_OUTPUT.PUT_LINE ('Block : '||l_block);
END;

Appendix of Redo Layer

1.check_redo_scn.sql

col member for a40
set linesize 140
select a.first_change#, a.status, b.member
from v$log a, v$logfile b
where a.group#=b.group#
/

2.dba2_fb.sql

set serveroutput on
DECLARE
l_dba NUMBER := TO_NUMBER ('&dba','XXXXXXXX');
l_file NUMBER := DBMS_UTILITY. DATA_BLOCK_ADDRESS_FILE (l_dba);
l_block NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK (l_dba);
BEGIN
DBMS_OUTPUT.PUT_LINE ('File : '||l_file);
DBMS_OUTPUT.PUT_LINE ('Block : '||l_block);
END;
/

3.param.sql (SYS User로 수행)

set pages 0
set heading off
set linesize 120
col name for a40
col value for a60
SELECT ksppinm as name,
ksppstvl as value
FROM sys.x$ksppi x , sys.x$ksppcv y
WHERE ( x.indx = y.indx )
AND ksppinm like '%&1%'
order by ksppinm
/

4.check_flush.sql


select name, value
from v$sysstat
where name in ('IMU Flushes','IMU commits','redo size','IMU undo allocation size', 'user commits')
order by name
/

Undo Layer

Appendix of Undo Layer

1) rowid2fb.sql


var v_rowid_type number;
var v_object_number number;
var v_relative_fno number;
var v_block_number number;
var v_row_number number;
set serveroutput on
exec dbms_rowid.rowid_info
('&1', :v_rowid_type, :v_object_number, :v_relative_fno, :v_block_number,:v_row_number);
/

2) print.sql

print v_relative_fno
print v_block_number
/

3) chk_undostat.sql

set linesize 140
select to_char(a.begin_time,'HH24:MI:SS') begin,
to_char(a.end_time, 'HH24:MI:SS') end,
a.maxquerylen max_q_len,
a.maxqueryid max_q_id,
a.tuned_undoretention tuned_ur,
substr(b.sql_text,1,15) sql_text
from v$undostat a, v$sql b
where a.maxqueryid=b.sql_id(+)
and rownum<=4
/

Enqueue Layer

Appendix of Enqueue Layer

1) v$lock 뷰 정의

-------------------------------------------------------
-- GV$LOCK 정의
-------------------------------------------------------
SELECT s.inst_id ,
l.laddr "ADDR",
l.kaddr "KADDR",
s.ksusenum "SID",
r.ksqrsidt "TYPE",
r.ksqrsid1 "ID1",
r.ksqrsid2 "ID2",
l.lmode "LMODE",
l.request "REQUEST",
l.ctime , "CTIME",
decode( l.lmode , 0 , 0 , l.block ) "BLOCK"
FROM v$_lock l ,
x$ksuse s ,
x$ksqrs r
WHERE l.saddr=s.addr
AND l.raddr=r.addr

 

-------------------------------------------------------
-- GV$_LOCK 정의
-------------------------------------------------------
SELECT USERENV( 'Instance' ) ,
laddr ,
kaddr ,
saddr ,
raddr ,
lmode ,
request ,
ctime ,
BLOCK
FROM v$_lock1
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktadm
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktatrfil
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktatrfsl
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktatl
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktstusc
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktstuss
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
addr ,
ksqlkadr ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktstusg
WHERE bitand( kssobflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )
UNION ALL
SELECT inst_id ,
ktcxbxba ,
ktcxblkp ,
ksqlkses ,
ksqlkres ,
ksqlkmod ,
ksqlkreq ,
ksqlkctim ,
ksqlklblk
FROM x$ktcxb
WHERE bitand( ksspaflg , 1 ) !=0
AND ( ksqlkmod!=0 OR ksqlkreq!=0 )

2) chk_lock.sql

select a.sid, b.object_name, a.type, a.id1, a.id2, a.lmode, a.request, a.block
from v$lock a, dba_objects b
where a.sid in (&sid.....)
and a.type='TM'
and a.id1=b.object_id(+)
order by sid
/

 

Block Layer

Appendix of Block Layer

1) dba2fb.sql

set feedback off
set serveroutput on
DECLARE
l_dba NUMBER := TO_NUMBER ('&dba','XXXXXXXX');
l_file NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE (l_dba);
l_block NUMBER := DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK (l_dba);
BEGIN
DBMS_OUTPUT.PUT_LINE ('alter system dump datafile '||l_file||' block '||l_block||';');
END;
/
set feedback on

2) hex2chr.sql

select chr(to_number('&1', 'XXXXXXXX')) from dual;

PGA Layer

Appendix of PGA Layer

1. getworarea.sql script


col sql format a13
col est_opt_sz heading "est|opt_sz" format 999.9
col est_one_sz heading "est|one_sz" format 999.9
col last_mem_used heading "last|mem_used" format 999.9
col total_exe heading "total|exe" format 999
col opt_exe heading "opt|exe" format 999
col onepass_exe heading "onepass|exe" format 999
col multipass_exe heading "multipass|exe" format 999
col active_time heading "active|time" format 999.9
col last_tmp_sz heading "last|tmp_sz" format 999
SELECT
--SUBSTR( sql_text , 57 , 11 ) AS SQL , -- for sort test
SUBSTR( sql_text , 103 , 10 ) AS SQL, -- for hash test
ROUND( estimated_optimal_size/1024/1024 , 1 ) AS est_opt_sz ,
ROUND( estimated_onepass_size/1024/1024 , 1 ) AS est_one_sz ,
ROUND( last_memory_used/1024/1024 , 1 ) AS last_mem_used ,
optimal_executions AS opt_exe,
onepass_executions AS onepass_exe,
multipasses_executions AS multipass_exe,
ROUND( active_time/1000000 , 1) AS active_time,
ROUND( last_tempseg_size/1024/1024 , 1 ) AS last_tmp_sz
FROM v$sql_workarea swa ,
v$sql sq
WHERE swa.address = sq.address
AND swa.hash_value = sq.hash_value
AND sql_text LIKE 'select count(*) from (select %'
order by 4,1
/

 

 

제공 : DB포탈사이트 DBguide.net

반응형
Posted by [PineTree]
OS/WINDOWS2008. 11. 10. 16:11
반응형

지난 호에서는 용량 계획 테스트를 하기 위한 준비 작업과 WAS의 설정 방법, 그리고 이를 이용해 실제로 성능과 용량 테스트를 했다. 이번 호에는 성능 모니터를 통해 어떤 개체들에 어떤 카운터를 설정해야 하는지, 또 어떤 기준으로 데이터를 분석해야 하는지 알아보도록 하자.


우선적으로 성능 테스트 환경을 구성해 보자. 지난 연재에서 WAS 사용 방법에 대해 다뤘고 이제 WAS의 웹 브라우저 레코딩 방식을 사용할 것이다.


테스트 사이트에 실제로 접속자들이 홈페이지에 접속하고 회원 가입한 후 로그인하고, 여러 가지 물건을 살펴볼 것이다. 그리고 물건이 마음에 든다면 구매할 것이고, 혹은 게시판에 궁금한 사항을 문의할 수도 있다. 또한 테스트 사이트에서 내가 직접 사용자가 된 입장으로 웹사이트 여기저기를 방문해 볼 것이다. 전체적인 부분을 보려고 한다면 사이트의 모든 컨텐츠들을 기록해야 한다. 테스트 환경을 어떻게 소화하느냐는 전적으로 이 글을 읽는 독자들에게 달렸다. 한가지 아쉬운 점은 물건을 구매하고 그것이 결제가 이뤄지는 일련의 과정은 테스트가 불가능하다. 여러 가지 절차가 있는데, 이 절차를 만들기가 불가능하기 때문에 이 부분은 생략하도록 하겠다.


독자분들은 모든 프로덕트 환경을 만들고 그에 준하는 테스트 환경을 만들 수 있다. 여기서 WAS는 3대의 클라이언트에 동시 접속하는 환경을 만들 것이며, 각각의 클라이언트는 30초 간격으로 사용자들이 접속하는 것으로 설정하도록 하겠다. 클라이언트 환경은 이렇게 설정하고, 서버에서는 성능 모니터의 로그를 설정할 것이다.


성능 로그를 미리 생성해 놓고 클라이언트 접속 시점 바로 전부터 걸어도 되지만, 서버의 모든 설정을 끝내 놓고 평상시의 성능 로그를 분석할 필요도 있다. 보기 드문 경우지만 간혹 CPU와 메모리의 불량을 볼 수도 있기 때문이다.


이에 성능 모니터의 로그 결과물을 볼 수 있다. 이 결과물을 토대로 서버 용량의 한계가 어디까지인지, 어느 시점에서 메모리, CPU, 하드디스크 혹은 RAID 도입을 결정해야 하는지를 알아보도록 하자. 서버 교체 시점도 같이 파악하도록 할 것이다.

 

 

성능 모니터


성능 모니터는 관리자가 병목 문제나 장애 문제를 파악할 수 있는 가장 보기 좋은 도구다. 보기 좋다는 것은 이해하기 쉽다는 것이고, 프로그램으로 말한다면 고급 언어(High Level Language)인 셈이다. 그렇다면 저수준 언어(Low Level Language)에 해당하는 것도 있을까? 있다. 덤프(Dump)라고 많이 들어봤을 것이다. 이것이 어셈블리와 같이 서버에서 본다면 저 수준에 속한다.


사실 윈도우 서버의 성능 모니터 툴은 용량을 계획할 때 데이터를 추출할 수 있는 좋은 도구지만, 일반적으로는 서버의 장애나 병목을 파악할 때 사용하는 도구로 제작된다. 왜냐하면 성능 모니터의 카운터들이 문제 발생을 파악하는데 기준이 되기 때문이다.


성능 모니터는 컴퓨터→성능 개체→카운터→인스턴스 순으로 세부적으로 들어간다. 많은 카운터들이 병목을 판단하기 위한 자료가 되지만, 몇몇 카운터는 접속 현황이라든지 사용량을 나타내므로 이런 기준들을 잘 조합해서 용량 계획에 대한 데이터 기준을 만들어 낼 것이다.


예를 든다면 이 서버의 접속자가 몇 명이 될 때 서버의 한계가 될 것인가? 하는 기준을 제시한다. 성능 모니터에서 추가하는 개체가 어떻게 구성되고 동작하는지를 알면 조금 더 쉽게 접근할 수 있기 때문에 우선적으로 용량 계획이라는 관점보다 성능 모니터 도구 본연의 임무쪽으로 설명하도록 하겠다.


성능 모니터는 여러 가지 데이터가 복합적인 판단에 의해 결과가 나와야 한다. CPU가 몇  십분, 몇 시간 동안 계속해서 임계치 값이 70∼80% 이상 유지한다고 해서 'CPU가 병목이네'라고 판단하고 CPU를 싱글에서 듀얼로, 또는 4웨이로 확장한다고 해서 만족할만한 성능을 얻을 수 있는 것은 아니다. 


CPU 사용률이 임계치값 이상의 사용률을 보이고 있다면 그 원인을 파악해야 하고, 원인 파악은 다른 성능 개체를 통해서 이뤄진다. 하나의 개체가 병목이라고 해당 개체의 사이징(sizing)을 잡고 확장한다면 그것은 잘못된 판단이다. 이 부분은 애플리케이션을 수정해서 해결할 수도 있고, 메모리나 디스크를 교체해서 병목을 해결할 수도 있다. 계획적이고 올바른 사이징은 병목을 예방하는 하나의 방법임을 기억해 두길 바란다.


성능 모니터를 어떻게 설정하는 것이라는 방법론, 즉 툴을 다루는 법에 대해서는 언급하지 않겠다. 그렇게 어렵지 않은 부분이고 설정에 대한 부분은 마이크로소프트 기술 사이트나 여러 방법으로 쉽게 얻을 수가 있다. 어려운 것은 어떤 개체의 어떤 카운터를 설정하고, 어떤 기준으로 그 데이터를 분석할 것이냐 하는 것이다.



용량 테스트 전 성능 모니터 설정 사항


다시 한번 강조하지만 성능 모니터의 개체, 카운터 그리고 인스턴스는 WAS를 수행하기 전에 로그로 설정해 놔야 한다. 그래야 WAS 테스트 환경에서 접속에 대한 성능 로그를 볼 수가 있다. 개체에 대해서는 그 개체가 어떤 방법으로 동작하는지에 대해 설명할 것이다. 


개체가 어떻게 돌아가는 지를 알면 서버를 운영하는데도 많은 도움이 될 것이다. 카운터에서는 카운터가 어떤 것이며, 이 카운터의 임계치 값을 명시할 것이다. 용량 계획을 위한 카운터 값은 수집이 목적이지만 병목을 판단해야 하는 카운터 값은 임계치를 알아야 한다. 아무리 찾아봐도 그 카운터의 일반적인 임계치 값에 대해 명시가 안된 것이 있다. 이 부분은 결과물이 나온 후 어느 정도면 해당 카운터의 현재 임계치 값이 얼마인지를 제시한다. 웹서버는 INETINFO와 DLLHOST라는 프로세스가 분석 타겟이 된다. MS SQL은 MS SQL에 관련된 프로세스가 분석될 것이다. 그러면 개체와 카운터에 대해 알아보자.


가상메모리의 원리


일반적인 컴퓨터의 메모리를 지칭하면 보드의 메모리 뱅크에 꽂혀있는 물리적인 메모리, RAM을 지칭한다. 이런 RAM은 속도를 극복하려는 많은 변화가 있었으며, SIMM, DIMM에서 SDRAM 그리고 DDR 방식으로 핀수도 갈수록 많아졌다. 그러나 서버에서 메모리를 지칭할 때면 약간 다른 관점에서 봐야 한다. 물론 클라이언트들이 주로 쓰는 운영체제인 윈도우 프로페셔널이나 XP 같은 경우에도 가상 메모리라고 하는 것이 있지만 이런 운영체제에 대해 가상 메모리가 어떻게 동작을 하는지 사용자들은 별 관심이 없고 알 필요도 없다.


본인의 PC가 어느 순간 느려지거나 이상이 발생하면 그 피해는 자기 자신만 주어지지만 서버에서 그런 현상이 발생하면? 그 영향는 서버를 사용하는 모든 사용자들에게 돌아간다. 이런 이유로 그 서버를 관리하는 사람이면 메모리가 어떻게 운영되는지를 알아야 문제가 생겼을 때 문제 발생 원인과 해결책을 제시해 줄 수 있다. 윈도우 서버의 많은 장애 가 메모리에 기인하고 있는 이유는 애플리케이션 때문이다. 비율로 얘기를 한다면 80% 이상으로 말할 수 있다.


윈도우 서버에서 메모리를 모니터링할 때에는 RAM과 가상 메모리가 같이 모니터링되고 있음을 알아야 한다. RAM의 한 부분으로 운영되는 것이 가상 메모리(PAGING FILE)이고, 이것의 위치는 하드디스크에 있기 때문이다. 메모리의 문제가 생기면 대부분 애플리케이션에서 문제가 발생된다. 간혹 디스크만을 모니터링하고 있다면 디스크의 병목 현상도 볼 수 있다. 이것은 디스크의 성능 문제가 아니고 잘못된 애플리케이션으로 인해 페이지 폴트가 일어나기 때문에 디스크의 병목 현상으로 보이는 것이다.


시스템에 관련된 프로세스들은 주로 RAM에 상주한다. 중요하고 자주 쓰이기 때문에 빠른 처리 속도가 필요하기 때문이다. 그러나 애플리케이션들은 사용자의 필요에 의해 쓰이는 것이고 자주 쓰는 것이 아니기 때문에 RAM에 상주할 필요는 없다.


시스템을 재부팅하고 나서 바로 작업관리자를 띄워서 살펴보자. 자주 보는 그림이기 때문에 그림 삽입은 하지 않겠다. 메모리 사용 내용이라는 그래프 밑에 보면 네 개의 파트가 있다. 이중 실제 메모리라고 하는 것은 RAM을 나타내는 것이며, 부과 메모리라고 하는 것은 가상 메모리를 나타낸다. 메모리 사용 내용이라는 그래프는 부과 메모리라고 하는 가상 메모리의 변화량을 보여주고 있는 것이다.


참고적으로 가상 메모리는 c:에 위치하는 것이 기본이고(관리자에 의해서 C: 아니 다른 파티션으로 변경 가능), 가상 메모리의 크기는 RAM의 1.5배∼3배의 크기로 기본적으로 윈도우 서버가 설정을 하지만 관리자가 변경할 수는 있다. 그러나 권장 사항은 아니다. 가상 메모리를 늘리려면 RAM을 추가하라고 권장하고 싶다.


재미있는 예를 한번 들어보자. A와 B서버 두 대 있다. A서버의 RAM은 1GB이고, B 서버의 RAM은 8GB이다. A서버의 가상 메모리 크기는 1.5∼3배로 설정이 되므로 1.5G∼3G로 설정될까? 맞다. 그렇게 설정된다. B서버의 가상 메모리 크기도 역시 1.5∼3배로 설정이 되므로 12G∼24G로 가상 메모리가 설정이 될까? 아니다 틀린 답이다. 윈도우 서버의 RAM을 8G, 16G, 32G의 RAM을 설정한다고 해도 가상 메모리의 크기는 4G 이상을 못 넘어간다. 윈도우 서버에서는 가상 메모리의 최대 크기는 4G이고, 4G 중 커널용으로 2GB의 공간이 예약, 사용자 모드 프로세스용으로 2GB가 설계돼 있다.


MS DOS를 기억하는 분들이 많을 것이다. 실제 메모리 한계를 640KB로 제한돼서 설계가 됐다. 그때 설계한 사람이 설마 애플리케이션들의 덩치가 그렇게 커질지 간과한 것이다. 새로운 애플리케이션들이 쏟아지면서 메모리 크기가 심각한 문제가 됐다. 그래서 확장 메모리(Extended Memory)를 config와 autoexec에 설정해서 사용했다.


참고적으로 가상 메모리의 사용 크기를 사용자 모드 프로세스용으로 더 할당하고 싶다면 c:boot.ini의 /3GB라는 플래그를 사용하면 커널용으로 1GB, 사용자 모드 프로세스용을 3GB가 할당되고, 이와 같은 설정은 MS SQL, 익스체인지에서 효과를 볼 수 있다. 웹서버는 추천하고 싶지 않다.


이제 가상 메모리가 어떻게 동작하는지 간단하게 살펴보자. 애플리케이션이 로드되면 사용자 파일을 실행하고 난 후 필요한 데이터만 RAM에 남고 나머지는 가상 메모리에 상주한다. 이렇게 구분하는 역할을 담당하는 것이 커널단의 메모리 관리자가 하는 작업이다.


메모리 관리자는 가상 메모리에서 어떤 것이 중요하고 중요하지 않은가를 어떻게 판단할까? 중요하지 않은 것을 버려야 할 상황도 발생할 수 있다. 이럴 때 어떤 기준을 가지고 처리할까? 이 부분은 아래 'Basic algorithm of the Memory'를 참고하면 되겠다.


가상 메모리에 영원하게 상주하느냐? 그건 아니다. 가상 메모리에서 필요한 데이터가 있다면 RAM으로 이동해야 하는데, 이럴 때는 어떻게 처리될까? 프로세스가 '몇 번지(0x80000000)에 있는 데이터가 필요해'라고 메모리 관리자에게 요청을 했는데, RAM의 해당 번지에 데이터가 없다면 이 주소의 데이터는 메모리 관리자에 의해 가상 메모리로 이동한다. 그렇기 때문에 메모리 관리자는 페이지 오류라는 알고리즘을 통해 재빨리 해당 데이터를 프로세스가 요청한 주소로 옮겨 놓는다. 프로세스 입장에서 보면 자기가 요청한 데이터를 RAM에서 가져오는 것으로 보이지만, 실제적으로는 하드디스크에 있는 가상 메모리에서 데이터가 옮겨져 왔다는 것을 여러분은 알 것이다.


컴퓨터의 속도를 비교하면 보통 CPU>RAM>HDD의 순서로 그 속도가 구분된다. 느린 하드디스크에서 데이터를 끌어온다는 것은 컴퓨터의 속도 면에서 아주 손실이 많은 부분이다. 서버를 운영하면서 가상 메모리에서 RAM으로 이동(페이징) 작업을 피할 수는 없지만 그 횟수를 줄인다면 서버 성능의 향상 효과를 크게 볼 수가 있다. 잘못 제작된 ASP나 COM+ 등 기타 애플리케이션이 서버를 다운시키는 것을 자주 봤다. 그 실제의 예를 성능 모니터의 마지막 부분에서 보여주도록 하겠다.



※ Basic algorithm of the Memory


① FIFO(First-In-First-Out) : FIFO는 먼저 들어온 것이 먼저 나간다라는 알고리즘이다. X86 기반의 멀티프로세서 시스템에 적용되는데, 최근에 사용된 시기와 상관없이 RAM에 가장 오래 있던 데이터가 페이징 파일로 이동한다는 것이다.


② LRU(Least Recently Used)와 MRU(Most Recently Used) : LRU는 최근에 사용된 데이터에 사용된 시기를 분석해 한동안 사용되지 않은 데이터를 페이징으로 이동시키는 알고리즘이고, MRU는 가장 많이 사용하는 메모리 영역이다. X86 기반의 단일 프로세서 시스템에 적용된다.


이 두 알고리즘을 통해 최근에 가장 많이 사용하는 RAM 데이터나 최근에 사용된 데이터는 RAM에 존재하고, 그 이외의 메모리 페이지들은 가상 메모리로 이동한다.




메모리 개체 카운터 설정


① Available Bytes(임계값 : 전체 메모리 크기의 5% 이하일 때)
실행중인 프로세스의 작업 설정과 캐시에서 필요로 하는 정보를 취한 다음 남아있는 RAM의 크기를 말한다. 쉽게 말하면 사용 가능한 RAM이 얼만큼 남았는지 알 수 있는 카운터다. 일반적으로 Available Bytes가 적고 메모리/pages/sec가 높다면 메모리를 추가해야 한다. 이 말은 RAM이 사용할 수 있는 공간이 적기 때문에 RAM의 데이터를 가상 메모리로 보내고 프로세스가 호출한 메모리의 페이지를 가상 메모리에서 불러왔기 때문이다. 실제로 사용할 수 있는 RAM의 공간은 0으로, 채워져 있거나 비워있거나 대기중인 메모리 목록에 있는 공간을 합쳐 계산한다. 빈 메모리는 사용할 준비가 된 메모리고, 0으로 채워진 메모리는 다음 프로세스가 이전 프로세스에서 사용된 데이터를 보지 못하도록 0으로 채워진 메모리 페이지다. 대기 메모리는 프로세스 작업 집합(실제 메모리)에서 제거돼 디스크로 라우트됐지만, 다시 호출돼 사용될 수 있는 메모리를 말한다.


 

② Committed Bytes(임계값 : Committed Bytes In use%로 판단)
RAM에 제휴된 가상 메모리의 크기를 나타낸다. 이 말은 프로세스는 RAM에만 존재하는 것이 아니고 가상 메모리에도 존재한다. 즉 데이터가 디스크로 페이징돼야 하는 경우, 페이징 파일에서 필요한 공간인 RAM의 양을 기록한다. 이 말은 사용중인 메모리이며 다른 프로세스는 사용할 수 없고 고정됐으며 사용되는 메모리량이다. Available Bytes가 크면 Committed Bytes가 작아지고, 반대로 Available Bytes가 작으면 Committed Bytes가 커진다.


③ Page/sec(임계값 : 80 이상)
RAM에서 사용할 수 없는 애플리케이션과 RAM에 다른 페이지 공간을 만들기 위해 하드디스크에서 읽거나 기록해야 하는 애플리케이션을 실행하기 위해 요청된 메모리의 페이지 수를 말한다. Page Faults/sec을 보면 쉽게 이해할 수가 있다. 한번 더 강조한다면 프로세스가 RAM에서 관련 주소를 호출했다. 이것이 RAM에 없다면 가상 메모리에 있기 때문에 메모리 관리자는 가상 메모리가 있는 디스크로 액세스해야 한다. 이 말은 페이징 파일을 사용했다는 말과도 같다. 즉, 초당 페이징 파일을 몇 번 사용했느냐 또는 가상 메모리에서 RAM으로 몇 번 올라오느냐를 말한다. 일반적으로 이 수치는 초당 30이 넘으면 과부하가 온다고 한다. 그러나 이것 하나만 놓고 본다면 잘못된 판단을 불러올 수 있다. CPU의 사용량과 Available Bytes와 연계해 볼 필요가 있다. Available Bytes는 많이 있는데 Page/sec가 많다면 이것은 실제 메모리가 부족한 것이 아니고 애플리케이션이 메모리를 잘못 관리하는 경우라고 볼 수 있다.


④ Page faults/sec(임계값 : 일반적으로 200 이상, 웹서버인 경우 180~300 이상)
프로세스에서 작업 설정의 일부인 RAM을 사용하려고 하지만 찾을 수가 없는 경우, 메모리 관리자는 페이지 오류를 발생시키고 디스크의 가상 메모리에서 다시 불러들이는 경우를 나타낸다. 페이지 오류는 크게 하드 폴트(가상 메모리 액세스를 필요로 하는 경우), 소프트 폴트(RAM에 폴트된 페이지가 있는 위치) 등이 있고 자세한 폴트의 내용은 다음과 같다.

- 메모리에 상주하는 페이지가 아니라 디스크의 페이지 파일 또는 맵파일에 액세스하는 경우
- 대기 중이거나 수정목록에 있는 페이지에 액세스하는 경우
- 커밋되지 않은 페이지에 액세스하는 경우
- 커널 모드에서만 액세스 될수 있는 페이지에 사용자 모드로부터 액세스하는 경우
- 읽기 전용인 페이지에 쓰는 경우

폴트라고 하면 실수를 말하는데, 대부분의 프로세서가 별무리 없이 많은 수의 소프트 폴트를 처리할 수 있다. 그러나 디스크를 액세스하는 하드 폴트의 경우는 심각한 성능 문제를 일으킬 수 있다. 즉, CPU와 메모리의 처리 속도와 CPU와 하드디스크의 속도는 엄청나게 차이가 난다. 하드 폴트가 많이 일어나 디스크의 병목 현상이 일어나고, 이로 인해 CPU가 대기 상태에 놓일 수도 있다.
일반적으로 이 수치가 20이 넘으면 과부하라고 판단해도 된다. 웹서버인 경우에는 180∼300 정도는 안정적인 수치다. 그러나 역시 다른 개체와 연동해서 봐야한다. 페이지란 디스크에 존재하기 때문에 디스크의 입출력에 대한 개체와 같이 연동해서 봐야 한다. 개별적으로 봐서 수치가 4∼5000 단위 이상이면 이것은 메모리 불량으로 봐도 된다. 서버의 모든 구성을 마치고 서비스를 시작하기 직전에 이 카운터값만 돌려서 천 단위 이상이 나온다면 이것은 메모리의 불량이다. 메모리의 불량이라고 해서 시스템이 부팅이 안되는 정도는 아니다. 시스템 운영상에는 전혀 문제가 없어 보이지만 패리티가 깨졌거나 노이즈가 있는 경우에도 가능하다.


⑤ Pool Nonpaged Bytes(임계값 : 4MB 이상)
Pool이란 쉽게 수영장을 생각하면 되겠다. 여기서 풀이란 어떤 공간을 만들어 놓고 사용하기 위한 곳이며 재사용도 가능하다. Nonpaged란 페이지가 되지 않은 메모리 즉 RAM에 존재하는 것이다. 이 말은 가상 메모리로 액세스하지 않고 캐시라는 공간으로(실제적으로는 RAM에 존재함)의 액세스를 말한다. 캐시가 사용되는 이유는 굉장히 급하고 반복적으로 사용되는 케이스고, 이런 것은 가상 메모리 관리자(VMM)가 관리한다. 풀링(Pooling,캐시와 RAM으로의 입력)이 많다면 프로세스의 과부하며 애플리케이션의 수행에 문제가 있다고 볼 수 있다. 일반적으로 윈도우 2000이 설치되면 파일서버 용도로 메모리 구성이 디폴트로 이뤄진다. 이럴 경우 캐시가 메모리 크기의 25%를 사용하기 때문에 물리적인 메모리가 많이 손해본다. 이런 부분은 메모리 구성 조정을 통해 캐시의 크기를 줄일 수가 있다.


⑥ Pool Paged Bytes(임계값 : 사용량 파악)
디스크에 있는 가상 메모리를 페이징 파일이라고도 부른다. 페이지됐다는 얘기는 RAM과 가상 메모리를 이동할 수 있다는 얘기다. 앞서 설명한 Pool Nonpaged Bytes는 고정돼 사용된다는 것이고, Pool Paged Bytes는 페이지로 사용되지 않고 있을 때 메모리 관리자에 의해 디스크에 쓸 수 있는 개체에 대한 시스템 메모리(운영 체제가 사용하는 실제 메모리) 영역을 말한다.


⑦ Commited Bytes In Use(임계값 : 70 이상)
가상 메모리의 사용량 한계를 살펴볼 목적으로 이 개체를 추가하면 된다. 가상 메모리가 한계에 다다르면 윈도우 서버는 가상 메모리 공간이 부족하니 확장하라는 경고 메시지가 뜬다. 이런 사용량 파악이 목적이며 Commit Limit에 대한 Commited Bytes의 비율이다. Commit Limit가 1000이고 Commited Bytes가 300이면 30%를 사용하고 있다고 표시된다. 일반적으로 페이징 파일의 크기는 RAM의 1.5배가 권장사항이다. 그러므로 가상 메모리가 이 크기에 다다르면 메모리 확장을 고려해야 한다.


⑧ 캐시 Faults/sec(임계값 : 100 이상)
컴퓨터를 접하다 보면 버퍼(buffer)와 캐시(cache)라는 용어를 많이 접하게 된다. 버퍼는 말 그대로 완충기 역할을 한다. 캐시가 속도를 빠르게 하는 목적이라면 버퍼는 속도를 떨어뜨리지 않고 유지할 수 있게 하는 역할을 하는 것이다. 버퍼는 하드웨어와 프로그램 양쪽에 모두 존재하며, 속도가 다른 하드웨어 장치들, 우선 순위가 다른 프로그램의 프로세스들에 의해 공유되는 데이터 저장소를 말한다. 버퍼는 각 장치나 프로세스가 상대방에 의해 정체되지 않고 잘 동작할 수 있도록 해주는 역할을 맡는다. 캐시는 데이터를 임시로 저장해두는 장소를 말한다. 프로그램적으로는 불가능하며 하드웨어적으로 존재한다. L2, L3 캐시 메모리라는 것을 들어보고 직접 보기도 했을 것이다. RAM에서 데이터를 하드디스크에서 가져오려고 하면, 서로의 속도 차이 때문에 캐시가 RAM 안에 존재한다. 여기에 해당 데이터가 존재한다면 가지고 올 수 있다. CPU에 캐시 메모리라는 것이 있는데 RAM까지 가기 바쁘니 캐시 메모리에 있다면 여기서 가지고 올 수 있다. 이런 이유로 캐시라는 것이 존재하고 이에 대한 성능 카운터가 윈도우 서버에 존재하는 것이다.
캐시 Faults/sec은 찾아본 페이지가 파일 시스템 캐시에 없고, 메모리에 있거나(soft fault) 디스크에 있었던(hard fault) 오류 수를 나타낸다. 파일 시스템 캐시는 애플리케이션이 최근에 사용한 데이터를 저장해두는 실제 메모리의 일부 영역이므로 잘못된 애플리케이션은 이 카운터 값을 높일 것이다. 이 카운터에 대한 임계치 값은 없다. 그러나 Available bytes 5% 이하이고, page faults/sec이 임계치 값이 높고 cache faults/sec이 평상시보다 높게 수치가 기록되면 100% 메모리 부족이나 애플리케이션의 오류라고 적용해도 된다. 서두에서도 설명했지만 윈도우 서버 성능 모니터는 복합하게 볼 필요가 있다고 한 것을 기억하자.


⑨ 캐시 Bytes(임계값 : 사용량 파악이 목적)
이제 캐시가 무엇을 하는지 알 것이다. 그러나 성능 모니터에서의 캐시를 본다면 이 카운터가 실제로 시스템 캐시 작업 세트를 나타내지 않는다는 것이다. 즉, 카운터 한 개가 시스템 캐시의 크기를 나타내는 것이 아니고, 4개의 카운터가 합쳐져서 캐시 Bytes라는 카운터 값을 나타내는 것이고 4개의 카운터 중 한 개가 우리가 일반적으로 말하는 RAM의 캐시를 얘기를 한다. 4개의 카운터는 다음과 같다.

- System Cache Resident Bytes : 이 카운터가 4개 중 한 개의 카운터, 실제 메모리에 있는 파일 시스템 캐시로부터의 바이트 수를 말한다.
- System Driver Resident Bytes : 장치 드라이버가 현재 사용하고 있는 페이지로 나눌 수 있는 실제 메모리의 바이트 수를 나타낸다. 이것은 드라이버의 작업 집합(RAM 영역)이다.
- System Code Resident Bytes : 사용하지 않을 때 디스크에 쓸 수 있는, 실제 메모리에 현재 있는 운영체제 코드의 바이트 수를 나타낸다.
- Pool Paged Resident Bytes : 페이지된 풀의 현재 크기를 바이트로 나타낸다. 페이지된 풀은 사용되지 않고 있을 때 디스크에 쓸 수 있는 개체에 대한 시스템 메모리(운영 체제가 사용하는 실제 RAM) 영역이다.

캐시를 이루는 카운터가 어떤 것인지 간단하게 설명했다. 설명하는 동안 작업 세트(working set)라는 말을 몇 번 언급했다. 이는 물리적(RAM)으로 정착된 프로세스의 가상 주소 공간의 부분 집합으로, RAM에 상주하는 가상 페이지의 하위집합을 설명하기 위해 사용하는 용어다. Page Faults/sec을 설명을 하면서 페이지 폴트가 왜 일어나는지를 설명했다. 디스크의 가상 메모리를 액세스하는 것이 메모리 관리자가 한다고 했지만 엄밀하게 얘기하면 작업 세트 관리자가 수행하는 것이다. 작업 세트 관리자가 가상 메모리의 주소 공간을 가지고 있기 때문에 작업 세트 관리자를 통해 가상 메모리에서 RAM으로 데이터가 이동할 수 있는 것이다.


⑩ Page Read/sec(임계값 : 5 이상)
이 카운터는 하드 페이지 폴트를 해결하기 위해 디스크가 읽혀진 횟수를 나타낸다. Page Faults/sec이 소프트 폴트와 하드 폴트 두 가지를 다 포함하기 때문에 이 카운터로 하드 페이지 폴트의 비율을 알 수 있다. 만약 이 수치들이 낮을 경우 웹서버는 request에 대해 빠르게 응답할 것이고, asp queued에도 2 이상의 수를 기록하지 않을 것이다. Page Faults/sec이 높다고 무조건 애플리케이션에 잘못이 있는 것은 아니다. 하드 폴트가 많은 것이 성능을 저하시키는 것이고, 이것은 잘못 설계되거나 수행되는 애플리케이션 때문이다. 애플리케이션에서의 문제가 아니라고 판단이 되면 RAM을 증설해야 한다.


⑪ Page Input/sec(임계값 : 5 이상)
이 카운터는 하드 페이지 폴트를 해결하기 위해 디스크로부터 읽어들이는 페이지들의 총 개수를 나타낸다. Page Faults/sec과 Page Read/sec을 참고하면 된다.



CPU 카운터에 대한 설명


시스템 성능 모니터의 CPU 카운터를 보면 어디서나 늘 임계치는 70∼80% 이상으로 잡고 있다. 이 말은 프로세스 하나가 계속적으로(어떤 일정한 시간은 없지만 10초 이상으로 봐도 된다) CPU 사용율을 70∼80% 이상 사용하고 있다는 말이다. 이때의 해결책은 메모리에서와 마찬가지지만 우선 어떤 프로세스가 CPU 사용률이 많은지 파악해야 하고, 다른 카운터와의 연관관계(디스크 입출력 문제, 페이징 발생 문제 등)를 따져서 이것이 정말 CPU의 병목 현상인지, 아니면 다른 애플리케이션으로 인한 CPU의 병목 현상인지 파악해야한다. 종종 백도어나 웜 등으로 인해 시스템의 장애 현상을 겪는 경우도 있다. 여기서 원인 파악을 제대로 못하고 단지 CPU의 병목이기 때문에 CPU를 듀얼로 확장한다거나 4웨이로 확장 작업을 마쳤다고 하더라도 원하는 만큼의 성능 결과를 얻지 못할 것이다. 수치적으로 환산해서 얘기한다면 100%의 만족감에서 5% 정도의 만족감을 얻을 수도 있다.
그래서 어디가 잘못된 것인가를 파악하는 게 가장 중요한 포인트고, 문제는 주로 원인이 되는 프로세스가 어떤 폴링 작업을 하고 있거나, 루프에 빠져서 허덕이면서 헤어나오지 못하는 현상이 다반사다. 현재 이 연재의 주제는 용량 계획이기 때문에 이런 부분도 같이 다뤄야 한다는 점을 충분히 고려해야 한다.


대부분의 성능 모니터 관련 글을 보면 높은 CPU 사용률에 포커스를 맞춰 정보를 알려 주고 있으나 낮은 CPU의 사용률도 성능 모니터의 대상이 된다는 것을 알아두자. MS SQL의 경우 잠금 경합이 발생하는 경우, 생산적인 작업이 발생하지 않는다면 시스템 CPU 사용량이 0%에 이를 수가 있다. 매우 낮은 전체 성능과 낮은 CPU 사용량을 보이고 있다면 이것 또한 애플리케이션의 어디에선가 병목현상을 보이고 있는 것이고 이것을 찾아서 해결해야 한다. 다만 이는 웹 접속자나 MS SQL의 접속자가 많다는 가정하에서다. 접속자가 없거나 애플리케이션이 쓰이지 않는다면 그것은 당연히 CPU 사용률이 0이어야 한다. 높아도 안되고 낮아도 안된다고 하니 혼란스러울 수도 있으나, 그래도 하다보면 재미가 솔솔 붙을 것이다.



※ IIS가 사용하는 CPU의 개수는?


윈도우 2000의 IIS5.0은 2∼4개까지의 프로세서를 사용하도록 설계돼있다. 그럼 MS SQL은? 운영체제가 지원하는 만큼 사용할 수 있다. 데이터센터가 얼마나 많은 CPU를 지원하는지 알아보면 그것이 한계라고 보면 된다. MS SQL이 엔터프라이즈 버전이어야만 한다.


① %Processor Time (임계값 : 70∼80 이상)
시스템이 사용하는 전체적인 CPU 양을 나타낸다. 일반적으로 70% 이상이 사용되고 있다면 과부하라고 판단된다. 멀티 프로세서가 장착된 컴퓨터에서 불균형 현상을 찾아내기 위해 %Processor Time 카운터의 인스턴스를 전체로 하지말고 0, 1을 따로 설정한다면 CPU 사용률을 각각 볼 수 있다.


② %User Time(임계값 : 80 이상)
수행되고 있는 애플리케이션이 사용하고 있는 CPU 사용률


③ %Privileged Time(임계값 : 80 이상)
시스템이 사용하고 있는 CPU 사용률


이 세 가지 설명된 값은 전부 CPU의 사용량과 관계가 있다. 하나는 시스템의 전체적인 사용량이고 그 전체적인 사용량에서 시스템이 사용하느냐, 애플리케이션이 사용하느냐의 세부 분석이 있다. 이 값을 볼 때는 서로 관계를 지어서 봐야 하는데, 예를 들어서 Processor Time이 30을 기록하고 있다. 이때 User Time이 50을 기록했다면 이것은 Processor의 30에 대한 50을 얘기하는 것이다. 이 말은 Privileged Time과 User Time은 Processor Time의 값을 전체 100으로 놓고 구분한 값이다.



④ Interrupts/sec(임계값 : 7000 이상)
프로세스가 매 초마다 받아 처리한 하드웨어 인터럽트의 평균 수를 나타낸다. 인터럽트가 많다는 것은 애플리케이션의 CPU 사용률이 그만큼 높다는 것이고 CPU의 대기가 그만큼 많아진다는 것이다. 하드웨어적인 측면에서 본다면 아주 과도한 인터럽트가 발생하는 경우는 잘못된 장치 드라이버를 사용하고 있는 경우에도 발생한다. 프로세스가 매 초마다 받아 처리한 하드웨어 인터럽트 평균수를 표시한다. 여기에 DPCs는 포함되지 않고 따로 계산되고, 이 값은 시스템 클럭, 디스크 드라이버, 데이터 통신 회선, 네트워크 인터페이스 카드, 기타 주변 장치 등 인터럽트를 만드는 장치의 활동을 표시한다.


⑤ %Interrupt Time(임계값 : 5 이상)
프로세스가 하드웨어 인터럽트를 받아 처리하는 데 소모한 시간의 백분율을 나타낸다. 이 값은 시스템 클럭, 디스크 드라이버, 데이터 통신 회선, 네트워크 인터페이스 카드, 기타 주변 장치 등 인터럽트를 만드는 장치 활동의 간접 표시기이다. 이런 장치는 일반적으로 작업을 완료하거나 주의를 요할 때 프로세서를 인터럽트한다. 인터럽트 동안 일반 스레드 실행은 잠시 중단된다. 대부분의 시스템 클럭은 백그라운드 인터럽트 활동을 만들면서 매 10 밀리초마다 프로세서를 인터럽트한다.


⑥ %DPC(Deffered Procedure Calls) Time(임계값 : 사용량 참고)
% DPC(표준 인터럽트보다 낮은 우선 순위로 실행되는 인터럽트) Time은 샘플 간격 동안 유예된 프로시저 호출(DPCs)을 받아 처리하는 데 소비한 시간을 나타낸다. DPC는 특권 모드에서 실행되므로 % DPC Time은 % Privileged Time의 구성 요소다. Interrupts/sec과 %DPC Time 카운터를 계산하면, 인터럽트와 연기된 프로시저 콜 즉, DPC에 대해 프로세서가 얼마나 많은 시간을 소비했는지를 나타낸다.


작성자 : 이인석 | 프리랜서

반응형
Posted by [PineTree]
OS/WINDOWS2008. 11. 10. 16:08
반응형

[서버용량계획하기 4] 윈도우 서버 용량 계획하기


지난 호에서는 성능 모니터를 통해 메모리와 CPU에 어떤 카운터를 설정해야 하는지, 또 어떤 기준으로 데이터를 분석해야 하는지 알아보았다. 이번 호에는 지난 호에 이어 메모리와 CPU 외에 다른 개체들의 카운트 설정 방법도 알아보도록 하자.

 

지난 연재에 이어 성능 테스트 환경을 통한 성능 모니터의 로그 결과물을 토대로 서버 용량의 한계가 어디까지인지, 어느 시점에서 메모리와 CPU, 하드디스크, 혹은 RAID 도입을 결정해야하는 지 알아보자. 우선 메모리와 CPU의 카운트 설정 방법에 이어, 여러 개체의 성능 카운터 설정에 대해 설명하도록 하겠다.

 

 

PhsicalDisk


디스크에서 가장 중요한 것은 디스크의 I/O다. 기본적인 서버의 데이터 입출력과 윈도우 서버(기타 다른 서버 운영체제)는 가상 메모리(Paging File)를 가지고 있는데, 가상 메모리는 하드 디스크에 위치를 해야하기 때문에 디스크의 입출력 문제가 중요하다.


그럼 왜 서버 운영체제는 가상 메모리를 디스크에 두고 있는지 궁금할 것이다. 윈도우 서버의 애플리케이션 프로세스가 모두 RAM에 상주한다면 비용도 비용이지만 수용하지 못할 것이다.


현재 테스트 서버로 준비된 서버는 하는 일이 없다. 앞으로의 결전(?)을 대비해 숨고르기를 하고 있는 중이다. 이럴 때 가상 메모리는 얼마 사용하지 않게 된다. 현재 약 100MB 정도 사용 중이고 최고 한도는 약 1.2GB, 최소 크기는 768MB가 잡혀 있다. 이 가상 메모리의 최대가 1.2GB로, 이 크기는 늘어날 수 있지만 늘리는 것을 권장하고 있지 않다. 윈도우가 가상 메모리를 늘려서 사용하면 CPU의 컴퓨팅 사용량을 많이 차지하기 때문에 추천하지 않고, 이럴 때는 메모리를 늘리라고 권장한다. 이렇게 최대 한도까지 다다른다면 그것은 한마디로 디스크의 입출력이 빈번하게 일어나서 디스크의 병목 현상도 같이 야기하게 된다는 것이다. 이것은 잘못된 페이징 작업으로 디스크에서 RAM으로 데이터가 올라오는 하드 페이지 폴트 오류 때문에 발생할 수가 있는데, 이것을 단지 디스크의 병목으로만 판단해 디스크를 좀더 빠르게, 그리고 가상 메모리도 완전히 다른 물리적 디스크에 독단적으로 쓴다해도 CPU와 같이 개선된 성능을 기대하기는 힘들다.


역시 애플리케이션을 수정한 후 그래도 원하는 성능이 안나온다면 한 개의 디스크를 가상 메모리를 위해 사용하면 보다 개선된 성능을 기대할 수가 있다. 그 이외의 카운터는 이런 병목 현상을 판단하거나 용량 계획에 대한 기초 자료가 될 수 있다.


디스크 성능 카운터를 다루다 보면 DISKPERF라는 명령어를 볼 수 있다. 이 명령어를 통해 시스템 성능 모니터를 사용해 볼 수 있는 카운터의 종류를 제어할 수 있다. DOS 창에서 'DISKPERF /?'라고 입력하거나 '윈도우 서버 도움말 → 색인'에서 찾아보면 쉽게 그 명령어를 이해할 수 있다.


DISKPERF 명령어를 적용하기 전에 성능 카운터를 열어 성능 개체를 보게 되면 PhysicalDisk라는 개체는 보이지만 LogicalDisk라는 개체는 볼 수 없다. 윈도우 서버를 설치하고 나서 디폴트로 올라오는 개체 값이 PhysicalDisk 개체다. DISKPERF 명령을 통해 LogicalDisk를 추가할 수가 있다. 여러 가지 명령어가 있겠지만 'DISKPERF /Y'라고 하면 재부팅 후 적용된다는 메시지가 나오고, 재부팅을 하고 난 후 성능 모니터의 성능 개체를 보면 LogicalDisk라는 개체가 생긴 것을 알 수 있다.




사실 PhysicalDisk 개체와 LogicalDisk의 성능 개체 각 각의 카운터 값은 틀린 것이 없다. 단지 인스턴스를 나타내는 방식이 틀리다는 것이다. PhsicalDisk의 구조는 두개의 디스크를 갖고 있다. 물리적 ID 0번 디스크에 C:\ 와 F:\가 할당됐고, 물리적 ID 1번 디스크에 D:\와 E:\가 할당돼 있다는 것을 나타낸다. 적용 후의 LogicalDisk를 보면 번호는 C:\, D:\, E:\, F:\가 나란히 배열돼 있다. 순수하게 논리적인 구조 관점으로 바라 본 것이다. 사실 PhysicalDisk로 어느 정도의 디스크 병목이 어디서 일어나는지 판단할 수 있지만, 보다 세밀하고 정확하게 적용하고 그 병목이 어느 파티션에서 일어나고 있는지 파악하고 싶다면 LogicalDisk 개체의 카운터를 같이 설정해 놓으면 보다 정확하게 알 수 있다.


필자가 경험했던 디스크 성능 문제를 간단히 소개하겠다. E업체로부터 현재 웹 서버에서 이미지의 로딩이 느리다는 문의가 들어 왔다. 이미지는 웹 서버 로컬에 저장된 것을 로딩하는 것이 아니고 다른 이미지 서버에서 가져 오는 것이다. 해당 웹사이트를 열어 이미지를 로딩해 봤더니 많은 양의 이미지가 있지만 이미지가 위에서부터 아래 방향으로 순차적으로 하나 두개씩 로딩되고 있는 병목 현상이 눈으로 보이고 있다.


이런 것이 눈으로 확인될 정도라면 서버에서는 엄청난 성능 저하가 일어나고 있는 경우다. 또 하나 조금 특별한 상황이라면 로컬에서 로딩하는 것이 아니고 네트워크를 통해 로딩하는 것이기 때문에 네트워크 문제도 고려해야 한다. 네트워크 쪽으로는 패킷 손실이 일어나지 않나 불필요한 트래픽이 실리지 않나를 점검했고, 성능 모니터에서 네트워크에 대한 부분도 예의 주시했다. 여러 가지 성능 개체를 걸어 놓고 판별한 결과, 이미지가 저장돼 있는 디스크의 병목현상으로 확연하게 나타났다.
따 라서 필자는 두 가지 대안을 제시했다. 디스크 어레이를 사용해 데이터의 안정화와 성능향상을 꽤하는 것과 서버를 한대 더 준비해 분산 환경을 사용하라고 제안했다. 고객사는 RAID를 선택했고 레벨은 0+1을 선택했다. 디스크 재구성이기 때문에 재설치는 불가피하다. 재설치 후 웹서버의 이미지 로딩이 원하는 만큼 나왔고, 이미지 서버의 성능도 크게 향상됐다. 사실 직감만으로 이런 작업을 하는 것은 도박과 같다. 성공하면 쾌감을 느끼고 직감에 대해서 신뢰가 가겠지만 만약 실패한다면 처음부터 다시 시작해야 한다.


① %Disk Time(임계값 : 90 이상)
현재 디스크 전송량(읽기+쓰기)을 시간으로 나타낸다. 디스크의 전송속도는 bps이기 때문에 속도 단위를 8로 나눠야 한다. Disk Time이 높고(임계값 이상) Current Queue Length도 높다면 디스크의 I/O 문제로 봐야 한다. 가상 메모리가 위치해 있는 물리적 디스크에 대한 값도 주의 깊게 모니터링한다. 이 값이 증가하면 가상메모리의 용도를 점검하고 메모리를 추가하도록 한다. 임계값 이상이면 과부하며, 별도의 디스크를 구입해 시스템 데이터, 사용자 데이터, 가상 메모리 데이터를 물리적으로 구분하거나 RAID 도입을 고려해야 한다.


② Current Disk Queue Length(임계값 : 2 이상)
디스크를 읽기 위해 대기열에 대기하고 있는 내용들의 수를 나타낸다. 디스크 병목을 판단하는데 중요한 모니터링 자료가 된다.


③ Disk Bytes/sec(임계값 : 사용량 파악)
쓰기 또는 읽기 작업 동안 디스크로(또는 디스크에서) 전송되는 양으로, 얼마나 많은 디스크의 입출력이 발생하는 지를 나타낸다. 이 값은 초당 얼마나 많은 데이터가 디스크로 입출력하는지 기준이 되는 모니터링 자료다.


④ Avg. Disk Bytes/Transfer(임계값 : 사용량 파악)
Avg. Disk Bytes/Transfer는 읽기 또는 쓰기 작업 동안 디스크로(또는 디스크에서) 전송되는 평균 바이트 수를 나타낸다. Disk Bytes/sec가 초당 전송률을 나타낸다면 이것은 평균값이다.


⑤ %Idle Time(임계값 : 10이하)
idle의 영어적인 뜻은 '쓰이고 있지 않는'이다. 작업관리자에 봐도 system idle process라는 것이 있고 서버가 쓰이고 있지 않고 한가하다면 이 값은 늘 높게 마련이다. 모니터링 간격동안 디스크의 유휴(쓰이고 있지 않는) 상태의 값을 나타낸다.


⑥ %Disk Read Time(임계값 : 사용량 파악)
% Disk Read Time은 선택한 디스크 드라이브가 읽기 요청을 처리하는데 사용된 시간의 백분율을 나타낸다. Read와 Write를 조합을 해서 %Disk Time와 함께 살펴보면 답이 나온다.


⑦ % Disk Write Time(임계값 : 사용량 파악)
% Disk Write Time은 선택한 디스크 드라이브가 쓰기 요청을 처리하는데 사용된 시간의 백분율을 나타낸다.


⑧ Avg. Disk sec/Read(임계값 : 사용량 파악)
읽기 작업에 소요된 평균 시간(밀리초)을 나타낸다. 오래 지연되는 읽기 작업은 디스크가 과다하게 사용된다는 것을 나타낸다.


⑨ Avg. Disk sec/Write(임계값 : 사용량 파악)
읽기 작업에 소요된 평균 시간(밀리초)을 나타낸다. 오래 지연되는 쓰기 작업은 디스크가 과다하게 사용된다는 것을 나타낸다.


※ %Free Space 카운터
카운터의 이름에서 보다시피 여유 공간을 체크하고 있는 카운터이다. 간혹 디스크의 공간이 모자라 장애를 일으키는 경우가 있는데 이 카운터를 설정을 해놓고 여유 공간을 체크하면 도움이 될 것이다.

 

 

네트워크 인터페이스


IT 분야에서 네트워크가 가장 큰 규모가 아닐까 한다. 네트워크 → 서버 → 응용 프로그램 순으로 동작한다고 봐도 네트워크는 큰 범위다. 예전에 한국에서 IT 붐이 일고 시스코 장비 관리자들이 많은 연봉을 받으며 일했다고 들은 적이 있다. 현재는 워낙 공급이 많아서 예전 같지 않다고 한다. 님다 바이러스(Nimda Virus) 이후 네트워크 관리자들의 보안에 대한 인식도 한층 높아진 것 같다. 네트워크 관리자만 그럴까? 서버 관리자도 마찬가지다. 바이러스, 웜, 백도어(예전에는 바이러스라는 것으로 통일 됐지만)가 그 방법이 갈수록 악랄해지고 있다. 윈도우98 시절 CIH 바이러스가 PC의 하드디스크를 통째로 포맷을 한다고 해서 뉴스에도 나온 것으로 기억한다. 예전 바이러스는 감염되고 자기 자신만 피해를 줬지만 님다 이후로는 개인 뿐만 아니라 네트워크 대역을 스캔해 가며 감염시켰고, 님다를 치료하려면 일단 네트워크를 단절해야 한다. LAN을 연결 시켜놓고 치료해도 소용이 없었다. 이렇게 서버 투 서버로 전파가 되던 것이 이제는 패킷을 무작위로 날려 라우터를 죽이려고 덤벼든다. 기발한 발상이다. 네트워크가 단절되면 서버가 무슨 소용이랴. 무작위로 패킷을 보내 라우터의 CPU나 메모리 사용률을 높여 라우터를 다운시키려고 하는 것이다. 이제 이런 것들은 파이어월이나 플로우스캔, MRTG를 통해 패킷의 움직임이나 성향을 파악해 바로 조치 할 수 있다.
윈도우 서버 성능 모니터링에서 네트워크 모니터링 부분은 사용량을 파악하기 위한 것이지 패킷 분석은 아니다. 패킷을 들여다보고 싶다면 윈도우 서버에 내장된 네트워크 모니터 도구나 이더리얼 등의 제품을 설치해 사용해야 한다. 프로토콜의 기본, 네트워크 구성 등 기본적인 네트워크를 알면 서버를 운영하는데 틀림없이 도움이 된다.


여러 개의 LAN 카드를 쓰고 있는 멀티홈 환경이라면, 해당 LAN 카드에 대해 모니터링을 걸어놔야 할 것이다. 네트워크 인터페이스의 카운터는 사용량을 파악하기 위한 것이기 때문에 임계값은 없다. 임계값이라면 LAN 카드가 지원하는 최고속도의 80% 정도로 생각하면 된다.


① Bytes Total/sec
이 카운터는 해당 서버의 LAN 카드의 모든 네트워크 프로토콜의 송수신 바이트를 초당 사용량으로 나타낸다. 접속자가 많지 않은데 이 사용량이 높다면 웜을 의심해 보기 바란다. 네트워크의 병목을 판단하려면 이 카운터 값과 Current Bandwidth를 비교해 판단해야 한다. 일반적으로 네트워크의 증가분을 고려해 50% 정도의 여유분을 갖고 있어야 한다. CPU, 메모리가 여유있음에도 네트워크 사용량이 많다면 커넥션쪽의 문제를 파악해야 한다. 여기서 주의할 점은 네트워크에서는 비트 단위이고 성능 모니터에서는 바이트이기 때문에 네트워크 어댑터의 대역폭을 바이트로 표시하기 위해서는 8로 나눠야 한다.


② Bytes Sent/sec
초당 서버에서 외부로 나간 전송량을 나타낸다. Bytes Total에서 Bytes Sent를 빼면 Bytes Received/sec가 나온다. Bytes Received/sec 추가 여부는 독자들에게 맡긴다.


③ Current Bandwidth
Current Bandwidth는 LAN 카드의 현재 대역폭을 각 초당 비트(BPS)로 추정한 값이다. 대역폭이 다양하지 않거나 값을 정확히 추정할 수 없는 인터페이스일 경우, 이 값은 명목상의 대역폭을 나타낸다. 이 카운터 값과 Bytes Total/sec 값을 비교한다면 여유분의 네트워크 사용량을 파악할 수 있다.



Acitve Server Page


ASP가 사람들에게 윈도우 서버를 많이 알게 하는데 공헌한 점이 있다고 생각한다. 그러나 ASP에서 늘 문제가 되는 DB 연결, 잘못된 LOOP는 한방에 서버를 가볍게 죽인다. 아주 잘 설계된 ASP 코드는 비싼 서버 10대가 부럽지 않다. 닷넷이 아무리 훌륭하다고 할지라도 기본 설계 방침을 벗어난다면 이름값 못하는 것처럼 말이다.


① Request Queued(임계값 : 40 이상)
큐에서 서비스를 기다리는 중인 요청의 수를 나타낸다. 이 수치가 5 이상 오르면 일단 병목으로 의심해 본다. Web services\Current Connection이 500 이상이고 이 수치가 몇 십을 기록하면 ASP 코드가 무겁다고 판단된다. 또한 커넥션에 상관없이 큐가 40 이상이면 ASP가 무겁다고 판단된다.


② Request/sce(임계값 : 사용량 파악)
초당 ASP가 실행되는 수를 나타낸다. 이 수치가 아무리 많아도 Request Queued에 쌓이지 않는다면 별 무리가 없다. 이 말은 ASP 코드가 바로 수행돼 대기열이 없기 때문이다. 만약 이 카운터가 서버의 트래픽이나 접속자가 많은 시간에 낮은 수치를 보인다면 애플리케이션은 병목 현상을 초래하고 있는 것이다.


③ Request Excution Time(임계값 : 사용량 파악)
가장 최근 ASP 요청을 실행하는 데 걸리는 시간(단위:밀리초)을 나타낸다. ASP의 수행 시간을 판단하는 자료가 된다.


④ Request Excuting(임계값 : 1 이상)
현재 실행 중인 ASP 요청의 수를 나타낸다


⑤Session Current(임계값 : 사용량 파악)
서비스 받고 있는 현재 세션의 수를 나타낸다.


⑥Errors/sec(임계값 : 5 이상)
초 단위 당 발생한 오류의 수를 나타낸다.


⑦ Request Wait Time(임계값 : 1 이상)
가장 최근 요청이 큐에서 대기하는 시간을 나타낸다.


⑧Request Not Authorized(임계값 : 5 이상)
액세스 권한이 불충분해 실패한 요청의 수를 나타낸다. 액세스 권한이 없다면 그것은 IIS에서 권한 설정과 폴더에서의 권한 설정을 점검해야 할 것이다. 자료를 업로드해야 한다면 업로드 프로그램을 이용해 해당 폴더와 IIS 사이트에서 쓰기 권한이 있어야 파일이 서버로 업로드될 것이다. 이런 실패가 있다면 기록될 것이다.


⑨ Request Not Found(임계값 : 5이상)
찾지 못한 파일에 대한 요청의 수를 나타낸다. 이 부분은 ASP에 문제가 있는지 없는지를 간접적으로 판단할 수가 있다. 이 카운터 값이 기록되면 웹로그를 이용해 해당 연결이 어떻게 잘못됐는지를 찾아내야 한다.


⑩ Request Rejected(임계값 : 5이상)
요청을 처리하기에 리소스가 충분하지 않아서 실행되지 않은 총 요청의 수다. 500/sever too busy라는 메시지를 본적이 있을 것이다. 이런 현상이 발견하면 나타나는 카운터값이다.


⑪ Session Timed Out(임계값 : 5이상)
시간이 초과한 세션의 수를 나타낸다. 소스에서 세션 값을 늘일 수도 있고 IIS에서도 늘일 수 있다. 이에 해당하는 카운터 값들이다.


⑫ Transaction Pending
처리 중인 트랜잭션의 수를 나타낸다. 이 트랜잭션 처리의 데이터를 기준으로 용량 계획에 대한 데이터가 나오게 된다.



웹 서비스


① Current Connections(임계값 : 사용량 파악)
이 카운터값은 현재 웹 서비스를 사용해 연결된 수를 나타낸다. 중요한 것은 이 카운터값과 함께 ASP에 대한 사항을 같이 봐야 한다는 것이다. 서로 밀접한 관계가 있기 때문이다. 또한 웹 서버로 이용한다면 접속자가 몇 명이고 서버의 여러 가지 환경을 고려해 몇 명의 사용자가 접속하고 있을 때 한계인지 기준이 될 것이다. 역시 이 카운터 하나만으로 데이터를 산출하는 것이 아니고 CPU, RAM, 하드디스크의 카운터 값과 조합해야 한다.
 
② Connection Attempt/sec(임계값 : 사용량 파악)
웹 서비스를 사용해 연결을 시도하는 비율을 나타낸다. 용량 계획에 필요한 데이터다.


③ Get Requests/sec(임계값 : 사용량 파악)
이 카운터와 Post Requests/sec의 값은 서버의 두 가지 HTTP 요청이 수행되는 속도를 나타낸다. Post 요청은 일반적으로 폼에서 사용되며 ISAPI(ASP 포함) 또는 CGI로 전송되고 Get 요청은 거의 모든 브라우저의 요청을 나타내고 정적파일, ASP 및 기타 ISAPI, CGI 요청 등을 포함한다. 이 카운터값은 사이트의 알반 로드 특성을 이해하는데 많은 도움이 된다.


④ Not Found Errors/sec(임계값 : 10 이상)
요청한 문서를 찾지 못해 서버를 만족시킬 수 없는 요청 때문에 생긴 오류 비율을 나타낸다. 일반적으로 HTTP 404 Not found 오류 코드로 클라이언트에게 보고된다.


⑤ Maximun Connections(임계값 : 사용량 파악)
최대 연결은 웹 서비스를 사용해 동시에 연결할 수 있는 최대 연결 수를 나타낸다. 용량 계획에 필요한 데이터다.



시스템


①Processor Queue Length(임계값 : 2 이상)
이 카운터값은 CPU가 연산하기 위해 대기열에 대기하고 있는 수치를 나타낸다. 일반적으로 이 값이 2 이상이면 과부하로 본다. 이 값을 볼 때에는 Processor Time과 같이 연동해 본다. 이 값이 높고 CPU 사용량도 70 이상이면 이것은 CPU 업그레이드를 고려해야 하지만, CPU 사용량이 부하인 70% 이상이라도 Queue Length가 낮다면 괜찮다. 이는 CPU 수행속도가 기다림 없이 원할하게 이뤄진다는 말과 같다.


② Context Switches/sec(임계값 : 사용량 파악)
이 카운터는 초당 발생하는 쓰레드 전환 개수를 표시한다. 쓰레드의 개수를 증가시키는 것은 성능을 감소시키는 시점까지 컨텍스트 스위치의 개수를 증가시킬 수 있다. 리퀘스트당 10개 혹은 그 이상의 컨텍스트 스위치는 매우 높은 것으로서 만약 이 수치가 나타난다면 쓰레드의 크기를 감소시키는 것이 바람직하다.
커넥션이나 리퀘스트에 의해 측정된 전체적인 성능을 통해 쓰레드의 균형을 잡기란 매우 어려우며 쓰레드를 조정할 때 이에 따른 성능의 증가와 감소 여부를 결정하기 위해 전체적인 성능 모니터링을 병행해야 한다.
만 약 쓰레드 카운트를 적용시키고자 한다면 전체 프로세서 타임에서 프로세스 내의 각각의 쓰레드에 대한 프로세서 타임과 쓰레드의 개수를 비교해 봐야 한다. 만약 쓰레드가 계속 바쁘고 완전하게 프로세서 타임을 사용하고 있지 않다면 쓰레드를 더 많이 생성함으로서 성능을 향상시킬 수 있다. 그렇지만 모든 쓰레드가 바쁘고 프로세서가 자신의 최고 수용력에 가깝다면 개수를 증가시키기 보다는 서버의 개수를 늘여 작업을 분산시키는 것이 바람직하다.



프로세스


① %User Time(임계값 : 사용량 파악)
프로세스의 쓰레드가 사용자 모드에서 코드를 실행하는데 걸린 시간의 백분율이다. 즉 프로세스가 CPU를 사용한 양을 나타내며 이 카운터값을 설정할 때에는 인스턴스를 잘 선택해야 한다. 웹 서버를 운영한다면 인스턴스에서 inetinfo와 dllhost를 선택해 이 프로세스가 얼마나 CPU를 사용하고 있는지 체크해야 한다. 만일 COM+용으로 개발했다면 메모리 운영 방식에서 차이가 있겠지만 dllhost 인스턴스가 두 개 이상이 된다. 모든 dllhost를 관찰하도록 하자.


② Virtual Bytes(임계값 : 사용량 파악)
Virtual Bytes는 프로세스가 사용하고 있는 가상 주소 공간의 바이트 수를 나타낸다. 가상 주소 공간의 사용이 해당 디스크 또는 주 메모리 페이지를 반드시 사용함을 뜻하지는 않는다. 그러나 가상 공간이 한정돼 있으므로 너무 많이 사용하면 프로세스가 라이브러리를 로드하는데 제한받을 수 있다. 메모리 관련 카운터와 조합해서 살펴보도록 해야 한다.
 
③ Thread Count(임계값 : 사용량 파악)
쓰레드란 프로세스안에 실행 가능한 존재를 말한다. 이 카운터값은 프로세스에서 현재 활성화된 쓰레드 수를 나타낸다. 명령은 프로세서에서 기본 실행 단위이고, 쓰레드는 명령을 실행하는 개체다. 모든 실행 프로세스 적어도 하나의 쓰레드를 포함하고 있다. 윈도우 2000에서는 보통 20개 정도가 적당하고 자동적으로 증가한다.


④ Working Set(임계값 : 사용량 파악)
프로세스가 데이터를 저장하기 위해 사용중인 RAM의 양을 나타낸다. 아무런 서비스를 하지 않는데 Working Set의 값이 시간에 지남에 따라 증가하면 프로세스는 메모리 누수 현상을 불러온다. 해당 애플리케이션을 점검해 봐야 한다.


⑤ Private Bytes(임계값 : 사용량 파악)
해당 프로세스에 적용되는 가상 메모리를 기록한다. 즉 해당 프로세스가 사용하는 가상 메모리의 양을 나타낸다. 이 카운터 역시 인스턴스를 잘 선택해야하고 웹 서비스와 관련된 인스턴스를 선택하도록 하자.


⑥ %Processor Time(임계값 : 사용량 파악)
모니터링 대상으로 선택된 프로세스가 시스템에서 사용한 프로세서 시간의 백분율을 나타낸다. 어떤 프로세스가 어느 정도의 CPU 사용률을 기록하는지 파악할 수가 있다.


⑦ Elapased Time(임계값 : 사용량 파악)
프로세스 인스턴스가 수행한 시간(초단위)이 카운터는 오랜 기간 동안의 활동 경향을 추적하는데 유용하며, 또한 What if 시나리오에서 유용하다. 만약 더 많은 애플리케이션 사용자를 추가한다면 CPU 사용량에 어떤 일이 발생할지 볼 수 있다.


⑧ I/O Data Operations/sec(임계값 : 사용량 파악)
프로세스 인스턴스가 생성한 읽기와 쓰기 작업의 수를 나타낸다. 이 카운터는 사용자 생성 I/O 활동에 집중해 What if 시나리오를 분석하고, 애플리케이션 유형들에 대해 I/O 활동량을 추적하는데 유용하다.


⑨ Page Files Bytes(임계값 : 사용량 파악)
Page File Bytes는 이 프로세스가 가상 메모리에 사용한 현재 바이트 수를 나타낸다. 가상 메모리는 다른 파일에 들어있지 않은 프로세스가 사용한 메모리 페이지를 저장하는데 사용된다. 가상 메모리는 모든 프로세스가 공유하므로, 가상 메모리에 공간이 부족하면 다른 프로세스들이 메모리 할당을 할 수 없게 된다. 메모리의 %Committed Bytes In Use와 Committed Bytes와 비교해서 가상 메모리가 부족하지 않은가 판단해야 한다.


⑩ Page Faults/sec(임계값 : 사용량 파악)
메모리 개체에서 전체적으로 페이지 폴트가 일어나는 것을 관찰을 했다면 Process 개체에서는 어떤 프로세스가 그렇게 페이지 폴트를 일으키는지 명확하게 볼 수가 있다. 선택한 인스턴스 중 높은 사용률을 보이는 것을 찾자. 그 프로세스에 해당하는 애플리케이션이 잘못된 것이다.


⑪ Pool Paged Bytes(Instance:Inetinfo) / Pool Nonpaged Bytes(Instance:Inetinfo)
 Pool Paged Bytes(Instance:dllhost#n) / Pool Nonpaged Bytes(Instance:dllhost#n)
위 의 카운터들은 IIS나 Inetinfo 프로세스, 서버내의 인스턴스된 dllhost에 의해 직접 사용되는 풀(Pool) 공간을 모니터하기 위한 것이다. 여기서 주의할 점은 서버 내의 모든 dllhost의 인스턴스에 대한 카운터를 모니터해야 한다는 것이다. 그렇지 않으면 IIS에 의해 사용된 정확한 수치를 얻을 수 없게 된다. 시스템 메모리의 풀은 애플리케이션이나 운영체제에 의해 생성되고 사용되는 객체를 포함하고 있다. 메모리 풀의 컨텐츠들은 오직 우선권이 적용된 모드에서만 접근 가능하다. 즉, 운영체제의 커널만이 직접 메모리 풀을 사용할 수 있다는 의미로 사용자 프로세스는 메모리 풀을 사용할 수 없다. IIS를 구동시키는 서버에는 커넥션을 제공하는 쓰레드는 서비스에 의해 사용되는 다른 객체와 함께 Nonpaged Pool에 저장된다. 메모리의 성능을 향상시키기 위해 무조건 RAM을 증설하는 것보다 다음의 방법을 시도해 보자. 이렇게 해도 메모리와 관련된 성능의 향상이 없다면 RAM을 증설하자.



임계값은 사용량을 파악하는 것이 목적이다.
1. CGI APP를 ISAPI나 ASP로 전환한다.
2. IIS 5.0의 파일 캐시를 재조정한다.
3. 디스크의 속도 향상을 위해 RAID를 고려한다.


※ 이같은 프로세스 값은 전부 애플리케이션과 관계가 있다. 실질적으로 로그를 걸어 놓은 서버는 특별한 애플리케이션이 없이 IIS에 ASP가 실행되는 서버라 해당 카운터값의 inetinfo라는 인스턴스를 체크했다. 특별히 개발해서 운영한다면 그것에 맞춰 보는 것이 바람직하다.



Redirector


① Network Errors/sec(임계값 : 1 이상)
Network Errors/sec는 일반적으로 리디렉터와 하나 이상의 서버에 심각한 통신 문제가 있다는 것을 뜻하는, 예상 밖의 심각한 오류를 나타낸다. 예를 들면, SMB(Server Message Block) 프로토콜 오류가 일으키는 네트워크 에러 등이다. 이는 시스템 이벤트 로그에 항목을 추가하므로 이 파일에서 세부 내용을 참조할 수 있다.


② Server Reconnects(임계값 : 1 이상)
Server Reconnects는 새 활성 요청을 완료하기 위해 리디렉터가 서버에 다시 연결해야 하는 수를 파악한다. 오랫동안 비활성 상태를 유지할 경우, 서버가 연결을 끊을 수 있다. 원격 파일이 로컬로 닫혀 있을 경우에도 리디렉터는 10분 동안(명목상으로) 연결을 그대로 유지한다. 이같은 비활성 상태의 연결을 휴면 연결이라고 하는데, 다시 연결하려면 시간이 많이 소모된다.
 
※ 두 카운터는 파일 서버에서 성능 모니터링을 할 때 필요한 카운터들이다. 참고적으로 알아 본 것이니 웹 서버에서는 그렇게 신경을 안써도 되는 카운터들이다.



서버


① Pool Nonpaged Failure(임계값 : 5 이상)
비페이지 풀에서 할당받지 못한 횟수를 나타낸다. 컴퓨터의 실제 메모리가 너무 작음을 나타낸다.


② Bytes Total/sec(임계값 : 사용량 파악)
서버가 네트워크 데이터를 송수신하는 속도를 보고, 초당 서버 안팎으로 이동하는 총 바이트 수는 서버가 어느 정도 바쁜지를 알 수 있는 좋은 지표가 된다. 서버 로드를 변경하기 위해 어떤 작업을 하는 경우(예를 들면 네트워크에 같은 종류의 서버나 로드 밸런싱을 추가하는 것) 이 값을 모니터링해 변경이 실제로 도움이 되는지 알 수 있다.


③ pool paged Failure(임계값 : 5 이상)
페이지 풀에서 할당받지 못한 횟수를 나타낸다. 컴퓨터의 실제 메모리 또는 페이지 파일이 너무 작음을 나타낸다.



Paging File


① %Usage(임계값 : 90 이상)
현재 사용중인 가상 메모리의 백분율을 나타낸다. 이 값이 90% 이상이 되면 그 원인을 잘 파악해야 한다. 급하면 RAM을 추가해도 된다. 윈도우 서버는 필요하다면 가상 메모리를 더 크게 만들지만 가상 메모리의 크기를 늘리는 것은 권장 사항이 아니므로 RAM 확장을 고려해야 한다.


② %Usage Peak(임계값 : 90 이상)
가상 메모리의 최대 크기를 기록한다. 이 값이 가상 메모리 파일의 최대값에 근접하면 RAM을 더 추가해야 한다. 값이 높으면 가상 메모리가 모든 데이터를 포함할 수 있을 정도로 크지 않다는 것을 의미한다.



Internet Information Services Global


① File Cache Hits%(임계값 : 80% 이상)
이 카운터는 총 캐시 request에 대한 캐시의 히트 비율을 나타내는 것으로 IIS의 파일 캐시의 조정이 잘 작동하는 지를 알 수 있다. 정적인 페이지들로 구성된 웹사이트의 경우 80% 또는 그 이상의 캐시 히트가 일어나야만 좋은 성능을 발휘할 수 있다.


② File Cache Hits
이 카운터는 파일 캐시에 성공한 총 횟수를 나타내며 File Cache Flushes와 로그를 비교해 보면 적절한 비율로 캐시로부터 객체들을 플러쉬 시키는지 알아볼 수 있다.


③ File Cache Flushes
이 카운터는 서버를 시작한 이후로 파일 캐시를 지우는 카운터를 표시하는 것으로 만약 플러쉬가 너무 빠르게 일어난다면 필요 이상으로 객체가 캐시로부터 플러쉬되는 것이고, 반대로 플러쉬가 너무 천천히 일어난다면 메모리의 낭비가 일어난다고 볼 수 있다.

이것으로 윈도우 서버와 IIS에 관련된 성능 카운터는 모든 설정을 한 셈이다. 다음 호에서는 SQL 서버의 성능 카운터를 설정하고, WAS를 실행시키고 성능 모니터의 로그와 SQL 서버의 Profiler와 필요하다면 인덱스 튜닝 마법사를 가지고 분석한 후 사후 용량 계획을 잡도록 하겠다.

작성자 : 이인석 | 프리랜서

반응형
Posted by [PineTree]
ORACLE/TUNING2008. 11. 7. 17:10
반응형

옵티마이저의 비용계산 방법과 실행원리
시스템의 성능 향상을 위한 노력

이번호 technical tips에서는 SQL문의 성능을 결정하는 비용기반 옵티마이저의 핵심 원리 중에 비용계산 방법에 대해 알아 보도록 하겠다. 대부분의 개발자들이 작성하는 SQL문은 비용기반 옵티마이저 환경에서 작성된 실행계획을 통해 실행 되어지는데, 이때 옵티마이저의 비용계산 방법에 대해 정확히 이해한다면 더 좋은 성능을 보장 받는 SQL문을 작성할 수 있을 것이다.

저자_주종면, 오라클 ACE, PLAN 정보기술(www.plandb.co.kr / Jina6678@paran.com)

1. SQL문 처리과정

옵티마이저의 비용계산 방법을 소개하기 전에 우선 SQL문의 처리과정의 대해 알아보자.
사용자가 실행하는 SQL문은 파서(Parser)에게 전달되고 파서는 데이터 딕셔너리 정보를 참조하여 SQL문에 대한 구문분석(Syntax와 Symantics)을 수행한다. 이 결과를 파스-트리(Parse-Tree)라고 한다.
파스-트리는 옵티마이저에게 전달되는데 오라클 데이터베이스에는 공식기반 옵티마이저(Rule-Based Optimizer)와 비용기반 옵티마이저(Cost-Based Optimizer)가 있다. 비용기반 옵티마이저에 의해 산출된 적정 플랜(Optimal Plan)은 로우 소스 생성기(Row Source Generator)에게 전달되고 이것은 실행 계획(Execution Plan)으로 결정된다.
우리가 SET AUTOTRACE, SQL*TRACE와 TKPROF와 같은 튜닝 도구들을 통해 참조할 수 있는 결과에 바로 이 실행계획이 포함되어 있다. 이 실행계획은 SQL 실행엔진(SQL Execution Engine)에 의해 테이블과 인덱스를 참조하여 그 결과를 사용자에게 리턴하게 되는 것이다.

이어서, 비용기반 옵티마이저가 어떤 비용계산 방법을 통해 적절한 실행 계획을 찾아내는지를 소개할 것이다. 개발작업 때 처음부터 좋은 실행계획을 작성할 수 있도록 SQL문을 작성한다면 SQL 튜닝에 대한 불필요한 시간과 비용을 줄여 나감으로써 좋은 성능의 시스템을 개발할 수 있는 첫걸음이 되는 것이다.

 

 

2. 비용기반 옵티마이저의 구조

 

 

이번에는 구체적으로 비용기반 옵티마이저의 아키텍처에 대해 알아보도록 하겠다.
CBO(Cost Based Optimizer)가 어떻게 비용을 계산하고 어떻게 실행계획을 작성하는지를 알기 위해서는 보다 구체적으로 CBO의 아키텍처의 대해 알고 있어야 한다.
<그림 2>에서와 같이 CBO는 쿼리 변형기(Query Transformer), 비용 계산기(Estimator), 쿼리 작성기(Query Generator) 3가지 구조로 구성되어 있다. 그럼, 각 구성 요소와 비용계산 알고리즘을 통해 실행계획 작성 방법에 대해 알아 보자.

 

 

3. 쿼리 변형기(Query Transformer)

 

 

쿼리 변형기는 파서(Parser)에 의해 구문 분석된 결과를 전달 받아 잘못 작성된 SQL문을 정확한 문장으로 변형시키는 역할을 수행한다.

? 잘못된 데이터 타입으로 조건 값을 검색하면 변형된다.
(S_DATE 컬럼은 날짜 컬럼인데 문자 값을 검색할 때 사용하는 인용부호를 사용한 경우)

 

SQL> SELECT * FROM emp WHERE s_date = '1999-01-01';
--> SQL> SELECT * FROM emp WHERE s_date = TO_DATE('1999-01-01');

? LIKE 연산자는 %(와일드 카드)와 함께 검색하는 경우 사용되지만, 그렇지 않은 경우
=(동등) 조건으로 변형되어 검색된다.

SQL> SELECT * FROM emp WHERE ename LIKE '주종면‘;
--> SQL> SELECT * FROM emp WHERE ename = ‘주종면’;

? BETWEEN ~ AND 조건은 > AND < 조건으로 변형되어 검색된다.

SQL> SELECT * FROM emp WHERE salary BETWEEN 100000 AND 200000;
--> SQL> SELECT * FROM emp WHERE salary >= 100000 and salary <= 200000;

? 인덱스가 생성되어 있는 컬럼의 IN 연산자의 조건은 OR 연산자의 조건으로 변형된다.

SQL> SELECT * FROM emp WHERE ename IN ('SMITH', 'KING');
--> SQL> SELECT * FROM emp WHERE ename = 'SMITH' or ename = 'KING';

? 인덱스가 생성되어 있는 컬럼의 OR 연산자의 조건은 UNION ALL로 변형된다.

SQL> SELECT * FROM emp WHERE ename = 'SMITH' or sal = 1000;
SQL> SELECT * FROM emp WHERE ename = 'SMITH'
UNION ALL
SELECT * FROM emp WHERE sal = 1000;

 

이와 같이 쿼리 변형기는 부적절하거나 잘못 작성된 SQL문장을 정확한 문장으로 변형시켜주는 역할을 수행하는 알고리즘이다.

 

 

4. 비용 계산기(Estimator)

 

 

비용 계산기는 비용기반 옵티마이저가 가지고 있는 비용 계산 공식에 의해 다양한 실행방법 중에 가장 좋은 성능의 실행계획을 찾아 주는 알고리즘이다.

 

1) 테이블과 인덱스의 통계정보

 

먼저, ANALYZE 명령어에 의해 수집되는 통계정보의 상태와 용어에 대해 설명하겠다. 먼저, 테이블에 대한 통계정보이다.

 

SQL> ANALYZE TABLE big_emp COMPUTE STATISTICS;
SQL> ANALYZE TABLE big_dept COMPUTE STATISTICS;

SQL> SELECT table_name, blocks, num_rows, avg_row_len
FROM user_tables
WHERE table_name = ‘BIG_EMP’ or table_name = ‘BIG_DEPT’

TABLE_NAME BLOCKS NUM_ROWS AVG_ROW_LEN
--------------------------------------------
BIG_DEPT 1 289 23
BIG_EMP 180 28955 43

NUM_ROWS : 해당 테이블의 전체 행수
AVG_ROW_LEN : 행 하나의 평균 길이

SQL> SELECT table_name, column_name, low_value, high_value, num_distinct
FROM user_tab_columns
WHERE table_name = ‘BIG_EMP‘ or table_name = ‘BIG_DEPT‘;

TABLE_NAME COLUMN_NAME LOW_VALUE HIGH_VALUE NUM_DISTINCT
----------------------------------------------------------------------
BIG_EMP EMPNO C102 C3036464 28955
BIG_EMP ENAME 4144414D53 57415244 14
BIG_EMP JOB 414E414C595354 53414C45534D414E 8
BIG_EMP MGR C24C43 C25003 6
BIG_EMP HIREDATE 77B7060D010101 78680604010101 713
BIG_EMP SAL 80 C24E6233 3982
BIG_EMP COMM 80 C20F 5
BIG_EMP DEPTNO 80 C164 98
BIG_EMP GROUPNO 31 32 2

LOW_VALUE : 해당 컬럼에 저장되어 있는 가장 최소값에 대한 암호화 결과
HIGH_VALUE : 해당 컬럼에 저장되어 있는 가장 최대값에 대한 암호화 결과
NUM_DISTINCT : 해당 컬럼의 저장되어 있는 유일한 값의 개수

 

다음은 인덱스에 대한 통계정보이다.

 

SQL> CREATE INDEX i_big_emp_deptno ON big_emp (deptno);
SQL> ANALYZE INDEX i_big_emp_deptno COMPUTE STATISTICS;

SQL> SELECT index_name index_name,
num_rows num_rows,
avg_leaf_blocks_per_key l_blocks,
avg_data_blocks_per_key d_blocks,
clustering_factor cl_fac,
blevel blevel,
leaf_blocks leaf
FROM user_indexes;

INDEX_NAME NUM_ROWS L_BLOCKS D_BLOCKS CL_FAC BLEVEL LEAF
----------------------------------------------------------------------------------
I_BIG_EMP_DEPTNO 28853 1 51 5036 1 57

NUM_ROWS : 인덱스 행 수
L_BLOCKS : 하나의 LEAF 블록에 저장되어 있는 인덱스 키의 수
D_BLOCKS : 하나의 DATA 블록에 저장되어 있는 인덱스 키의 수
CL-FAC : CLUSTER FACTOR
BLEVEL : INDEX의 DEPTH
LEAF : LEAF 블록의 수

 

통계 정보는 오라클 10g 이전 버전까지는 사용자가 실행하는 ANALYZE 명령어에 의해 생성되었으며 10g 버전부터는 오라클 서버의 자동화된 알고리즘에 의해 자동 생성된다.
오라클 9i 버전 때까지는 사용자에 의해 통계정보를 생성해 주지 않으면 비용기반 옵티마이저는 부정확한 실행계획을 작성함으로써 성능이 저하되는 경우들이 많이 발생했었다.
<그림 3>은 통계정보가 생성되어 있지 않은 경우 비용기반 옵티마이저가 참조하는 통계정보의 기본 값이다. 데이터를 저장하고 있는 테이블과 인덱스의 실제 구조정보와 다른 값을 참조하기 때문에 결론적으로 좋은 실행계획을 작성하지 못하는 것이다.

 

2) 용어에 대한 이해
SQL> SELECT * FROM big_emp;

Execution Plan
----------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=19 Card=28955 Bytes=1042380)
1 0 TABLE ACCESS (FULL) OF 'BIG_EMP' (Cost=19 Card=28955 Bytes=1042380)

COST : SQL문을 실행하여 조건을 만족하는 행을 검색하는데 소요되는 횟수
CARDINALITY : 전체 테이블에서 SQL문의 조건을 만족하는 행 수

 

3) Cardinality

일반적으로 cardinality는 SQL문이 실행되었을 때 조건을 만족하는 행수를 의미하는 것이긴 하지만 이것은 검색되는 컬럼이 어떤 속성을 가지고 있느냐에 따라 계산 공식이 달라진다.

 

3-1) Distinct Cardinality(Unique-Key)인 경우

이 경우는 주로 Full Table Scan과 같이 테이블 전체 행을 검색하는 경우의 cardinality를 계산하는 공식이다.

SQL> SELECT count(*) FROM big_dept;
count(*)
------------------
289

Cardinality = 조건을 만족하는 테이블의 행 수 = 289

SQL> ANALYZE TABLE big_dept COMPUTE STATISTICS;
SQL> SELECT * FROM big_dept ;

Execution Plan
--------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=289 Bytes=5202)
1 0 TABLE ACCESS (FULL) OF 'BIG_DEPT' (Cost=1 Card=289 Bytes=5202)

 

3-2) Efficient Cardinality(Non-Unique-Key)인 경우

SQL> SELECT count(*) FROM big_dept; --> 289 행
SQL> SELECT distinct loc FROM big_dept; --> 7 행

Cardinality = 테이블의 전체 행수 / Distinct-Key 수 = 289 / 7
= 41

SQL> ANALYZE TABLE big_dept COMPUTE STATISTICS;
SQL> SELECT * FROM big_dept WHERE loc = ‘LA’;

Execution Plan
---------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=41 Bytes=738)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_DEPT' (Cost=1 Card=41 Bytes=738)

 

3-3) Group Cardinality(Group by 절)인 경우

SQL> ANALYZE TABLE big_emp COMPUTE STATISTICS;

Cardinality = Distinct-Key 수 - 1

SQL> SELECT deptno, sum(sal) FROM big_emp Group by deptno; --> 99 행

Execution Plan
-----------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=131 Card=98 Bytes=588)
1 0 SORT (GROUP BY) (Cost=131 Card=98 Bytes=588)
2 1 TABLE ACCESS (FULL) OF 'BIG_EMP' (Cost=57 Card=28955 Bytes=173730)

 

4) Selectivity

선택도는 전체 테이블에서 SQL문의 조건을 만족하는 행이 분포되어 있는 비율을 의미하며 검색 되어지는 컬럼의 성격에 따라 계산 공식이 달라진다.

 

4-1) Unique-Key/Primary-Key의 경우

SELECT * FROM emp WHERE empno = 200;
--> Selectivity = 0.01 (좋은 선택도)

 

4-2) Non Unique-Key의 경우

SELECT * FROM emp WHERE ename = ‘SMITH’;
--> Selectivity = 1 / distinct-keys
--> 1/ 4 = 0.25

 

4-3) 값을 가진 비동등 조건식의 경우

SELECT * FROM emp WHERE empno < 200;
--> Selectivity = (범위값 - 최소값) / (최대값 - 최소값)
= (200 - 1) / (29999 - 1)
= 199 / 29998 = 0.007

SELECT * FROM emp WHERE empno > 200;
--> Selectivity = (범위값 - 최소값) / (최대값 - 최소값)
= (29799 - 1) / (29999 - 1)
= 29798 / 29998 = 0.9
SELECT * FROM emp WHERE empno BETWEEN 100 AND 200;
--> Selectivity = (최대 조건값 - 최소 조건값) / (최대값 - 최소값)
= (200 - 100) / (29999 - 1)
= 100 / 29998 = 0.003

 

4-4) 바인드 변수를 가진 비동등식의 경우

SELECT * FROM emp WHERE empno < :a ;
--> Selectivity = 0.25 % (나쁜 선택도)

SELECT * FROM emp WHERE empno BETWEEN :a AND :b ;
--> Selectivity = 0.5 % (나쁜 선택도)

 

5. 비용 계산 방법

 

지금까지 비용기반 옵티마이저가 비용을 계산하기 위해 알아야 할 여러 가지 내용에 대해 알아보았다. 그럼 지금부터는 다양한 SQL문의 비용 계산 공식에 대해 알아보자.

 

5-1) Full Table Scan인 경우

Cost = 전체 블록 수 / DB_FILE_MULTIBLOCK_READ_COUNT의 보정 값

인덱스를 사용하지 않고 해당 테이블의 첫 번째 블록부터 전체 블록을 검색해야 하는 전체 테이블 스캔의 경우에는 init.ora 파일에 정의되어 있는DB_FILE_MULTOBLOCK_READ_COUNT 파라메터 값에 의해 비용이 계산된다.
이 파라메터는 FULL TABLE SCAN의 경우 한번에 하나의 I-O로는 성능을 기대할 수 없기 때문에 보다 빠른 성능을 기대하기 위해 제공되는 다중 블록 읽기를 위한 파라메터이다. 즉, 한번 I-O에 8개, 16개, 32개, 64개의 다중 블록을 읽게 하기 위함이다.

SQL> SHOW PARAMETER db_file_multiblock_read_count
NAME TYPE VALUE
-------------------------------------------------------------------------------------
db_file_multiblock_read_count integer 16
SQL> SELECT * FROM big_emp;

Execution Plan
----------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=19 Card=28955 Bytes=1042380)
1 0 TABLE ACCESS (FULL) OF 'BIG_EMP' (Cost=19 Card=28955 Bytes=1042380)

앞에서 소개된 비용 계산 공식을 적용해보면 COST = 180 / 16 = 11.25의 결과가 나와야 하는데 실제 비용은 COST=19의 결과가 계산되었다 !!
이것은 DB_FILE_MULTIBLOCK_READ_COUNT 파라메터의 실제 값처럼 한번 I-O에 8, 16, 32, 64개의 블록을 읽을 수는 없기 때문에 파라메터의 실제 값이 아닌 보정 값으로 비용을 계산했기 때문이다. <그림 4>의 왼쪽 표는 ACTUAL (DB_FILE_MULTIBLOCK_READ_COUNT 파라메터 값)에 따른 Adjusted(보정 값)이며 <그림 4>의 오른쪽 그림은 이 파라메터가 실제로 성능의 영향을 미치게 되는 영향도를 그림으로 나타낸 것이다.
즉, COST = 19는 (180 / 10.398) +1의 계산 공식 결과임을 알 수 있다.
사용자가 실행하는 SQL문의 실행계획이 FULL TABLE SCAN으로 결정되도록 유도하기 위해서는 이 파라메터 값을 조절하면 된다.

 

SQL> ALTER SESSION SET db_file_multiblock_read_count = 8;
SQL> SELECT * FROM big_emp;

Execution Plan
-------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=29 Card=28955 Bytes=1042380)
1 0 TABLE ACCESS (FULL) OF 'BIG_EMP' (Cost=29 Card=28955 Bytes=1042380)

 

위 SQL문의 비용은 Cost = (180 / 6.589) + 1 = 29 이다.
파라메터 값의 변경에 따라 비용이 달라지는 것을 확인할 수 있을 것이다.

 

SQL> ALTER SESSION SET db_file_multiblock_read_count = 32;
SQL> SELECT * FROM big_emp;

Execution Plan
-------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=13 Card=28955 Bytes=1042380)
1 0 TABLE ACCESS (FULL) OF 'BIG_EMP' (Cost=13 Card=28955 Bytes=1042380)

위 SQL문의 비용은 Cost = (180 / 16.409) + 1 = 13이다.

 

 

5-2) Unique Index Scan인 경우

Cost = blevel + 1

UNIQUE INDEX를 이용한 비용은 LEAF 블록의 DEPTH +1 이 된다.

SQL> CREATE UNIQUE INDEX I_big_emp_empno ON BIG_EMP (EMPNO);
SQL> ANALYZE INDEX I_big_emp_empno compute statistics;

SQL> SELECT INDEX_NAME, BLEVEL FROM USER_INDEXES
WHERE INDEX_NAME = 'I_BIG_EMP_EMPNO';

INDEX_NAME BLEVEL
-------------------------------------------------
I_BIG_EMP_EMPNO 1

SQL> SELECT /*+index(big_emp I_big_emp_empno )*/ ename
FROM big_emp
WHERE empno = 7499;
--------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=20)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP' (Cost=2 Card=1 Bytes=20)
2 1 INDEX (UNIQUE SCAN) OF 'I_BIG_EMP_EMPNO' (UNIQUE) (Cost=1 Card=100)

위 SQL문의 비용은 Cost = 1 + 1 = 2이다.

5-3) Fast Full Index Scan인 경우

Cost = leaf_blocks / db_block_size

SQL> CREATE INDEX emp_job_deptno ON BIG_EMP (job, deptno);
SQL> ANALYZE INDEX emp_job_deptno compute statistics;
SQL> SELECT INDEX_NAME, LEAF_BLOCKS FROM USER_INDEXES
WHERE INDEX_NAME = 'EMP_JOB_DEPTNO';

INDEX_NAME LEAF_BLOCKS
--------------------------------------------------------
EMP_JOB_DEPTNO 89

SQL> SHOW PARAMETER DB_BLOCK_SIZE
NAME VALUES
----------------------------------------------
DB_BLOCK_SIZE 8

SQL> SELECT /*+index_ffs(big_emp big_emp_job_deptno)*/ job, deptno
FROM big_emp
WHERE deptno >= 1 and deptno <= 100
----------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=10 Card=37 Bytes=703)
1 0 INDEX (FAST FULL SCAN) OF 'EMP_JOB_DEPTNO (Cost=10 Card=37 Bytes=703)

위 SQL문의 비용은 Cost = 89 / 8 = 10 이다.

 

5-4) Index Range Scan인 경우

Cost = blevel + (Selectivity X leaf_blocks) + (Selectivity X Cluster Factor)
SQL> ALTER SESSION SET optimizer_index_cost_adj = 100; SQL> ANALYZE
TABLE big_emp COMPUTE STATISTICS;
SQL> ANALYZE INDEX i_big_emp_deptno COMPUTE STATISTICS;

선택도= 1/98 (Distinct.. deptno.. 98.... ...... .... .. USER_TAB_COLUMNS
참조)
Cluster-Factor= 5036 (USER_INDEXES 참조)

SQL> SELECT INDEX_NAME, BLEVEL, LEAF_BLOCKS FROM USER_INDEXES
WHERE INDEX_NAME = 'I_BIG_EMP_DEPTNO'

INDEX_NAME BLEVEL LEAF_BLOCKS
---------------------------------------------------------------------------
I_BIG_EMP_DEPTNO 1 57

SQL> SELECT /*+INDEX(BIG_EMP i_big_emp_deptno)*/ *
FROM BIG_EMP WHERE DEPTNO = 10 ;

Execution Plan
-------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=53 Card=294 Bytes=10584)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP' (Cost=53 Card=294 Bytes=10584)
2 1 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO' (NON-UNIQUE) (Cost=1 Card=294)

위 SQL문의 비용은 Cost = 1 + (1/98 * 57) +(1/98 * 5036) = 53이다.

SQL> ALTER SESSION SET optimizer_index_cost_adj = 50;
SQL> SELECT /*+INDEX(BIG_EMP)*/ * FROM BIG_EMP WHERE DEPTNO = 10 ;

Execution Plan
-------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=27 Card=294 Bytes=10584)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP' (Cost=27 Card=294 Bytes=10584)
2 1 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO' (NON-UNIQUE) (Cost=1 Card=294)

위 SQL문의 비용은 Cost = 53 X 0.5 = 27이다.

SQL> ALTER SESSION SET optimizer_index_cost_adj = 150;
SQL> SELECT /*+INDEX(BIG_EMP)*/ * FROM BIG_EMP WHERE DEPTNO = 10 ;

Execution Plan
-------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=80 Card=294 Bytes=10584)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP' (Cost=80 Card=294 Bytes=10584)
2 1 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO' (NON-UNIQUE) (Cost=1 Card=294)

위 SQL 문의 비용은 Cost = 53 X 1.5 = 80이다.

 

5-5) Sort-Merge Join인 경우

다음은 소트-머지 조인의 경우 비용 계산 공식이다.
Cost = (Outer 테이블의 Sort Cost +Inner 테이블의 Sort Cost) -1
SQL> SELECT /*+use_merge(big_dept big_emp)*/ *
FROM big_emp, big_dept
WHERE BIG_EMP.DEPTNO = BIG_DEPT.DEPTNO;

Execution Plan
-------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=452 Card=28853 Bytes=1558062)
1 0 MERGE JOIN (Cost=452 Card=28853 Bytes=1558062)
2 1 SORT (JOIN) (Cost=7 Card=289 Bytes=5202)
3 2 TABLE ACCESS (FULL) OF 'BIG_DEPT' (Cost=1 Card=289 Bytes=5202)
4 1 SORT (JOIN) (Cost=446 Card=28955 Bytes=1042380)
5 4 TABLE ACCESS (FULL) OF 'BIG_EMP' (Cost=57 Card=28955 Bytes= 1042380)

위 SQL문의 비용은 Cost = (outer-sort-cost + inner-sort-cost) - 1
= 7 + 446 - 1 = 452 이다.

5-6) Nest-Loop 조인의 경우

다음은 중첩루프 조인의 경우 비용 계산 공식이다.

Cost = Outer 테이블의 Cost + (Inner 테이블의 Cost * Outer 테이블의 Cardinality)

SQL> SELECT /*+ use_nl(big_emp big_dept)
index(big_emp I_big_emp_deptno)*/ *
FROM big_emp, big_dept
WHERE BIG_EMP.DEPTNO = BIG_DEPT.DEPTNO;

Execution Plan
-------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=18786 Card=28853 Bytes= 1558062)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP' (Cost=65 Card=28955 Bytes=1042380)
2 1 NESTED LOOPS (Cost=18786 Card=28853 Bytes=1558062)
3 2 TABLE ACCESS (FULL) OF 'BIG_DEPT' (Cost=1 Card=289 Bytes=5202) <-- OUTER 테이블
4 2 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO' (NON-UNIQUE) (Cost=1 Card=28955)

위 SQL문의 비용은 Cost = outer-cost + (inner-cost * outer card)
= 1 + (65 * 289)
= 1 + 18785
= 18786

SQL> CREATE INDEX i_big_dept_deptno ON big_dept (deptno);
SQL> ANALYZE TABLE big_dept COMPUTE STATISTICS;
SQL> SELECT /*+use_nl(big_emp big_dept)
index(big_dept I_big_dept_deptno)
ordered*/ *
FROM big_emp, big_dept
WHERE BIG_EMP.DEPTNO = BIG_DEPT.DEPTNO;

Execution Plan
-------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=57967 Card=28853 Bytes= 1558062)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_DEPT' (Cost=2 Card=289 Bytes= 5202)
2 1 NESTED LOOPS (Cost=57967 Card=28853 Bytes=1558062)
3 2 TABLE ACCESS (FULL) OF 'BIG_EMP'(Cost=57 Card=28955 Bytes=1042380) <--OUTER ......
4 2 INDEX (RANGE SCAN) OF 'I_BIG_DEPT_DEPTNO' (NON-UNIQUE) (Cost=1 Card=289)

위 SQL문의 비용은 Cost = outer-cost + (inner-cost * outer card)
= 57 + (2 * 28955)
= 57 + 57910
= 57967


5-7) Hash Join인 경우

다음은 해시 조인의 경우 비용 계산 공식이다.

Cost = (Outer 테이블의 Cost × #Hash 파티선수 +Inner 테이블의 Cost) + 2

SQL> SELECT /*+hash(big_emp)*/ *
FROM BIG_EMP, BIG_DEPT
WHERE BIG_EMP.DEPTNO = BIG_DEPT.DEPTNO;

Execution Plan
-------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=60 Card=28853 Bytes=1558062)
1 0 HASH JOIN (Cost=60 Card=28853 Bytes=1558062)
2 1 TABLE ACCESS (FULL) OF 'BIG_DEPT' (Cost=1 Card=289 Bytes=5202)
3 1 TABLE ACCESS (FULL) OF 'BIG_EMP' (Cost=57 Card=28955 Bytes= 1042380)

위 SQL문의 비용은 Cost = outer-cost + inner-cost + Sort Cost + 2
= 1 + 57 + 2
= 60

 

 

6. 실행계획 생성기(Plan Generator)

사용자가 실행한 SQL문은 쿼리 변형기의 비용 계산기에 의해 여러 가지 유형의 실행계획으로 비용 분석된다. 그 중에 가장 적은 비용으로 실행되어질 수 있는 실행계획 하나가 선택되는데 이것을 Optimal Plan이라고 한다.
다음 문장들은 동일한 결과를 제공하지만 실행계획 생성기에 의해 가장 적은 비용의 실행계획을 선택한 결과이다.

 

6-1) 적정 플랜(Optimal Plan)

Index Scan인 경우

SELECT ename
FROM big_emp
WHERE deptno = 20 AND empno BETWEEN 100 AND 200
ORDER BY ename;
Execution Plan
-------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=9 Card=1 Bytes=12)
1 0 SORT (ORDER BY) (Cost=9 Card=1 Bytes=12)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP' (Cost=5 Card=1 Bytes=12)
3 2 INDEX (RANGE SCAN) OF 'I_BIG_EMP_EMPNO' (UNIQUE) (Cost=2 Card=1)

이 실행계획은 비용기반 옵티마이저에 의해 I_BIG_EMP_EMPNO 인덱스가 선택되었으며 이때 계산된 I-O COST는 9이다.
I_BIG_EMP_DEPTNO 인덱스가 선택된 경우

SELECT /*+index(big_emp I_BIG_EMP_DEPTNO)*/ ename
FROM big_emp
WHERE deptno = 20 AND empno BETWEEN 100 AND 200
ORDER BY ename;

Execution Plan
-------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=70 Card=1 Bytes=12)
1 0 SORT (ORDER BY) (Cost=70 Card=1 Bytes=12)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'BIG_EMP' (Cost=66 Card=1 Bytes=12)
3 2 INDEX (RANGE SCAN) OF 'I_BIG_EMP_DEPTNO' (NON-UNIQUE) (Cost=2 Card=1)

이 실행계획은 I_BIG_EMP_DEPTNO 인덱스가 선택되었으며 이때 계산된 I-O COST는 70이다.

Full Table Scan인 경우

SELECT /*+full(big_emp)*/ ename
FROM big_emp
WHERE deptno = 20 AND empno BETWEEN 100 AND 200
ORDER BY ename;
Execution Plan
-------------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=61 Card=1 Bytes=12)
1 0 SORT (ORDER BY) (Cost=61 Card=1 Bytes=12)
2 1 TABLE ACCESS (FULL) OF 'BIG_EMP' (Cost=57 Card=1 Bytes=12)

이 실행계획은 Full Table Scan이 선택되었으며 이때 계산된 IO COST는 61이다. 결론적으로, 5-1, 5-2, 5-3의 SQL문장들은 동일한 문장, 동일한 결과를 제공하지만 이 문장이 실행될 수 있는 실행계획은 다양하다는 것을 알 수 있다.
이와 같이, 비용기반 옵티마이저는 여러 가지 실행계획 중에 가장 비용이 적게 발생하는 I_BIG_EMP_EMPNO 인덱스를 이용한 실행계획을 Optimal Plan으로 선택하게 된다.

 

6-2) 비용계산 분석 명령어

다음 문장은 비용분석기(Estimator)와 실행계획 생성기(Plan Generator)에 의해 비용 분석된 결과를 모니터링 하는 방법이다.
SQL> ALTER SESSION SET EVENTS '10053 trace name context forever, level 1';
SQL> SELECT *
FROM BIG_EMP, BIG_DEPT, ACCOUNT
WHERE BIG_EMP.DEPTNO = BIG_DEPT.DEPTNO
AND ACCOUNT.CUSTOMER = BIG_EMP.EMPNO
SQL> EXIT
[C:\] CD C:\ORACLE\ADMIN\ORA92\UDUMP
[C:\] DIR
ORA92_ORA_xxxx.trc <-- 워드패드 편집기를 통해 결과 확인

 

<분석결과>

*** 2005-07-17 10:41:27.000
*** SESSION ID:(10.976) 2005-07-17 10:41:27.000
QUERY
SELECT * FROM BIG_EMP, BIG_DEPT, ACCOUNT
WHERE BIG_EMP.DEPTNO = BIG_DEPT.DEPTNO AND ACCOUNT.CUSTOMER
= BIG_EMP.EMPNO

***************************************
GENERAL PLANS
***************************************
Join order[1]: BIG_DEPT [BIG_DEPT] BIG_EMP [BIG_EMP] ACCOUNT
[ACCOUNT]
Now joining: BIG_EMP [BIG_EMP] *******
NL Join
Outer table: cost: 2 cdn: 289 rcz: 19 resp: 2
Inner table: BIG_EMP
Access path: tsc Resc: 19
Join: Resc: 5493 Resp: 5493
Join cardinality: 28853 = outer (289) * inner (28955) * sel (3.4480e-003)
[flag=0]
Best NL cost: 5493 resp: 5493
SM Join
Outer table:
resc: 2 cdn: 289 rcz: 19 deg: 1 resp: 2
Inner table: BIG_EMP
Best SM cost : 257

***********************
Join order[2]: BIG_DEPT [BIG_DEPT] ACCOUNT [ACCOUNT] BIG_EMP
[BIG_EMP]
Now joining: ACCOUNT [ACCOUNT] *******

***********************
Join order[3]: BIG_EMP [BIG_EMP] BIG_DEPT [BIG_DEPT] ACCOUNT
[ACCOUNT]
Now joining: BIG_DEPT [BIG_DEPT] *******

***********************
Join order[4]: BIG_EMP [BIG_EMP] ACCOUNT [ACCOUNT] BIG_DEPT
[BIG_DEPT]
Now joining: ACCOUNT [ACCOUNT] *******


***********************
Join order[5]: ACCOUNT [ACCOUNT] BIG_DEPT [BIG_DEPT] BIG_EMP
[BIG_EMP]
Now joining: BIG_DEPT [BIG_DEPT] *******

***********************
Join order[6]: ACCOUNT [ACCOUNT] BIG_EMP [BIG_EMP] BIG_DEPT
[BIG_DEPT]
Now joining: BIG_EMP [BIG_EMP] *******

 

<분석결과 평가>

 

분석된 결과 중에 Join order[n]는 여러 개의 테이블을 조인하는 경우 어떤 테이블부터 검색하여 어떤 순서에 의해 조인해 나가는 방법인지 분석하는 경우를 나타낸다.
Join order[1]에서 Best NL cost: 5493은 중첩루프 조인의 비용 결과이며, Best SM cost : 257은 소트-머지 조인의 경우 비용 결과이다.
비용기반 옵티마이저는 하나의 조인순서가 결정되면 다양한 실행 방법들에 대한 비용을 일일이 계산하게 된다. 그 중에 가장 적은 비용이 발생하는 조인 순서와 실행 방법을 실행 계획으로 선택하게 되는 것이다.

 

 

 

제공 : DB포탈사이트 DBguide.net
반응형

'ORACLE > TUNING' 카테고리의 다른 글

오라클 hint 사용법  (2) 2008.11.24
Transaction internals  (0) 2008.11.11
접속 부하가 있을때 Multi listener구성하기  (0) 2008.06.12
자동화 통계수집 & AWR & ASH  (0) 2008.02.01
Toad를 이용한 DB튜닝방법  (0) 2007.11.16
Posted by [PineTree]
ORACLE/Migration2008. 11. 7. 15:03
반응형


  

7. Data Pump Import 모드

   지금 까지  Data Pump Export 대해 자세히 알아 보았습니다. 데이터베이스 내에 있는 오브

   젝트를 운영체제 파일시스템으로 옮기는 작업을 Data Pump Export 라고 한

   다면 Data Pump Import 작업은 운영체제 파일시스템에 있는 오브젝트 들을 데이터 베이스

   내의 테이블로 옮기는 작업 입니다.  impdp 명령어를 통하여 사용할 수 있으며,

   Data Pump Import 작업에서 처럼 Command 라인, par 파일, Interactive Mode 모두 사용 하

   실 수 있습니다.

 

    1) 파일 및 디렉토리 관련 파라메타

      

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmpSCHEMAS=SCOTT

 

       과 같이 DIRECTORY 는 디렉토리 오브젝트를 받는 파라메타 이고 DUMPFILE 파라메타

       는 Import 될 파일명, SQLFILE 은 작업 수행동안 수행될 DDL문을 저장할 파일이름

       이며, 디렉토리 관련 파라메타 로 설정 됩니다.

    2) 필터링 관련 파라메타

       필터링 파라관련 파라메타 에는 COTENT,INCLUDE,EXCLUDE,TABLE_EXISTS_ACTION 파라메

       터가 있습니다. COTENT,INCLUDE,EXCLUDE 파라메타는 Export 와 마찬가지로 사용 하

       실수 있으며,TABLE_EXISTS_ACTION 파라메타는 오직 Import 작업시에만 사용 할 수 있

       습니다.

        COTENT : CONTENT 파라메타는 DATA_ONLY,ALL,METADATA_ONLY 3가지 값을 가질 수 있

       으며, CONTENT=DATA_ONLY 형식으로 사용 하실 수 있습니다.

       

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

SCHEMAS=SCOTT CONTENT=DATA_ONLY

 

        INCLUDE : INCLUDE=OBJECT_NAME:"='조건'" 형식으로 사용하실 수 있으며, 오브

       젝트의 종류에는 앞서 배운 것 과 같이 TABLE,INDEX,PORCEDURE,FUNCTION 등이 있습

       니다.

       

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

SCHEMAS=SCOTT INCLUDE=TABLE:"='SAL'"

 

       SCOTT 유저의 테이블을 Import 하되 SAL 테이블 만 포함 시키라는 명령 이 됩니다

       SCOTT 유저가 EMP,SAL,SALARY 3개의 테이블을 가졌다고 가정하고 하나의 덤프파일에

       3개의 테이블을 Export 받았고, 위와 같은 import 명령을 내린다면 3개의 테이블중

       오직 SAL 테이블 만을 Import 하게 됩니다.

        EXCLUDE : EXCLUDE=OBJECT_NAME:"='조건'" 형식으로 사용하실 수 있으며, 마찬가지

       로 오브젝트 종류는 INCLUDE 와 같습니다.

 

       

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

SCHEMAS=SCOTT EXCLUDE=TABLE:"='SAL'"

 

       SCOTT 유저의 테이블을 Import 하되 SAL 테이블을 제외한 나머지 테이블을 Import

       하라는 명령이 되겠죠? 마찬가지로 SCOTT 유저가 EMP,SAL,SALARY 3개의 테이블을 가졌

       다고 가정하고 하나의 덤프파일에 3개의 테이블을 Export 받았고, 위와 같은 import

       명령을 내린다면 3개의 테이블중 SAL 을 제외한 EMP,SALARY 테이블만 Import 될 것

       입니다.

        TABLE_EXISTS_ACTION : Import 시에 중요한 옵션입니다. 우리가 Data Pump 를 통

       해 작업을 하게될 경우 같은 이름의 테이블이 존재할 때가 있습니다. 만약 테이블이

       존재 하더라도 Import 하고자 하는 데이터의 row 수가 다를 수고 있고 같을 수도 있

       을 겁니다. 즉, 테이블은 존재하지만 데이터의 내용은 차이가 난다는 거죠.

       이러한 경우에 사용할 수 있는 유용한 파라메타가  TABLE_EXISTS_ACTION 입니다.

       TABLE_EXISTS_ACTION 파라메타는  SKIP,APPEND,TRUNCATE,REPLACE 의 값을 가질수 있으

       며 각 값의 의미는 다음과 같습니다.

       - SKIP     : 같은 테이블을 만나면 지나치고 다음 테이블을 Import 합니다.

       - APPEND   : 같은 테이블을 만나면 기존의 데이터에 추가하여 Import 합니다.

       - TRUNCATE : 같은 테이블을 만날경우 기존의 테이블을 TRUNCATE 하고 새로운 데이

                    터를 Import 합니다.

       - REPLACE  : 같은 테이블을 만날 경우 기존의 테이블을 DROP 하고 테이블을 재생성

                    한후 데이터을 Import 합니다.

       

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

SCHEMAS=SCOTT TABLE_EXISTS_ACTION=SKIP  

 

       위와 같이 실행하면 같은 테이블을 만날경우 그냥 지나치고 다른 테이블을 Import

       하겠죠?

      2) JOB 관련 파라메타

       앞서 학습한 JOB_NAME,STATUS,PARALLEL 파라메타를 Export 와 같은 방법으로 사용

       하실 수 있습니다. Export 와 마찬가지로 PARALLEL 작업시에 dumpfile 의 개수를

       %u를 사용하여 지정하여 주거나, 명시적으로 ','를 사용하여 PARALLEL 개수 만큼

       파일을 지정 하셔야 합니다.

 

      3) 리맵핑 관련 파라메타

      리맵핑 관련 파라메타에는 REMAP_SCHEMA,REAMP_DATAFILE,REMAP_TABLESPACE 가 있으며,

      이들 파라메타 를 통하여 우리는 다른 데이터베이스 로 Import 시에 많은 유연성을 제

      공 받을 수 있습니다.

       REMAP_SCHEMA : A 유저 스키마로 Export 받은 데이터를 B 유저 스키마로 Import 하

      고자 할때 사용 합니다.

      

      

 

impdp dangtong/edu2006 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

SCHEMAS=SCOTT REMAP_SCHEMA=SCOTT:DANGTONG

 

      위와 같이 수행한후 TABLE의 OWNER 을 조회 한다면 DANGTONG 유저의 소유로 테이블

      이 등록 되었음을 확인 하실수 있습니다.

       REMAP_DATAFILE : 전체 데이타베이스 시스템을 Data Pump 를 통하여 옮기고자 할때

      Export 된 daumfile 에는 DataFile 정보까지 포함하게 됩니다. 하지만 다른시스템의

      디스크 경로 상에는 존재하지 않는 경로이기 때문에 Import에 실패하게 됩니다. 이러한

      경우에 사용 할 수 있는 파라메타가 REAMP_DATAFILE 입니다. Export 된 dumpfile 이

      Datafile 정보를 포함한 경우에만 해당합니다.

      

 

impdp dangtong/edu2006 FULL=Y DIRECTORY=datapump_dir1

DUMPFILE=datapump.dmp 

REMAP_DATAFILE='/db1/data/lvol01':'/db2/data/lvol01',

               '/db1/data/lvol02':'/db2/data/lvol02'     

                                .

                                .

                                .

 

 

       REMAP_TABLESPACE : Export 받은 데이터 속한 TABLESPACE에서 다른 테이블 스페이

      스로 REMAPPING 하고 하는 경우 사용할 수 있응 파라메타 입니다.

      

 

impdp dangtong/edu2006 REMAP_TABLESPACE='scott_tsb':'dangtong:tbs'

DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp SCHEMAS=SCOTT

 

      4) 네트웍 링크 파라메타

      Export 에서와 마찬가지로 DB LINK를 이용하여 원격지 데이터베이스에 대해 Import

      작업을 수행할 수 있습니다.

 

      5) Interactive mode 파라메타

      Export 에서와 마찬가지로 Ctrl + C 를 통하여 Interactive mode 로 진입할 수 있으며

      작업을 통제 할 수 있습니다.

 

   8. Data Pump 모니터링 하기  

   이번 장에서는 SQL을 통한 작업 모니터링 방법에 대하여 학습해 보도록 하겠습니다.

   작업의 진행 경과와 작업속성들 그리고 얼마나 많은 작업들이 존재 하는가를 알 수

   있습니다.

      1) 관련 조회 테이블 및 VIEW 들

     

          DBA_DATAPUMP_JOBS 현재 실행중인 작업의 속성들을 살펴 볼 수 있는 테이블

            입니다.

         SQL> select * from dba_datapump_jods;

         로 조회 하시면  다음과 같은 컴럼이 나옵니다.

         - OWNER_NAME  : DB 작업 계정

         - JOB_NAME    : 작업의 명칭

         - JOB_MODE,   : FULL,TABLE,INDEX,TABLESPACE 등이 있습니다.

         - STATE       : EXECUTING(수행중),DEFINING ,UNDEFINED, NOT RUNNING 의 값을

                         가집니다.

          Pump Session 확인

        Select sid,serial# from v$session session,dba_data_session pump_session

        where session.saddr = pump_session.saddr;

         로 조회 하시면 현재 Data Pump 를 통해 수행 중인 모든 Session 들과 상태들을

         모니터링 할 수 있습니다.

          Data Pump  의  모니터링

         SELECT opname,target_desc,sofar,totalwork,(sofar/totalwork*100) Percentage

         FROM v$session_longops;

         opname  : JOBNAME 과 같습니다.

         TOTALWORK : 총 수행하여야할 용량을 가르키며 단위는 Megabytes 입니다.

         sofar     : 현재 수행한 용량 을 가르키며 단위는  Megabytes 입니다.

         target_desc : 작업의 종류를 말합니다. IMPORT/EXPORT 가 값이 될수 있습니다.

반응형
Posted by [PineTree]
ORACLE/Migration2008. 11. 7. 15:01
반응형


  

 5. Data Pump Export 사용하기

   이제 본격적으로 Data Pump Export 를 사용하는 방법과, 여러 가지 옵션들에 대해 살펴

   보고, 실 상황에서 옵션들이 어덯게 동작하는지 테스트 해보는 시간을 가져 보도록 하겠습

   니다.

     1) 컴맨드 라인을 이용한 Data Pump 사용

     $ expdp system/manager DIRECTORY=datapump_dir1 DUMPFILE=dangntong_dump01.dmp

     컴맨드 라인을 이용하여 보기와 같이 expdp 를 사용하실 수 있습니다. 커맨들 라인을

     이용 할 때는 비교적 적은 수의 옵션들이 사용되거나 간단한 구문일 때 이용하시는 것이

     좋습니다. 복잡하고, 옵션이 많게 되면 수정 하거나, 잘못 타이핑할 때 시간이 많이

     걸리게 됩니다.

     2) 파라메타 파일을 이용한 Data Pump 사용

     파라메타 파일에 다음과 같이 기록합니다. 파일명은 dangtong.par입니다.

     ⓛ dangtong.par 파일을 다음과 같이 작성하세요

     SCHEMAS=SCOTT

     DIRECTORY=datapump_dir1

     DUMPFILE=dangtong_dump01.dmp

 LOGFILE=dangtong_dump.log  

     $ expdp dangtong/imsi00 PARFILE=dangtong.par

 

   6. Data Pump Export 모드

    1) Full export 모드

    FULL 파라메타를 사용합니다.

    데이터 베이스 전체를 export 받을수 있습니다. 한가지 주의 할점은

    EXPORT_FULL_DATABASE 롤이 Full export 받고자 하는 사용자 에게 부여되어 있

    어야 합니다.

    2) 스키마 모드

    SCHEMAS 파라메타를 사용합니다.

    하나의 유저가 소유하고 있는 데이타및 오브젝트 전체를 export 받고자 할때  사용할 수

    있는 모드입니다.

    3) 테이블스페이스 모드

    TABLESPACE 파라메타를 사용합니다.

    하나 이상의 테이블스페이스에 대해 해당 테이블스페이스에 속한 모든 테이블을 받을수

    있습니다. 만약 TRANSPORT_TABLESPACES 파라메타를 이용한다면, 테이블 뿐 아니라 테이

    블스페이스의 메타데이타 까지 export 받게 되어 다른 서버에 dump 파일을 카피 한 후

    import 하게 되면 테이블 스페이스 및 테이블이 자동으로 생성됩니다.

    4) 테이블 모드

    TABLES 파라메타를 사용합니다.

    하나 이상의 테이블을 export 받을 때 사용합니다.

 

   7. Data Pump Export 파라메타

    1) 파일 및 디렉토리 관련 파라메타

       파라메타 :DIRECTORY,DUMPFILE,FILESIZE,PARFILE,LOGFILE,NOLOGFILE,COMPRESSION

       ① DIRECTORY : 디렉토리 오브젝트를 참조 하는 DIRECTORY 파라메타를 이용하여

          덤프 파일의 위치 및 로그 파일의 위치를 지정할 수 있습니다.

          DIRECTORY=directory_object_name  형식으로 사용할 수 있습니다.

       ② DUMPFILE  : Export 받아 파일시스템에 저장될 덤프파일의 이름을 지정하는 파

          라메터 입니다. 파라메타를 사용할 때 다음을 기억하시고 사용하시면 됩니다.

          - %U 를 사용하여 여러 개의 덤프 파일을 구분할 수 있습니다.

            DUMPFILE=DANGTONG_DUMO_%U.dmp 로 파라메타를 정의 합니다. 만약 덤프 파일

            이 10개가 생성 된다고 가정하면 DANGTONG_DUMO_01.dmp 부터 DANGTONG_DUMO_10.dmp

            까지 %U 부분이 자동 증가하여 파일을 구분하여 줍니다. %U의 범위는 01~99 까

            지입니다.

          - ',' 를 이용하여 여러게의 파일명을 구분할 수 있습니다. 예를 들어 다음과 같이

            DUMPFILE=DANGTONG_DUMO_01.dmp,DANGTONG_DUMO_02.dmp,DANGTONG_DUMO_03.dmp 라고

            정의 할 수 있습니다.

          - 만약 DUMPFILE 파라메타를 지정하지 않는다면 expdat.dmp 라는 파일명으로 오

            라클이 자동 선언하게 됩니다.

       ③ FILESIZE  : Export 받는 1개 파일의 최대 크기를 지정하는 파라메타 입니다.

          만약 총데이터 량이 10Gigabyte 이고 FILESIZE 를 1Gigabyte 로 지정하였다면

          1Gigabyte 크기의 dump file 이 10개 만들어 지게 됩니다.

          FILESIZE=N [ BYTES | KILOBYTES | MEGABYTES | GIGABYTES ] 형식으로 쓸 수 있습

    니다.

 ④ PARFILE   : 파일에 파라메타 들을 저장해두고 Data Pump 를 이용할 때 마다 참조

    하여 작업을 수행하고 싶을 때 PARFILE 파라메타 를  사용할 수 있습니다.

    PARFILE=filename.par 형식으로 사용할 수 있으며, 파일 확장자는 아무런 영향을

    미치지 않습니다.

 ⑤ LOGFILE and NOLOGFILE : 로그파일명을 지정하는 파라메타 입니다.

    LOGFILE=logfile_name 형식으로 사용 하시면 됩니다. 파라메타 를 설정하지 않

    는다면 export.log 라는 파일명으로 로그가 남게 됩니다. 로그파일을 남기고 싶

    지 않을 때는 NOLOGFILE 파라메타 를 사용하시면 됩니다.

 ⑥ COMPRESSION : 오라클에서 EXPORT 시에 메타데이터는 압축을 하여 파일에 저장

    하게 됩니다. COMPRESSION 파라메타를 사용 하지 않을 경우에는 덤프파일 내에

    메타데이타가 압축되어 보관됩니다. COMPRESSION 파라메타 에는 METADATA_ONLY,    

 NONE 두개의 옵션이 있으며,METADATA_ONLY 는 파라메타를 사용하지 않으면 디펄

 트로 인식되는 옵션입니다. COMPRESSION=OPTION_NAME 형식으로 사용하시면 됩니다.

 

$expdp dangtong/imsi00 DIRECTORY=datapump_dir1 DUMPFILE=dump.dmp COMPRESSION=NONE

 

    2) Export 모드 관련 파라메타

      파라메타 :FULL,SCHEMAS,TABLES,TABLESPACES,TRANSPORT_TABLESPACES

     TRANSPORT_FULL_CHECK 가 있으며, TRANSPORT_FULL_CHECK 파라메타를 제외한 파라메타

     들은 여러분들 께서 이미 "6. Data Pump Export 모드" 에서 학습 하셨습니다. 그럼

     TRANSPORT_FULL_CHECK 파라메타에 대해서만 학습 하도록 하겠습니다.

     TRANSPORT_FULL_CHECK 파라메타는 Export 작업시에 테이블스페이스 내에 존재하는 테

     이블과 인덱스의 의존성을 검사 할 것인지 하지 않을 것인지를 설정하는 파라메타 이

     며 'Y' 또는 'N' 두개의 값만을 허용 하는 파라메타 입니다. TRANSPORT_FULL_CHECK

     파라메타는 TRANSPORT_TABLESPACES 와 같이 사용 되어 집니다.

     ① 'Y' 일경우 TABLESPACE 내에 테이블만 있고 인덱스가 없다면 작업은 실패합니다.

        반드시 INDEX도 같은테이블 스페이스에 존재 해야합니다.

     ② 'Y' 일경우 TABLESPACE 내에 인덱스만 존재하고 테이블이 없다면 작업은 실패합니다.

        반드시 TABLE 또한 존재 해야합니다.

     ③ 'N' 일경우 TABLESPACE 내에 테이블만 있고 인덱스가 없다면 작업은 성공합니다.

     ④ 'N' 일경우 TABLESPACE 내에 인덱스만 있고 테이블이 없다면 작업은 실패합니다.

   

    3) Export 필터링 관련 파라메타

     파라메타 :CONTENT,EXCLUDE,EXCLUDE,QUERY 파라메타가 있으며, 이러한 파라메타들은

     어떤 데이터를 Export 된 파일에 포함시킬지 결정 하는 파라메타 입니다.

     ① CONTENT :3개의 옵션을 가질 수 있으면 옵션 들은 다음과 같습니다.

        - ALL : 테이블과 메터데이터를 포함한 모든것을 포함시키겠다는 옵션

       

 

$ expdp dangtong/edu2006 DUMPFILE=datadump.dmp CONTENT=ALL

        - DATA_ONLY : 테이블 데이터만 포함 시키겠다는 옵션

       

 

$ expdp dangtong/edu2006 DUMPFILE=datadump.dmp CONTENT=DATA_ONLY

        - METADATA_ONLY : 메타데이터 만을 포함하겠다는 옵션이며, 이경우 Export된

          파일을 이용해 다른 데이터베이스에 Import할 경우 테이블 구조만 생성되게

          됩니다.

        $ expdp dangtong/edu2006 DUMPFILE=datadump.dmp CONTENT=METADATA_ONLY

     ② EXCLUDE and INCLUDE  : 원하는 오브젝트를 선택하여 받을 수 있습니다.

        그렇다면 EXCLUDE 와 INCLUDE 파라메타가 가질 수 있는 오브젝트의 종류에는 어떤

        것들이 있을까요? 오라클에서 오브젝트란 유저스키마, 테이블, 인덱스, 프로시져

        등을 통칭해서 오브젝트라고 합니다. 파라메타의 사용방법은 아래와 같습니다.

        - SCOTT 유저와 관련된 모든것을 Export 받고 싶은데 단, BONUS 테이블을 제외하고

        받고 싶다면 아래와 같이 하시면 됩니다.

       

 

$ expdp dangtong/edu2006 dumpfile=ex_dump.dmp schemas=scott

  exclude=TABLES:"='BONUS'"  

        - SCOTT 유저와 관련된 모든 것을 Export 받고 싶은데 단, EMP 테이블의 인덱스는 받

          지 않고 싶다면  다음과 같이 하시면 됩니다.

       

 

$ expdp dangtong/edu2006 dumpfile=ex_dump.dmp schemas=scott

  exclude=INDEX:\"='EMP%'\"  

 

        [exclude | include]=object_name:조건 형식으로 사용하실 수 있습니다.

 

     ③ QUERY : 테이블 내에 있는 데이터 중 특정 조건에 만족하는 데이터 만을 Export 받

        고자 할때 사용 하는 파라메타 입니다. 사용방법은 다음과 같습니다.

        QUERY=SCHEMA.TABLE: "조건" 이며 다음과 같은 예들을 볼 수 있습니다.

        - QUERY=SCOTT.EMP: "where SAL > 1200 '

        SCOTT유저의 EMP 테이블을 Export 하되 SAL 컬럼의 값이 1200 보다 큰 값들만 Export

        한다는 뜻입니다.

     ④ SAMPLE : 오라클 10g 에서 새롭게 지원하는 기능중 하나로써 테이블의 데이터를

        Export 할때 퍼센트를 정하여 지정된 퍼센트 만큼의 데이터를 샘플링 해서 뽑을

        때 사용 하는 옵션입니다. 사용방법은 아래와 같습니다.

        

 

$ expdp dangtong/edu2020 DIRECTORY=datapump_dir1 DUMPFILE=datapump.dmp

  SAMPLE=scott.emp:20

     

          SCOTT 유저의 EMP 테이블의 데이터 중 20%만을 Export 하게 됩니다.

        - 입력 가능한 PERCENT 의 범위는 0.000001 ~ 100 까지 입니다.

 

    4) 네트웍링크 파라메타

    원격지 데이터 베이스에 있는 데이터에 접근하여 로컬 데이터베이스 머신에 Export

    된 덤프 파일을 저장하고자 한다면 NETWORK_LINK 파라메타를 사용함으로써 가능합니다.

    원격지 데이터는 DB_LINK를 통해 가져올 수 있으며 NETWORK_LINK 파라메타 를 사용하기

    위해서는 원격지 데이터베이스의 테이블에 대한 DB_LIBK 를 만들어 놓아야 합니다.

    A 데이터베이스에 B 테이터베이스의 EMP 테이블을 소유한 SCOTT_B 유저에 대한

    DB LINK link_b_scott_b 이 존재 한다면 다음과 같이 NETWORK_LINK 파라메타를 사용

    하여 export 할 수 있습니다.

    

 

$ expdp dangtong/edu2006 DIRECTORY=datapump_dir1 dumpfile=datapump.dmp

  NETWORK_LINK=EMP@link_b_scott LOGFILE=datapump.log

    5) 암호화 관련 파라메타

    Export 되는 데이터중 일부 컬럼이 암호화 되어 있거나, 중요한 데이터 라면

    ENCRYPTION_PASSWORD 파라메타를 이용하여 Export 시에 암호를 설정 하여 Export

    된 데이터가 위 변조 되지 못하게 설정할 수 있습니다. 사용 방법은 아래와 같습니다.

    

 

$expdp dangtong/edu2006 TABLES=EMP DUMPFILE=datapump.dmp

 ENCRYPTION_PASSWORD=abcdef

    

    위와 같이 설정 하게 되면 차후 Import 시에 패스워드를 물어 보게 됩니다.

     

    6) JOB 관련 파라메타

    JOB 관련 파라메타 에는 JOB,STATUS 가 있습니다.

     JOB : JOB 파라메타를 설정하면 Data Pump 의 작업 명을 오라클에서 자동할당 하지

       않고 JOB 파라메타에 주어진 이름으로 등록 하게 되게 됩니다. 작업 마스터 테이블에

       작업명이 등록괴어 작업에 대한 정보들을 JOB 파라메타에 등록된 이름으로 조회할 수

       있습니다.

     STATUS :STATUS 파라메타는 Data Pump Export 작업시에 작업의 갱신된 내용을 STATUS

       에 설정된 크기의 시간 간격으로 진행상태를 보고 받고자 할때 사용하는 파라메타 입

       니다. STATUS=30 이면 30초 간격으로 작업결과를 갱신하여 보여 주게 됩니다. 만약 이

       파라메타를 설정하지 않으면 디펄트는 0입니다. 디펄트로 설정하게 되면 거의 실시간

       으로 작업 정보를 보여 주게 됩니다.

     FLASHBACK_SCN :System Change Number(SCN)는 시스템의 테이블이나 오브젝트가 변경

    되었을 때  변경 되는 SCN값을 가집니다. FLASHBACK_SCN 파라메타를 이용하여 SCN 값을

    지정할 경우에 파라메타에 설정된 SCN  기준 이전까지의 상태를 받게 됩니다.

    

 

$expdp dangtong/edu2006 dircetory=datapump_dir1 dumpfile=datapump.dmp

 FLASHBACK_SCN=120001

 

     FLASHBACK_TIME : FLASHBACK_TIME은 번호 대신에 시간 값을 가집니다. FLASH_BACK

    파라메타를 사용하면 파라메타에 지정된 시간까지 의 변경사항만을 Export 하게 됩니다.

    FLASHBACK_TIME 의 값은 TIMESTAMP 형식의 값을 가지며 TO_TIMESTAMP 함수를 사용하여

    설정할 수 있습니다.

     PARALLEL : PARALLEL 파라메타를 사용할 경우 Export 작업시에 프로세스를 필요한

    숫자 만큼 만들어 수행 함으로써 작업의 속도를 향상 시킬 수 있습니다. 디펄트 값은

    1로 설정되어 있으며, 주의할 점은 PARALLEL 에 지정된 갯수 만큼의 dumpfile 을 지정

    해주어야 합니다. 앞서 배운 %U 를 사용 하면 지정된 PARALLEL 갯수 만큼 자동으로 파일

    을 만들게 됩니다.

    

 

$expdp dangtong/edu2006 direcotry=datapump_dir1 dumpfile=datapump%U.dmp

 PARALLEL=3

    위와 같이 설정하게 되면 datapump01.dmp, datapump02.dmp, datapump03.dmp 3개의 덤프

    파일이 생성 됩니다.

    

 

$expdp dangtong/edu2006 direcotry=datapump_dir1 dumpfile=(datapump1.dmp,

 datapump2.dmp, datapump3.dmp) PARALLEL=3

 

    위와 같이 %U를 사용하지 않고 사용자가 직접 3개의 파일명을 ',' 로 구분하여 입력해도

    무방 합니다.

     ATTACH : ATTACH 파라메타 를 이용하여 Interactive Mode 로 들어 갈수 있습니다.

     오라클에서는 작업을 제어하고 모니터링 하기 위해 Interactive Mode 를 제공합니다.

     Interactive mode 로 들어가는 방법은 2가지가 있으며 다음과 같습니다.

      - Crtl + C 를 입력 함으로써 들어 갈 수 있습니다.

        $expdp dangtong/edu2006 directory=datapump_dir1                

         table=scott.emp dumpfile=datapump.dmp

         LOGFILE=datapump.log JOBNAME=MYJOB

        작업로그.........

        ................. -> 작업에 대한 로그가 떨어질때 Crtl + C 를 누르게 되면

        export> _         -> 와 같이 프롬프트 상태로 진입하게 됩니다.

        로그가 멈춘다고 해서 작업이 중단 된게 아니라 여러분 께서는 이상태에서 Inter

         active mode 명령을 사용하여 작업을 모티너링 하고 작업을 제어 할수 있습니다.

 

      - $expdp username/password ATTACH=SCHEMA.JOB_NAME 형식 으로 원하는 작업의 

        Interactive mode 로 들어 갈수 있습니다.

        

 

 $expdb dangtong/edu2006 ATTACH=scott.MYJOB

        하게 되면 조금 전에 실행한 작업의 Interactive mode 로 들어 가게 됩니다.

        이처럼 ATTACH 파라메타는 현재 수행 중신 작업의 Interactive mode 로 진입 하는데

        사용 되어 지며 InterActive Mode 명령에는 다음과 같은 것들이 있습니다.

        

명령어

설명

ADD_FILE

 덤프파일 을 추가 할 때 사용합니다.

CONTINUE_CLIENT

 Interactive Mode 에서 Logging Mode 로 전환 할 때 사용합니다.

EXIT_CLIENT

 Client Session 을 종료하고 Job 의 상태에서 벗어납니다.

HELP

 Interactive mode 도움말페이지

KILL_JOB

 작업을 삭제합니다.

PARALLEL

 현재 수행중인 작업의 프로세스 개수를 조정할때 사용합니다.

START_JOB

 실패한 작업이나 중단된 작업을 다시 시작시킬 때 사용합니다.

STATUS

 현재 작업상태를 모니터링 할 때의 갱신 시간을 설정합니다.

STOP_JOB

 작업의 실행을 중단하고 Client 를 종료합니다.

반응형
Posted by [PineTree]
ORACLE/Migration2008. 11. 7. 14:59
반응형

Dangtong 의 오라클 <Data Pump Export / Import 1편>

 

우리가 데이터 베이스 내에 있는 정보들을 운영체제 파일 시스템으로 옮기거나 혹은 그 반대

의 경우를 위해 사용해 오던 것이  export/import 였다면 ,오라클 Data Pump 는 우리가 사용

 오던 export/import 의 기능에 다양하고 강력한 기능들을 추가 한 것입니다.  

오라클 10g 에서는 export/import와 Data Pump export/import 두 가지 기능을 모두를 지원

하고 있지만, Data Pump import/export 를 알고난 후 에는 더 이상 기존에

사용해오던 export/import 를 사용하실 필요성을 느끼지 못하게 되실 겁니다.  왜냐구요?

그만큼 강력한 기능을 제공한답니다.  자 그럼 Data Pump 의 세계로 들어가 볼까요?

※잠깐만~~!!

Export/Import와 Data pump는 서로 호환되지 않습니다. 즉 Export유틸리티를 이용하여 백업 받은 파일을 Data pump 를 이용하여 Import할 수 없으며, 마찬가지로 Data Pump 를 통해 Export 된 데이터는 Export/Import 유틸리티를 통해 Import할 수 없습니다.

 

1. Data Pump export/import 의 잇점

   Data Pump export/import 를 사용함으로서 얻을 수 있는 잇점은 다음과 같습니다.  

    1) JOB 콘트롤 가능

    Interactive mode 를 통하여 Data Pump 작업을 통제 할 수 있습니다. 작업을 중단시키고

    재시작 할 수 있으며 동적으로 dump file 을 할당 할 수 있습니다. 에러가 나더라도 작업

    이 중지 될 뿐 언제든지 원인을 수정하고 재수행 할 수 있습니다.

    2) 병렬수행지원

    PARALLEL 파라메타 를 이용하여 프로세스의 Data Pump 작업의 프로세스를 병렬화 할수

    있습니다. 병렬화 된 프로세스는 여러게의 데이타 파일에 각각 데이터를 쓰거나 여러

    개의 데이터 파일로 부터 데이터를 읽어 데이터베이스에 저장합니다. 병렬 수행이 가능

    함으로써 이전 보다 훨씬 강력한 수행 속도를 보장합니다.

    3) 작업에 필요한 디스크공간을 미리 예상

    ESTIMATE 파라메타를 이용하여 작업 시작 전에 필요한 물리적인 디스크 공간을 예상 할

    수 있습니다.

    4) 원격지 수행

    DB LINK를 통하여 원격지 데이터에 대한 Data Pump Import/Export 를 수행 할 수 있습

    니다.

    5) Remapping 지원

    유저 스키마, 테이블 스페이스, 데이터파일 등과 같은 정보들의 Data Pump Import/

    Export 시에 변경 할 수 있습니다. 이러한 기능은 데이터 마이그레이션 시에 보다 많

    은 유연성을 제공하는데 큰 역할을 합니다.

2. Data Access Methods

    1) Direct-path

    메모리를 거의 사용하지 않고 파일에 direct 로 쓰게 되는 방법입니다. 메모리

    사용이 적고 속도가 빠르며, 데이터 컨버전에 시간이 걸리지 않습니다.

    2) External tables

    메타 데이터를 데이터베이스에 저장하고 데이터 는 파일시스템에 존재하게 함으로써

    대용량 데이터를 Export/Import 할 때 사용합니다.

    이두가지 모드는 오라클이 자동으로 판단하여 수행하게 됩니다.

※잠깐만~~!!!

Direct-path 가 되지 않는 경우

. 클러스터 테이블인 경우

. 테이블에 활성화된 트리거가 존재 할 경우

. 글로벌 인덱스를 가진 테이블이 하나의 파티션에 존재 할 경우

. LOB 칼럼 에 있는 도메인 인덱스

. insert 모드에서 fine-grained access control 이 enable 인 경우

. BFILE 을 가진 테이블 인 경우

 

External Table이란?

. Create TABLE ~~ ORGANIZATION EXTERNAL 문을 통해 만들어진 테이블입니다.

. 실질적인 데이터는 데이터 베이스 내에 존재하는 것이 아니라 물리적 디스크에 논리

  적 공간을 할당 받아 데이터를 저장하며, 파일형태로 존재합니다.

. 저장되는 데이터는 READ ONLY 데이터 이며 인덱스를 생성할 수 없습니다.

. DML 작업을 수행할 수 없습니다.

. MEAT-DATA in DATABASE, DATA in OS 라고 압축 설명 할 수 있습니다.

 

3. Data Pump의 권한 설정

    좀더 다양한 옵션과 Data Pump 의 모든 기능을 자유자재로 사용하고

    자 한다면, 시스템에 설정된 EXP_FULL_DATABASE, IMP_FULL_DATABASE 롤을 부여 함으로써

    가능합니다. 일단 다음과 같이 유저를 생성하고 두 권한 모두를 생성된 사용자에 게 주는

    실습을 해 보도록 합시다.

    1) 사용자 생성

       create user dangtong identified by imsi00

       default tablespace USERS

       temporary tablespace temp;

    2) 권한부여

       grant connect, resource to dangtong;

    3) 모든 테이블에 대한 select 권한 부여

       grant select any table to dangtong;

    4) EXP_FULL_DATABASE,IMP_FULL_DATABASE 권한 부여

       grant EXP_FULL_DATABASE, IMP_FULL_DATABASE to ecampus;

       

    이렇게 함으로써 모든 데이터 베이스 오브젝트에 대한 Data Pump 권한을 획득

    하였습니다. 그럼 이제 실제적으로 Data Pump 를 이용하여 Export/Import 를 실습해 보실

    모든 준비가 되었습니다.   

 

    4. Data Pump 파일 오브젝트

    1) Data Pump 가 사용하는 파일의 종류

       ⓛ Dump File : 테이블로부터 데이터 또는 메타 데이터를 로드하여 저장된 파일

       ② Log File  : Data Pump 작업 중에 발생 하는 메세지나 결과를 기록하는 파일

       ③ SQL File  : Data Pump 는SQLFILE 이라는 옵션을 사용합니다. 이옵션을 사용할 경

                       우 Data Pump Import 작업이 수행되는 동안 DDL 문을 수행할 수 있게

     해주는 옵션입니다.(자세한 사항은 이후에 다룸)

 

    2) Data Pump 디렉토리 오브젝트

      

 

       Data Pump 는 디렉토리 오브젝트를 참조하여 Dump 파일을 쓰게 됩니다.

       그림과 같이 사용자 A는 DO1,DO2 에 허가(GRANT)되어 실재 존재하는 Dir1 과

       Dir2를 사용할 수 있게 됩니다. Data Pump 가 Export 받은 데이터를 Dir1, Dir2 모두

       에 저장할 수 있다. 반면, 사용자 B는 DO1에 만 (Grant) 되어 Dir1 에만 접근할 수 있

       습니다. 이처럼 Data Pump를 이용하게 되면 디렉토리에 대한 권한까지 설정할 수 있

  습니다.

  

       ⓛ 사용 중인 디렉토리 오브젝트의 조회

          SELECT * FROM dba_directories;   

       ② 디렉토리 오브젝트 추가

          CREATE DIRECTORY datapump_dir1 as '/temporary/ora_tmp';  

          '/temporary/ora_tmp' 에 대한 디렉토리 오브젝트 datapump_dir1 을 생성하는

          명령문 입니다.

       ③ 디렉토리 오브젝트에 대한 권한 설정

          GRANT READ,WRITE ON DIRECTORY datapump_dir1 to dangtong;

          ecampus 유저에 대해 datapump_dir1 에 대한 쓰기 및 읽기 권한을 할당하는 명령문 입니다.

          이제 Data pump 를 통해 Export 받을 때 ecampus 유저는 다음과 같이 지정함으로서 '/temporary/ora_tmp'

          에 Export된 덤프 파일을 저장할 수 있습니다.

 expdp dangtong/imsi00 DIRECTORY=datapump_dir1 Tables=EMP dumpfile=dangtong_dump1.dmp

         

       ④ 디펄트 디렉토리 설정하기

          Data Pump 를 사용할 때마다 디렉토리지정을 하지 않고 묵시적으로 사용하고 싶다

          면 운영체제 환경변수에 DATA_DUMP_DIR 을 만들고 그 값으로 디렉토리 오브젝트명

          을 입력 하면 됩니다.

          $ export DATA_DUMP_DIR datapump_dir1

          위와 같이 선언하게 되면 이제 다음과 같이 디렉토리를 지정하지 않아도 됩니다.

          $ expdp ecampus/password  dumpfile=ecam_dump01.dmp Tables= test_00

반응형
Posted by [PineTree]