유닉스에서 시스템 상태를 간략하게 볼 수 있는 대표적인 프로그램인 TOP에 대한 설명이다.

1. 설치

http://sourceforge.net/projects/unixtop/ 에서 top-3.7.tar.gz 을 받는다.
root@wl ~ # tar xvfz top-3.7.tar.gz
root@wl ~ # cd top-3.7
root@wl ~/top-3.7 # ./configure
메시지 생략
config.status: creating top.1
config.status: creating config.h
root@wl ~/top-3.7 # make
메시지 생략
cc -DHAVE_CONFIG_H -I. -I. -g -v -o top color.o commands.o display.o hash.o s
creen.o top.o username.o utils.o version.o m_sunos5.o -lm -ltermcap -lkvm -lkst
at -lelf
root@wl ~/top-3.7 # make install
메시지 생략
./install-sh -c -m 755 \
top /usr/local/bin/top
root@wl ~/top-3.7 #

2. 화면 설명

root@wl ~ # top
last pid:1) 14149; load avg:2) 0.03, 0.06, 0.08;; up 46+07:54:14 15:57:473)
56 processes: 55 sleeping, 1 on cpu4)
CPU states: 97.6% idle, 1.4% user, 1.0% kernel, 0.0% iowait, 0.0% swap5)
Kernel: 224 ctxsw, 7 trap, 232 intr, 230 syscall, 7 flt8)
Memory: 2048M phys mem, 1873M free mem, 2048M swap, 2048M free swap6)
This terminal can only display 18 processes9)
PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND7)
14133 nobody 27 59 0 97M 14M sleep 0:00 0.80% httpd
13541 mysql 13 59 0 341M 52M sleep 3:30 0.73% mysqld
14137 root 1 59 0 5660K 2324K sleep 0:00 0.59% sshd
14149 windy 1 59 0 2644K 1456K cpu 0:00 0.37% top
14139 windy 1 59 0 2612K 1668K sleep 0:00 0.03% bash
450 root 7 59 0 3012K 2388K sleep 0:00 0.03% mibiisa
14134 root 1 59 0 4440K 2080K sleep 0:00 0.02% sendmail
13560 root 1 59 0 1204K 872K sleep 0:08 0.01% cronolog
13555 root 1 59 0 89M 8916K sleep 0:00 0.00% httpd
237 root 1 59 0 3448K 1416K sleep 0:01 0.00% in.named
14136 nobody 27 59 0 89M 2536K sleep 0:00 0.00% httpd
13701 root 1 59 0 5660K 2324K sleep 0:00 0.00% sshd
456 root 2 59 0 3612K 2200K sleep 0:00 0.00% snmpXdmid
461 root 2 59 0 3920K 2112K sleep 0:00 0.00% vold
257 root 18 59 0 3096K 2028K sleep 0:00 0.00% nscd
1)마지막으로 할당된 PID. 따라서 PID에서 가장 큰 값을 의미하지는 않는다. 단지 얼마나 빨리 프로세스가 생성되는지 대략적인 가늠만 할 수 있을 뿐이다. (PID는 순차적으로 할당되지 않는다) root권한으로 top을 실행해야 표시된다.
2)로드 평균. 로드란 시스템 스케줄러의 런 큐에 대기하고 있는 쓰레드의 개수로, 일반적으로 시스템의 부하는 로드값이 높은 것을 의미한다. (항상 그런것은 아니다) 왼쪽부터 차례대로, 1분, 5분, 15분간 평균 로드값을 나타낸다.
3)시스템 가동시간및 현재 시간
4)모든 프로세스 상태 개요. 총 개수와 각각의 상태를 가리킨다.
- On cpu:현재 CPU에 의해 실행되고 있는 프로세스 개수
- Running: 실행할 수 있는 프로세스 개수. On CPU와 Running인 프로세스가 많다는 것은 시스템에 부하가 많다는 뜻이다.
- Sleeping: 외부 이벤트/입력을 기다리고 있는 프로세스 개수
- Stopped: Ctrl+Z와 같은, 정지 시그널로 정지된 프로세스 개수
- Swapped: 디스크로 스왑되고 있는 프로세스 개수. 0이어야 한다.
- Zombie: 종료되었지만, 다른 이유로 정리되지 않고 기다리고 있는 프로세스 개수. 작은값 또는 0이어야 한다.
5)CPU 상태.
- Idle: 아무것도 하고 있지 않음
- User: 유저 프로세스 실행중
- Kernel: 커널 시스템 콜, 페이지 폴트, 인터럽트 수행중
- IOwait: I/O 를 위해 기다리는 중
- Swap: 스와핑 또는 페이징하는중
6)메모리 상태
- phys mem: 프로세스가 사용할 수 있는 물리 메모리 양.(커널에 의해 예약된 영역 제외)
- free mem: 남은 메모리 양.
- total swap: 사용된 스왑 메모리 양.
- free swap: 남은 스왑 메모리 양.
7)프로세스 상태
- PID: 프로세스 아이디
- USERNAME: 프로세스 소유자 이름
- LWP/THR: LWP또는 쓰레드 개수 (Light-Weight Process, SUN은 쓰레드와 LWP는 다르다!고 하지만 유닉스 쓰레드가 LWP를 이용해 구현되기 때문에 비슷한 개념인건 맞다) 개수. 모든 프로세스는 1개 이상의 쓰레드를 가진다.
- PRI: 우선순위. 유저프로세스의 경우 범위는 0~59이다. 사용자가 주는 데이터를 바탕으로 커널에 의해 자동으로 결정된다. 값이 높을 수록 우선순위가 높다. 이 값에 신경쓸필요는 없다. 솔라리스 커널은 똑똑하니 말이다.
- NICE: 우선순위를 결정하기 위해 커널에서 참고하는 값. 나이스 값이다. 사용자가 설정할 수 있으며 설정하지 않으면 0이다. 이 값이 낮다면 우선순위가 높게 책정될지도 모른다. (이렇게 모호하게 서술한 이유가, 솔라리스 커널에서 우선순위는 NICE값을 고려해 커널 맘대로 설정하기 때문이다) 솔라리스에서는 -20~20까지 설정할 수 있다.
- SIZE: 프로세스에 할당된 총 메모리의 양이다. 물리메모리 + 가상 메모리 + ... 의 값이다.
- RES: 프로세스에 의해 사용된 물리 메모리의 양이다. RES는 RESident set size의 약어이다.
- STATE: 프로세스 상태. CPU, RUN, SLEEP, STOP, SWAP, ZOMB가 있다. 자세한 내용은 [4) 프로세스 상태]를 참고하자.
- TIME: 프로세스가 사용한 CPU시간이다. 1:00 이라 되어있으면 해당 프로세스는 1분동안 CPU를 100% 소모한것과 같다. 1000분이 넘으면 H(시간)으로 단위가 바뀐다. [127.4H]라면 127시간 + 0.4시간(24분) 이라는 뜻이다.
- FLTS: TOP이 실행된 이후 생긴 메이저 페이지 폴트 회수. 일반적인 경우 0에 가까워야 한다.
- CPU: 현재 프로세스의 총 CPU 대비 사용률. TOP는 이를 기준으로 프로세스 목록을 정렬한다. 1개의 CPU가 있는 시스템에서 [30%]라 되어있으면 해당 프로세스는 전체의 30%를 사용하고 있는 것이다. 4개의 CPU가 있는 시스템에서 [25%]라 나왔다면, 해당 프로세스는 CPU 1개를 100% 소비하고 있다고 해석된다.
- COMMAND: 프로세스를 실행한 커맨드.
8)커널 개요 (단위: 초, TOP 3.7이상)
- ctxsw: 컨텍스트 스위치
- trap: 트랩 회수
- intr: 인터럽트
- syscall: 시스템콜
- fork: fork, vfork 회수
- flt: 페이지 폴트
- pgin: 페이지인
- pgout: 페이지아웃
9)터미널 라인 표시. 실행시 [이 터미널은 18개의 프로세스만을 표시할 수 있습니다]라고 안내해준다.

3. 사용

  • 실행옵션
    • -C, --color: 컬러 사용 안함
    • -I, --idle-procs: 유휴 프로세스 표시 안함(기본값은 표시)
    • -S, --system-procs: 시스템 프로세스(페이징데몬, 스와핑 데몬등등) 보임(기본값은 표시 안함)
    • -T, --tag-names: 사용 가능한 컬러 태그 목록 보임
    • -a, --all: 모든 포로세스를 보임("-d all all" 과 동일)
    • -b, -n, --batch: 배치모드. 표준 출력이 터미널이 아니거나 더미 터미널인 경우 기본값. 터미널로부터의 모든 입력 무시.(인터럽트 캐릭터 예를 들어 Ctrl+C등은 유효함)
    • -c, --full-commands: 프로세스의 커맨드 라인을 모두 보임(모든 플랫폼에서 지원되지는 않음. 솔라리스에서는 지원됨)
    • -i, --interactive: 인터랙티브 모드 사용. 표준 출력이 터미널인 경우 기본값.
    • -q, --quick: top을 -20으로 renice 한 후 실행. 루트로만 가능.
    • -u, --uids: UID를 사용자이름으로 변경하지 않음.
    • -v, --version: 버전 출력
    • -d count, --displays count: 지정한 회수만큼 출력하고 종료. 터미널에서의 기본값은 'infinity'. 수치 외에 'infinity', 'maximum', 'all' 을 사용할 수 있다.
    • -s time, --delay=time: 갱신 지연 시간(초). 기본값은 5.
    • -o field, --sort-order=field: 정렬 순서. 컬럼명(7))을 소문자로 써주면 된다. (예: cpu, size, res, time)
    • -U username, --user=username: 해당 사용자의 프로세스만 보임
  • 대화형 명령
    • h, ?: 도움말, 버전정보
    • C: 컬러 사용 여부
    • c: 지정한 문자열을 포함하는 커맨드를 가진 프로세스만 표시. 빈 문자열의 경우 모든 프로세스를 표시. (모든 플랫폼에서 지원되지는 않음. 솔라리스에서는 지원됨)
    • d: 지정된 회수만큼 프로세스를 보임. 1이면 한번 보여주고 바로 종료됨. 기본값은 무한대.
    • f: 풀 커맨드 라인을 보일것인지 여부
    • H: 쓰레드를 각각의 라인마다 보여줌. (모든 플랫폼에서 지원되지는 않음. 솔라리스에서도 지원안됨. [prstat -L]사용할것)
    • i, I: 유휴 프로세스를 보일 것인지 여부
    • k: 시그널 전송. k를 누른 후 kill 명령 뒤의 내용을 써준다
    • M: 메모리 사용량을 기준으로 정렬. [o size] 대화형 명령의 약어임
    • m: 또다른 디스플레이 모드를 사용함. (모든 플랫폼에서 지원되지는 않음. 솔라리스에서도 지원안됨)
    • N: PID 기준으로 정렬. [o pid] 대화형 명령의 약어임
    • n, #: 표시할 프로세스의 개수를 지정. n을 누른 후 숫자를 입력한 다음 엔터를 입력한다.
    • o: 정렬 순서를 변경. (모든 플랫폼에서 지원되지는 않음. 솔라리스에서는 지원됨) top 실행시 보이는 컬럼명을 소문자로 입력하고 엔터를 입력한다. 컬럼의 종류는 플랫폼마다 다르지만 cpu, res, size, time 은 보통 존재할것이다. 기본값은 cpu.
    • P: CPU사용량을 기준으로 정렬 [o cpu] 대화형 명령의 약어임
    • q: top 종료
    • r: 프로세스 우선순위를 결정. r을 누른 후 renice 명령 뒤의 내용을 써준다.
    • s: 표시할 시간의 지연시간을 결정. 숫자를 입력한다
    • T: CPU 사용시간을 기준으로 정렬. [o time] 대화형 명령의 약어임
    • U: 사용자명, UID 중 어느것으로 표시할 것인지 여부
    • u: 지정한 사용자가 소유한 프로세스만 표시. [+]인 경우 모든 사용자가 표시됨
  • 컬러 사용
    • 컬러는 환경변수인 TOPCOLORS 에 내용을 세팅하면 top을 실행할때 표시된다.
    • 환경변수의 내용은 "컬럼코드=[최소],[최대]#색상번호[;색상번호...][:컬럼코드=[최소],[최대]#색상번호[;색상번호...] ...]"의 형식이다.
    • 컬럼코드는 [top -T]명령을 통해 알아낼 수 있으며, 색상번호는 ANSI코드와 같다. 이는 color.h에 나와있으며 다음과 같다.
      속성                   글자 색상 번호               배경 색상 번호          
      0 초기화 30 검은색 40 검은색
      1 밝게 31 붉은색 41 붉은색
      2 흐릿하게 32 녹색 42 녹색
      4 아랫줄 33 노란색 43 노란색
      5 깜빡임 34 파란색 44 파란색
      7 반전 35 붉은자주색(Magenta) 45 붉은자주색(Magenta)
      8 숨김 36 맑은파란색(Cyan) 46 맑은파란색(Cyan)
      37 흰색 47 흰색
    • 최소, 최대값중 로드 평균을 나타내는 값은 원래 값에 100을 곱한 값을 넣어야 한다. (소숫점 2째자리까지 표현하기 위함이다)
    • 예) 1min=500,1000#31 → 1분단위 로드에서 5.00이상 10.00이하면 붉은색으로 표시
    • 예) TOPCOLORS="1min=100,300#32:1min=300,500#33:1min=500,#31:5min=100,300#32:5min=300,500#33:5min=500,#31:15min=100,300#32:15min=300,500#33:15min=500,#31:header=,#36:memory.physmem=,100#31;1" TOP COLORS

4. 팁

- TOP을 과신하지 않는다. 편하게 실행할 수 있긴 하지만, 역시 *stat 커맨드보다는 얻을 수 있는 정보가 많지 않다.
- NICE와 PRI에 대한 설명이 복잡하게 느껴질지도 모르겠다. 한마디로 우선순위는 사용자가 임의로 정해줄 수 없다는 것이다. 그나마 다행인건 솔라리스 커널이 꽤 똑똑하게 PRI값을 정해준다는 사실이다. nice, renice, priocntl(솔라리스 8 이상) 커맨드를 참고하자.

'Database > Server' 카테고리의 다른 글

특정단어 패턴으로 검색하기  (0) 2010.03.29
ls 했을때 디렉토리 색깔 나오게 하기  (0) 2010.03.29
해킹 피해시스템 분석절차  (0) 2009.09.28
[Unix]sendmail 테스트  (0) 2009.09.09
[Linux] Find … 명령어 활용  (0) 2009.07.23
insert /*+ APPEND PARALLEL(ems_test_temp 4)/ into ems_test_temp nologging
select /*+ PARALLEL(ems_test 4) */ * from ems_test;

or alter 명령어를 통해서 테이블 자체를 nologging로 바꾸고..
insert  작업이 끝나면 다시  logging 모드로 변경합니다..

alter session set optimizer_goal=all_rows;
alter session set sort_area_size=52428800;   <-- OS 환경에 따라 조절
alter session set hash_area_size=524288000;  <-- OS 환경에 따라 조절
alter session set db_file_multiblock_read_count = 128;  <-- OS 환경에 따라 조절
alter session enable parallel DDL;
alter session enable parallel DML

append 를 사용했을 때의 여파를 생각하고 하셔야 합니다.append 는 HWM (High Water Mark) 를 직접 찾아서 그 지점부터 insert 해주기 때문에 성능에 효과를 볼수 있지만 테이블 자체에 delete 작업이 자주 일어 나는 경우 공간 낭비가 일어 날수 있습니다.  

그리고 parallel의 경우... 지금 정확히 기억이 나지 않는데. update일 경우에는 테이블 단위 lock이 발생 할겁니다..
--------------------------------------------------------------------------------------------------------/*+ 이부분은 대용량 만질때 그냥 상투적으로 적어 주신다고 보시면 됩니다. */
alter session set optimizer_goal=all_rows;
alter session set sort_area_size=52428800;
alter session set hash_area_size=524288000;
alter session set db_file_multiblock_read_count = 128;
alter session enable parallel DDL;
alter session enable parallel DML; 

truncate table table_name;
drop index table_name_index; 

alter table table_name nologging; 

insert /*+ append parallel(table_name 8) */ into table_name
select /*+ parallel(table_name1 8) full(table_name1) */ * from table_name; 

create index table_name_index
TABLESPACE tablespace_name

NOLOGGING
PARALLEL 12; 

ALTER TABLE table_name LOGGING ;
ALTER INDEX  table_name_index NOPARALLEL NOLOGGING;
----------------------------------------------------------------------------------------------------
tp://download-west.oracle.com/docs/cd/B10501_01/server.920/a90842/apb.htm

'Database > Oracle' 카테고리의 다른 글

드라이빙 테이블이란?  (0) 2010.03.30
hint 종류  (0) 2010.03.30
Oracle Function Reference  (0) 2009.12.30
환경알기  (0) 2009.12.30
to_char format  (0) 2009.12.30
Oracle - MS SQL - DB2 UDB 의 서로 다른 날짜 형식을 맞추기위한 SQL문

--------------------------------------------------------------------------------
DBMS 별 시간, 날짜 조회 쿼리
--------------------------------------------------------------------------------
1. Oracle
- 날짜+시분초 까지 조회가능
select sysdate from dual;

- 날짜+밀리초+시간존 까지 조회
select current_timestamp from dual;

2. MS SQL
- 날짜 + 밀리초 단위까지 조회가능
select getdate();



3. DB2 UDB
- 날짜+밀리초까지 조회 가능
select current timestamp from sysibm.sysdummy1;
- 날짜만 조회
select current date from sysibm.sysdummy1;
- 밀리초 단위의 시간만 조회
select current time from sysibm.sysdummy1;

--------------------------------------------------------------------------------
DBMS 별 default date format
--------------------------------------------------------------------------------
1. Oracle
한글 : YYYY/MM/DD                       영어 : DD-MON-YYYY



2. MS SQL
한글 :  YYYY/MM/DD HH:MI:SS      영어 : MM-DD-YYYY HH:MI:SS



3. DB2 UDB
TIMESTAMP 타입 : YYYY-MM-DD-HH:MI:SS.MMMMMM
DATE 타입 : YYYY-MM-DD

TIME 타입 : HH:MI:SS.MMMMMM


--------------------------------------------------------------------------------
날짜 포맷 변환
--------------------------------------------------------------------------------
[ 형식 : 'YYYY.MM.DD' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY.MM.DD')
2. MSSQL : CONVERT(VARCHAR, date_exp, 102)
3. DB2 : REPLACE(CHAR(DATE(date_exp),ISO), '-', '.')

[ 형식 : 'HH:MI:SS' ]
1. Oracle : TO_CHAR(date_exp, 'HH:MI:SS')
2. MSSQL : CONVERT(VARCHAR, date_exp, 108)
3. DB2 : CHAR(TIME(date_exp) , JIS )



[ 형식 : 'YYYY/MM/DD' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY/MM/DD')
2. MSSQL : CONVERT(VARCHAR, date_exp, 111)
3. DB2 : REPLACE(CHAR(DATE(date_exp), ISO), '-', '/')

[ 형식 : 'YYYYMMDD' ]
1. Oracle : TO_CHAR(date_exp, 'YYYYMMDD')
2. MSSQL : CONVERT(VARCHAR, date_exp, 112)
3. DB2 : CHAR(DATE(date_exp))

[ 형식 : 'HH24:MI:SS' ]
1. Oracle : TO_CHAR(date_exp, 'HH24:MI:SS')
2. MSSQL : CONVERT(VARCHAR(8), date_exp, 114)
3. DB2 : CHAR(TIME(date_exp))

[ 형식 : 'YYYY.MM.DD HH24:MI' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY.MM.DD HH24:MI')
2. MSSQL : CONVERT(VARCHAR, date_exp, 102) + ' ' + CONVERT(VARCHAR(5), date_exp, 114)
3. DB2 : REPLACE(CHAR(DATE(date_exp), ISO), '-', '.') || CAST( TIME(date_exp) AS CHAR(5))

[ 형식 : 'YYYY/MM/DD HH24:MI:SS' ]
1. Oracle : TO_CHAR(date_exp, 'YYYY/MM/DD HH24:MI:SS')
2. MSSQL : CONVERT(VARCHAR, date_exp, 111) + ' ' + CONVERT(VARCHAR(8), date_exp, 114)
3. DB2 : REPLACE(CHAR(DATE(date_exp), ISO), '-', '/') || CAST( TIME(date_exp))

- http://www.dbguide.net/ 발취

'Database' 카테고리의 다른 글

오픈소스 DBMS 라이센스의 이해  (0) 2009.12.30
DBMS별 날짜 포멧  (0) 2009.12.30
지금 우리에게 필요한 건 정렬의 제거이다  (0) 2009.12.04

아쉽게도 필자는 프로젝트를 수행하면서 그리고 많은 사이트를 지원하면서 기술을 리드(Lead)하는 전문 DBA의 부재를 절실하게 느꼈었다. 따라서 이 글에서는 많은 사람들이 해보고 싶어 하는 전문 DBA가 무엇인지 그리고 전문 DBA가 수행해야 할 일에는 어떤 것들이 있는지를 함께 이야기해 보자. 

전문 DBA는 반드시 필요하지만 현실은 전문 DBA를 육성하지 않고 있다. 그러다 보니 많은 프로젝트에서 어려움을 경험하게 되고 이제는 많은 곳에서 DBA의 필요성이 부각되고 있는 것 또한 현실이다. 그렇다면 전문 DBA는 무엇을 수행하는 업무인가? 

- 데이터베이스 엔진 관리
- 데이터베이스 모니터링
- 오브젝트 관리
- 데이터베이스 백업
- 데이터베이스 복구
- 데이터베이스 엔진 최적화
- SQL Tuning
- 논리적 모델링 관리
- 물리적 모델링 수행
- 데이터 표준화 수행

위와 같은 업무를 수행하는 것이 일반적인 전문 DBA의 역할일 것이다. 이러한 항목은 데이터베이스를 수행하는 사람마다 조금씩은 다르다. 하지만, 항목이 조금 다르더라도 위의 항목들은 전문 DBA로 성장하기 위해 반드시 필요한 항목임에는 틀림없다. DBA를 희망하는 모든 사람들과 회사의 관리자에게 말하고 싶은 게 있다. IT의 기술을 리드하는 DBA는 하루 아침에 만들어지지 않는다. 10년이라는 시간을 두고 계속 노력하지 않는다면 전문 DBA는 만들어질 수 없다. 회사의 관리자라면 이러한 DBA를 육성하기 위해 노력해야 할 것이다. 

데이터베이스 엔진은 내가 책임진다 

데이터베이스 시스템을 구축한다면 가장 기본이 되는 것이 당연히 데이터베이스를 설치하는 작업이다. 데이터베이스의 설치 또한 DBA의 가장 기본적인 업무가 될 것이다. 그렇다면 데이터베이스만을 설치하며 DBA가 해야 할 일은 모두 끝난 것인가? 우리가 PC에 소프트웨어를 설치하면 보통의 경우에는 사용만 할 뿐이지만 데이터베이스 엔진만을 설치하고 관리 없이 사용만 한다면 얼마 지나지 않아 엄청난 재앙이 발생할 것이다. 그렇다면 데이터베이스 엔진 관리를 위해 무엇을 해야 하는지 확인해 보자.

 - 데이터베이스 버그 관리 : 사용 중인 데이터베이스 버전에서 발생하는 버그를 관리해 해당 버그에 대한 해결 방법을 관리한다.
- 데이터베이스 버전 및 패치 관리 : 해당 버전을 통해 원하는 서비스를 수행할 수 있는지 또는 다른 기능을 위해 데이터베이스 버전을 업그레이드해야 하는지를 관리 및 결정한다. 또한, 버전과 다르게 관리되는 버그 및 보안 등의 각종 패치를 관리해 데이터베이스의 안정성을 보장해야 한다.
- 데이터베이스 엔진 백업 : 데이터베이스 엔진은 실제 데이터만큼 자주 백업을 수행할 필요는 없지만 엔진 자체의 문제에 의해 재설치를 수행해야 할 경우를 대비해 엔진 백업 본을 준비해야 한다. 

데이터베이스 엔진과 관련되어 DBA가 수행해야 할 업무는 위와 같다. 위에서 언급한 하나하나의 항목은 어려운 업무는 아니다. 어떻게 보면 단순한 업무 성격을 가진다. 하지만 데이터베이스를 운영함에 있어서 매우 중요한 업무임에는 틀림없다. 

데이터베이스 상태를 점검하라 

DBA는 이와 같은 엔진 관리의 업무뿐만 아니라 데이터베이스의 상태를 점검하는 모니터링의 업무를 가지고 있다. 그렇다면 과연 어떤 항목을 모니터링해야 하는가? 

- 오브젝트의 상태
- 메모리 상태
- 디스크 상태
- 에러 상태

크게 보면 위와 같이 세 가지 항목에 대해 모니터링을 수행해야 할 것이다. 오브젝트의 상태는 인덱스 중 사용하지 못하는 인덱스가 존재하는지 또는 테이블 중 공간을 할당할 수 없는 테이블이 존재하는지 등에 대한 주기적인 모니터링이 필요할 것이다. 메모리 상태는 메모리의 크기가 최적화되어 있는지 부족하지는 않는지에 대한 모니터링이 필요하며 메모리 관련 Waiting 또한 관심 있게 확인해야 할 것이다. 디스크 상태는 디스크 I/O의 상태를 확인하는 부분에 중점을 둬야 할 것이다. 에러 상태는 로그 등을 확인해 에러에 대한 지원을 해야 할 것이다. 이와 같이 데이터베이스의 상태를 항상 모니터링해야 한다. 

다양한 백업 방법을 숙지해라 

데이터베이스 시스템도 다른 시스템 또는 우리가 사용하는 PC와 마찬가지로 언제든지 문제가 발생할 수 있고 그에 따라 해당 시스템에 보관되어 있는 데이터를 분실할 수 있다. 따라서 데이터 또는 데이터베이스에 문제가 발생했을 경우를 대비해 기존에 데이터를 특정한 장소에 복사해 두어야 한다. 특히 데이터베이스 시스템은 기업에서 사용하는 매우 중요한 데이터를 다루므로 데이터를 복사하는 전략과 전술이 요구된다. 데이터베이스에서 사용할 수 있는 백업은 크게 다음의 두 가지로 구분된다. 

 - 물리적 백업(Logical Backup)
- 논리적 백업(Physical Backup)
 이 가운데 물리적 백업은 아래와 같이 두 가지로 구분된다. 

- HOT 백업 : 온라인 중에 데이터베이스의 구성 요소인 컨트롤 파일, 리두로그 파일 및 데이터 파일을 백업으로 지정된 매체로 복사하는 방법
- COLD 백업 : 온라인 상태가 아닌 오프라인 상태에서 구성 요소인 컨트롤 파일, 리두로그 파일 및 데이터 파일을 백업으로 지정된 매체로 복사하는 방법

결국, 두 가지 방법의 차이는 데이터베이스가 사용 중인 온라인에서 백업을 수행하는가 아니면 데이터베이스의 서비스를 정지하고 오프라인에서 백업을 수행하는가의 차이이다. 물론, 이와 같은 차이 외에도 문제가 발생해 복구를 수행할 경우 HOT 백업은 현시점까지 복구가 가능한 아키텍처를 가지고 있지만 COLD 백업은 일반적으로 백업을 수행한 시점까지만 복구가 가능한 방식이다. 이와 같은 복구의 차이는 백업 전략의 엄청난 차이를 발생시키게 된다.

논리적 백업은 보통의 경우 테이블별로 데이터를 백업하는 경우를 의미한다. 따라서 테이블별로 복구를 수행할 수 있으며 백업 본을 이용한 복구 시에는 백업을 수행한 시점까지 복구할 수 있다. 

지금 우리에게 필요한 것은 완벽한 백업 전략

이처럼 DBA 업무에는 백업이라는 중요한 업무가 있으며 백업 업무를 올바르게 수행하기 위해서는 위와 같은 기본 지식을 이해하고 있어야만 완벽한 백업을 수행할 수 있다. 또한, DBA의 중요한 업무는 백업의 전략을 수립하는 것이다. 이와 같은 백업 전략을 수립하기 위해서는 데이터 장애 발생 시 어떤 수준으로 복구를 원하는지를 반드시 고객과 협의해야 할 것이다. 예를 들어, A 테이블이 문제가 발생해 엑세스되지 않을 경우 A 테이블을 복구해야 할지 개발 담당자가 해당 데이터를 가공할 수 있는지 아니면 해당 테이블이 삭제되어도 문제가 없는지 등을 정확히 이해해야 한다. 해당 테이블이 반드시 필요한 테이블이라면 해당 테이블에 대해 논리적 백업을 수행해야 할 것이다. 또한, 논리적 백업은 백업 시점까지만 해당 데이터를 복구할 수 있으므로 이에 대한 고객과의 정확한 협의를 DBA가 주도해야 한다. 

결국, 백업 전략은 DBA가 수립해야 하며 백업 전략을 수립하기 위해서는 고객과 데이터 복구 수준을 정확히 협의해야 한다. 고객의 정확한 요구 사항이 파악되었다면 이에 맞게 물리적 백업과 논리적 백업을 이용한 양방향 백업을 수행한다. 백업 전략 수립 시 또 하나의 고려 사항은 보관 주기이다. 백업 데이터를 얼마동안 보관할지도 백업 전략에 포함되어야 한다. 백업은 DBA의 가장 기본적인 업무 중 하나로, 이는 잘하면 본전이지만 잘못할 경우 큰 문제를 발생시킨다. 이와 같이 가장 기본인 백업 전략을 제대로 수행하지 못한다면 어찌 DBA라고 할 수 있겠는가? 이제부터라도 전문 DBA로 발전하기 위해 기본에 충실해야 할 것이다. 

필자소개
권순용 kwontra@hanmail.net|Data Consulting 업무를 수행하는 ㈜엑시엄의 대표이사이며 DBA로 시작해 SQL 튜닝, 데이터베이스 아키텍처 및 모델링 업무를 주로 수행했다. 데이터베이스 교육에도 많은 관심을 가지고 있으며 저서로는 『Perfect! 오라클 실전 튜닝, 『초보자를 위한 오라클 10g』 및 『INSIDE SQL』이 있다. 또한, 데이터 액세스 최적화에 대한 특허를 출원했다.

출처 : 한국 마이크로 소프트웨어 [2010년 1월호]
제공 : DB포탈사이트 DBguide.net

'Database > DB Tip' 카테고리의 다른 글

몽고 쿼리 응용  (0) 2013.10.08
서브 쿼리 종류  (0) 2010.04.02

+ Recent posts