시작...

블로그 이미지
mutjin

Article Category

분류 전체보기 (148)
기록 (3)
개발새발 (8)
2010년 이전 글 (133)
호주로의 여행.. (41)
VC++ 자료 (12)
C/C++ 자료 (16)
프로그래밍 (43)
computer (12)
기타... (9)

Recent Post

Recent Comment

Recent Trackback

Calendar

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Archive

My Link

  • Total
  • Today
  • Yesterday
  1. 2008.11.04
    한글 putty 0.58 1
  2. 2007.10.30
    TCPDUMP 요약글입니다.
  3. 2007.10.30
    TCPDUMP 사용법
  4. 2007.09.21
    블루스크린 ErrorCode Define 값입니다.
  5. 2007.08.22
    HP-UX 쉘 명령어 총정리
  6. 2007.05.01
    gcc와 make 강좌
  7. 2007.05.01
    vi 사용법의 모든것 !!! [리눅스]
  8. 2007.05.01
    리눅스 명령어 모음 !!!
  9. 2007.05.01
    patch & diff & CVS
  10. 2007.02.03
    DBA라면 이 정도는 알고 있어야 하지 않을까요 !!!
그냥 좀 필요해서... 올려둠


이거만 올리면 되려나 모르겠다 ㅋ

'2010년 이전 글 > computer' 카테고리의 다른 글

TCPDUMP 요약글입니다.  (0) 2007.10.30
TCPDUMP 사용법  (0) 2007.10.30
블루스크린 ErrorCode Define 값입니다.  (0) 2007.09.21
HP-UX 쉘 명령어 총정리  (0) 2007.08.22
gcc와 make 강좌  (0) 2007.05.01
and

1. tcpdump
 

 

 

 

tcpdump는 네트워크 인테페이스 상에 있는 패킷중에서 명시된 expression에 일치하는 것만을 선별하여 그 패킷의 헤더 정보를 보여주는 도구 이다.
이프로그램을 컴파일하여 설치하기 위해서는 libpcab(packet capture library)이 먼저 설치되어있어야 한다.

참고로 시모무라 소토무가 케빈 미트닉을 잡을 때 사용했던 프로그램으로도 유명하다.
이프로그램은 네트워크 상에서 돌아다니는 모든 패킷을 캡처함으로서 여러분들에게 유용한 정보를 보여준다.

 

 

 

2.소스 가져오기
 

 

 

 

 

 

 

3. 설치
 

 

 

 

 libpcap-0.6.2설치

shell> gunzip libpcap-0.6.2.tar.gz
shell> tar xvf libpcap-0.6.2.tar
libpcap-0.6.2/./
libpcap-0.6.2/./CVS/
libpcap-0.6.2/./CVS/Root
libpcap-0.6.2/./CVS/Repository
libpcap-0.6.2/./CVS/Entries
libpcap-0.6.2/./CVS/Tag

<생략>

shell> ./configure
creating cache ./config.cache
checking host system type... i586-pc-linux-gnu
checking target system type... i586-pc-linux-gnu
checking build system type... i586-pc-linux-gnu

<생략>
shell> make
gcc -O2 -I.  -DHAVE_CONFIG_H -c ./pcap-linux.c
gcc -O2 -I.  -DHAVE_CONFIG_H -c ./pcap.c
gcc -O2 -I.  -DHAVE_CONFIG_H -c ./inet.c

<생략>
shell> make install
[ -d /usr/local/lib ] || \
    (mkdir -p /usr/local/lib; chmod 755 /usr/local/lib)
/usr/bin/install -c -m 644 libpcap.a /usr/local/lib/libpcap.a ranlib /usr/local/lib/libpcap.a
[ -d /usr/local/include ] || \
    (mkdir -p /usr/local/include; chmod 755 /usr/local/include)

/usr/bin/install -c -m 644 ./pcap.h /usr/local/include/pcap.h
/usr/bin/install -c -m 644 ./pcap-namedb.h \
    /usr/local/include/pcap-namedb.h
[ -d /usr/local/include/net ] || \
    (mkdir -p /usr/local/include/net; chmod 755/usr/local/include/net)
/usr/bin/install -c -m 644 ./bpf/net/bpf.h \
    /usr/local/include/net/bpf.h
[ -d /usr/local/man/man3 ] || \
        (mkdir -p /usr/local/man/man3; chmod 755/usr/local/man/man3)
/usr/bin/install -c -m 644 ./pcap.3 \
    /usr/local/man/man3/pcap.3

shell> 

 

 tcpdump-3.6.2설치

shell> gunzip tcpdump-3.6.2.tar.gz
shell> tar xvf tcpdump-3.6.2.tar
tcpdump-3.6.2/./
tcpdump-3.6.2/./CVS/
tcpdump-3.6.2/./CVS/Root
tcpdump-3.6.2/./CVS/Repository
tcpdump-3.6.2/./CVS/Entries
tcpdump-3.6.2/./CVS/Tag
<생략>
shell> cd tcpdump-3.6.2
shell> ./configure
creating cache ./config.cache
checking host system type... i586-pc-linux-gnu
checking target system type... i586-pc-linux-gnu
checking build system type... i586-pc-linux-gnu
checking for gcc... gcc
checking whether the C compiler (gcc  ) works... yes
checking whether the C compiler (gcc  ) is a cross-compiler... no
<생략>
shell> make
gcc -O2 -DHAVE_CONFIG_H -I. -I../libpcap-0.6.2  -I./missing -I/usr/local/ssl/inc
lude -I/usr/local/ssl/include/openssl -c ./tcpdump.c
gcc -O2 -DHAVE_CONFIG_H -I. -I../libpcap-0.6.2  -I./missing -I/usr/local/ssl/inc
lude -I/usr/local/ssl/include/openssl -c ./print-arp.c
gcc -O2 -DHAVE_CONFIG_H -I. -I../libpcap-0.6.2  -I./missing -I/usr/local/ssl/inc lude -I/usr/local/ssl/include/openssl -c ./print-atalk.c
<생략>
shell> make install
[ -d /usr/local/sbin ] || \
    (mkdir -p /usr/local/sbin; chmod 755 /usr/local/sbin)
/usr/bin/install -c tcpdump /usr/local/sbin/tcpdump
[ -d /usr/local/man/man1 ] || \
    (mkdir -p /usr/local/man/man1; chmod 755/usr/local/man/man1)
/usr/bin/install -c -m 644 ./tcpdump.1 /usr/local/man/man1/tcpdump.1
shell>

 

 

 

4. 사용법
 

 

 

 

tcpdump [ -adeflnNOpqStvx ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]  [ expression ]

 <Option>

-a :

Network & Broadcast 주소들을 이름들로 바꾼다.

-c :

Number : 제시된 수의 패킷을 받은 후 종료한다

-d :

comile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로 출력하고, 종료한다.

-dd :

packet-matching code를 C program의 일부로 출력한다.

-ddd :

packet-matching code를 숫자로 출력한다.

-e :

출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.

-f :

외부의 internet address를 가급적 심볼로 출력한다(Sun의 yp server와의 사용은 가급적 피하자).

-F file :

filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은 모두 무시된다.

-i device :

어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지저되지 않으면 시스템의 인터페이스 리스트를 뒤져서 가장 낮은 번호를 가진 인터페이스를 선택한다(이 때 loopback은 제외된다).

-l :

표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터 데이터를 받고자 할 때, 유용하다.

-n :

모든 주소들을 번역하지 않는다(port,host address 등등)

-N :

호스트 이름을 출력할 때, 도메인을 찍지 않는다.

-O :

packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는 버그를 찾을 때나 쓰인다.

-p :

인터페이스를 promiscuous mode로 두지 않는다.

-q :

프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.

-r <file>:

패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 "-" 가 사용되면 표준 입력을 통해서 받아들인다.

-s <spaplen>:

패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때 사용한다(SunOS의 NIT에서는 최소가 96Byte이다). 68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만 Name Server나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation할 우려가 있다. 이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하나하나를 처리하는데 시간이 더 걸릴 뿐만아니라 패킷 버퍼의 사이즈도 자연히 작아지게 되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃게되는 것이다. 따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아주어야 한다.

-T <type> : 조건식에 의해 선택된 패킷들을 명시된 형식으로 표시한다. type에는 다음과 같은 것들이 올 수 있다. rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp(Real-Time Application control protocal), vat(Visual Audio Tool), wb(distributed White Board)

-S :

TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.

-t :

출력되는 각각의 라인에 시간을 출력하지 않는다.

-tt :

출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.

-v :

좀 더 많은 정보들을 출력한다.

-vv :

'-v'보다 좀 더 많은 정보들을 출력한다.

-w :

캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.

-x :

각각의 패킷을 헥사코드로 출력한다.

<expression>

expression은 패킷을 선택적으로 캡처하기 위한 조건을 적는 부분이다. expression이 없다면 네트워크상의 모든 패킷을 캡처하여 보여 주며expression이 정의 되어있다면 이 expression을 참으로 하는 패킷만을 선별하여 보여준다. expression은 하나이상이 primitives로 구성되며, primitives는 일반적으로qualifer을 앞에 내세운 id(이름이나 숫자)로 구성된다.

[Qualifier]

type :

id(이름이나 숫자)가 어떠한 의미를 가지는지를 알려준다. 가능한 type으로는 host, net, port가 있다.

 

ex) " host foo", "net 123.4", "port 23"      특별한 qualifier가 정해져 있지 않으면 "host"로 가정한다.

dir   :

전송방향을 결정한다. 가능한 방향은 "src", "dst", "src or dst", "src and dst"이다

 

ex) "src foo", "dst net 123.4", "src or dst port ftp"   특별한 qualifier가 정해져 있지 않으면 "src or dst"로 가정한다.

proto :

특정한 프로토콜의 패킷만을 받아들이게 한다. 가능한 proto로는 "either", "fddi", "ip" ,"arp", "rarp", "decnet", "lat", "sca", "moprd", "mopdl", "tcp","udp"가 있다.

 

ex) "either src foo", "arp net 123.4", "tcp port 23" 특별한 qualifier가 정해져 있지 않으면 "src or dst"로 가정한다.

[primitives]

dst host <host> :

패킷의목적지 필드에 있는 IP주소와 <host> (hostname, name 둘다 가능)가 일치하면 참.

src host <host> :

패킷의 발신지 필드에 있는 IP주소와 <host> (hostname, name 둘다 가능)가 일치하면 참.

host <host> :

패킷의 목적지 IP나 발싲니 IP중 어느하나라도 <host>와 일치하면 참.

ether dst <ehost> :

패킷의 목적지 ethernet 주소(48bit의 주소로 일반적으로 X:X:X:X:X;X로 표시된다.여기서 X는 16진수)가<ehost>와 일치하면 참

ether dst <ehost> :

패킷의 목적지 ethernet 주소가  <ehost>와 일치하면 참.

gateway <ehost> :

 <host>가 gateway로 쓰일 때 참. 즉, ethernet발신지 혹은 목적지 주소는 <host>이나 IP 발신지 혹은 목적지 주소로 <host>는 될 수 없다는 것을 의미한다. <host>는 반드시 /etc/hosts와 /etc/ethers에서 찾을 수 있어야 한다.이 expression은 "ether host <ehost> and not host <host>"와 동일한 의미를 가진다.

dst net <net> :

패킷의 IP목적지 주소가 <net>과 동일한 테트워크 번호(network number)를 가지면 참.

 

src net <net> : 패킷의 IP발신지 주소가 <net>과 동일한 테트워크 번호(network number)를 가지면 참.

net <net> :

패킷이 IP목적지 혹은 발신지 주소 둘 중 어느 하나라도 <net>과 동일한 network number를 가지면 참 .

net <net> mask <mask> :

IP주소가 지정된 netmask(<mask>)를 통하여 network number <net>와 일치하면 참.

net <net>/<len> :

IP주소가 network number <net>과 netmaks의 <len>비트만큼 일치하면 참.

dst port <port> :

패킷이 IP혹은 UDP 이면서 목적지 port값으로 <port>를 가지고 있다면 참. <port>는 숫자나 /etc/services에 정의 되어있는 port이름을 사용할 수 있다.

src port <port> :

패킷이 IP혹은 UDP 이면서 발신지 port값으로 <port>를 가지고 있다면 참.

port <port> :

패킷의 목적지 혹은 발신지 port값에서 둘주 어느하나라도 <port>와 같으면 참이된다. 위의 port expression들은 "tcp"나 "udp"와 함께쓰일 수 있다.
  ex) tcpdump tcp src port 23  -tcp패킷중에서 발신지 port 23인 것만 검출하여 보내준다.

less <length> :

패킷의 길이가 <length>Byte보다 작거나 같으면 참이된다.

greater <length> :

패킷의 길이가 <length>Byte보다 크거나 같으면 참이된다.

ip proto <protocol> :

패킷이 <protocol> protocol형태의 ip패킷이면 참. <protocol>에는 icmp, igrp, udp , tcp이름이 들어갈 수 있다. tcp, udp,icmp는 키워드로도 사용되기 때문에 <protocol>의 값이 되기 위해서는 앞에 backslash를 붙여준다.

ether broadcast :

패킷이 ethernet broadcast패킷이면 참. "ehter" keyword는 생략 가능.
ip broadcast : 패킷이 ip broadcast패킷이면 참.

ether multicast :

패킷이 ethernet multicast 패킷이면 참이된다. "ether"keyword 는 생략가능.

ip multicast :

패킷이 ip multicast패팃이면 참.

ether proto <protocol> :

패킷이 <protocol>의 ether형태라면 참. <protocol>의값으로는 숫자나 ip, arp, rarp와 같은 이름이 될수있다.

decnet src <host> :

DECNET발신지 주소가 <host>이면 참이 된다. <host>의 값으로는 "10.123"나 DECNET호스트 이름이 될수있다.

decnet dst <host> :

DECNET목적지 주소가 <host>이면 참.

decnet host <host> :

DECNET목적지혹은 발신지 주소중에서 어느 하나라도 <host>와 일치하면 참.

ip, arp, rarp, decnet :

"ether proto <p>"의 축약형이다. 여기서 <p>값은 위의 protocol중의 하나가된다.

tcp, udp, icmp :

"ip proto <p>"의 축약형이다. 여기서 <p>값은 위의 protocol중 하나가된다.

간단한 expression들을 다음의 관계연산자를 통하여 묶음으로서 더욱 복잡한 filter expression을 구성할 수 있다.

    Nagation : "!", "not"
    Concatenation : "&&", "and"
    Alternation : "||", "or"

 

 

 

 

5. tcp_dump의 사용
 

 

 

 

 

shell> tcpdump -t
tcpdump: listening on eth0
0:a0:c9:4:2e:48 sap c4 > 0:60:b0:f2:5f:b sap b4 sabme/Plen=43
arp who-has 143.248.1.200 (6:6b:e8:c0:4:11) tell kaist-gw.kaist.ac.kr
211.205.0.142.1432 > gaya.kaist.ac.kr.telnet: . ack 4254948997 win 15826 (DF)
gaya.kaist.ac.kr.telnet > 211.205.0.142.1432: P 1:93(92) ack 0 win 32522 (DF)
arp who-has ns.kaist.ac.kr tell gaya.kaist.ac.kr
arp reply ns.kaist.ac.kr is-at 8:0:20:cc:66:1f
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17263+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17263 NXDomain*[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17264+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17264*[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17265+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17265 NXDomain[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17266+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17266*[|domain] (DF)

Example 1)
(1. icmp패킷만 출력한다. 2. 패킷의 수신지 혹은 발신지가apple 인 것을 출력한다. 3. 패킷의 수신지 혹은 발신지가 sun이나 moon이면 출력하지 않는다.)

    shell> tcpdump ip proto '\icmp && host apple && !(sun || moon)'
    or
    shell> tcpdump ip proto \\icmp and host apple and not \(sun || moon \))

Example 2)
패킷의 발신지가apple이고 수신지는 banana가 아닌 패킷을 출력한다.

    shell> tcpdump src host apple and not dst host banana

 Example 3)
echo requests/replies가 아닌 모든 ICMP패킷을 출력한다.

    shell> tcpdump 'icmp[0] != 8 and icmp[0] != 0"

Example 4)
(tcp 프로토콜 통신에서 123.45.67.89가 수신지나 발신지가 아닌 모든 SYN , FIN 패킷을 출력한다)

    shell> tcpdump 'tcp[13] & 3 != 0 and not net 123.45.67.89'

     

     

    **********************************8

    위의 내용은 초고속연구망실무자 협의회에서 발췌한 글이며..

    저작권 문제가 있을경우 바로 삭제 하겠습니다.

'2010년 이전 글 > computer' 카테고리의 다른 글

한글 putty 0.58  (1) 2008.11.04
TCPDUMP 사용법  (0) 2007.10.30
블루스크린 ErrorCode Define 값입니다.  (0) 2007.09.21
HP-UX 쉘 명령어 총정리  (0) 2007.08.22
gcc와 make 강좌  (0) 2007.05.01
and

http://security.kaist.ac.kr/docs/tcpdump.html

 

 

 

 

 

TCPDUMP User Guide
 
 

Date : January 1999

written byKwon, YongChul

-. 이 문서의 저작권은 저자(권용철:godslord@sparcs.kaist.ac.kr)에게 있습니다. 본문의 무단 인용, 복사는 저자와의 협의 없이 절대 불가능합니다.


Table of Contents


  • 이 문서를 보기 전에 알아야 할 사전 지식

    이 문서는 네트워크의 패킷들을 잡아내는 Tcpdump라는 프로그램에 대해서 설명하고 있다. 프로그램의 특성상, 네트워크에 관련된 많은 용어들과 특히 TCP/IP에 대한 내용 이 많이 나온다. 따라서 보다 잘 이해하기 위해서는 네트워크 설비 자료나, 네트워크 프로그래밍 가이드, 혹은 네트워크 프로토콜(TCP/IP)에 관련된 책들을 참조하는 것이 좋을 것이다.


  • Tcpdump란?

    Tcpdump는 주어진 조건식을 만족하는 네트워크 인터페이스를 거치는 패킷들의 헤더들 을 출력해 주는 프로그램이다. 프로그램의 특성상, 네트워크 인터페이스를 아주 심도 있게 사용하기 때문에, 실행하는 사람은 반드시 네트워크 인터페이스에 대한 읽기 권 한이 있어야만 한다.
    OS dependent)
    위에서 말하는 읽기 권한을 가지고 있어야 하는 파일, 혹은 Tcpdump의 퍼미션 이다.

    • SunOS : /dev/nit, /dev/bpf*
    • Solaris(SunOS 5.x) : /dev/le 등
    • HP-UX & IRIX & Linux : root에서 실행하거나, root로 setuid를 설정해야 함
    • Ultrix & Digital UNIX : root가 pfconfig를 이용하여, promiscuous-mode를 가능하게 설정하면 어떤 유저라도 사용할 수 있다.
    • BSD : /dev/bpf*


  • Tcpdump의 패키지 구하기

    Tcpdump는ftp://ftp.ee.lbl.gov/tcpdump.tar.Z에서 최신 버전을 구할 수 있다. 유명 한 프로그램이기 때문에, 시스템소프트웨어를 패키지형태로 제공해 주는 OS들의 경우 Vendor에서 패키징된(컴파일된) 버전으로도 구할 수 있을 것이다.


  • Tcpdump의 설치

    Tcpdump는 libpcap(Protocol Capture Library)라는 것을 사용한다. 이 라이브러리는 Platform에 상관없이 동일한 방법으로 사용자 레벨에서 패킷들을 캡춰할 수 있게 해 준다. 따라서 이 라이브러리가 없다면,ftp://ftp.ee.lbl.gov/libpcap.tar.Z에서 구하 여 설치하도록 한다.

    ANSI C 컴파일러는 아마 대부분의 시스템에서 구비하고 있을 것이다. 만약 없다면ftp://prep.ai.mit.edu/pub/gnu/gcc.tar.gz를 받아서 설치하기 바란다.

    libpcap라이브러리가 완벽하게 설치되었다는 가정하에서 다음의 절차에 따라 설치를 시작한다.

    • Makefile.in의 BINDEST와 MANDEST 항목에 각각, tcpdump 실행파일과 메뉴얼 페이 지가 설치될 디렉토리들을 입력해 준다.
    • Tcpdump 패키지와 함께 제공되는 ./configure 스크립트를 실행시킨다. 이 스크립트는 현재 시스템의 환경들을 검사하고 이에 맞추어서 Makefile을 생성해 준다.
    • make를 실행한다.
    • 컴파일이 다 됐으면, make install을 수행하여 실행파일을 설치하고, make install-man을 실행하여 메뉴얼 페이지도 설치한다.
    • tcpdump의 퍼미션이 제대로 되었는지를 검사한다. setgid가 설정되어 있기 때문에, 원하지 않는 사람이 실행하게 된다면 위험하다.
    위에서 설명한 절차를 그대로 옮겨 본다.
    # vi Makefile.in# ./configure# make# make install# make install-man
    OS dependent)
    • DEC/OSF and BSD/386, etc : tcpdump가 OS와 함께 제공되는 경우가 있다. 이럴 경우 tcpdump를 업그레이드 하기 전에 반드시 기존의 tcpdump를 백업해 두도록 하자.
    • Linux : libpcap 라이브러리는 2.0.25 커널에서 테스트 됐다. 2.0.x 대 커널 에서 25이하의 버전에서는 실행이 아마 가능할 것이다. 그러나 1.x대의 커널에서는 동작 여부가 입증되지 않았으므로 주의해야 한다.
    • OSF 4 : OSF4에서는 stack C 컴파일러에 치명적인 버그가 있다. 이 버그를 피해가려면, ./configure를 실행한 후 컴파일 하기 전에 Makefile에서 다음의 문장을 삭제한 후 컴파일해 주면 된다.
    -DETHER_HEADER_HAS_EA=1 -DETHER_ARP_HAS_EA=1


  • Tcpdump Source의 간략한 설명


  • Tcpdump의 옵션들

    • -a: Network & Broadcast 주소들을 이름들로 바꾼다.
    • -cNumber : 제시된 수의 패킷을 받은 후 종료한다.
    • -d: comile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로 출력하고, 종료한다.
    • -dd: packet-matching code를 C program의 일부로 출력한다.
    • -ddd: packet-matching code를 숫자로 출력한다.
    • -e: 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.
    • -f: 외부의 internet address를 가급적 심볼로 출력한다(Sun의 yp server와의 사용은 가급적 피하자).
    • -F file: filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은 모두 무시된다.
    • -i device: 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지저되지 않으면 시스템의 인터페이스 리스트를 뒤져서 가장 낮은 번호를 가진 인터페이스를 선택한다(이 때 loopback은 제외된다).
    • -l: 표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터 데이터를 받고자 할 때, 유용하다.
    • -n: 모든 주소들을 번역하지 않는다(port,host address 등등)
    • -N: 호스트 이름을 출력할 때, 도메인을 찍지 않는다.
    • -O: packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는 버그를 찾을 때나 쓰인다.
    • -p: 인터페이스를 promiscuous mode로 두지 않는다.
    • -q: 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.
    • -r file: 패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 "-" 가 사용되면 표준 입력을 통해서 받아들인다.
    • -s length: 패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때 사용한다(SunOS의 NIT에서는 최소가 96Byte이다). 68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만 Name Server나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation할 우려가 있다. 이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하나하나를 처리하는데 시간이 더 걸릴 뿐만아니라 패킷 버퍼의 사이즈도 자연히 작아지게 되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃게되는 것이다. 따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아주어야 한다.
    • -T type: 조건식에 의해 선택된 패킷들을 명시된 형식으로 표시한다. type에는 다음과 같은 것들이 올 수 있다. rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp(Real-Time Application control protocal), vat(Visual Audio Tool), wb(distributed White Board)
    • -S: TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.
    • -t: 출력되는 각각의 라인에 시간을 출력하지 않는다.
    • -tt: 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.
    • -v: 좀 더 많은 정보들을 출력한다.
    • -vv: '-v'보다 좀 더 많은 정보들을 출력한다.
    • -w: 캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.
    • -x: 각각의 패킷을 헥사코드로 출력한다.

    조건식(expression)

    옵션의 제일 마지막인 조건식은 어떤 패킷들을 출력할지를 선택하는데 쓰인다. 조건식이 주어지지 않는 다면 모든 패킷들이 그 대상이 될 것이다. 일단 주어지면, 아무리 패킷들이 많아도 조 건식에 부합하는 패킷만을 출력한다.

    조건식들은 하나 또는 몇 개의 primitive들로 구성되어 있다. primitive들은 보통 하나 혹은 몇개의 qualifier들 다음에 오는 하나의 값으로 이루어진다. Qualifier들은 모두 3 종류이며 다음과 같다.

    • type : 주어진 값의 종류가 무엇인지를 나타낸다. 가능한 type들은 'host', 'net', 'port'가 있다. type이 없는 값들은 type을 host라 가정한다.
    • dir : id로 부터의 어떤 특정한 전송 방향을 나타낸다. 가능한 방향은 'src', 'dst', 'src or dst', 'src and dst'이다. 만약 방향이 정해지지 않았다면, src or dst라 가정한다. "For `null' link layers (i.e. point to point protocols such as slip) the inb ound and out bound qualifiers can be used to specify a desired direction."
    • proto : 매칭을 특정 프로토콜에 한해서 수행한다. 가능한 프로토콜들은 ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp, udp이다. 만약 프로토콜이 명시되지 않았다면, 해당하는 값의 type에 관련된 모든 프로토콜들이 그 대상이 된다.

    이 밖에도 위의 패턴을 따르지 않는 Primitive들이 존재한다(gateway, broadcst, less, greater, 산술식).

    좀 더 정교한 조건식들을 사용하려면, 'and(&&)', 'or(||)', 'not(!)'들을 사용하여 여러 primitive들을 연결하면 된다. 같은 표현들은 생략될 수 있다.

    사용 가능한 Primitive들

    • dst host HOST
      packet의 IP destination 항목이 HOST일때 참이 된다.
    • src host HOST
      packet의 IP source 항목이 HOST일때 참이 된다.
    • host HOST
      IP source, IP destination 항목 중 어느 하나라도 HOST이면 참이다.
    • ether dst ehost
      ethernet destination 주소가 ehost일 때 참이다.
    • ether src ehost
      ethernet source 주소가 ehost일 때 참이다.
    • ether host ehost
      ethernet source, destination 항목들 중 어느 하나라도 ehost이면 참이다.
    • gateway host
      패킷이 host를 게이트웨이로 사용하면 참이다. 이 말의 의미는 ethernet sour ce나 destination 항목은 host이지만, IP source와 destination은 host가 아닐 때를 말한다.
    • dst net NET
      패킷의 IP destination 주소가 NET의 network number를 가지고 있을 때 참이 다.
    • src net NET
      패킷의 IP source 주소가 NET의 network number를 가지고 있을 때 참이다.
    • net NET
      패킷의 IP source 주소 혹은 destination 주소가 NET의 network number를 가 지고 있을 때 참이다.
    • net netmask mask
      IP 어드레스가 지정된 netmask를 통해서 net과 매칭되면 참이다.
    • net net/len
      IP 어드레스가 netmask와 len 비트만큼 매치되면 참이다.
    • dst port PORT
      패킷이 ip/tcp, ip/udp 프로토콜의 패킷이고 destination port의 값이 PORT일 때 참이다. port는 /etc/services에 명시된 이름일 수도 있고 그냥 숫자일 수도 있다. 만약 이름이 사용됐다면 port 번호와 프로토콜이 같이 체크될 것이다. 만약 숫자나 불 확실한 이름이 사용됐을 경우에는 port 번호만이 체크될 것이다.
    • src port PORT
      패킷의 source port의 값으로 PORT를 가지면 참이다.
    • port PORT
      패킷의 source, destination port 중에 하나라도 PORT이면 참이다.
    • less length
      패킷이 length보다 짧거나 같으면 참이다.(len <= length)
    • greater length
      패킷이 length보다 짧거나 같으면 참이다.(len >= length)
    • ip proto protocol
      패킷이 지정된 종류의 프로토콜의 ip패킷이면 참이다. Protocol은 icmp, igrp, udp, nd, tcp 중의 하나 혹은 몇 개가 될 수 있다. 주의할 점은 tcp, udp, icmp들은 '\'로 escape되어야 한다.
    • ehter broadcast
      패킷이 ethernet broadcast 패킷이라면 참이다. ehter는 생략 가능하다.
    • ip broadcast
      패킷이 IP broadcast 패킷이라면 참이다.
    • ether multicast
      패킷이 IP multicast 패킷이라면 참이다.
    • ether proto protocol
      패킷이 ether type의 protocol이라면 참이다. protocol은 ip, arp, rarp 중에 하나 혹은 몇개가 될 수 있다. ip proto protocol에서와 마찬가지로 ip, arp, rarp는 escape 되어야 한다.
    • decnet src host
      만약 DECNET의 source address가 host이면 참이다. 이 어드레스는 '10.123'이 나 DECNET의 host name일 수 있다. DECNET host name은 DECNET에서 돌아가도록 설정된 Ultrix 시스템에서만 사용 가능하다.
    • decnet dst host
      DECNET destination address가 host이면 참이다.
    • decnet host HOST
      DECNET source, destination address중의 하나라도 HOST이면 참이다.
    • ip, arp, rarp, decnet
      ether proto [ip|arp|rarp|decnet]의 약어
    • lat, moprc, mopdl
      ether proto [lat|moprc|mopdl]의 약어
    • tcp, udp, icmp
      ip proto [tcp|udp|icmp]의 약어
    • expr relop expr
      • EXPR
        proto [expr:size]의 형식을 띤다. proto, expr, size에 올 수 있는 것들은 다음과 같다.
        • proto : ether, fddi, ip, arp, rarp, tcp, udp, icmp
        • expr : indicate Byte offset of packet of proto
        • size : optional. indicate the size of bytes in field of interest
        • default is one, and can be two or four
      • RELOP
        !=, =, <=, >=, etc.

      이 조건식을 사용하기 위해서는 먼저 해당하는 Protocol(proto)의 헤더에 관련된 것들을 자세히 알아야만 한다. proto에는 대상이 될 프로토콜을 지정한다. expr에는 프로토콜 헤더의 처음부터의 Byte Offset을 지정하는 식이 들어가게 된다. Size는 Option이며 지정이 안 되어 있을 경우에는 자동으로 1byte를 지칭한다. 따라서 이 조건식을 사용하게 되면 헤더에 포함된 정보를 Bitmask를 사용하여 직 접 원하는 패킷인지를 가려낼 수 있기 때문에, 보다 정밀한 사용이 가능하게 된다.


  • Tcpdump의 사용 예제들

    • security라는 호스트로부터 날아오고, 날아가는 패킷들을 출력
      # tcpdump host security
    • security와 mazinga, getarobo 사이에 날아다니고 있는 패킷들을 출력
      # tcpdump host security and \( mazinga or getarobo \)
    • security에서 elgaim을 제외한 모든 호스트로 날아다니는 IP 패킷들을 출력
      # tcpdump ip host security and not elgaim
    • gateway amurorei를 거치는 ftp에 관련된 패킷들을 출력
      # tcpdump 'gateway amurorei and ( port ftp or ftp-data )'
    • local호스트가 아닌 호스트와 로컬호스트가 맺는 TCP 커넥션의 시작과 마지막 패 킷들을 출력한다(SYN, FIN 패킷).
      # tcpdump 'tcp[13] & 3 != 0 and not src and dst net non-local'
    • gateway amurorei를 지나는 576Byte보다 큰 패킷들을 출력한다
      # tcpdump 'gateway amurorei and ip[2:2] > 576'
    • Ethernet boradcast 혹은 multicast를 통해서 보내진 것이 아닌, IP broadcast 혹 은 multicast 패킷들을 출력한다.
      # tcpdump 'ehter[0] & 1 = 0 and ip[16] >= 224'
    • Echo request/reply가 아닌 ICMP 패킷들을 모두 출력한다.
      # tcpdump 'icmp[0] != 8 and icmp[0] != 0'


  • Tcpdump의 평가

    TCPDUMP는 여러모로 좋은 툴이다. libpcap을 거의 100% 활용한 프로그램의 예이며, 실제로 많은 툴들이 TCPDUMP와 병행하여 돌아가거나, TCPDUMP를 기반으로 제작되었다. TCPDUMP의 막강한 packet filter는 현재 로컬 네트워크 상에서 날아다니고 있는 특정한 패킷들을 실시간으로 기록해 줄 수 있으며, 이를 이용하여 네트워크에서 벌어지는 일들을 네트워크 관리자가 원하는 대로 뽑아 볼 수 있게 해 준다. 또한, 시스템 관리자들에게는 로컬 유저의 외부로의 커넥션들을 감시하고, 또 특정 침입자가 침투 경로로 자주 이용하는 호스트, 혹은 원하지 않는 호스트로부터의 커넥션을 실시간으로 감시할 수 있게 해 준다. libpcap을 이용하여 비슷한 툴을 제작하고자 하는 사람들에게도 TCPDUMP는 가장 훌륭한 예제가 될 것이다.


  • References

    • TCP dump Manual page : written by Van Jacobson, Craig Leres and Steven McCanne, all of the Lawrence Berkeley National Laboratory, University of California, Berkeley, CA.
    • TCP dump Document included in TCP dump package

'2010년 이전 글 > computer' 카테고리의 다른 글

한글 putty 0.58  (1) 2008.11.04
TCPDUMP 요약글입니다.  (0) 2007.10.30
블루스크린 ErrorCode Define 값입니다.  (0) 2007.09.21
HP-UX 쉘 명령어 총정리  (0) 2007.08.22
gcc와 make 강좌  (0) 2007.05.01
and

 

 

Error code  Stop 0x0000000A or IRQL_NOT_LESS_OR_EQUAL 
ː내 용 1. 프로세서 및 메모리관리나 데이터 입출력 하드웨어제어 등의 IRQL(interrupt request level)인터럽트 요청 레벨이 너무높을때 발생하는 오류이다.

2. 메모리로 접근을위한 커널모드가 퍼미션을 가지지 못할 때 생기는 오류이다.

3. 일반적으로 이 메시지는 하드웨어나 소프트웨어 호환성 문제 때문에 생긴다.
 
ː문제해결 방법 - 드라이버나 펌웨어를 설치하는데 실패할 때 발생한다. 문제를 해결하기 위해 실패한 드라이버를 삭제하거나 드라이버 롤백기능을 사용한다.

- 윈도우 XP를 업그레이드하는 동안 이오류가 나타나면 호환성부족 드라이버나 바이러스를 체크 해본다.
 


Error code  Stop 0x0000001E or KMODE_EXCEPTION_NOT_HANDLED 
ː내 용 1. 커널 오류중 하나이며 0×A오류와 거의 같다.

2. 메모리 부족 때문에 발생하는 오류이다.
 
ː문제해결 방법 - 잘못된 드라이버를 설치하거나 메모리와 IRQ충돌시 이런 문제가 나타난다.

- 바이러스 백신이나 멀티미디어 응용프로그램 백업 프로그램등과 같이 필터프로그램을 사용하는 소프트웨어를 업데이트한다.

- 원격 제어프로그램의 win32k.sys 파일이 손상되었을 경우나 다른회사의 원격제어 프로그램을 설치할 경우에 발생될 수 있다.

- 안전모드로 접근을 못하는 경우 Recovery Console을 이용하여 문제를 해결한다.

- 시스템 펌웨어의 호환성부족으로 발생할수 있으며 바이오스 업그레이드로 문제를 해결해 본다.

- 디스크 공간이 부족할 때 발생되는 오류중하나이며 chkdsk.exe autochk.exe의해 발생되는 인터넷케쉬파일이나 temporary files(*.tmp files) 응용프로그램 백업파일을 삭제해 준다.
 
 


Error code  Stop 0x00000024 or NTFS_FILE_SYSTE 
ː내 용 1. 이 오류메시지는 NTFS파일 시스템 드라이버들을 쓰거나 읽는데 필요한 드라이버파일인 ntfs.sys 가 깨지거나 삭제되었을 경우 발생한다.
 
ː문제해결 방법 - SCSI나 ATA 하드웨어드라이버의 부조화로 발생하는 에러이다.
스카시인 경우 termination문제 케이블을 체크한다.

- event viewer에서 시스템 로그 안에 SCSI나 FASTFAT 과 관련된 에러사항을 체크한다.

- 시스템 제조회사에서 제공하는 하드웨어 진단프로그램과 진단 소프트웨어로 테스트해본다.
 
 


Error code  Stop 0x0000002E or DATA_BUS_ERROR 
ː내 용 1. 시스템 페러티 에러나 메모리모듈 Level2 cache 나 비디오메모리 손상으로 발생되는 에러이다.
 

2. 바이러스로 인해 발생할수있다.
 
ː문제해결 방법 - 드라이버를 잘못설치한 경우 발생할 수 있다. 파일이름을 보여주면 제거하거나 롤백 기능을 사용하여 문제를 해결한다.

- 램의 물리적인 손상일 경우가 많으므로 데이터가 주소에 제대로 접근 못하는경우가 많다. 이럴경우는 램을 교체해본다.

- 크랙된 응용프로그램을 설치한 경우에 발생할 수 있다.
 
 


Error code  Stop 0x0000003F or NO_MORE_SYSTEM_PTES 
ː내 용 1. 이 에러는 여러 가지 원인에 의해 발생될수 있다.
주로 PTEs(page table entries)-시스템의 입출력수행의 과도현상 PTEs(메모리공간에대한정보)가 부족하거나 파손되는경우에 발생할수 있는 에러이다.

2. 잘못된 드라이버 설치시 발생할수 있다.
 
ː문제해결 방법 - 응용프로그램들이 요구하거나 이용할 수 있는 충분한 크기의 메모리 블록이 부족한경우에 발생하는 에러이다.

- 응용프로그램의 드라이버를 업데이트해본다.

- 윈도우 xp 는 PTEs의 수를 늘리기위해 registry entry,system pages를 제공한다.
 
 


Error code  Stop 0x00000050 or PAGE_FAULT_IN_NONPAGED_AREA 
ː내 용 1. 요청된 데이터가 메모리에 상주되어 있지 않을때 발생하는 에러이다.

2. 호환이 잘 안되는 소프트웨어 설치시(원격 엑세스, 바이러스 백신)들이 에러를 일으키는 원인이 된다.

3. 결함이있는 메모리(메인 메모리,L2케시 메모리,video RAM)
 
ː문제해결 방법 - 잘못된 드라이버 설치시 에러를 발생시킬수 있다. 드라이버를 삭제하고 업데이트된 드라이버를 재설치 한다.

- 만약 제조회사에서 드라이버를 찾지못한다면 비슷한 종류의 드라이버로 교체한다.
 
 


Error code  Stop 0x00000077 or KERNEL_STACK_INPAGE_ERROR 
ː내 용 1. 이 에러는 페이징 (가상 메모리)파일로부터 요구된 커널 데이터의 페이지가 메모리에서 읽거들이거나 발견되지 않았을때 생기는 오류이다.

2. 디스크 데이터 충돌이나 바이러스 감염에 의해서도 생기는 오류이다.
 
ː상태 코드  - 0xC000009A, or STATUS_INSUFFICIENT_RESOURCES 리소스부족을 가르킨다.

- 0xC000009C, or STATUS_DEVICE_DATA_ERROR,하드디스크의 베드블럭,섹터로 요청된 데이터를 찾지 못할때

- 0xC000009D, or STATUS_DEVICE_NOT_CONNECTED, 결함있는 파워케이블, 스카시 터미네이션 ,하드디스크 컨트롤러

- 0xC000016A, or STATUS_DISK_OPERATION_FAILED, 결함있는 하드디스크의 베드섹터

- 0xC0000185, or STATUS_IO_DEVICE_ERROR, 결함있는 파워케이블 ,스카시 터미네이션 ,하드디스크 컨트롤러 두가지 디바이스장치가 동일한 시스템 리소스를 사용해서 생기는 오류
 
 


Error code  Stop 0x00000079 or MISMATCHED_HAL 
ː내 용 1. 하드웨어추상화계층(Hardware Abstraction Layer)-입출력 인터페이스, 인터럽트 제어, 다중 프로세서 통신을 구현하는 데 필요한 하드웨어 종속적인 세부 사항을 처리하는 루틴과 커널타입이 맞지 않아 생기는 오류이다.

2. 주로 ACPI 펌웨어 설정이 변경되었을때 자주일어나는 오류이다
 

 

출처 : support.microsoft.com

'2010년 이전 글 > computer' 카테고리의 다른 글

TCPDUMP 요약글입니다.  (0) 2007.10.30
TCPDUMP 사용법  (0) 2007.10.30
HP-UX 쉘 명령어 총정리  (0) 2007.08.22
gcc와 make 강좌  (0) 2007.05.01
vi 사용법의 모든것 !!! [리눅스]  (0) 2007.05.01
and

UNIX 명령어 총정리

 

1. addbib - 도서목록 형식의 데이터베이스를 만들거나, 확장

 

2. apropos - 사용설명서의 키워드 검색

 

3. ar - 라이브러리 만들기, 관리

아카이브 화일에 있는 화일의 그룹들을 유지 관리하는 명령어

문법 ar [drqtpmx] [vuaiblc] afile files ...

options

d 아카이브 화일에 있는 특정화일을 삭제

r 아카이브 화일에 있는 화일을 교체 ; 문자 n 와 함께 쓰면 수정되는 날짜보다 뒤의 화일만을 교체

q 특정 화일을 아카이브 화일의 맨 뒤에 첨가

t 아카이브 화일내의 목록을 출력

p 아카이므 화일내의 지정된 화일 내용을 출력

m 아카이브 화일의 맨 끝에 특정 화일을 이동시킨다 ; 인수 a, b 또는

i와 함께 사용하면 posname으로 위치를 지정할 수 있다

x 특정화일을 추출

c afile을 생성

l system 내의 임시 directory인 /tmp 대신에 local directory에 있는 임시 화일을 둔다

v 새로운 아카이브 화일 생성에서 기술된 정보를 화일별로 출력. 인수

t와 함께 사용하며 화일에 관한 모든 정보의 목록을 출력할 수 있으며 인수 x와 함께 사용하면 화일명이 먼저 출력

afile 아카이브 filename

 

4. at, batch - 원하는 시간에 원하는 명령을 실해하게 하는 명령

사용자가 원하는 시간에 프로그램 스케쥴링을 할 수 있는 명령어. 또한 앞으로 사용될 작업들을 확인해볼수 있으며(atq), 취소(atrm)도 가능하다. 주로 이것은 시스템 관리자가 시스템을 정리하고자 할 때이용하고 있는 사용자에게 메시지를 전달하는 등 비교적 규칙적으로 서버에서 일어날 수 있는 일에 자주 사용된다.

일정 시간이 지난후에 명령어를 실행 시깁니다. 따라서 자리를 비우고 30분후에 시스템을 다운 시킨다든지 하는 등 명령어에 타이머를 달수 있습니다.

옵션 -l at queue 를 보여 줍니다.

-d 번호 queue 에서 삭제 합니다. 즉 예약 명령 취소

ex) 10:20 분에 시스템을 정지 하는 것을 예약하고 싶은 경우

#at 10:20 ; 10:20 분을 줍니다.

at>halt ; 프롬프트가 at> 로 바뀌면, halt 명령을 예약합니다. .

ctrl-D ; ctrl+D 로 빠져나옵니다. ( ctrl-C, ctrl-Z 로 빠져나오면 예약이 안 됩니다. )

 

5. awk - 패턴 검색과 언어 처리

program file에서 기술된 pattern들중 일치되는 line 을 찾기 위해 입력 화일을 검색하는 명령어

문법 awk [-Fc] [profile] [file] ...

또는

awk [-Fc] [-f profile] [file] ...

options

-Fc 입력필드의 구분기호로서 c를 이용

-f progam file로서 다음 인수 사용

 

6. banner - 큰 글자(배너) 만들기

10문자이내의 문자열을 확대문자로 표준출력\

문법 banner string

 

7. basename - 경로 이름에서 마지막에 있는 이름만 출력

 

8. bdiff - 매우 큰 화일을 비교하는 diff 명령어

문법 bdiff file1 file2 [u] [-s]

options

file1,file2 비교하는 filename

n segment 수를 지정하여 생략시 default로 3500임

-s 진단적 message를 표준 출력하지 않는다

 

9. bfs - 매우 큰 화일을 scan하는 명령어

문법 bfs [-] name

options

- file의 크기를 출력하지 않음

name 읽기만 하는 화일을 scan 할 때 사용되며 name 은 filename

 

10. biff - 자신에게 편지가 배달되면 알려주는 명령

 

11. bin-mail, binmail - 예전에 사용한 전자우편 프로그램

 

12. cal - 달력보기

 

13. calendar - 간단한 일정표

현재 directory 내의 calendar file로부터 매일의 메모를 print하는 명령어

문법 calendar [-]

options

- login directory에 calendar file을 가지는 각 사용자에 이 화일 중의 오늘과 내일 날짜를 포함하는라인을 전자우편(mail)으로 보낸다

 

14. cat - 파일 병합과 내용 보기

파일의 내용을 화면에 출력하거나 파일을 만드는 명령( 도스의 TYPE명령)

% cat filename

 

15. cb - 간단한 C 프로그램 beautifier

 

16. cc - C 컴파일러

17. cd - 작업 디렉토리 바꾸기

디렉토리를 변경

% cd cgi-bin : 하부 디렉토리인 cgi-bin으로 들어감.

% cd .. : 상위디렉토리로 이동

% cd 또는 cd ~ : 어느곳에서든지 자기 홈디렉토리로 바로 이동

% cd /webker : 현재 작업중인 디렉토리의 하위나 상위 디렉토리가

아닌 다른 디렉토리(webker)로 이동하려면 /로 시작해서 경로이름을 입력하면 된다.

 

18. checknr - nroff 또는 troff 입력 파일 검사; 오류를 보여준다

 

19. chgrp - 파일의 사용자 그룹 바꾸기

 

20. chmod - 파일의 접근 권한 바꾸기

화일 permission 변경

유닉스에서는 각 화일과 디렉토리에 사용권한을 부여.

예) -rwxr-xr-x guestbookt.html

rwx :처음 3개 문자 = 사용자 자신의 사용 권한

r-x :그다음 3개 문자 = 그룹 사용자의 사용 권한

r-x :마지막 3개 문자 = 전체 사용자의 사용 권한

 

읽기(read)---------- 화일 읽기 권한

쓰기(write)---------- 화일 쓰기 권한

실행(execution)---------- 화일 실행 권한

없음(-)---------- 사용권한 없음

 

명령어 사용법

chmod [변경모드] [파일]

 

% chmod 666 guestbook.html

: test.html 화일을 자신에게만 r,w,x 권한을 줌

% chmod 766 guestbook.html

: 자신은 모든 권한을 그룹사용자와,전체사용자에게는 읽기와 쓰기 권한만 줌

 

21. clear - 터미날 화면 깨끗이 하기

 

22. cmp - 두 파일을 바이트 단위로 비교

두 개의 화일 내용을 비교하는 명령어

문법 Cmp [-l] [-s] file1 file2

options

-l 두 화일 내용을 비교함에 있어 틀린곳마다 byte 수 (10진수)와 틀린 byte 수(8진수)를 출력

-s 틀린 화일의 내용을 출력하지 않고 return code 만 변환한다

 

23. colcrt - troff 파일의 밑줄 속성 문자 처리

 

24. comm - 지정 두파일의 줄 단위 비교와 그 처리

두 개의 정렬(sort)된 화일에서 공통된 line을 선택하거나 삭제하는 명령어

문법 comm [-123] file1 file2

options

1 file1에만 있는 line을 출력하지 않는다

2 file2에만 있는 line을 출력하지 않는다

3 file1, file2 양쪽 화일에 있는 line을 출력하지 않는다

 

25. compress, uncompress, zcat - 파일 압축관련 유틸리티들

확장자 .Z 형태의 압축파일 생성

% compress [파일명] : 압축시

% uncompress [파일명] : 해제시

 

26. cp - 파일 복사

화일 복사(copy)

% cp index.html index.old

: index.html 화일을 index.old 란 이름으로 복사.

% cp /etc/*.* .

: etc 디렉토리내의 모든 화일을 현 디렉토리로 복사

 

27. cpio - copy file archives in and out

아카이브 화일을 복사하여 입출력하는 명령어

문법 cpio -o [abcv]

cpio -i [Bdmtuvsb] [patterns]

cpio -p [adlmv] directory

options

-o 복사 출력: 화일을 path명과 정보 상태를 함께 출력

-i 복사 입력: 표준 입력 화일로 부터 pattern에 일치하는 화일을 추출

-p *directory 내에 file 을 조건부로 작성하고 복사

a *file 복사후 입력 화일의 최종 접근 시간을 reset한다

B 입출력을 5,120 byte의 레코드로 블럭화한다

c ASCII 문자로 헤드 정보를 쓴다

d 필요에 따라 directory를 생성

m 존재하는 최종 화일 수정 시각을 보존

r 대화 문법으로 화일명을 변경

t 입력 화일명 목록을 출력하여 화일은 작성되지 않는다

u 무조건 복사

v 화일명 목록을 출력

 

28. cpp - C 언어 전처리기

 

29. crontab - 지정된 시간에 유저의 crontab 파일을 관리하는 명령어  

지정한 화일을 입력으로 받아 user의 크론탭 화일을 관리 및 directory로 복사하는 명령어

문법 crontab [file]

options

-r user crontab을 crontab directory로 부터 삭제

-l 호출한 user crontab fule을 출력

file 등록되는 화일명을 지정

 

30. csh - C 문법과 비슷한 쉘 스크립트 문법과 기타 여러 기능이 내장된 쉘

 

31. ctags - ex 나 vi 편집기에서 사용될 tag 파일을 만드는 명령

 

32. cut - 파일이 각 line에서 선택된 필드를 절단하는 명령어

화일이 각 line에서 선택된 필드를 절단하는 명령어

문법 cut -clist [file1 file2 ...]

cut -flist [-d char] [-s] [file1 file2 ...]

options

list - 사용으로 페이지 범위를 지정할수 있으며 정수의 필드 번호를 컴마로 분리하고 증가순서로 나열

clist 문자위치를 지정

(예로서, -(1-72)는 각 line에서 첫 72문자이다)

-d char -d의 문자는 필드구분 문자이며 -f 옵션에서만 필요

flist 구분문자에 의해 분리되는 필드 목록

(예로서, -f1,7은 첫번째와 일곱번째 필드를 복사)

-s 필드 구분문자가 없는 line은 무시

 

33. date - 시스템 시간 보기나 지정하기

 

34. dbx - 소스 수준의 디버거

 

35. deroff - nroff, troff, tbl, eqn 관련 내용 지움

 

36. df - disk free: 디스크의 남은 용량 보기

이용가능한 디스크블럭수를 출력하는 명령어

문법 df [-f] [-t] [file sysytem]

options

-f 디스크내의 자유리스트내의 정확한 블럭수를 출력

-t 사용가능 블럭 및 i-node와 할당된 전체블럭과 i-node가 출력

 

37. diff - 두 파일의 차이점 비교

두개의 화일중에서 다른 라인을 출력하는 명령어

문법 diff [-befh] file1 file2

options

-b 비교할 때 라인의 마지막에 있는 탭(tab)과 공백을 무시

-e file1으로부터 file2를 재생성. ed 편집을 위한 a,c 그리고 d 명령어의 script를 만든다

-f 비슷한 script를 만들지만 역순이기 때문에 ed 편집에서는 사용할 수 없다

-h 정밀도가 없어도 빠른 속도를 처리하고자 할 때 사용하며 -e와 -f와 함께 사용할수 없다

문법 diff3 [-ex3] file1 file2 file3

options

-e file1에 file2와 file3의 차이 비교를 기록

-x file1에 3개 화일 모두의 차이 비교를 기록

-3 file1에 file3과 차이 비교되는 부분만 기록

 

38. dircmp - 디렉토리를 비교하는 명령어

문법 dircmp [-dsw] directory1 directory2

options

-d 두 directory내의 화일명을 비교후 그 차이점을 diff문법으로 출력

-s 비교 일치된 화일에 대한 메세지 출력 안함

-Wn 출력되는 화면의 폭(n)을 변경

**) directory1, directory2는 비교되는 디렉토리명

 

39. du - disk used : 디스크 사용량 보기

디스크 사용을 요약 출력하는 명령어

문법 du [-ars] [files]

options

-a 각 화일에 대한 entry 출력

-r 읽을 수 없는 directory 또는 열 수(open) 없는 화일에 대해 메세지

를 출력

-s 이름으로 지정된 각각에 대한 총계 블럭수만을 출력

 

40. echo - 인자를 표준 출력으로 출력

echo명령어는 외부 프로그램과 내부 쉘명령어 사이에 있으며 echo의 인수는 공백에 의해 구분되어지며new line으로 종료하는 각 인수를 화면에 표준출력하는 명령어

문법 echo [-n] [arg] ...

options

-n new line이 없는 것은 추가로 출력

 

41. ed, red - 기본 줄 편집기

표준 텍스트 편집기 (라인 편집기)

문법 ed [-] [-x] [file]

options

- 문자 e,r과 w의 명령어의 출력을 없앤다

-x x 명령어는 암호와 선택 항목 인수이다

 

42. env - UNIX 명령어를 수행하기 위한 환경을 설정하는 명령어

문법 env [-] [name=value] ... [command arg]

options

- 기존 환경을 무시하고 지정된 환경으로 명령어를 수행

name=value 명령 수행 전의 원래 환경을 지정

command arg 수행하고자 하는 명령어 지정

 

 

43. eqn, neqn, checkeq - 수식 표현 포멧 도구

 

44. error - 컴파일러 오류 메시지 목록

 

45. ex, edit, e - 줄 편집기

ed 기능을 강화한 텍스트 편집기

문법 ex [-] [-trRV] [+command] name ...

options

- 대화형 사용자를 위해 feed-back을 억제

-t tag tag를 갖는 화일을 편집후 편집기를 그 화일의 위치에 지정

-r file file을 복구

R 읽기 허가만 된 모드로 한다

+ command 지정한 명령어를 수행하고 편집

 

46. expand, unexpand - TAB 문자를 공백문자로 바꿈, 또는 그 반대로

 

47. expr - 인자를 수식으로 처리

 

48. fgrep - 문자열에 따라 화일 검색

문자열에 따라 화일 검색(fgrep [option] string [file .. ) fgrep은 문자열에 따라 화일을 검색하여지정한 문자열이 있는 모든 행을 출력하며 정규식(영문,숫자,특수문자의 부분집합을 사용하는 식)을 사용 하는 grep와는 차이가 있다.

-b: 각 행의 선두에 그 행이 발견된 블럭번호를 넣어줌.

-c: 일치하는 패턴을 갖고 있는 행의 수 만을 출력함.

-l: 일치하는 행이 있는 화일의 화일명만을 복귀개행으로 구별시켜 출력하는데, 화일내에 패턴이 몇 개나 포함되어 있어도 화일명은 한 개밖에 출력하지 않음.

-n: 각 행의 선두에 화일내의 행번호를 넣음.(1 라인은 1임)

-i: 비교시 소문자와 대문자의 차이를 무시

-v: 일치하는 행을 제외한 모든행을 출력.

 

49. file - 파일 형식 알아보기

화일 형태를 결정하는 명령어

문법 file [-f] file ...

options

-f 다음 인수를 조사하고 싶은 화일명을 포함하는 화일로 간주

 

50. find - 파일 찾기

각 경로명에 대해서 계층적 directory를 순환적으로 내림차순으로 불(Boolean)표현식과 일치하는 화일을 찾는 명령어

문법 find pathname-list expression

options

-atime n 만약 화일이 n 날짜 이내에 접근되면 참

-cpio device 현재의 화일은 cpio(1)의 문법(5120byte 레코드)으로 장치에 써넣는다

-ctime n 화일이 n 날짜내에 변경되면 참

-exec cmd 지정한 명령어를 수행하고 종료상태로서 0의 값이 반환되면 참

-group gname 화일에 gname에 포함되어 있으면 참

-links n 화일이 n 개의 링크가 있으면 참

-mtime n 화일이 n 날짜 이내에 수정되면 참

-name file 화일이 현재의 화일명과 일치하면 참

-newer file 현 화일이 인수화일보다 최근에 수정되어 있으면 참

-ok cmd 명령어 라인을 의문부호를 선두에 부과하여 화면에 출력하며 만약 사용자가 y를 칠 경우에만실행 가능

-perm onum 화일의 허가 그래프가 9진수 onum과 일치하는 경우이면 참

(chmod(1) 참조)

-print 항상 참 ; 현재의 패스명을 출력

-size n 화일의 길이가 n 블럭(블럭당 512byte)이면 참

-type c 화일의 형태가 이면 참이며 여기서 말하는 c는 블럭형태인 특수화일,

문자형 특수화일, 디렉토리, 파이프 또는 일반화일을 각각 b,c,d,p,

또는 f로 표시

-user unname 화일이 사용자 unname에 속하면 참

(expression) 괄호내의 식이 참이면 참

 

1. 특정파일을 모두 찾아서 각각 "ls -l"하여 정보확인하기

[root@kebia_1 /root]# find / -name .searchfile -exec ls -l {} \;

2. 특정파일을 모두 찾아서 각각 파일내용 확인하기

[root@kebia_1 /root]# find / -name .searchfile -exec cat {} \;

 

51. finger - 사용자 정보 알아보기

who 명령을 보충하는 명령이 finger입니다. 특정 사용자에 대한 정보를 알려면 finger username(또는사용자가 다른 컴퓨터에 있으면 finger username@domain)을 입력합니다.

 

52. fmt, fmt_mail - 간단한 문서나, 편지 포멧 도구

 

53. fold - 긴 줄 출력 방법 지정

 

54. ftp - 파일 전송 프로그램

 

55. gcore - 실행 중인 프로세스의 core 이미지를 구한다.

 

56. gprof - call-graph profile data(?)를 보여줌

 

57. grep - 문자열 찾기

화일의 패턴을 검색하는 명령어

문법 grep [option] expression [file]

options

-b 각 라인의 첫머리에 블럭번호를 넣는다

-c 라인에 일치되는 수를 출력

-e expression a로 시작되는 식일 때 사용

-f file 규칙적인 식(grep) 또는 리스트열(fgrep)이 화일로부터 취한다

-l 일치되는 라인의 화일명만 출력

-s 읽지못하는 화일이거나 존재하지 않는 화일에 대한 에러 메세지 출력을 억제

-v 일치되는 라인을 제외한 모든 라인을 출력

-x 정확히 일치되는 라인을 출력 (fgrep만 사용)

 

58. groups - 사용자의 그룹을 보여줌

 

59. gzip - 확장자 .gz, .z 형태의 압축파일 생성

확장자 .gz, .z 형태의 압축파일 생성

% gzip [파일명] : 압축시

% gzip -d [파일명] : 해제시

 

60. head - 파일의 앞 부분 보기

% head -n filename : n줄 만큼 위세서부터 보여줌

 

61. history - 이전 명령 보기

 

62. hostname - 현재 시스템 이름을 보여줌

 

63. imake - makefile 만드는 프로그램

 

64. indent - C 프로그램 소스 파일을 들여쓰기 하는 포멧 도구

 

65. install - 파일 설치

 

66. ipcs - process 상호간의 통신에 대한 상태를 출력하는 명령어

문법 ipcs [-copqt]

options

-c 사용자의 로그인 명과 그룹명을 출력

-o 사용 상황 상태에 대한 정보를 출력

-p 프로세서 번호에 대한 정보를 출력

-q 수행중인 메세지 큐(Queue)에 대한 정보를 출력

-t 시간에 대한 정보를 출력

 

67. join - 관계형 데이터베이스 연산자

 

68. kill - 프로세스 죽이기

프로세스를 강제 종료하는 명령어

문법 kill [-signo] process id ...

options

1 hang up

2 인터럽터

3 정지

4 정확하지 않는 명령

5 trace trap

6 IOT

7 EMT

8 부도소수점 expression 발생

9 강제 종료

10 버스 에러

11 세그먼트 위배

12 bad system 콜

13 읽는 사람없이 파이프에 써 넣음

14 경보 신호

15 Software 종료

 

69. last - 사용자가 마지막 접속 상태를 보여줌

 

70. ld, ld.so - 링크 편집기, 동적 링크 편집기

 

71. leave - 자신의 접속 종료 시간을 알려줌

 

72. less - more 명령의 확장

 

73. lex - 어휘 분석 프로그램 생성기

 

74. link - 파일 및 디렉토리 링크 명령어

 

75. lint - C 프로그램 verifier

 

76. ln - 파일의 하드, 심벌릭 링크 명령

 

77. login - 시스템 접속 명령

 

78. look - 시스템 디렉토리나, 정열된 목록에서 단어 찾기

 

79. lookbib - 도서목록형 데이타베이스에서 찾기

 

80. lorder - 오브젝트 라이브러리의 관계 찾기

 

81. lp, cancel - 인쇄 시작, 취소

특정화일 및 정보를 프린터로 출력하는 명령어

문법 lp [-c] [-d lest] [-m] [-nnumber] [-0 option] [-s] [-t title]

[-w] files

options

-c 프린터가 끝나기전에 화일 변경이 가능하도록 프린트할 화일을 복사

-d dest 프린터 또는 프린터 클라스를 dest로 지정

-n 프린트 후 전자우편을 보낸다

-n number 프린트 할 매수를 지정

-s 메세지 출력을 억제

-w 프린트 후 사용자의 단말장치에 메세지를 보낸다

 

82. lpq - 인쇄 작업 상황 보기

 

83. lpr - 인쇄

 

84. lprm - 인쇄 작업 지우기

 

85. ls - 디렉토리 내용 보기

directory의 내용을 화면에 출력하는 명령어

문법 ls [-aAcCdDfFgimngrRstuxl] file ...

options

-a .file을 포함한 전 entry를 출력

-A -a option과 유사하지만 .또는 ..을 포함하는 화일은 출력 억제

-c 마지막 변경된 i-node의 시간을 출력

-C 멀티칼럼으로 출력하며 디폴트로는 CRT에 출력

-d directory명만 출력하며 내용은 출력하지 않는다

-D directory만 출력

-f 인수를 directory로 해석하며 각각의 슬롯에 있는 directory 및 file

명을 출력

-F system에 있는 화일이 directory면 /를 실행가능한 화일이면 *를 붙

인다

-g 옵션 -l과 같으나 소유자명이 출력되지 않는다

-i 첫 칼럼에 i-number를 출력

-l 화일 및 directory 상태 정보를 long 문법으로 출력

-m 스트림 문법의 출력

-n 소유자명과 그룹명 대신에 UID 번호와 GID 번호가 출력되는 것을 제

하고는 옵션 -l과 같다

-g 비도형문자를 ?문자로 출력

-r 화일명이나 수정시간을 알파벳 또는 오래된 역순으로 출력

-R 발견되는 sub-directory의 내용을 순환적으로 출력

-s 간접블럭을 내포하는 블럭수를 출력

-t 화일명 대신에 수정된 시간으로 분류

-u -t 또는 -l option으로 분류하는 중에서 최종접근 시간을 사용

 

86. mail, Mail - 전자 우편 프로그램

 

87. make - 실행 파일을 만들거나, 특정 작업 파일을 만들 때 사용하는 도구

 

88. man - 온라인 사용자 설명서를 보는 명령

원하는 명령어의 사용방법을 CRT 화면에서 알고자하는 명령어

문법 man [option ... ] [chapter] title ...

 

89. mesg - 메시지 수신 상태를 보거나 지정

 

90. mkdir - 디렉토리 만들기

디렉토리 생성

% mkdir download : download 디렉토리 생성

 

91. mkstr - C 소스 파일을 참조로 오류 메시지 파일을 만듬.

 

92. more, page - 텍스트 파일 보기 명령

cat 명령어는 실행을 시키면 한 화면을 넘기는 파일일 경우 그 내용을 모두 볼수가 없다. 하지만 more명령어를 사용하면 한 화면 단위로 보여줄 수 있어 유용.

 

% more <옵션>

옵션은 다음과 같습니다.

Space bar : 다음 페이지

Return(enter) key : 다음 줄

v : vi 편집기로 전환

/str : str 문자를 찾음

b : 이전 페이지

q : more 상태를 빠져나감

h : 도움말

= : 현재 line number를 보여줌

 

93. mount - file system을 mount하는 명령어

file system을 mount하는 명령어

문법 mount [special directory [-r]]

options

special directory에 있는 블럭형 특수장치를 말한다

directory special이나 resource를 위한 적재 directory를 가리킨다

-r special이나 resource를 읽기허가하여 적재하도록 한다

 

94. mountall - 여러개의 file system을 mount하는 명령어

여러개의 file system을 mount하는 명령어

문법 mountall [-] file system

mountall [-k]

options

- 입력되는 데이타가 표준입력

-k 화일을 open시키고 프로세서를 찾은 다음 SIGKILL 시그널을 보낸다

 

95. mv, mvdir - 파일 이동이나, 이름 바꾸기

파일이름(rename) / 위치(move)변경

 

% mv index.htm index.html

: index.htm 화일을 index.html 로 이름 변경

$ mv file ../main/new_file

: 파일의 위치변경

 

96. nawk - 패턴 검색과 언어 처리

 

97. nice - 낮은 우선권에서 명령 실행

문법 nice [- number] command [arguments]

options

- number 우선 순위를 1에서 19까지로 지정하며 디폴터로는 10

 

98. nm - 심블 이름 목록 보기

 

99. nroff - 문서 포멧 도구

 

100. od - 8진수, 10진수, 16진수, ascii 덤프

8진수로 덤프하는 명령어

문법 od [-bcdox] [file] [[+[x]] offset [.] [b]]

options

-b 8진수로 byte를 해석

-c ASCII code로 byte를 해석

-d 10진수로 단어를 해석

-o 8진수로 단어를 해석

-x 16진수로 단어를 해석

 

101. passwd, chfn, chsh - 비밀번호, 핑거정보, 쉘 바꾸기

 

102. paste - 여러파일의 서로 관련 있는 줄 연결시키기

 

103. pr - 문서 파일 양식화 도구

 

104. printenv - 현재 환경 변수들의 내용과 그 값 알아보기

 

105. prof - profile 자료 보기

 

106. ps - 현재 프로세스 정보 보기

실행중인 프로세스에 관한 정보를 출력하는 명령어

문법 ps [options]

options

-a 프로세스 그룹의 리더 및 단말장치와 관계없는 프로세스를 제외한 빈번하게 사용되는 모든 프로세스에 관한 정보를 출력

-d 프로세스 그룹의 리더(rearder)를 제외한 모든 프로세스에 대한 정보를 출력

-e 현재 system내에서 실행중인 모든 프로세스 정보를 출력

-f 프로세스 관한 전부의 정보를 출력

-l 프로세스에 관한 정보를 long(롱)으로 출력

-n name list system 내의 name list 화일의 이름을 지정

-u uidlist 지정한 사용자 ID번호 또는 login명을 갖고있는 프로세스에 관한 정보만을 출력

 

107. ptx - permuted(순열화된?, 교환된?) 색인 만들기

 

108. pwd - 현재 작업 디렉토리 보기

 

109. quota - 한 사용자에게 지정된 디스크 할당량보기

 

110. ranlib - archive를 random 라이브러리로 변화

 

111. rcp - 리모트 카피

 

112. rcs - RCS 파일 속성 바꾸기

 

113. rcsdiff - RCS revisions 비교

 

114. rev - 한 줄의 문자열 꺼꾸로

 

115. rlogin - 리모트 로그인

 

116. rm, rmdir - 파일, 디렉토리 지우기

% rm test.html : test.html 화일 삭제

% rm -r <디렉토리> : 디렉토리 전체를 삭제

% rm -i a.*

: a로 시작하는 모든 파일을 일일이 삭제할 것인지 확인하면서 삭제

 

117. roffbib - 도서목록형 데이터베이스 보기 또는 양식화

 

118. rsh - 리모트 쉘

 

119. rup - 로칼 머쉰의 호스트 상태 보기(RPC version)

 

120. ruptime - 로칼 머쉰의 호스트 상태 보기

 

121. rusers - 현재 접속자 보기 (RPC version)

 

122. rwall - 모든 사용자에게 알림(RPC)

 

123. rwho - 현재 접속자 보기

 

124. sccs - Source Code Control System (SCCS)

125. sccs-admin, admin - SCCS 사용 내역 파일을 만들고, 관리

 

126. sccs-cdc, cdc - SCCS 델타의 델파 주석을 바꿈

 

127. sccs-comb, comb - SCCS 델타 조합

 

128. sccs-delta, delta - SCCS 파일에 데해 델타를 만듬

 

129. sccs-get, get - SCCS 파일 버전확인

 

130. sccs-help, help - SCCS 오류나 경고 메시지 검색

 

131. sccs-prs, prs - SCCS 사용내역의 선택된 부분 보기

 

132. sccs-prt, prt - SCCS 파일에서 델타 테이블 정보를 봄

 

133. sccs-rmdel, rmdel - SCCS 파일에서 델타를 지움

 

134. sccs-sact, sact - SCCS 파일의 편집 상태를 봄

 

135. sccs-sccsdiff, sccsdiff - SCCS 파일들의 버전 비교

 

136. sccs-unget, unget - SCCS 파일의 미리 얻은 것(?)을 취소한다.

 

137. sccs-val, val - SCCS 파일 유요화

 

138. script - 화면 갈무리

 

139. sdiff - 라인 단위의 차이를 비교하는 diff 명령어

문법 sdiff [losw] file1 file2

options

-r 라인 내용이 같으면 왼쪽만 출력

-o output 사용자가 지정한 문법으로 file1과 file2를 합병하고 같은 내용의 라

인을 output으로 지정한 화일에 복사

-s 같은 내용의 라인을 출력하지 않음

-Wn 인수 n 만큼 출력 라인의 폭을 지정

 

140. sed - stream editor

문법 sed [-efn] files

options

-e script 편집 명령어의 script를 지정

-n 이 옵션 생략시 출력하지 않음

-f sfile 화일 sfile에 script를 취하여 편집

-files 편집할 화일 지정

141. sh - 유닉스 표준 쉘

 

142. size - 오브젝트 파일의 크기들을 보여줌

 

143. sleep - 지정한 시간 만큼 실행 보류

초단위로 정의된 시간을 n 초 동안 실행을 정지시키는 명령어

문법 sleep time

 

144. sort - 줄 정열과 검색

모든 화일의 라인을 함께 소트(sort)하여 그 결과를 화면 또는 지정한 장소에 출력하는 명령어

문법 sort [-cmu]

[-o output]

[-ykmem]

[-zrecsz]

[-dfiMnr]

[-btx]

[+pos1 [pos2]] [files]

options

-b 필드비교시 앞에 붙는 공백을 무시

-c 입력화일이 순서대로 소트 되어있는지를 검사하여 소트되어 있지 않

으면 출력하지 않는다

-d 사전식 순서비교

-f 대문자와 소문자를 구별하지 않는다

-i 인쇄불가능 문자를 무시

문자비교에 있어 ASCII코드 040-0176의 문자만 유효

-r 역순으로 소트

-o output 출력화일명을 output으로 지정

-m 화일을 합병(merge)한다

-u 화일내의 같은 라인은 한 라인만 남기고 삭제

 

145. sortbib - 도서목록형 데이터베이스 정열

 

146. spell, hashmake, spellin, hashcheck - 맞춤범 검사(물론 영어겠지요)

 

147. split - 파일 나누기

system의 화일을 분할하는 명령어

문법 split [-n] [file [name]]

options

-n 화일을 n라인씩 분할하며 이 옵션을 생략하면 1000라인씩 분할

 

148. strings - 오브젝트 파일이나, 실행 파일에서 문자열 찾기

 

149. strip - 오브젝트 파일에서 심벌 테이블과 중복된 비트 삭제

 

150. stty - 터미날 설정

단말장치의 옵션의 설정상황을 출력한다

문법 stty [-a] [-g] [options]

options

-a 모든 옵션의 설정사항을 출력

-g 현재의 설정사항을 출력

 

151. su - super-user, 임시적으로 새 ID로 바꿈

 

152. sum - 화일 check sum과 블럭수를 나타내는 명령어

문법 sum [-r] file

options

-r 알고리즘을 check sum계산에 사용

file sum 처리를 하는 화일명

 

153. symorder - 심벌 순서 바꿈

 

154. tabs - 터미날 tab 크기 지정

 

155. tail - 파일의 끝 부분 보기

% tail -n filename : n줄 만큼 아래에서부터 보여줌

 

156. talk - 다른 사용자와 이야기하기

 

157. tar - 여러 파일 묶기 또는 묶긴 파일 풀기

.tar, _tar로 된 파일을 묶거나 풀때 사용하는 명령어

(압축파일이 아님)

 

% tar cvf [파일명(.tar, _tar)] 압축할 파일(또는 디렉토리): 묶을때

% tar xvf [파일명(.tar, _tar)] : 풀 때

(cf) cvfp/xvfp 로 하면 퍼미션 부동

 

아카이브 화일을 자기테이프에 저장하는 명령어

문법 tar [crtuxNbf lmgvw] [file ... ]

options

c 새로운 테이프에 새로 저장

r 지정한 화일을 테이프의 마지막부터 저장

t 지정한 화일이 테이프에 검출될 때마다 화일명 및 정보를 출력

x 지정한 화일을 테이프에서 꺼집어 낸다

 

158. tbl - nroff 또는 troff의 도표 작성 도구

 

159. tee - 표준 출력으로 방향 전환

 

160. telnet - TELNET 프로토콜을 이용한 원격 리모트 호스트 접속

 

161. test - 주워진 환경이 참인지, 거짓인지를 돌려줌

 

162. tftp - 간단한 ftp.

 

163. time - 명령 실행 시간 계산

 

164. touch - 파일 날짜 관련 부분을 바꿈

파일이나 디렉토리의 timestamp를 업데이트시키는 명령어이다. 현존하는 특정 파일을 지정하지 않으면,해당 이름의 비어있는 파일이 생성된다

 

165. troff - 문서 양식화 도구

 

166. true, false - 쉘 스크립트에서 사용되는 참/거짓을 리턴하는 명령

 

167. tsort - topological sort

 

168. tty - 현재 터미날 이름 보기

 

169. ue - MICROemacs

 

170. ul - 밑줄 속성 문자 표현

 

171. umask - 시스템 파일이 만들어질 때 허가권의 기본값을 정하기 위해 사용되는 명령어

 

172. unifdef - cpp 입력 줄에서 ifdef 부분 바꾸거나 지움

 

173. uniq - 중복되는 빈줄 지우기

문법 uniq [-dcu [+n] [-n]] [input [output]]

options

-c 각 라인 앞의 중복된 횟수를 나타낸다

-d 중복된 라인의 첫째 라인만 출력

-u 중복되지 않은 라인만 출력

input 입력화일 지정

output 출력화일 지정

 

174. units - 프로그램 변환도구

 

175. uptime - 시스템 부팅 기간 보기

 

176. users - 현재 접속 사용자 보기

 

177. uucp, uulog, uuname - 시스템 간의 복사

178. uuencode, uudecode - 이진 파일을 아스키파일로 인코딩, 반대로 디코딩

 

179. uusend - 리모트 호스트에 파일 보내기

 

180. uux - 리모트 시스템 명령 실행

 

181. vacation - 자동으로 편지 답장하기

 

182. vgrind - grind nice program listings

 

183. vi, view, vedit - ex 바탕의 편집기

 

184. vtroff - 문서 양식화 도구

 

185. w - 현재 누가 접속해 있으며, 무엇을 하고있는지

 

186. wait - 프로세스가 마치기를 기다림

프로세스의 종료를 기다린 후 그 결과를 출력하는 명령어

문법 wait [n]

options

n 대기하는 백그라운드 프로세서 ID를 지정

 

187. wall - 모든 사용자에게 알림

UNIX sysytem을 사용하는 모든 사용자에게 메세지를 전달하는 명령어

문법 wall login name

 

188. wc - 단어, 줄, 바이트 계산

화일에 있는 단어 ,라인,문자수를 계산하는 명령어

문법 wc [-clw] [file ... ]

options

-c 문자수만 계산

-l 라인수만 계산

-w 단어수만 계산

 

189. what - 파일에서 SCCS 버전 정보 알아냄

 

190. whatis - 명령의 간단한 설명 보여줌

 

191. whereis - 찾는 명령의 실행파일, 소스, 맨페이지가 어디 있는지 경로를 보여줌

 

192. which - 명령만 찾음.

 

193. who - 시스템에 접속되어 있는 사람만 보여줌

 

194. whoami - 현재 사용하고 있는 자신이 누군지 보여줌

 

195. write - 다른 사용자의 화면에 특정 내용을 알림

다른 사용자에게 메세지를 전달하는 명령어

문법 write user [line]

options

user 메세지를 보내는 사용자명

line 접속할 라인이나 terminal을 지정

 

196. xargs - 명령행 인자 처리 명령

 

197. xstr - extract strings from C programs to implement shared strings

 

198. yacc - yet another compiler-compiler: 파싱(형태소분석) 프로그램 생성기

 

199. yes - 항상 yes만 응답하는 명령

 

200. zcat - 압축 파일 내용보기  

'2010년 이전 글 > computer' 카테고리의 다른 글

TCPDUMP 사용법  (0) 2007.10.30
블루스크린 ErrorCode Define 값입니다.  (0) 2007.09.21
gcc와 make 강좌  (0) 2007.05.01
vi 사용법의 모든것 !!! [리눅스]  (0) 2007.05.01
리눅스 명령어 모음 !!!  (0) 2007.05.01
and

gcc와 make 강좌

지은이 : 이만용(geoman), 옮긴이 : 조한석(junye)

v1.0, 1997년 6월 11일 수요일


이 문서는 나우누리 "Linux 사용자 모임" 12-2번 강좌란 게시판에 올라온 이만용님의 강좌 "gcc와 make에 대한 강좌"를 sgml문서로 만든 것입니다.

참고문헌

Running LINUX(Matt Welsh, Lar Kaufman), "오렐리 출판사"

1.시작하면서

2.gcc 강좌

3.make 강좌


이전페이지다음페이지차례

and

 

 

VI 사용법의 모든것 !!!

 

삽입 명령

a

커서 뒤에 입력

A

라인 끝에 입력

i

커서 앞에 입력

I

라인시작 부분에 입력

o

커서 있는 라인 밑에 입력

O

커서가 있는 라인 위에 입력

커서 이동 명령

h

왼쪽으로 커서 한 칸 이동

H

화면의 처음으로 이동

L

오른쪽으로 한 칸 이동

L

화면 끝으로 이동

e

다음 단어의 마지막으로 이동

E

커서를 공백으로 구분된 다음 단어 끝으로 이동

b

한 단어 뒤로 이동

B

커서를 공백으로 구분된 이전 단어로 이동

w

커서를 한 단어 뒤로 이동

W

커서를 공백으로 구분된 다음 단어로 이동

k

커서를 한 라인 위로 이동

j

커서를 한 라인 아래로 이동

O

커서를 라인의 시작으로 이동

$

커서를 라인의 끝으로 이동

Enter

커서를 다음 라인 시작으로 이동

-

커서를 전 라인의 시작으로 이동

Ctrl + F

다음 화면으로 이동

Ctrl + D

화면의 반만 앞으로 이동

Ctrl + B

전 화면으로 이동

Ctrl + U

화면의 반만 뒤로 이동

G

커서를 텍스트 마지막 라인으로 이동

숫자G

커서를 숫자 라인만큼 이동

M

커서를 화면 중간 라인으로 이동

커서를 전 위치로 이동

(

문장의 시작으로 이동

{

문단의 시작으로 이동

)

문장 끝으로 이동하여 다음 단어의 시작으로 커서 이동

}

문단 끝으로 이동

삭제 명령

x

커서가 있는 문자 삭제

X

커서가 있는 문자 앞에 있는 문자 삭제

dw

커서가 있는 단어 삭제

db

커서가 앞에 있는 단어 삭제

dW

공백으로 구분된 뒷 단어 삭제

dB

공백으로 구분된 앞 단어 삭제

dd

커서가 있는 라인 삭제

D

커서가 있는 라인의 나머지 삭제

d)

문장의 나머지 삭제

d}

문단의 나머지 삭제

dG

파일의 나머지 삭제

dH

화면의 시작까지 삭제

dL

화면의 나머지 삭제

J

커서와 다음 단어의 공백을 모두 삭제

바꾸기명령

r

커서에 있는 문자 대치

R

입력 모드로 한 문자씩 덮어씀

s

커서가 있는 문자 삭제 후 입력 모드로 전환

S

커서가 있는 줄을 삭제 후 입력 모드로 전환

cb

커서가 있는 앞 문자 삭제 후 입력 모드

cW

공백으로 구분된 뒷 단어를 삭제 후에 입력 모드

cB

공백으로 구분된 앞 단어 삭제 후 입력 모드

cc

커서가 있는 라인을 삭제하고 입력 모드

C

커서가 있는 라인의 나머지를 삭제하고 입력 모드로 전환

cO

커서에서부터 라인의 시작까지 텍스트 바꾸기

c

특정 텍스트 바꾸기

c)

문장의 나머지 바꾸기

c}

문단의 나머지 바꾸기

cG

파일의 나머지 바꾸기

cm

표시까지 모든 것 바꾸기

cL

화면의 나머지 바꾸기

ch

화면의 시작까지 바꾸기

이동

p

삭제나 복사된 텍스트를 커서가 있는 문자나 라인 뒤에 삽입

P

삭제나 복사된 텍스트를 커서가 잇는 문자나 라인 앞에 삽입

dw p

커서가 있는 단어를 삭제한 후 이를변경한 커서가 있는 것 뒤에 삽입

dw P

커서가 잇는 단어를 삭제 후 이를 변경한 커서 있는 곳 앞으로 삽입

d p

지정한 다음 텍스트로 삭제한 후 커서가 가리키는 곳으로 이동

d) P

문장의 나머지로 이동

d} p

문단의 나머지로 이동

dG P

파일의 나머지로 이동

dH p

회면 시작 부분으로 이동

dL P

화면의 나머지를 이동

복사

yw

커서가 있는 단어를 복사

yb

커서가 있는 앞 단어를 복사

yW

공백으로 구분된 뒷 단어 복사

yB

공백으로 구분된 앞 단어를 복사

y

특정한 다음 텍스트 복사

yy

커서가 있는 라인을 복사, 커서가 가리키는 곳으로 라인을 이동

y)

문자의 나머지 복사

y}

문단의 나머지 복사

yG

파일의 나머지 복사

yH

화면의 시작까지 복사

yL

화면의 나머지 복사

검색

/patter

n

텍스트에서 앞으로 패턴 검색

>patter

텍스트에서 뒤로 패턴 검색

n

앞 또는 뒤로 이전 검색 반복

N

반대 방향으로 이전 검색 반복

/

전 검색을 앞으로 반복

?

전 검색을 뒤로 반복

 

vi에디터종료 마치기 명령

 

:q

그대로 종료하기

 

:q!

변경된 내용을 저장하지 않고 강제로 종료하기

 

:wq

변경된 내용을 저장하고 종료하기

 

:x

:wq와 동일한 명령

 

ZZ

:wq와 동일한 명령

 

삽입 명령

 

a

커서 뒤에 입력

A

라인 끝에 입력

 

I

커서 앞에 입력

I

라인시작 부분에 입력

 

o

커서 있는 라인 밑에 입력

O

커서가 있는 라인 위에 입력

 

방향키를 이용한 커서 이동 명령

 

<-,Del

왼쪽으로 커서 한 칸 이동

PageUp

화면 위로 이동

 

->

SpaceBar

오른쪽으로 한 칸 이동

PageDown

화면 아래로 이동

 

윗 줄로 커서 이동

Enter

다음 줄 첫 칸으로 이동

 

아래 줄로 커서 이동

Esc

다음 줄 첫 칸으로 이동

 

Home

줄 처음 칸으로 이동

 

다른 키를 이용한 커서 이동 명

 

H

왼쪽으로 커서 한 칸 이동

k

윗 쪽으로 커서 이동

 

l

오른쪽으로 한 칸 이동

j

아래쪽으로 커서 이동

 

e

다음 단어의 마지막 칸으로 이동

E

공백으로 구분된 뒷 단어의 마지막 칸으로 이동

 

b

앞 단어의 앞 칸으로 이동

B

공백으로 구분된 앞 단어의 앞 칸으로 이동

 

W

다음 단어의 앞 칸으로 이동

W

공백으로 구분된 뒷 단어의 앞 칸으로 이동

 

그 외의 키를 이용한 커서 이동 명령

 

Ctrl + F

다음 화면으로 이동

Ctrl + D

반 화면 위로 이동

 

Ctrl + B

(앞) 화면으로 이동

Ctrl + L

반 화면 아래로 이동

 

O

줄이 시작되는 첫 칸으로 이동

-

이전 줄의 시작 부분으로 이동

 

$

줄이 끝나는 마지막 칸으로 이동

+

다음 줄의 시작 부분으로 이동

 

(

문장의 시작으로 이동

{

문단의 시작으로 이동

 

)

문장의 끝으로 이동하여 다음 단어의 시작 첫 칸으로 커서 이동

}

문단의 끝으로 이동

 

G

문서의 마지막 줄로 이동

이전의 커서 위로 이동

 

nG

n번째 줄로 이동

M

화면 중간 줄에 커서 이동

 

삭제 명령

 

x

커서가 있는 문자 삭제

X

커서가 있는 문자 앞에 있는 문자 삭제

 

dw

커서가 있는 단어 삭제

db

커서 앞에 있는 단어 삭제

 

dW

공백으로 구분된 뒷 단어 삭제

dB

공백을 구분된 앞 단어 삭제

 

dd

커서가 있는 라인 삭제

D

커서가 있는 라인의 나머지 삭제

 

d)

문장의 나머지 삭제

d}

문단의 나머지 삭제

 

dG

파일의 나머지 삭제

dH

화면의 시작까지 삭제

 

dL

화면의 나머지 삭제

J

커서와 다음 단어 사이의 모든 공백 삭제

 

바꾸기 명령

 

R

커서에 잇는 문자 대치

R

입력 모드로 한문자식덮어 씀

 

s

커서가 있는 문자 삭제 후 입력 모드로 전환

D

커서가 있는 줄을 삭제한 후 입력 모드로 전환

 

cb

커서가 있는 앞 문자 삭제 후 입력 모드

cW

공백으로 구분된 뒷 단어를 삭제한 후 입력 모드

 

cB

공백으로 구분된 앞 단어 삭제 후 입력 모드

cc

커서가 있는 라인을 삭제하고 입력 모드

 

C

커서가 있는 라인의 나머지를 삭제하고 입력 모드로 전환

cO

커서에서부터 라인의 시작까지 텍스트 바꾸기

 

c

특정 텍스트 바꾸기

c)

문장의 나머지 바꾸기

 

c}

문단의 나머지 바꾸기

cG

파일의 나머지 바꾸기

 

cH

화면의 시작까지 바꾸기

cL

화면의 나머지 바꾸기

 

텍스트 이동

 

p

삭제나 복사된 텍스트를 커서가 있는 문자나 라인 뒤에 삽입

P

삭제나 복사된 텍스트를 커서가 있는 문자나 라인 앞에 삽입

 

dw p

커서가 있는 단어를 삭제한 후 이를 원하는 곳 커서 뒤로 삽입

dw P

커서가 있는 단어를 삭제한 후 이를 변경한 커서가 있는 곳으로 삽입

 

d p

지정한 다음 텍스트로 삭제한 후 커서가 가리키는 곳으로 이동

d) P

문장의 나머지로 이동

 

d} p

문단의 나머지로 이동

dG P

파일의 나머지로 이동

 

dH P

화면 시작 부분으로 이동

dL P

화면의 나머지를 이동

 

복사

 

yw

커서가 있는 단어를 복사

yb

커서가 잇는 앞 단어를 복사

 

yW

공백으로 구분된 뒷 단어 복사

yB

공백으로 구분된 앞 단어를 복사

 

y

특정한 다음 텍스트 복사

yy

커서가 있는 라인을 복사, 커서가 가리키는 곳으로 라인을 이동

 

y)

문자의 나머지 복사

y}

문단의 나머지 복사

 

yG

파일의 나머지 복사

yH

화면 시작까지 복사

 

yL

화면의 나머지 복사

 

검색

 

/pattern

텍스트에서 앞으로 패턴 검색

>pattern

텍스트에서 뒤로 패턴 검색

 

n

앞 또는 뒤로 이전 검색 반복

N

반대 방향으로 이전 검색 반복

 

/

전 검색을 앞으로 반복

?

전 검색을 뒤로 반복

 

옵션

옵션약어

기능

디폴트

autoindent

ai

들여 쓰기 가능, 탭으로 들여 쓰기 범위 지정

off

autoprint

ap

줄이 바뀔 때 현재 줄을 화면상에서 출력

on

errobells

ed

명령 에러가 발생시 삑 소리나게 함

off

number

nu

줄 번호를 나타나게 함

off

report

report

편집시 메시지를 보낼 편집 변화 크기 지정

5

showmatch

sm

가로 닫기 괄호를 사용할 때 일치하는 가로 열기 괄호를 보여줌

off

wam

wam

저장하지 않고vi 종료할 때 경고 메시지를 뿌려 줌

on

ignorecase

ic

검색 패턴에 사용되는 대소문자 구별하지 않음

on

tabstopp=n

ts=n

탭 공백을n 수만큼 지정

8

wrapmargin=n

wm=n

텍스트 오른쪽 여백을n 수만큼 지정

0

 

'2010년 이전 글 > computer' 카테고리의 다른 글

HP-UX 쉘 명령어 총정리  (0) 2007.08.22
gcc와 make 강좌  (0) 2007.05.01
리눅스 명령어 모음 !!!  (0) 2007.05.01
patch & diff & CVS  (0) 2007.05.01
DBA라면 이 정도는 알고 있어야 하지 않을까요 !!!  (0) 2007.02.03
and


addbib -도서목록형식의데이터베이스를 만들거나, 확장
apropos - 사용설명서의
키워드검색
ar -
라이브러리만들기, 관리
at, batch - 원하는 시간에 원하는 명령을 실해하게 하는 명령
awk - 패턴 검색과 언어 처리
banner - 큰 글자(배너) 만들기
basename - 경로 이름에서 마지막에 있는 이름만 출력
biff - 자신에게 편지가 배달되면 알려주는 명령
bin-mail, binmail - 예전에 사용한 전자우편 프로그램
cal - 달력보기
calendar - 간단한 일정표
cat - 파일 병합과 내용 보기
cb - 간단한 C 프로그램 beautifier(?)
cc - C
컴파일러
cd - 작업 디렉토리
바꾸기
checknr - nroff 또는 troff 입력 파일 검사; 오류를 보여준다
chgrp - 파일의 사용자 그룹 바꾸기
chmod - 파일의 접근 권한 바꾸기
clear - 터미날 화면 깨끗이 하기
cmp - 두 파일을
바이트단위로 비교
colcrt - troff 파일의 밑줄 속성 문자 처리
comm - 지정 두파일의 줄 단위 비교와 그 처리
compress, uncompress, zcat - 파일 압축관련 유틸리티들
cp - 파일 복사
cpio - copy file archives in and out
cpp - C 언어 전처리기
csh - C 문법과 비슷한 쉘
스크립트문법과 기타 여러 기능이 내장된 쉘
ctags - ex 나 vi
편집기에서 사용될 tag 파일을 만드는 명령
date - 시스템 시간 보기나 지정하기
dbx - 소스 수준의 디버거
deroff - nroff, troff, tbl, eqn 관련 내용 지움
df - disk free:
디스크의 남은 용량 보기
diff - 두 파일의 차이점 비교
du - disk used : 디스크 사용량 보기
echo - 인자를 표준 출력으로 출력
ed, red - 기본 줄 편집기
eqn, neqn, checkeq - 수식 표현 포멧 도구
error - 컴파일러 오류 메시지 목록
ex, edit, e - 줄 편집기
expand, unexpand - TAB 문자를
공백문자로 바꿈, 또는 그 반대로
expr - 인자를 수식으로 처리
file - 파일 형식 알아보기
find - 파일 찾기
finger - 사용자 정보 알아보기
fmt, fmt_mail - 간단한 문서나, 편지 포멧 도구
fold - 긴 줄 출력 방법 지정
ftp - 파일 전송 프로그램
gcore - 실행 중인
프로세스의 core 이미지를 구한다.
gprof - call-graph profile data(?)를 보여줌
grep -
문자열찾기
groups - 사용자의 그룹을 보여줌
history - 이전 명령 보기
hostname - 현재 시스템 이름을 보여줌
imake - makefile 만드는 프로그램
indent - C 프로그램 소스 파일을
들여쓰기하는 포멧 도구
install - 파일 설치
join - 관계형 데이터베이스
연산자
kill - 프로세스 죽이기 - "마누라 죽이기"와 상관없음 :-)
last - 사용자가 마지막 접속 상태를 보여줌
ld, ld.so - 링크 편집기, 동적 링크 편집기
leave - 자신의 접속 종료 시간을 알려줌
less - more 명령의 확장
lex - 어휘 분석 프로그램 생성기
lint - C 프로그램 verifier
ln - 파일의 하드, 심벌릭 링크 명령
login - 시스템 접속 명령
look - 시스템 디렉토리나, 정열된 목록에서 단어 찾기
lookbib - 도서목록형
데이타베이스에서 찾기
lorder -
오브젝트라이브러리의 관계 찾기
lp, cancel - 인쇄 시작, 취소
lpq - 인쇄 작업 상황 보기
lpr - 인쇄
lprm - 인쇄 작업 지우기
ls - 디렉토리 내용 보기
mail, Mail - 전자 우편 프로그램
make - 실행 파일을 만들거나, 특정 작업 파일을 만들 때 사용하는 도구
man - 온라인 사용자 설명서를 보는 명령
mesg - 메시지 수신 상태를 보거나 지정
mkdir - 디렉토리 만들기
mkstr - C 소스 파일을 참조로 오류 메시지 파일을 만듬.
more, page - 텍스트 파일 보기 명령
mv - 파일 이동이나, 이름 바꾸기
nawk - 패턴 검색과 언어 처리
nice - 낮은
우선권에서 명령 실행
nm - 심블 이름 목록 보기
nroff - 문서 포멧 도구
od - 8진수, 10진수, 16진수,
ascii덤프
passwd, chfn, chsh -
비밀번호, 핑거정보, 쉘 바꾸기
paste - 여러파일의 서로 관련 있는 줄 연결시키기
pr - 문서 파일 양식화 도구
printenv - 현재 환경 변수들의 내용과 그 값 알아보기
prof - profile 자료 보기
ps - 현재 프로세스 정보 보기
ptx - permuted(순열화된?, 교환된?) 색인 만들기
pwd - 현재 작업 디렉토리 보기
quota - 한 사용자에게 지정된 디스크 할당량보기
ranlib - archive를 random 라이브러리로 변화
rcp -
리모트카피
rcs - RCS 파일 속성 바꾸기
rcsdiff - RCS revisions 비교
rev - 한 줄의 문자열 꺼꾸로
rlogin - 리모트 로그인
rm, rmdir - 파일, 디렉토리 지우기
roffbib - 도서목록형 데이터베이스 보기 또는 양식화
rsh - 리모트 쉘
rup - 로칼 머쉰의
호스트상태 보기(RPC version)
ruptime - 로칼 머쉰의 호스트 상태 보기
rusers - 현재 접속자 보기 (RPC version)
rwall - 모든 사용자에게 알림(RPC)
rwho - 현재 접속자 보기
sccs - Source Code Control System (SCCS)
sccs-admin, admin - SCCS 사용 내역 파일을 만들고, 관리
sccs-cdc, cdc - SCCS 델타의 델파 주석을 바꿈
sccs-comb, comb - SCCS 델타 조합
sccs-delta, delta - SCCS 파일에 데해 델타를 만듬
sccs-get, get - SCCS 파일 버전확인
sccs-help, help - SCCS 오류나 경고 메시지 검색
sccs-prs, prs - SCCS 사용내역의 선택된 부분 보기
sccs-prt, prt - SCCS 파일에서 델타
테이블정보를 봄
sccs-rmdel, rmdel - SCCS 파일에서 델타를 지움
sccs-sact, sact - SCCS 파일의 편집 상태를 봄
sccs-sccsdiff, sccsdiff - SCCS 파일들의 버전 비교
sccs-unget, unget - SCCS 파일의 미리 얻은 것(?)을 취소한다.
sccs-val, val - SCCS 파일 유요화
script - 화면 갈무리
sed - stream editor
sh -
유닉스표준 쉘
size - 오브젝트 파일의 크기들을 보여줌
sleep - 지정한 시간 만큼 실행 보류
sort - 줄 정열과 검색
sortbib - 도서목록형 데이터베이스 정열
spell, hashmake, spellin, hashcheck - 맞춤범 검사(물론 영어겠지요)
split - 파일 나누기
strings - 오브젝트 파일이나, 실행 파일에서 문자열 찾기
strip - 오브젝트 파일에서 심벌 테이블과 중복된 비트 삭제
stty - 터미날 설정
su - super-user, 임시적으로 새 ID로 바꿈
symorder - 심벌 순서 바꿈
tabs - 터미날 tab 크기 지정
tail - 파일의 끝 부분 보기
talk - 다른 사용자와 이야기하기
tar - 여러 파일 묶기 또는 묶긴 파일 풀기
tbl - nroff 또는 troff의 도표 작성 도구
tee - 표준 출력으로 방향 전환
telnet- TELNET프로토콜을 이용한 원격 리모트 호스트 접속
test - 주워진 환경이 참인지, 거짓인지를 돌려줌
tftp - 간단한 ftp.
time - 명령 실행 시간 계산
touch - 파일 날짜 관련 부분을 바꿈
troff - 문서 양식화 도구
true, false - 쉘 스크립트에서 사용되는 참/거짓을 리턴하는 명령
tsort - topological sort
tty - 현재 터미날 이름 보기
ue - MICROemacs
ul - 밑줄 속성 문자 표현
unifdef - cpp 입력 줄에서 ifdef 부분 바꾸거나 지움
uniq - 중복되는 빈줄 지우기
units - 프로그램 변환도구
uptime - 시스템 부팅 기간 보기
users - 현재 접속 사용자 보기
uucp, uulog, uuname - 시스템 간의 복사
uuencode, uudecode - 이진 파일을
아스키파일로 인코딩, 반대로 디코딩
uusend - 리모트 호스트에 파일 보내기
uux - 리모트 시스템 명령 실행
vacation - 자동으로 편지 답장하기
vgrind - grind nice program listings
vi, view, vedit - ex 바탕의 편집기
vtroff - 문서 양식화 도구
w - 현재 누가 접속해 있으며, 무엇을 하고있는지
wait - 프로세스가 마치기를 기다림
wall - 모든 사용자에게 알림
wc - 단어, 줄, 바이트 계산
what - 파일에서 SCCS 버전 정보 알아냄
whatis - 명령의 간단한 설명 보여줌
whereis - 찾는 명령의 실행파일, 소스, 맨페이지가 어디 있는지 경로를 보여

which - 명령만 찾음.
who - 시스템에 접속되어 있는 사람만 보여줌
whoami - 현재 사용하고 있는 자신이 누군지 보여줌
write - 다른 사용자의 화면에 특정 내용을 알림
xargs -
명령행인자 처리 명령
xstr - extract strings from C programs to implement shared strings
yacc - yet another compiler-compiler: 파싱(형태소분석) 프로그램 생성기
yes - 항상 yes만 응답하는 명령
zcat - 압축 파일 내용보기

and
마이크로소프트웨어 잡지에 연재된 내용입니다.. 참조해 보세요..

리눅스 개발자들에게 중요한 것 중의 하나가 오픈소스 프로젝트 진행이다. 사실 국내에서도 오픈소스 프로젝트는 많은 사람들이 관심을 갖고 있지만 막상 프로젝트에 참여하는 사람들의 숫자는 여전히 부족하다. 여기서는 여러 개발자들이 동시에 오픈소스 프로젝트에 참가할 때 거의 필수적으로 쓰이는 diff, patch, CVS(Concurrent Versions System)와 같은 소스코드 버전 관리툴에 대해 살펴 보고 오픈소스 프로젝트를 진행할 때 알아두면 좋은 특성이나 작업 방식에 대해서도 알아 본다.

오픈소스 프로젝트란 도대체 어떤 것일까? 리눅스와 오픈소스의 부상과 더불어 오픈소스 개발 방식은 기존의 상용 소프트웨어 개발 방식에 비해 적은 비용으로 양질의 소프트웨어를 개발할 수 있으며 소프트웨어 시장 독점의 문제가 없다는 의견이 설득력을 계속 높여가고 있다.

그러나 필자가 보기에는 오픈소스 개발 방식은 그 효율성을 논의하기 전에 왜 이런 식의 개발 방식이 만들어 졌으며 왜 오픈소스 스타일의 개발 방식이 자연스럽게 정착되었는지를 이해하는 것이 더욱 중요하다고 생각한다. 필자의 의견으로는 오픈소스는 소프트웨어를 소프트웨어 그 자체가 지닌 특성에 맞도록 자연스럽게 개발하는 한 방법이라고 생각한다.

당연한 얘기지만 어떠한 소프트웨어의 소스코드를 공개하면 그 소프트웨어가 계속 바뀌어 나갈 수 있는 길이 열리게 된다. 소스코드를 공개해서 개발 작업을 진행하는 오픈소스 개발 방법이 두드러지게 나타난 것은 1970년대 초 AT&T에서 자사의 운영체제인 유닉스의 소스코드를 공개한 이후부터라고 보는 것이 정설이다. AT&T에서는 대학과 같은 교육, 연구 기관에 자사의 제품인 유닉스를 공급하면서 돈을 받고 소스코드를 그대로 제공하는 라이선스 방식을 취했다.

소프트웨어를 배포할 때 소스가 아닌 바이너리를 주로 배포하는 지금으로서는 언뜻 상상하기 어려운 관행일 수도 있지만 컴퓨터의 종류가 통일되어 있지 않고, 소수의 전문가 집단에서 유닉스를 주로 사용했다는 점을 생각해 본다면 AT&T 입장에서 유지보수 비용을 줄여주는 이러한 소스코드 형태의 배포는 나름대로 합리적인 선택이라고도 할 수 있겠다.

그러나 여기서 예상하지 못한 일이 벌어진 것이 이들 사용자, 혹은 사용자이면서 개발자이기도 한 사람들이 마음대로 뜯어고치고 덧붙이기 시작한 코드들이 오리지널 AT&T 유닉스보다 오히려 더 중요한 위치를 차지하게 된 것이다(BSD 유닉스의 발전도 이러한 관습에 뿌리를 두고 있다).

따라서 자유 소프트웨어나 오픈소스와 같은 용어들은 소프트웨어 개발 방식의 측면에서 볼 때 이미 존재하고 있던 개발 방식을 새롭게 재조명하고 있다고 생각할 수 있다. 자유 소프트웨어에서는 소스코드가 공개된 소프트웨어의 보호에 좀 더 중점을 두고 있으며 오픈소스에서는 소스코드가 공개된 채로 개발되는 소프트웨어의 개발 효율성에 좀 더 관심을 집중하는 편이다. 어느 경우이든 간에, 소스코드를 공개해서 개발자의 참여를 이끌어 내는 소프트웨어 개발 방식은 변함이 없으며, 오픈소스라는 단어가 아예 없던 시절에도 이것은 마찬가지인 것이다.

그렇다면, 이제 간단한 상황 하나를 가정해 보기로 하자. 여러분들이 초기 유닉스 시절 대학 전산실에 근무하던 도중 유닉스가 도입되었다고 생각해보자. 고된 포팅과 설정 작업 끝에 시스템이 제대로 돌아가기 시작했는데 이 와중에서 버그를 하나 발견하고 그 부분의 소스코드를 수정했다. 이럴 때 다음 버전의 유닉스에 여러분들이 고친 부분이 반영되도록 하려면 어떻게 해야 할까?

이럴 때 가장 상식적인 해법은 고친 부분의 소스코드를 원저자에게 보내주면 될 것이다. 그리고 그 방법으로 가장 편리한 것은 아마도 이메일이 좋을 것이다. 인터넷이 없던 시절이라면 아마도 일반 메일을 이용했을 것이다. 약간은 논외의 이야기지만, 인터넷 초창기에는 국내에서 유즈넷 뉴스그룹에 올라온 글을 보기 위해 정기적으로 뉴스서버 데이터 백업을 외국에서 자기 테이프에 받아 소포로 전송받기도 했다고 한다. 어쨌든 이러한 이메일의 간편함 덕분에 이메일은 오픈소스 개발 작업에서 가장 중요한 통신 수단이며 패치 전송 수단으로 자리 잡게 된다.

여기서 하나 생각해 봐야 할 것이 원저자의 입장이다. 이렇게 패치를 담고 있는 메일의 숫자가 적을 때는 원저자는 그저 전송된 패치를 고맙게 받아 적용하기만 하면 되겠지만 패치의 숫자가 늘어나고, 같은 버그에 대해서도 두 종류 이상의 중복 패치가 생기게 되면 어떤 패치를 선택할 것인지, 그리고 모은 패치를 어떻게 통합해서 하나의 소스코드 트리로 만들고 그것을 배포(public release)할 것인지 선택해야 하는 문제가 생긴다. 이런 경우, 보통 오픈소스계의 관습은 원저자, 혹은 프로젝트 리더에게 어떤 패치를 받아들일 것인지의 결정권을 맡겨버리는 경향이 있다. 이럴 때 원저자나 프로젝트 리더는 ‘자비로운 독재자(benevolent dictator)’라는 역할을 맡게 되는 것이다.

또한, 패치가 전송될 때 사람들마다 통일되지 않은 방식으로 패치를 전송하게 되면 프로젝트 리더의 입장에서는 여러 종류의 패치를 하나의 소스코드 트리에 적용시키는 데 많은 혼란을 겪게 될 것이다. 이를 해결하기 위해 등장한 심플한 도구가 바로 diff와 patch이다.

diff와 patch
diff는 유닉스 사용자 튜토리얼에도 가끔씩 등장하는 간단한 유틸리티이다. diff의 역할은 두 파일간의 차이점을 보여주는 데 소스코드의 바뀐 부분을 보여 줄 때 많이 쓰인다. patch는 이러한 diff의 출력 결과를 이용해서 이 바뀐 부분을 원래의 소스코드에 업데이트할 때 쓰는 유틸리티이다.

diff의 일반용법
우선, diff의 형식은 다음과 같다.

diff [options] from-file to-file

diff는 두 개의 파일을 필요로 한다는데 주의하자. from-file은 원래의 파일, 즉 구 버전의 파일이며, to-file은 새로이 바뀐 새 버전의 파일이다. diff는 이렇게 하면 from-file에서 to-file로 어떠한 변화가 있었는지를 출력해 준다. from-file과 to-file은 모두 디렉토리가 올 수도 있는데 디렉토리가 오는 경우는 조금 뒤에 살펴보기로 하자. 참고로 간단한 예제 hello1.c와 hello2.c의 예를 들어보자. 다음에서 볼 수 있듯이 hello2.c는 hello1.c에서 hello, world 부분이 hello, the world of linux로 대치되었고 그 아랫줄에 공백 라인 하나와 printf("Testing one two three.\n");가 추가되었음을 볼 수 있다.

*** hello1.c:
#include
#include
main()
{
    printf("hello, world.\n");
}

*** hello2.c:
#include
main()
{
    printf("hello, the world of Linux.\n");
    printf("Testing one two three.\n");
}

diff 결과는 다음과 같다.

$ diff hello1.c hello2.c
2d1
< #include
6c5,7
<     printf("hello, world.\n");
---
>     printf("hello, the world of Linux.\n");
>
>     printf("Testing one two three.\n");

첫 줄의 2d1은 hello1의 두 번째 줄에서 한 줄을 삭제(delete)하는 변화가 일어났다는 의미이다. 그리고 조금 아래의 6c5,7은 hello1의 6번째 줄을 아랫부분으로 바꾸는데(change) 그 결과가 5번째부터 7번째 라인까지 들어가게 된다는 의미이다. 그러나 실제로 프로그램 소스코드에서는 오리지널 diff의 결과물보다는 unified format의 diff 출력을 쓰는 경우가 많다. unified format을 쓰려면 diff에 -u 옵션을 추가한다.

$ diff -u hello1.c hello2.c
--- hello1.c    Tue Aug  3 14:34:46 2004
+++ hello2.c    Tue Aug  3 13:25:49 2004
@@ -1,7 +1,8 @@
#include
-#include

main()
{
-    printf("hello, world.\n");
+    printf("hello, the world of Linux.\n");
+
+    printf("Testing one two three.\n");
}

참고로 unified format에서는 변경되는 부분만이 아닌 변경되는 부분 근처의 내용(context)도 같이 출력됨을 볼 수 있다. 사람이 좀 더 읽기 편리한 context format 출력 옵션인 -c를 사용한 결과는 다음과 같다. context format 역시 바뀌는 부분 근처의 내용도 참고하기 좋게 출력을 해 준다. 어쨌거나 오픈소스 프로젝트에서는 diff를 쓸 때 주로 -u 옵션을 붙인다는 점을 꼭 외워 두도록 하자.

$ diff -c hello1.c hello2.c
*** hello1.c    Tue Aug  3 14:34:46 2004
--- hello2.c    Tue Aug  3 13:25:49 2004
***************
*** 1,7 ****
  #include
- #include
  
  main()
  {
!     printf("hello, world.\n");
  }
--- 1,8 ----
  #include
  
  main()
  {
!     printf("hello, the world of Linux.\n");
!
!     printf("Testing one two three.\n");
  }

이렇게 diff로 소스코드의 변경된 부분을 저장한 다음 이것을 원저자에게 메일로 보내면 된다.

$ diff -u hello1.c hello2.c > hello.diff

여러 개의 소스 파일을 diff로 비교하기
앞의 경우는 소스코드 파일 하나만이 변경되었지만 상황에 따라서는 패치 과정에 여러 파일이 수정되고 새로운 파일이 추가되는 경우가 발생할 수도 있다. diff는 디렉토리 단위의 파일 비교도 가능하다. 우선, 다음 예제를 보자.

$ pwd
/home/foobar
$ ls -F
src1/  src2/            # src1은 원본, src2는 새로운 기능 추가본
$ ls src1
hello1.c  hello2.c
$ ls src2
hello1.c  hello2.c  hello3.c
$ more src1/*c
::::::::::::::
src1/hello1.c
::::::::::::::
#include
#include

main()
{
    printf("hello, world.\n");
}
::::::::::::::
src1/hello2.c
::::::::::::::
#include

main()
{
    printf("hello, the world of Linux.\n");

    printf("Testing one two three.\n");
}
$ more src2/*c
::::::::::::::
src2/hello1.c
::::::::::::::
#include

main()
{
    printf("hello, world.\n");
}
::::::::::::::
src2/hello2.c
::::::::::::::
#include

main()
{
    printf("hello, the world of Linux.\n");

    printf("Testing one two three four.\n");
}
::::::::::::::
src2/hello3.c
::::::::::::::
#include
#include

main()
{
    /* needs to be filled in */
}

src2에서는 hello3.c 파일이 새로 추가되었으며, hello2.c에서 수정 부분이 있고, hello1.c에서 빠진 부분이 있다. 이 두 디렉토리 사이에서 diff를 실행하려면 다음과 같은 명령을 쓴다.

$ pwd
/home/foobar
$ ls -F
src1/ src2/             # 경로를 제대로 확인한 뒤 diff를 실행한다
$ diff -urN src1 src2
diff -urN src1/hello1.c src2/hello1.c
--- src1/hello1.c       Tue Aug  3 14:34:46 2004
+++ src2/hello1.c       Tue Aug  3 13:35:44 2004
@@ -1,5 +1,4 @@
#include
-#include

main()
{
diff -urN src1/hello2.c src2/hello2.c
--- src1/hello2.c       Tue Aug  3 13:25:49 2004
+++ src2/hello2.c       Tue Aug  3 13:35:57 2004
@@ -4,5 +4,5 @@
{
     printf("hello, the world of Linux.\n");

-    printf("Testing one two three.\n");
+    printf("Testing one two three four.\n");
}
diff -urN src1/hello3.c src2/hello3.c
--- src1/hello3.c       Thu Jan  1 09:00:00 1970
+++ src2/hello3.c       Tue Aug  3 13:37:02 2004
@@ -0,0 +1,7 @@
+#include
+#include
+
+main()
+{
+    /* needs to be filled in */
+}

diff 명령에서 -r 옵션은 recursive 옵션으로 서브 디렉토리까지 diff가 모두 탐색하라는 의미이고, -N 옵션은 hello3.c와 같이 새로 만들어진 파일까지도 포함해 diff 출력을 생성하라는 의미다. 이 옵션 역시 -urN으로 외워 두는 것이 좋다.

patch 사용하기
이렇게 만들어진 diff의 결과물은 patch 명령을 통해서 원저자의 소스코드로 업데이트된다. patch 명령은 -p 옵션만 정확히 이해하면 사용하는데 무리가 없다.
-p 옵션은 strip 옵션이라고 부르는데 diff 파일에 명시되어 있는 디렉토리에서 몇 단계를 벗겨(strip)낼 것인가를 결정한다. -p0 옵션은 디렉토리 단계를 하나도 벗겨내지 않겠다는 것이고, -p1 옵션은 한 단계를 벗겨낸다는 의미이고 -p2는 두 단계를 의미한다. 쉽게 이해하기 위해 <표 1>를 보자. foobar/include/net 디렉토리가 있다고 할 때 p 옵션을 적용하면 다음과 같이 디렉토리가 벗겨져 나간다.

p0 foobar/include/net
p1 include/net
p2 net

이것이 diff로 생성시킨 패치를 적용할 때 어떤 의미를 가지게 될까? 우선, 파일 두 개를 비교했을 때 생성된 diff 패치와 디렉토리 두 개를 비교했을 때 생성된 diff 패치의 헤더 부분을 비교해보자.

◆ 파일 두 개를 비교했을 경우:
$ diff -u hello1.c hello2.c
--- hello1.c    Tue Aug  3 14:34:46 2004
+++ hello2.c    Tue Aug  3 13:25:49 2004
(이하 생략)

◆ 디렉토리 두 개를 비교했을 경우:
$ diff -urN src1 src2
diff -urN src1/hello1.c src2/hello1.c
--- src1/hello1.c       Tue Aug  3 14:34:46 2004
+++ src2/hello1.c       Tue Aug  3 13:35:44 2004
(이하 생략)

즉, diff가 생성한 패치 파일에는 원본 파일과 바뀐 파일의 디렉토리가 명시되어 있음을 알 수 있다. patch 명령을 사용할 때는 이 경로명을 고려해서 patch 명령을 실행시켜 줘야 한다.

패치 적용하기
여러분이 원저자의 입장에서 제공받은 패치를 적용시키려면 다음과 같은 방법을 사용하면 된다. 패치 파일은 표준 입력(standard input)으로 들어가며, 항상 -p 옵션을 주의 깊게 사용해야 한다. 이번 예제에서는 디렉토리 두 개를 비교한 패치가 전송되었다고 가정해 보자. 원저자는 diff 패치의 헤더 부분을 읽고 패치의 경로명을 확인한 다음 적절한 디렉토리로 가서 patch 명령을 실행한다. 우선, -p0 옵션 사용 예부터 보자. diff 패치의 헤더 부분은 다음과 같다.

diff -urN src1/hello1.c src2/hello1.c
--- src1/hello1.c       Tue Aug  3 14:34:46 2004
+++ src2/hello1.c       Tue Aug  3 13:35:44 2004
... 이하 생략 ...

따라서 원저자는 이 패치를 hello.diff로 저장한 다음 자신의 소스코드가 있는 src1까지 가서 패치를 적용한다.

$ cd projects
$ pwd
/home/foobar/projects
$ ls -F
hello.diff   src1/

diff 파일에 기술된 경로명과 현재 경로명이 일치하고 있음을 주의깊게 보자.

$ patch -p0 < hello.diff
$ patch -p0 < hello.diff
patching file src1/hello1.c
patching file src1/hello2.c
patching file src1/hello3.c

패치 전과 패치 후의 결과를 비교해 보면 다음과 같다.

패치 전:

$ pwd
/home/foobar/projects/src1
$ ls -al
total 16
drwxr-xr-x    2 jwsohn   jwsohn       4096  8월  3 16:35 .
drwxr-xr-x    3 jwsohn   jwsohn       4096  8월  3 16:35 ..
-rw-r--r--    1 jwsohn   jwsohn         82  8월  3 14:34 hello1.c
-rw-r--r--    1 jwsohn   jwsohn        116  8월  3 13:25 hello2.c

패치 후:

$ pwd
/home/foobar/projects/src1
$ ls -al
total 20
drwxr-xr-x    2 jwsohn   jwsohn       4096  8월  3 16:41 .
drwxr-xr-x    3 jwsohn   jwsohn       4096  8월  3 16:35 ..
-rw-r--r--    1 jwsohn   jwsohn         62  8월  3 16:41 hello1.c
-rw-r--r--    1 jwsohn   jwsohn        121  8월  3 16:41 hello2.c
-rw-r--r--    1 jwsohn   jwsohn         83  8월  3 16:41 hello3.c

이제 -p1 옵션을 적용해서 patch 명령을 써 보자. diff 파일에 기술된 경로명에서 디렉토리를 한 단계 벗겨내면 src1 디렉토리가 없어지므로 다음과 같은 방식으로 패치 파일이 적용된다.

$ pwd
/home/foobar/projects
$ ls -F
hello.diff  src1/
$ cd src1
$ patch -p1 < ../hello.diff
patching file hello1.c
patching file hello2.c
patching file hello3.c

참고로 diff 파일의 경로는 어디에 위치하든 상관이 없다. 파일 하나에 대한 패치를 적용할 때는 -p0 옵션을 쓰면 될 것이다.

CVS 사용
CVS는 약자 중 Concurrent가 의미하듯이 한번에 여러 명의 개발자가 동일한 소스코드 트리에 동시에 수정을 가하면서 작업을 할 수 있도록 도와주는 도구이다. 사실 오픈소스 프로젝트에 참가하는 일반 개발자의 입장에서는 CVS에 대한 일반적인 지식은 별다른 필요가 없다고 생각해도 무방하다. 실제 소스코드 트리를 수정할 수 있는 권한을 갖고 있는 사람들은 프로젝트 리더인 자비로운 독재자 한 사람이나 프로젝트와 관련이 깊은 소수의 개발자들일 것이기 때문이다.

즉, 소스코드 수정 사항이 생기면 CVS를 굳이 쓸 필요가 없이 그냥 FTP나 http로 다운받은 소스코드 위에 diff를 돌려서 패치만 이메일과 같은 수단으로 보내 주면 소스코드 수정 권한이 있는 그쪽 사람들이(보통 ‘커미터’라고 부른다) 알아서 처리를 해 줄 것이기 때문이다.
하지만 가장 최신 버전의 nightly build된 소프트웨어는 CVS 서버에 접속해야만 구할 수 있는 경우가 대부분이다. 따라서 오픈소스 개발 프로젝트에 관심이 있는 개발자라면 다음 측면에서 CVS 사용법을 알아야 할 필요가 있을 것이다.

[1] FTP나 http 서버에서 소스코드를 다운받는 대신에
[2] CVS 서버에서 가장 최신 소스코드를 다운 받고
[3] 자신이 패치한 소스코드와 CVS 서버의 소스코드의 diff를 생성하는 방법

익명 CVS 체크아웃
이제 CVS에서 소스코드를 다운받는 방법을 알아보기로 하자. 일반적으로 오픈소스 프로젝트들은 대부분 CVS 서버를 읽기 전용으로 세팅해 놓고 누구든지 들어와서 소스코드를 다운받아 갈 수 있도록 해 놓고 있다. 익명 FTP(anonymous FTP)와 비슷한 개념으로 생각하면 되겠다. CVS 서버에 사용자가 접속을 해서 소스코드를 한 카피 다운받아 가는 것을 CVS에서는 체크아웃(check-out)이라는 용어로 표현한다.
참고로 CVS는 로컬 서버에서 사용할 수도 있고, 따로 CVS 서버를 두고 원격으로 접속할 수도 있다. 여기서는 CVS가 원격 서버라고 가정하기로 한다. CVS 서버에서 소스코드를 다운받는 명령은 다음과 같다. KLDP.net 서버에 위치한 moniwiki 프로젝트를 예로 들어 보겠다.

$ cvs -d:pserver:anonymous@cvs.kldp.net:cvsroot/moniwiki login
$ cvs -d:pserver:anonymous@cvs.kldp.net:cvsroot/moniwiki checkout moniwiki

익명 FTP에 접속할 때 보다는 조금 복잡해 보인다. 우선, 첫줄의 cvs 명령은 CVS 서버에 anonmous, 즉 익명 사용자로 로그인하는 과정이다. CVS 서버가 암호를 요구하면 그냥 엔터 키를 쳐 주면 인증이 끝나고 읽기 권한이 부여된다. 일단 로그인을 한번 한 다음부터는 사용자의 홈 디렉토리에 .cvspass 파일이 생기면서 인증 절차가 생략된다. 즉, 매번 접속할 때마다 anonymous 인증 과정을 거쳐야 하는 익명 FTP와는 달리, CVS에서는 한번만 익명 로그인을 해서 .cvspass 파일을 생성하고 나면 다시 cvs login 명령으로 인증 과정을 거칠 필요가 없다.

그 다음 -d 옵션은 CVS 서버에서 제공하고 있는 루트 디렉토리를 의미한다. moniwiki 프로젝트의 경우는 cvsroot/moniwiki로 지정되어 있다. 앞의 pserver는 CVS 명령이 소스코드를 다운받으면서 쓸 프로토콜명이며 뒤의 anonymous@cvs.kldp.net은 CVS 로그인시 사용할 계정이다.

두 번째 cvs 명령은 소스코드 한 카피를 다운받는 체크아웃 과정을 실행하게 된다. 체크아웃(checkout)한 다음의 moniwki는 CVS 서버에서 지정해 놓은 프로젝트 이름이며(모듈이라고 부른다) 이곳 CVS 서버에서는 moniwki로 지정해 두었다. 두 번째 명령을 실행하면 사용자의 현재 디렉토리에 moniwiki라는 디렉토리가 생성되고 소스코드 다운로드가 시작된다. 여기에, -z3 옵션을 주면 전송시 압축을 사용하기 때문에 전송 속도가 빨라진다.

$ cvs -z3 -d:pserver:anonymous@cvs.kldp.net:cvsroot/moniwiki checkout moniwiki

그런데 CVS 서버에 접속할 때마다 -d 옵션 뒤의 긴 디렉토리 이름을 타이핑하기는 아무래도 불편한 감이 있다. -d 옵션을 생략하려면 환경변수 CVSROOT에 -d 옵션을 등록해 둔다.

$ export CVSROOT=:pserver:anonymous@cvs.kldp.net:/cvsroot/moniwiki

그 다음부터는 다음 명령으로도 충분하다.

$ cvs login
$ cvs checkout moniwiki

소스코드를 받은 지 시간이 어느 정도 지났다면 그동안 CVS 서버의 내용이 새롭게 업데이트되어 있을 수도 있다. 바뀐 부분을 다운받으려면 CVS에서 update 명령을 사용한다.

$ cvs update -dP

여기서 -P 옵션은 Prune 옵션으로 비어있는 디렉토리를 자동으로 삭제해 주는 역할을 한다. -d 옵션은 그동안 서버 쪽에 새로 만들어진 디렉토리가 있으면 다운 받은 이쪽에도 동일한 디렉토리를 만들어 준다.

CVS 서버 원본에서 diff로 패치 파일 만들기
이제 기본적인 CVS 서버에서 소스코드 다운로드 방법을 알았으니 직접 CVS 서버의 소스코드를 이용해서 패치 파일을 만들어 보자. CVS는 diff 명령을 아예 자체적으로 내장하고 있다. 조금 전 다운받은 moniwiki의 소스코드를 예로 들어보자. 여기서, 필자는 monisetup.php 파일에 간단히 /* testing one two three */라는 주석문을 하나 삽입했다.

$ cd moniwiki
$ ls
COPYING                 doc                     secure.sh
CVS                     imgs                    theme
INSTALL                 index.html              tools
README                  lib                     wiki.php
THANKS                  locale                  wikihttpd.php
applets                 monisetup.bat           wikilib.php
config.php.default      monisetup.php           wikismiley.php
css                     monisetup.sh
data                    plugin
$ cvs diff -u -p monisetup.php
Index: monisetup.php
===================================================================
RCS file: /cvsroot/moniwiki/moniwiki/monisetup.php,v
retrieving revision 1.11
diff -u -p -r1.11 monisetup.php
--- monisetup.php       3 Jan 2004 14:26:50 -0000       1.11
+++ monisetup.php       3 Aug 2004 09:14:21 -0000
@@ -486,4 +486,5 @@ if ($_SERVER['REQUEST_METHOD']!="POST")

}

+/* testing one two three */
?>

cvs diff 명령이 마치 로컬에서 monisetup.php 파일에 diff 명령을 실행한 것과 같은 결과가 나왔음을 알 수 있다. cvs diff 명령 뒤의 -u 옵션은 diff와 마찬가지로 unified format을 의미하며 -p 옵션은 cvs diff 의 출력을 표준 출력(standard output)으로 보내라는 의미이다. 디렉토리 안의 모든 파일에 대해 diff 명령으로 비교를 하려면 다음과 같은 방법을 사용한다.

$ cvs -Q diff -u -p              
Index: monisetup.php
===================================================================
RCS file: /cvsroot/moniwiki/moniwiki/monisetup.php,v
retrieving revision 1.11
diff -u -p -r1.11 monisetup.php
--- monisetup.php       3 Jan 2004 14:26:50 -0000       1.11
+++ monisetup.php       3 Aug 2004 09:19:27 -0000
@@ -486,4 +486,5 @@ if ($_SERVER['REQUEST_METHOD']!="POST")

}

+/* testing one two three */
?>
Index: css/log.css
===================================================================
RCS file: /cvsroot/moniwiki/moniwiki/css/log.css,v
retrieving revision 1.1
diff -u -p -r1.1 log.css
--- css/log.css 11 Feb 2004 08:48:27 -0000      1.1
+++ css/log.css 3 Aug 2004 09:19:27 -0000
@@ -1,4 +1,5 @@
/* MoniWiki CSS 2003/11/01 by wkpark */
+/* another testing comment */
body {
   font-family:Georgia,Verdana,Lucida,sans-serif;font-size:12px;
   background-color:#FFFFFF;

여기서는 monisetup.php 파일과 css/log.css 파일에 수정된 부분이 있음을 알 수 있다. cvs diff 명령에서 -Q 옵션은 Quiet 옵션으로 diff 출력 이외의 다른 메시지를 출력하지 않도록 해 준다. 그런데 여기서 하나 의문이 들 수 있다. 분명히 CVS에서는 cvs를 이용해서 직접 소스코드에 수정을 가할 수 있을 것인데 여기에서 왜 굳이 구식 diff를 이용한 방법을 또 사용하고 있는 것을까?

그 이유는 앞에서도 잠깐 언급했듯이, CVS 서버의 내용을 수정할 수 있는 권한이 있는 개발자는 소수이기 때문이다. 그리고 자비로운 독재자라는 용어에서 알 수 있듯이 제출된 패치를 받아들일지 아닐지의 여부는 관습적으로 보통 그쪽 프로젝트 리더들의 몫이 된다.

따라서 CVS 서버에 읽기 전용의 권한만을 갖고 있는 일반 오픈소스 프로젝트 참가자들은 이메일이나 혹은 메일링 리스트에 diff를 이용해서 패치 파일을 포스팅하는 것이 오픈소스 프로젝트에 참가하는 가장 무난한 방법이다. 일반적으로 프로젝트의 참가자가 지나치게 많지 않은 경우를 제외하고는 오픈소스 프로젝트에 올라오는 패치는 아무리 사소한 것이라도 쉽게 CVS 서버의 원본 소스코드에(repository라고 부른다) 반영 된다.

따라서 일반 개발자의 입장에서는 프로젝트 리더나 메인 개발자가 되기 전에는 CVS 서버에서 쓰기 권한이 그다지 필요하지는 않다. 이제 간단하게 CVS 서버에서 자주 쓰이는 기본적인 개념과 용어에 대해 알아보기로 하자.

CVS의 개념과 여러 용어
CVS 모델, copy-moodify-merge model
CVS는 이전에 많이 쓰이던 RCS(Revision Control System)과는 달리 lock-modify-unlock이 아닌 copy-modify-merge 모델을 사용한다. 여러 명의 개발자가 하나의 소스코드 트리에서 개발 작업을 할 때 가장 큰 문제는 같은 부분의 소스코드에 두 명 이상의 개발자가 서로 다른 소스코드를 작성하고 있을 때 발생한다. 이것을 CVS에서는 conflict이 발생했다고 한다.

RCS의 lock-modify-unlock 접근방식은 이러한 conflict를 한번에 두 명 이상의 개발자가 같은 소스코드 부분에 접근할 수 없도록 해서 conflict 상황을 미연에 방지한다. 하지만 CVS에서는 이러한 conflict 상황이 발생하는 것을 허용한다. 그렇다면 CVS에서는 이런 소스코드 conflict 상황이 발생하면 어떻게 대처할까?

재미있게도 CVS에서는 이런 상황에서 아무 일도 하지 않는다. 다만, CVS는 어느 부분에서 소스코드 conflict가 발생했는지, 그리고 어떤 사람이 conflict에 관계되어 있는지만 정확하게 알려 준다. 따라서 소스코드의 conflict 문제를 해결하는 것은 기계가 아닌 사람의 몫이 된다.

lock-modify-unlock 모델은 프로젝트의 전체 개발자 숫자가 소수이고 각각의 개발자들이 다른 개발자들이 현재 어떤 작업을 하고 있는지 쉽게 알 수 있는 상황에 유리하다. 그러나 개발자의 숫자가 많아지면 이미 잠금이 걸려 있는 파일에는 다른 개발자들이 접근할 수 없기 때문에 전체적인 업데이트가 늦어지는 문제가 발생하게 되고 좀 더 유연한 환경을 제공하기 위해 CVS가 도입되기에 이르렀다. 따라서 copy-modify-merge 모델의 CVS를 사용하는 개발자는 기본적으로 다음과 같은 과정을 거치며 개발 작업을 진행해 나가게 된다.

[1] 개발자는 CVS 서버로부터 소스코드 카피를 다운로드(check-out)한 다음
[2] 소스코드를 수정하고
[3] 완료된 작업은 다시 CVS 서버로 올려준다(check-in, commit)

여기서 conflict의 발생 여부는 commit 작업 단계에서 알 수 있다. 그리고 조금 전에 잠깐 살펴보았듯이 현재 개발자의 컴퓨터의 소스코드를 cvs 서버 쪽과 가능한 한 동일하게 유지하려면 update를 자주 해 주는 것이 좋다.

CVS와 관련된 용어
CVS와 관련된 용어는 통일된 번역이 아직 존재하지 않는 것 같아 원문 그대로 싣고 여기에 설명을 덧붙이도록 하겠다.

◆ repository : CVS 서버에 들어가 있는 바로 그 원본(master copy) 소스코드를 의미한다. 나중에 최종 출시가 되는 소스코드가 바로 이 repository이며 repository는 그동안 버전업되어 온 정보를 모두 포함하고 있다. cvs respository의 개수는 하나가 된다.

◆ working copy : 각각의 개발자가 작업을 위해 cvs repository에서 복사해 갖고 나간(check-out) 소스코드가 working copy이다. 따라서 working copy는 개발자의 수만큼 존재한다고 볼 수 있다. 개발자는 이 working copy에서 소스코드 수정 작업을 한 다음 나중에 check-in 혹은 commit 단계를 거쳐 원본 cvs repository에 수정을 가하게 된다.

◆ check-out : 개발자가 자신이 작업할 working copy를 CVS 서버에서 한 카피 복사해 가는 것을 check-out이라고 한다.

◆ update : update는 check-out과 비슷하게 cvs repository에서 원본 소프트웨어를 한 카피 가져오는 역할을 하지만, update는 단어의 원래 뜻 그대로 수정된 부분만 가져와서 현재 개발자가 쓰고 있는 working copy가 항상 최신의 갱신본이 될 수 있도록 해 준다. 일반적으로, 개발자는 한번 working copy를 check-out 한 뒤에는 최신의 소스코드를 유지하기 위해 이 update 명령을 주로 쓰게 된다.

◆ check-in 혹은 commit : 여기서 잠깐 조심해서 봐야 할 것이 update와 check-in의 관계이다. 얼핏 보기에는 CVS에서 check-out과 check-in이 반대의 개념이 되어야 할 것 같은데 실상 check-in의 반대 개념은 update이다. check-in은 내가 작성한 소스코드를 repository에 병합시켜서 다른 개발자들도 내가 작성한 수정 부분을 볼 수 있게 해 주는 소위 publish 작업이기 때문이다. 따라서 그 반대 개념은 내가 다른 사람들이 작성한 소스코드 수정본을 나의 working copy에 반영시키는 것인데 이 작업이 update 과정이다. 따라서 check-in 과정은 오히려 commit이라는 단어를 써서 표현하는 것이 혼동을 미리 방지하는 효과가 있지 않나 싶다. 참고로 commit 권한은 잠시 언급했듯이 소수의 주요 프로젝트 리더들이 갖게 되는 경우가 많다. 어떤 오픈소스 프로젝트에서 커미터의 역할을 담당한다는 것은 그 사람의 기여도가 높고 그만큼 높은 위치를 배정받았다는 뜻이 된다.

update와 commit에 관해서 또 하나 알아놓을 상식은 update와 commit 작업은 가능하면 자주 해 주는 것이 좋다는 사실이다. 다른 사람들이 내가 어떤 작업을 하는지 잘 알고, 나 역시 다른 사람들이 어떤 작업을 하고 있는지 잘 아는 것이 효율적인 협업(collaboration)의 기초가 됨은 두말할 필요가 없다. 추가적으로 CVS의 commit 명령 사용 예는 다음과 같다. -m 옵션 뒤에는 이번 commit에 대한 간략한 설명이나 주석문이 따라온다.

$ cvs commit -m "added additioinal messages" hello2.c   # 파일 하나 commit 예

$ pwd
/home/foobar/projects/src1
$ cvs commit -m "removed redundant declarations"       # 전체 디렉토리 commit 예

◆ log message : 수정된 소스코드를 commit할 때 이 소스코드가 어떤 역할을 하는지, 어떤 부분이 바뀌었는지 등을 기술하는 주석문 역할의 메시지이다. 이것 역시 코딩시 주석문 작성에 신경을 많이 쓰는 것처럼 수정된 소스코드를 commit할 때 마다 간결하고 정확하게 써 주는 것이 좋다.

오픈소스 프로젝트에 많은 참여를
지금까지 여러 명의 개발자, 특히 오픈소스 프로젝트에 참가할 때 필수적으로 쓰이는 유틸리티인 diff와 patch, 그리고 CVS의 기본 사용법에 대해서 알아보았다. 최근 들어서는 문서 작성도 오픈소스와 비슷하게 여러 사람이 동시에 같은 페이지를 고쳐 나가는 방식이 정착되어 가고 있다. 위키(wiki)의 사용이 늘어나고 있는 것이 바로 그것인데 위키는 내부적으로 RCS를 사용해서 문서의 버전 컨트롤을 해 나가는 경우가 많다. 즉, 위키를 통한 문서 작성 방식도 CVS를 이용한 오픈소스 소프트웨어 개발과 근본적으로 다르지 않은 것이다.

앞에서도 강조했듯이, 오픈소스 프로젝트에 참여하기 위해서 가장 중요한 것은 diff와 patch의 사용법을 아는 것이다. 일견 간단해 보이는 이 유틸리티들이 이메일, 그리고 이메일의 확장판인 메일링 리스트와 초기 유즈넷 뉴스그룹과 결합되면서 인터넷상에서 중요 오픈소스 소프트웨어 개발의 문을 열어젖힌 주역들이다.

또한, 이렇게 오픈소스 프로젝트에 참여하는 것이 생각만큼 어렵지 않다는 점을 일반 개발자들이 인지하는 것도 중요하다고 하겠다. 필자 역시 CVS의 사용법을 알기 전에는 내가 CVS의 사용법을 모르는데 오픈소스 프로젝트 참여가 가능하겠는가라는 쓸모없는 생각을 했던 적이 있다. 필자의 경우는 실제 떨어지는 코딩 능력이 오픈소스 프로젝트 참여에 장벽이 되고 있는데 이 글을 읽는 많은 독자들이 이번 연재를 계기로 오픈소스 프로젝트에 좀 더 많이 참여해 보는 기회를 가질 수 있으면 좋겠다는 것이 필자의 바람이다. 단 한 줄의 diff로 만든 패치라도 오픈소스 개발자에게는 많은 도움이 되며 또한 격려의 응원이 된다.

출처 --http://zdnet.co.kr/techupdate/lecture/os/0,39024998,39131586,00.htm

and
SQL Server DBA 가이드

DBA라면 이 정도는 알고 있어야 하지 않을까요 !!!

이 페이지의 내용
사용자 삽입 이미지

사용자 삽입 이미지
데이터베이스 관리
사용자 삽입 이미지
백업과 복구

사용자 삽입 이미지
테이블 관리

사용자 삽입 이미지
시스템 오브젝트 생성

사용자 삽입 이미지
사용자 관리

사용자 삽입 이미지
서버 및 데이터베이스의 정보 확인

사용자 삽입 이미지
성능 모니터링

사용자 삽입 이미지
프로필러

사용자 삽입 이미지
문제 점검 및 해결

사용자 삽입 이미지


DBA의 역할과 책임

DBA의 역할

시스템과 조직에 따라 DBA의 임무에 차이가 있을 수 있지만 일반적으로 대부분의 DBA는 다음과 같은 작업들을 책임지고 수행해야 하는 임무를 가집니다.

  • 설치와 환경설정
    - 소프트웨어 설치
    - 환경 설정
  • 보안 관리
  • 운영
    - 백업과 복원
    - 사용자 관리
    - 기타 일상적인 운영 업무
  • 서비스 레벨 유지
    - 성능 최적화 및 성능 모니터링
    - 용량 계획 (Capacity Planning)
  • 시스템 가동 시간 관리
    - 시스템 정지 시간의 계획과 일정 관리
  • 문서화 작업
  • 작업 절차 계획 및 규격화
    - 운영 유지보수 계획 수립
    - 재난 복구 계획 수립
  • 설계 및 개발 지원
    - 데이터 모델링
    - 데이터베이스 설계
    - 저장 프로시저 개발
    - 응용 프로그램 개발
  • 개발 환경 관리
    - 개발 시스템 환경 별도 제공 및 개발 시스템 관리
  • 긴급 상황 해결/장애 복구
  • SQL Server 관리에 필요한 지식 숙지

DBA 작업의 기본적인 원칙

DBA가 시스템 유지를 위하여 일반적으로 수행하는 모든 작업들에 대하여 기본적으로 다음과 같은 원칙에 의거하여 작업할 것을 권고합니다.

  • 작업 표준화 체계 수립

    표준화는 관리에 있어서 매우 중요한 요소입니다. 자신의 시스템에 가장 적합한 표준화 체계를 수립하고, 전체 시스템에 대하여 표준화된 관리 체계를 적용하여 관리해야 합니다. 예를 들어, 다중의 DB 서버를 관리하는 경우에는 표준화가 특히 중요합니다.

  • 문서화

    DB 관리와 같이 중요한 작업은 사람의 기억에 의한 주먹구구식의 작업이 되어서는 안됩니다. 어떤 경우라도 항상 정확하고 일관된 작업이 가능하도록 문서화가 필요합니다. 기록 가능한 모든 작업들에 대해서 문서화하고, 변경이 발생하면 지속적으로 업데이트하는 관리가 필요합니다.

    • 작업 매뉴얼 : 작업 수행 절차에 대한 정보 (설치, 장애 복구, 백업과 복원 전략, 주기적으로 수행하는 작업 등에 대한 작업 절차 및 참고 사항이 이에 포함될 수 있으며, 일반적이고 중요한 정보는 운영 매뉴얼에 기록하여 모든 DBA가 참조할 수 있도록 합니다.)
    • 시스템 환경에 대한 정보 : 서버의 하드웨어, 소프트웨어, 네트워크 등에 대한 정보
    • 담당자 및 관계자에 대한 정보 : 시스템과 관련된 내/외부 조직에 포함되는 모든 사람과 하드웨어/소프트웨어 제품 및 서비스 공급업체 및 담당자에 대한 정보
    • 장애 기록 일지 : 발생된 문제와 문제 해결에 관한 모든 절차에 대한 기록 (장애 기록에 대한 내용은 활용 및 검색이 용이하도록 웹 기반으로 만들어, 유사한 문제의 재발 시에 신속하게 처리할 수 있도록 합니다.)

  • 스크립트화

    반복적, 주기적으로 수행하는 모든 작업들은 엔터프라이즈 관리자를 사용하는 대신, 스크립트를 작성하여 수행하는 것을 원칙으로 합니다. 스크립트를 사용하면 오류 발생 가능성을 최소화할 수 있으며 반복적인 작업을 효율적으로 수행할 수 있습니다. 스크립트는 보안을 위하여 안전한 디렉터리에 중앙 집중적으로 관리하는 것이 바람직하며, 스크립트 작성 시에는 응용 프로그램과 마찬가지로 주석을 기술하여 쉽게 이해하고 활용할 수 있도록 합니다. 만약 주석만으로 불충분한 경우에는 문서를 작성하여 관리합니다.

  • 자동화

    주기적으로 수행해야 하는 작업들은 가능한 한 자동화하여 DBA의 업무 효율성을 제고할 것을 권고합니다. 예를 들어 DB 서버 성능 데이터의 수집, 디스크 공간의 확인, 백업, 블로킹 감지, 데이터 타입 오버플로우 감지 등의 작업들은 자동화가 가능합니다. 단순히 수행을 자동화하는 차원을 넘어서, SQL Server에서 제공하는 다양한 기능들을 활용하면 자동으로 경고 메일의 발송, 문자 메시지의 발신, 문제 해결을 위한 작업의 수행 등이 가능하기 때문에, DBA가 지속적으로 시스템을 모니터링하지 않더라도 시스템에 발생한 문제를 조기에 감지하는 것이 가능합니다. DBA가 주기적으로 수행되는 작업에 할애하는 시간은 가능한 한 최소화하고, 주기적인 관리 작업을 통하여 확보한 지식을 기반으로 응용 프로그램과 서버의 성능을 향상시키기 위한 전략을 모색하는데 많은 시간을 할애하는 것이 바람직합니다.

  • 신중한 변경 관리 및 롤백 전략 수립

    운영중인 시스템에 어떤 변경작업을 수행하는 경우에는 가능한 한 충분한 사전 테스트를 거친 후에 작업해야 하며, 롤백 전략을 수립한 다음에 작업하는 것을 원칙으로 합니다. 또한 한번에 여러 가지 변경 작업을 수행하지 말고, 하나의 변경 작업을 수행하고 그 변경 작업이 미친 영향을 관찰하는 것이 바람직합니다.
    모든 변경 작업에 대해서 롤백 전략을 수립하는 것이 원칙이며, 롤백에 필요한 사항들을 문서로 기록하고 롤백에 필요한 스크립트 등을 작성하고 테스트하여 검증합니다. 특히 대용량 데이터베이스의 경우에는 문제 발생 시 복구에 소요되는 시간이 길기 때문에 충분한 사전 테스트와 롤백 전략 수립이 매우 중요합니다.


    DBA가 주기적으로 수행해야 하는 작업

    시스템에 따라 차이가 있을 수 있지만, DBA는 시스템 유지를 위하여 일반적으로 수행해야 하는 작업들에 대하여 이해하고 있어야 하며, 다음과 같은 작업들을 주기적으로 수행해야 합니다.

  • 일 단위로 수행해야 하는 작업

    • 시작되어야 할 서비스들이 제대로 시작되어 있는지 확인합니다.
    • Windows NT 또는 Windows 2000의 이벤트 뷰어를 사용하여 오류 발생 여부를 점검합니다.
    • SQL Server 오류 로그에 오류 메시지가 기록되어 있는지 점검합니다. 자세한 내용은 [SQL Server 오류 로그 보기]를 참조하십시오.
    • 데이터베이스 파일과 로그 파일의 확장에 대비하여 디스크에 충분한 여유 공간이 있는지 확인합니다.
    • 데이터베이스 파일과 로그 파일의 크기와 실제로 사용되는 공간을 모니터링하며, 공간 부족으로 자동 확장이 예상되는 경우에는 미리 파일을 확장하여 충분한 공간을 확보합니다.
    • SQL Server 작업(Job)의 성공/실패 여부를 점검합니다.
    • 매일 데이터베이스 전체 백업 또는 차등 백업을 수행하기로 되어 있는 경우라면, 데이터베이스 전체 백업을 수행합니다. 자동화되어 있는 경우에는 백업이 성공적으로 수행되었는지 점검합니다. 데이터베이스 전체/차등 백업 주기는 시스템 여건과 복원 전략에 따라 달라집니다.
    • SQL Server 트랜잭션 로그를 백업 받습니다. 자동화되어 있는 경우에는 백업이 성공적으로 수행되었는지 점검합니다. 백업 주기는 시스템 여건에 따라 백업 주기는 분 단위, 시간 단위, 일 단위로 달라질 수 있으며, 트랜잭션 백업 주기에 따라 트랜잭션 로그 파일의 크기가 달라집니다. 참고로 복원이 불필요한 테스트 DB에 대해서는 복구 모델을 단순으로 설정하면 트랜잭션 로그에 대한 주기적인 관리를 줄일 수 있습니다.
    • Master, model, msdb, 배포(distribution) 데이터베이스도 변경 사항이 있으면 주기적으로 백업해야 합니다. 시스템 카탈로그의 변경이 이루어진 후에는 master 데이터베이스의 전체 백업을 수행합니다. 경고, 작업(Job), 운영자, 로그 전달(log-shipping), 복제, DTS 패키지 등에 변경이 발생한 다음에는 msdb를 백업해야 합니다. Model 데이터베이스에 변경작업을 수행한 다음에는 model을 백업해야 합니다.
    • 시스템 모니터를 사용하여 성능 카운터를 모니터링함으로써, 적절한 성능이 유지되고 있는지 점검합니다. 최소한 시스템 모니터에서 프로세서, 메모리, 디스크(I/O), 네트워크에 대한 카운터들은 필수로 점검해야 합니다. 문제 발생 시 또는 추가적인 분석이 필요한 경우에는 관련 성능 카운터들을 추가로 분석합니다.
    • 복구 모델이 전체 복구가 아니라면, 최소 로깅 작업(Minimal-logged operation)을 수행한 다음에는 차등 백업을 수행합니다.
    • 블로킹, 교착상태(Deadlock)의 발생 여부를 점검합니다.
    • 오래 수행되는 쿼리 또는 리소스를 과다하게 사용하는 쿼리가 있는지 점검합니다.
    • 문제가 발생하면 문제 해결을 위한 활동을 수행하며, 문제 분석 및 해결 과정에 대한 내용을 가능한 한 상세하게 문서화합니다.
    • 통계 자동 갱신(Auto update statistics) 옵션이 비활성화되어 있는 데이터베이스의 테이블들에 대해서는 주기적으로 (예:매일, 매주) UPDATE STATISTICS 작업을 수행합니다.

  • 주간 단위로 수행해야 하는 작업

    • 모든 시스템 데이터베이스와 운영중인 사용자 데이터베이스에 대한 전체/차등 데이터베이스 백업을 수행합니다.
    • 통계 자동 갱신(Auto update statistics) 옵션이 비활성화되어 있는 데이터베이스의 테이블들에 대해서 UPDATE STATISTICS를 매일 또는 매주 수행합니다.
    • 인덱스의 조각화를 제거합니다. CREATE INDEX WITH DROP_EXISTING 또는 DBCC DBREINDEX를 수행하여 인덱스를 재구성함으로써 물리적, 논리적 조각화를 제거할 수 있으며, DBCC INDEXDEFRAG를 사용하면 논리적인 조각화를 제거할 수 있습니다. 자세한 내용은 온라인 설명서를 참조하십시오.
    • 대형 일괄 처리의 작업 등으로 인하여 로그 파일이 과다하게 확장된 경우에는 로그 파일의 사용되지 않는 여분의 공간을 제거합니다.

  • 월간 단위로 수행해야 하는 작업

    • 전체 운영 체제를 백업합니다.
    • 최소 월 1회 모든 시스템 데이터베이스와 운영 데이터베이스에 대하여 전체 백업을 수행해야 합니다.
    • DBCC CHECKDB를 수행하여 데이터베이스의 무결성을 점검합니다. DBCC CHECKDB를 수행하면 서비스나 다른 작업에 영향을 미칠 수 있으므로, 테스트 장비에 모든 시스템 데이터베이스와 운영 데이터베이스를 복원하고, 복원된 모든 시스템 데이터베이스와 운영 데이터베이스를 대상으로 DBCC CHECKDB를 수행하여 무결성을 점검하는 것이 바람직합니다.
    • Sqldiag.exe를 수행하고 결과를 저장합니다.
    • 성능 데이터를 수집하여 시스템이 충족시켜야 하는 기준과 비교하여, 성능 향상 및 향후의 용량 계획에 활용합니다.

    [참고] 정확한 점검을 위해서는 모든 유지 관리 활동 작업에 대하여 로그를 저장하는 것이 필요합니다. 데이터베이스 유지 관리 계획 마법사와 SQL Server 작업(Job)에서는 자동으로 작업 결과를 저장하도록 설정 가능합니다.



    데이터베이스 관리

    데이터베이스 생성

    번호수칙체크
    1트랜잭션 로그 파일은 로그 전용 드라이브에 배치합니다. 
    2트랜잭션 로그 파일을 저장할 디스크는 일반적으로 RAID10으로 구성합니다. 
    3데이터베이스를 만들 때 향후 예상되는 최대 데이터 크기를 고려하여 충분한 크기로 생성합니다. 
    4파일이 증가할 수 있는 최대 크기를 지정하는 것을 권고합니다. 
    5파일이 자동으로 증가하도록 설정하는 경우에는 자동 확장 증가 크기를 적절하게 설정합니다. 
    6파일 그룹을 사용하여 데이터를 배치합니다. 
    7데이터베이스를 생성한 경우에는 master 데이터베이스를 백업합니다. 
    8tempdb는 I/O가 빠른 쪽에 배치할 것을 권고합니다. 

    수칙1. 트랜잭션 로그 파일은 로그 전용 드라이브에 배치합니다.

    데이터 파일들과 트랜잭션 로그 파일은 서로 다른 디스크에 배치합니다.
    모든 데이터베이스는 최소 하나의 주 데이터 파일(Primary Data File)과 하나의 트랜잭션 로그 파일로 구성됩니다. 트랜잭션 로그 파일은 별도의 드라이브에 배치합니다.

    [따라하기] 주 데이터 파일은 D 드라이브에 배치하고 트랜잭션 로그 파일은 E 드라이브에 배치하는 데이터베이스 생성하기

    확장명은 주 데이터 파일은 .mdf, 보조 데이터 파일은 .ndf, 트랜잭션 로그 파일은 .ldf를 사용합니다.

    USE masterGOCREATE DATABASE sample                  /* 데이터베이스 이름 */ON (NAME = sample_dat,                     /* 데이터 파일 이름 */FILENAME = 'd:\DBdata\sample_dat.mdf',   /* 데이터 파일 위치 */SIZE = 100 MB,                          /* 데이터 파일 초기 크기 */MAXSIZE = 1 GB,                        /* 데이터 파일 최대 크기 */FILEGROWTH = 100 MB)                  /* 데이터 파일 증가량 */LOG ON (NAME = sample_log,                      /* 로그 파일 이름 */FILENAME = 'e:\DBlog\sample_log.ldf',  /* 로그 파일 위치 */SIZE = 20 MB,     /* 로그 파일 초기 크기 */MAXSIZE = 500 MB,    /* 로그 파일 최대 크기 */FILEGROWTH = 50 MB)    /* 로그 파일 증가량 */GO

    수칙2. 트랜잭션 로그 파일을 저장할 디스크는 일반적으로 RAID10으로 구성합니다.

    트랜잭션 로그 파일의 경우에는 복제가 구성되어 있거나 트리거가 빈번하게 수행되는 경우가 아니라면 대부분의 IO가 쓰기 작업이므로, 쓰기 작업의 성능을 위하여 트랜잭션 로그 파일은 RAID 10에 저장할 것을 권고합니다. 참고로, 로그에서 대기가 발생하는지는 다음 명령어로 확인할 수 있습니다.

    DBCC SQLPERF (WAITSTATS)GO

    수칙3. 데이터베이스를 만들 때 향후 예상되는 최대 데이터 크기를 고려하여 충분한 크기로 생성합니다.

    주 데이터 파일, 트랜잭션 로그 파일 모두 충분한 크기로 생성합니다. 파일이 증가하는 동안에는 쓰기 작업은 대기 상태가 되기 때문에 잦은 확장은 성능에 좋지 않은 영향을 미칠 수 있습니다. 트랜잭션 로그를 자동 증가하도록 옵션을 설정하되, 되도록이면 로그의 사이즈가 증가될 필요가 없도록 합니다. 트랜잭션 로그의 초기 크기는 트랜잭션 로그 백업을 수행한 후, 다음 로그 백업이 수행되기 전까지 발생하는 작업들을 저장하기에 충분한 크기로 생성합니다. 트랜잭션 로그 파일에 대하여 여러 번의 자동 증가가 발생하게 되면, 여러 개의 가상 로그 파일들로 조각화되어, 로그 관련 작업의 성능에 좋지 않은 영향을 미칩니다. 가상 로그 파일을 줄이는 방법은 [데이터 베이스 축소하기]를 참조하십시오.
    만약 데이터베이스의 초기 크기가 작아서 확장이 발생하고 있다면, 파일의 크기를 충분한 크기로 확장하기 바랍니다.

    [따라하기] 데이터베이스 파일 확장하기

    ALTER DATABASE SampleMODIFY FILE   (NAME = sample_dat,   MAXSIZE = 1 GB)GO

    수칙4. 파일이 증가할 수 있는 최대 크기를 지정하는 것을 권고합니다.

    파일의 최대 크기를 지정하면, 파일의 크기가 증가하여 디스크 여유 공간이 전혀 없는 상태가 되는 것을 방지할 수 있습니다. 파일의 최대 크기를 지정하려면 CREATE DATABASE 문의 MAXSIZE 매개 변수를 사용하거나 엔터프라이즈 관리자의 등록 정보 대화 상자의 파일 증가 제한(MB) 옵션을 사용하면 됩니다.
    만약 기존의 데이터베이스 파일의 최대 크기가 UNLIMITED로 설정되어 있다면, 최대 크기를 설정하기 바랍니다.

    [따라하기] 데이터베이스 파일의 최대 크기 확인 및 설정하기

    EXEC sp_helpdb Sample -- 또는 EXEC Sample..sp_helpfileGO-- 결과 중 maxsize 정보를 확인 후 다음 명령어를 수행합니다.ALTER DATABASE SampleMODIFY FILE   (NAME = sample_dat,   SIZE = 200MB)GO

    수칙5. 파일이 자동으로 증가하도록 설정하는 경우에는 자동 확장 증가 크기를 적절하게 설정합니다.

    파일의 크기가 매우 작거나 매우 큰 경우에는 파일 자동 확장 증가분을 퍼센트 단위가 아닌 MB 단위로 지정하는 것을 권고합니다. 파일의 자동 확장 증가분을 지정하지 않으면 디폴트 값이 10% 확장으로 설정되는데, 데이터베이스의 크기가 큰 경우에는 새로운 데이터를 저장할 공간이 없어서 자동 확장이 이루어질 때 소요시간이 오래 걸림으로 인하여 트랜잭션 로그를 발생시키는 작업들이 대기 또는 실패하는 문제가 발생할 수 있습니다. 예를 들어, 데이터 파일의 크기가 100GB인 경우에 파일의 자동 확장 증가분이 10%로 설정되어 있다면, 자동 확장이 발생할 경우 10GB의 파일 확장을 수행합니다. 10GB의 확장작업은 상당한 시간이 걸리는 작업이므로 정상적인 서비스를 하지 못하는 문제를 유발할 수 있습니다. 반대로 파일의 크기가 매우 작은 경우에는 10%씩 증가하면 확장되는 크기가 작아서 빈번하게 재확장이 발생합니다. 로그 파일의 경우에 작은 크기의 확장이 여러 번 발생하면 여러 개의 작은 가상 로그 파일(VLF)들로 단편화가 발생하게 되어 성능을 저하시킬 수 있으므로 유의하기 바랍니다. 가상 로그 파일의 수는 일반적으로 25개 미만으로 유지하는 것을 권고하며, 가상 로그 파일의 수가 지나치게 많은 경우에는 가상 로그 파일의 수를 줄이는 작업을 수행하는 것이 좋습니다. 작업 방법은 [트랜잭션 로그 파일 축소하기]를 참조하십시오.

    [따라하기] 데이터베이스의 데이터 파일 증가율 100MB로 변경하기

    ALTER DATABASE SampleMODIFY FILE   (NAME = sample_dat,   FILEGROWTH = 100MB)GO

    수칙6. 파일 그룹을 사용하여 데이터를 배치합니다.

    주 데이터 파일에는 메타 데이터만 저장하고, 사용자 오브젝트들은 사용자 정의 파일 그룹에 저장하며, 디폴트 파일 그룹을 주 파일 그룹이 아닌 사용자 정의 파일 그룹으로 변경할 것을 권고합니다. 참고로 데이터베이스는 주 파일 그룹과 사용자 정의 파일 그룹으로 구성되며 주 파일이 있는 파일 그룹이 주 파일 그룹이 되고 주 파일 그룹에는 모든 시스템 테이블이 저장됩니다. 데이터베이스에 오브젝트를 만들 때 파일 그룹을 지정하지 않으면 오브젝트들은 디폴트 파일 그룹에 저장되며 디폴트로 주 파일 그룹이 디폴트 파일 그룹이 됩니다.

    [따라하기] 파일 그룹이 있는 데이터베이스 생성하기

    USE masterGOCREATE DATABASE sample2ON Primary (       /* PRIMARY 파일 그룹 */NAME = sample_pri_dat, FILENAME = 'D:\DBdata\sample_pri_dat.mdf',SIZE = 200 MB, MAXSIZE = 1 GB, FILEGROWTH = 20 MB), FILEGROUP SamplesFG1     /* 두 번째 파일 그룹 */(NAME = sample1_dat, FILENAME = 'E:\DBdata\sample1_dat.ndf', SIZE = 200 MB, MAXSIZE = 1 GB, FILEGROWTH = 20 MB), FILEGROUP SamplesFG2     /* 세 번째 파일 그룹 */(NAME = sample2_dat, FILENAME = 'F:\DBdata\sample2_dat.ndf', SIZE = 200 MB, MAXSIZE = 1 GB, FILEGROWTH = 20 MB) LOG ON (     /* 로그 파일 */NAME = sample_log,    FILENAME = 'G:\DBlog\sample_log.ldf',  SIZE = 10 MB, MAXSIZE = 50 MB,FILEGROWTH = 5 MB) GO

    [따라하기] 디폴트 파일 그룹 확인 및 변경하기

    USE Sample2SELECT * FROM sysfilegroups WHERE status = 16GO/* 'Primary' 파일 그룹이 디폴트 파일 그룹이면 1이 반환되고 그렇지 않으면 0이 반환됩니다. */SELECT FILEGROUPPROPERTY('Primary', 'IsDefault')GO/* 디폴트 파일 그룹을 'SamplesFG1'로 변경합니다. */ALTER DATABASE Sample2 MODIFY FILEGROUP [SamplesFG1] DEFAULTGO

    수칙8. tempdb는 I/O가 빠른 쪽에 배치할 것을 권고합니다.

    Tempdb는 I/O가 빠른 쪽에 배치하는 것이 성능을 위해 좋습니다. Tempdb를 여러 디스크에 스트라이핑하면 더욱 좋습니다. 또한 tempdb를 자주 쓰는 사용자 데이터베이스와 물리적으로 격리된 디스크에 배치할 것을 권고합니다. 특히 tempdb를 매우 많이 사용하는 대규모 시스템이라면 tempdb를 별도의 디스크 세트에 배치하면 더 나은 성능 향상을 기대할 수 있습니다. 유의할 사항은, 데이터베이스 데이터와 운영 시스템의 페이징 파일을 동일한 디스크에 배치하는 것은 어떤 경우라도 좋은 방법이라고 할 수 없습니다.

    [참고] 그 외 파일 배치하기
    운영 시스템은 RAID 1로 구성된 어레이에 있어야 합니다. 페이징 파일은 운영 시스템이 있는 드라이브에서 훨씬 잘 동작하며, 데이터베이스에 별도의 디스크를 할당할 수 있게 하기 위해서 같은 위치에 있어도 관계 없습니다. 페이징 파일을 옮겨야 할 필요가 있다면, 데이터베이스의 데이터, 로그, tempdb가 있는 곳에는 위치시키지 않아야 합니다. 이렇게 해야 디스크 오류에 빠르게 대응하여 복구할 수 있습니다. 이 때, 부트 디스크는 미러를 이용하여 부팅 가능해야 합니다.
    시스템 백업을 동일 서버에 저장해야 한다면 반드시 데이터나 로그 파일이 없는 다른 디스크에 저장해야 합니다.
    파일 그룹에 파일의 개수는 SQL Server의 성능과 관련이 없으므로, 파일을 관리하기 쉽게 배치합니다.

    [참고] CREATE DATABASE가 실패하는 경우 문제 해결하기
    새로운 데이터베이스의 생성이 실패하는 원인에는 여러 가지가 있지만 주로 다음과 같은 문제로 인하여 새로운 데이터베이스의 생성이 실패합니다.

    1. model 데이터베이스가 사용 중일 때
      model 데이터베이스를 사용하는 프로세스의 수행이 완료되기를 기다렸다가 재수행하거나, model 데이터베이스를 사용 중인 프로세스를 강제로 중지한 후에 재수행합니다.

    2. 데이터베이스 파일의 물리적인 위치를 잘못 지정했을 때
      지정한 폴더가 실제로 있는지 확인합니다.
      지정한 드라이브에 충분한 여유 공간이 있는지 확인합니다.

    3. CREATE DATABASE를 수행한 사용자에게 새로운 데이터베이스를 생성할 수 있는 권한이 없을 때
      새로운 데이터베이스를 생성하기 위해서는 sysadmin 또는 dbcreator 역할의 구성원이어야 합니다. 이 역할의 구성원에게 작업을 요청하거나, 주기적으로 작업이 필요하다면 해당 사용자를 dbcreator 역할에 추가하면 됩니다.

    4. 동일한 이름의 데이터베이스가 이미 존재할 때
      sp_helpdb를 수행하거나 master..sysdatabases 테이블을 참조하여 확인합니다. 만약 기존의 데이터베이스가 불필요하다면 sp_renamedb 를 사용하여 기존의 데이터베이스를 다른 이름으로 변경하거나 삭제한 후에 다시 시도합니다.

    5. 동일한 이름의 파일이 이미 존재할 때
      존재하지 않는 파일 이름을 지정하고 다시 시도합니다.

    데이터베이스 삭제하기

    [구문]USE masterGODROP DATABASE database_name [ ,...n ]GO

    [유의사항]
    DROP DATABASE를 수행하면 모든 데이터베이스 파일들도 디스크에서 삭제됩니다. 만약 다시 복구하고자 하는 경우에는 백업본을 복원해야 합니다. 그러므로, 만약 다시 참조할 필요가 있는 데이터베이스를 삭제하고자 하는 경우에는 sp_detach_db를 사용하여 SQL Server에서 데이터베이스 정보만 삭제하고 파일들은 디스크에 남겨 둘 것을 권고합니다. [데이터베이스 파일 위치 변경하기]를 참조하십시오.
    데이터베이스를 삭제하면 master 데이터베이스의 시스템 테이블이 업데이트 되므로 데이터베이스가 삭제된 후에는 master 데이터베이스를 백업할 것을 권고합니다. master 데이터베이스를 복원할 필요가 있을 때, 마지막 master 백업 이후 삭제된 데이터베이스가 시스템 테이블에 남아 있으면 그로 인하여 오류가 발생할 수 있습니다.

    [참고] DROP DATABASE가 실패하는 경우 문제 해결하기
    삭제하고자 하는 데이터베이스를 다른 프로세스에서 연결 중이면 데이터베이스를 삭제할 수 없습니다. 데이터베이스 사용 중이어서 삭제할 수 없는 경우에는, 해당 데이터베이스를 사용하는 프로세스들이 완료되기를 기다렸다가 삭제하거나 아니면 다음과 같이 데이터베이스를 단일 사용자 모드로 변경한 다음에 삭제하거나 또는 spid를 확인하여 KILL 명령어로 프로세스들을 중지한 다음에 재시도합니다.

    USE masterGOALTER DATABASE SampleSET SINGLE_USER WITH ROLLBACK AFTER 30  -- 30초가 경과한 후에 롤백 GO

    데이터베이스 이전하기

    [따라하기] 사용자 데이터베이스 이전하기 C 드라이브에 주 데이터 파일과 트랜잭션 로그 파일이 있는 데이터베이스를 주 데이터 파일은 D 드라이브, 트랜잭션 로그 파일은 E 드라이브로 이전합니다.
      데이터베이스명  SAMPLE
      데이터 파일명  sample_dat
      변경 전 데이터 파일 위치  C:\data\sample_dat.mdf
      변경 후 데이터 파일 위치  D:\data\sample_dat.mdf
      로그 파일명  sample_log
      변경 전 로그 파일 크기  C:\log\sample_log.ldf
      변경 후 로그 파일 위치  E:\log\sample_log.ldf
    1. 데이터베이스에 연결되어 있는 연결을 모두 비 연결 상태로 만들고, 단일 사용자 모드로 설정합니다. 다음은 5초 후에 모든 작업들이 ROLLBACK되고, 연결을 끊는 예제입니다.
      USE masterGOALTER DATABASE SampleSET SINGLE_USER WITH ROLLBACK AFTER 5GO
      [참고]
      EXEC sp_dboption database_name, 'single user', trueGO
      이 작업을 실행하는 것 외에 다른 사용자가 연결을 하고 있을 경우에는, 데이터베이스 상태를 변경할 수 없습니다. 이 방법을 사용 하는 경우에는, DBA가 모든 작업들의 연결을 끊은 후에, 이 작업을 해야 합니다.
    2. 해당 데이터베이스의 모든 데이터 파일과 트랜잭션 로그파일의 경로의 확인합니다.
      EXEC sp_helpdb SampleGO
    3. 데이터베이스와 파일을 분리합니다.
      EXEC sp_detach_db 'Sample', 'true'GO
    4. 데이터베이스 파일들을 원하는 위치에 복사합니다.
      C 드라이브에 있는 sample_dat.mdf, sample_log.ldf를 각각 d:\data, e:\log 밑에 복사합니다.
    5. 새로운 위치의 파일을 지정하여 데이터베이스와 연결합니다.
      EXEC sp_attach_db 'Sample','d:\data\sample_dat.mdf' ,'e:\log\sample_log.ldf'GO

    Tempdb 위치 변경하기

    [따라하기] Tempdb를 디스크 상의 다른 위치로 이전하기
    아래 예제는 tempdb에만 적용할 수 있으며, 사용자 데이터베이스를 이동하고자 하는 경우에는 sp_detach_db와 sp_attach_db를 사용하기 바랍니다. 이에 대한 자세한 내용은 [데이터베이스 이전하기]를 참조하십시오.

    1. tempdb 데이터베이스의 논리 파일 이름을 확인합니다.
      USE tempdbGOEXEC sp_helpfileGO/* 결과tempdev 1 C:\Program Files\Microsoft SQL Server\MSSQL\data\tempdb.mdf    PRIMARY 102400 KB Unlimited 10% data onlytemplog    2 C:\Program Files\Microsoft SQL Server\MSSQL\data\templog.ldf    NULL 20480 KB Unlimited 5120 KB log only*/
    2. ALTER DATABASE 명령어를 사용하여 파일의 위치를 변경합니다.
      USE masterGOALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 'E:\DBData\tempdb.mdf')GOALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = 'F:\DBData\templog.ldf')GO
    3. SQL Server 를 중지한 후 다시 시작합니다.
    4. SQL Server 서비스가 시작된 다음에, 다음의 확인작업을 수행합니다.
      USE tempdbGOEXEC sp_helpfileGO
    5. 기존의 tempdb 파일들을 삭제합니다.

    데이터베이스 파일 변경하기

    • 파일 크기 확장하기
      [따라하기] Sample 데이터베이스 sample_dat 파일을 200MB로 확장하기.
      ALTER DATABASE sampleMODIFY FILE(NAME = sample_dat,SIZE = 200MB)GO
    • 파일 증가 규칙 변경하기
      [따라하기] Sample 데이터베이스 sample_dat 파일의 증가율을 5MB로 변경하기.
      ALTER DATABASE sampleMODIFY FILE(NAME = sample_dat,FILEGROWTH = 5MB)GO
    • 새로운 파일 그룹 추가하기
      [따라하기] 파일 그룹 추가하기
      Sample 데이터베이스에 sample_Fg 파일 그룹을 추가한 후, 그 파일그룹에 Sample_New 파일을 추가합니다. 주 데이터 파일이 아닌 데이터 파일의 확장자는 .ndf입니다.
      ALTER DATABASE SampleADD FILEGROUP Sample_FgGOALTER DATABASE SampleADD FILE(NAME = Sample_New,FILENAME = 'c:\data\Sample_New.ndf',SIZE = 10MB,MAXSIZE = UNLIMITED,FILEGROWTH = 3MB)TO FILEGROUP Sample_FgGO

    데이터베이스 축소하기

    데이터베이스의 IsAutoShrink 옵션을 true로 설정하여, 데이터베이스를 축소하는 방법도 있으나, DBCC SHRINKDATABASE 또는 DBCC SHRINKFILE를 사용하여 수동으로 데이터베이스를 축소하는 방법이 있습니다. 관련 데이터베이스의 특정 데이터 파일이나, 트랜잭션 로그 파일을 축소하는 경우에는 DBCC SHRINKFILE을 사용합니다.

    • 파일 지정 없이 축소하기
      [따라하기] 파일 지정 없이 Sample 데이터베이스 전체 크기 중에서 10%의 여유공간이 남도록 파일 크기를 축소합니다.
      DBCC SHRINKDATABASE (Sample, 10)GO
    • 특정 파일 축소하기
      [따라하기] Sample 데이터베이스의 sample_dat 파일을 10MB로 축소합니다.
      USE SampleGODBCC SHRINKFILE (sample_dat, 10)GO
    • 가상 로그 파일 축소하기

      트랜잭션 로그 파일이 여러 번 자동 증가가 발생한 경우, 여러 개의 가상 로그 파일들로 조각화되어, 로그 관련 작업의 성능에 좋지 않은 영향을 미칩니다. 가상 로그 파일이 25개 이상일 경우, 가상 로그 파일을 제거하고, 트랜잭션 로그 파일을 적절한 크기로 변경합니다.

      [따라하기] Sample 데이터베이스의 Sample_log 로그 파일의 가상 로그 파일을 제거하여, 트랜잭션 로그 파일을 축소합니다.

      1. 1. 가상 로그 파일 확인합니다. 결과 행의 수가 가상 로그 파일의 수입니다.
        USE SampleGODBCC LOGINFOGO
      2. 2. 트랜잭션 로그 백업을 수행합니다. 로그 백업을 받을 수 없는 경우에는 로그를 삭제합니다.
        BACKUP LOG Sample TO DISK='D:\DBBackup\Sample_Log.bak'GO-- 또는 BACKUP LOG Sample WITH NO_LOGGO
      3. 3. 트랜잭션 로그 파일의 크기를 가능한 한 작은 크기로 축소합니다.
        EXEC sp_helpfileGODBCC SHRINKFILE (Sample_log, TRUNCATEONLY)GO
      4. 4. 로그 파일의 크기를 적절하게 변경합니다.
        ALTER DATABASE SampleMODIFY FILE     ( NAME = 'Sample_log'    , SIZE = 30)GO

    데이터베이스 옵션 설정하기

    [따라하기] 데이터베이스 옵션 확인하기
    데이터베이스 옵션의 현재 설정이나 지정된 데이터베이스의 속성에 대한 정보의 확인은 SQL Server 2000에서 제공하는 함수인 DATABASEPROPERTYEX를 사용합니다.

    SELECT DATABASEPROPERTYEX ('pubs', 'IsAutoUpdateStatistics')GO

    [참고]
    새로운 데이터베이스를 만들 때 FOR ATTACH가 지정된 경우를 제외하면 model 데이터베이스의 데이터베이스 옵션 설정을 상속받습니다. 예를 들어, 데이터베이스 옵션 select into/bulkcopy는 model 데이터베이스와 모든 새 데이터베이스에서 OFF로 설정됩니다. 그러므로 ALTER DATABASE를 사용하여 model 데이터베이스의 옵션을 변경하면 변경된 옵션 설정이 이후에 새로 만들어지는 모든 데이터베이스에 적용됩니다.

    /* model 데이터베이스의 옵션 설정 */USE modelGOALTER DATABASE model SET AUTO_UPDATE_STATISTICS OFF, RECOVERY BULK_LOGGEDGO/* model 데이터베이스의 변경된 옵션정보 확인 */SELECT DATABASEPROPERTYEX ('model', 'IsAutoUpdateStatistics')SELECT DATABASEPROPERTYEX ('model', 'Recovery')GO

    데이터베이스 소유자 변경하기

    USE SampleEXEC sp_changedbowner 'dbadmin'GO

    데이터베이스 이름 변경하기

    EXEC sp_renamedb Sample, Sample_RenameGO


    백업과 복구

    모든 데이터베이스 운영 환경은 반드시 장애 복구에 대한 백업과 복구 계획을 가지고 있어야 합니다. 백업과 복구 계획은 실제 운영 서버를 백업하여 실제와 동일한 상태로 철저히 테스트하고 문서화해야 합니다. 백업과 복구 계획은 응용 프로그램과 운영 체제의 구성 요소를 포함하여, 전체 시스템에 대하여 문서화해야 하며, 발생 가능한 모든 장애 시나리오를 고려하여 문서화해야 합니다. 반드시 규칙적인 테스트를 수행해야 합니다. 계획을 수립할 때에는, 시스템이 얼마동안 다운되어도 무방한지, 어느 정도의 데이터가 유실되어도 되는지에 관련된 리소스 비용과 다운타임, 복구 비용을 고려합니다.

    복구 모델

    복구 모델은 트랜잭션 로그에 어떤 내용이 저장되었는지를 가리키는 것입니다. SQL Server Standard Edition, Enterprise Edition의 디폴트 복구 모델은 전체 백업 모드입니다. 디폴트 복구 모델은 데이터베이스가 만들어질 때 model 데이터베이스에 설정된 값에 의하여 결정됩니다.

    • 단순 복구 (Simple)
      - 마지막으로 백업을 시행한 시점까지의 백업된 정보를 복구합니다.
      - 전체 백업과 차등 백업을 이용할 수 있으나, 트랜잭션 로그 백업은 할 수 없습니다.
      - 이 모델은 응용 프로그램을 테스트하는 테스트 환경 또는 저장된 데이터를 복구할 필요가 전혀 없는 시스템에 적합합니다.
    • 전체 복구 (Full)
      - 모든 변경 사항이 트랜잭션 로그에 기록됩니다.
      - 문제가 발생한 시점이나 과거의 백업을 받은 특정한 시점까지의 정보를 복구할 수 있습니다.
      - 전체 백업, 차등 백업, 트랜잭션 로그 백업을 모두 이용할 수 있습니다.
    • 대량 로그 복구 (Bulk_Logged)
      - 대량 작업이나 대량 로딩에 대한 기록은 최소화하기 때문에, 백업 전에 발생한 대량 작업의 오류는 수작업으로 보정해야 합니다.
      - 전체 백업, 차등 백업, 트랜잭션 로그 백업을 모두 이용할 수 있습니다.

    [따라하기] 데이터베이스 복구 모델 변경하기

    ALTER DATABASE SampleSET RECOVERY BULK_LOGGEDGOALTER DATABASE TestDBSET RECOVERY SIMPLEGOALTER DATABASE TestDBSET RECOVERY FULLGO

    [참고] 복구 모델 전환 시 백업 전략

    변경 전변경 후작업설명
    전체 복구대량 복구없음백업 전략의 변화는 없다.
    전체 복구단순 복구변경하기 전에 선택적으로 트랜잭션 로그를 백업한다.변경 시점까지 복원을 위해 변경 전에 로그 백업을 한다. 단순 복구 모델로 전환한 후에는, 로그 백업을 중지한다.
    대량 복구전체 복구없음백업 전략의 변화는 없다.
    대량 복구단순 복구변경하기 전에 트랜잭션 로그를 선택적으로 백업한다.변경 작업 전에 로그 백업을 하는 것으로 특정 시점까지 복원하는 것이 가능하다. 단순 복구 모델로 변경 후에는 로그 백업을 중지한다.
    단순 복구전체 복구변경 후에 데이터베이스 백업을 수행한다.전체 복구 모델로 전환된 후 전체 데이터베이스 백업 또는 차등 백업을 수행한다. 주기적으로 데이터베이스 백업, 로그 백업, (선택적으로) 차등 백업을 수행한다.
    단순 복구대량 복구변경 후에 데이터베이스 백업을 한다.대량 복구 모델로 전환된 후 전체 데이터베이스 백업 또는 차등 백업을 수행한다. 주기적으로 데이터베이스 백업, 로그 백업, (선택적으로) 차등 백업을 수행한다.

    백업의 종류

    • 전체 백업
      데이터베이스를 구성하는 모든 데이터 파일들을 백업합니다. 시스템과 사용자 정의 데이터베이스에서 주기적으로 수행되어야 합니다.
    • 파일 또는 파일 그룹 백업
      파일 그룹을 구성하는 파일들 중에서 하나의 파일이나 여러 개의 파일들을 백업합니다. 전체 백업보다 훨씬 빠르고, 업무 단위의 백업이 가능하여, 대량의 데이터베이스일 경우에 효율적이기는 하지만, 백업받은 데이터만 보호된다는 단점이 있습니다.
    • 차등 백업
      마지막 전체 백업이 실행된 이후 변경된 정보를 백업합니다. 즉, 두 번째 차등 백업은 첫 번째 차등 백업과 중복되는 부분이 있으므로, 복원 시에는 전체 백업과 장애가 발생하기 전의 마지막 차등 백업을 복원하면 됩니다. 차등 백업 전략을 사용하면 복구 속도를 향상시킬 수 있습니다.
    • 트랜잭션 로그 백업
      트랜잭션 로그 백업은 전체 복구 또는 대량 로그 복구 옵션으로 설정된 데이터베이스에서만 사용 가능하며, 이 경우 데이터베이스에 변경이 발생할 때마다 그 변경에 대한 모든 정보가 트랜잭션 로그에 기록됩니다. 트랜잭션 로그는 연속적으로 변경 내역을 저장합니다. 복원할 경우에는, 마지막 전체 백업을 실행한 시점부터 순차적으로 실행한 모든 트랜잭션 로그 백업이 필요합니다. 다시 말씀드리지만 복구 모델이 "단순 복구"일 경우에는, 트랜잭션 로그 백업은 사용할 수 없습니다.

    백업 전략 세우기

    전체 데이터베이스 백업은 항상 수행되어야 합니다. 일반적으로 트랜잭션 로그 백업은 대부분의 경우 수행합니다. 트랜잭션 로그 백업을 수행하지 않는 예외적인 경우는 데이터의 변경이 드물게 발생하거나 테스트 환경에서입니다. 차등 백업은 많은 트랜잭션이 발생하고 로그 백업의 크기가 큰 환경에서 주로 사용됩니다. 파일과 파일 그룹 백업 전략은 대용량 데이터베이스 환경에서 사용합니다. 다중 파일로 구성된 데이터베이스라도 한 번에 하나의 파일로 백업할 수 있습니다. 백업에 관한 정보는 엔터프라이즈 관리자를 사용하거나 쿼리 분석기에서 RESTORE 명령어를 수행하여 시스템 테이블을 쿼리하여 확인할 수 있습니다.

    번호수칙체크
    1시스템 데이터베이스도 백업을 수행합니다. 
    2백업 전략은 복구 시간까지 감안하여 계획을 세웁니다. 
    3트랜잭션 로그를 정기적으로 백업하지 않는다면, 정기적으로 비워 줍니다. 
    4백업 파일은 데이터베이스 파일이 저장된 디스크와 물리적으로 다른 디스크에 저장합니다. 
    5주기적으로 백업 파일이 제대로 복원되는지 테스트합니다. 

    수칙1. 시스템 데이터베이스는 변경이 발생할 때마다 백업해야 합니다.

    사용자 데이터베이스뿐만 아니라, 시스템 데이터베이스에도 시스템에 관련된 중요한 정보들이 있으므로, 백업을 합니다. Master 데이터베이스와 msdb 데이터베이스는 데이터베이스에 변경이 발생할 때마다 백업하는 것이 원칙입니다. 데이터베이스의 생성 및 변경, 로그인 정보의 변경, 연결된 서버의 변경, 구성 변경 등의 작업이 수행되면 master 데이터베이스 백업을 수행해야 합니다. 작업, 경고, 작업자, 스케쥴 등이 생성되거나 변경될 때에는 msdb를 백업해야 합니다.
    - Master, msdb : 단순 복구 모델의 전체 백업
    - Model : 전체 복구 모델의 전체 백업

    수칙2. 백업 전략은 복구 시간까지 감안하여 계획을 세웁니다.

    백업전략은 데이터의 중요성, 데이터의 변경 주기, 복구 시간 등 여러 가지 요인들을 고려하여 수립합니다.

    수칙3. 트랜잭션 로그를 정기적으로 백업하지 않는다면, 정기적으로 비워 주어야 합니다.

    트랜잭션 로그가 가득 차면, 데이터베이스에서의 모든 변경 작업은 트랜잭션 로그가 삭제되거나 로그가 확장될 때까지 중단되므로, 로그 파일은 자동으로 증가되도록 설정할 것을 권고합니다. 그리고, 사용된 로그 공간의 양은 지속적으로 스크립트나 감사 테이블 또는 SQL Server:Databases 객체의 카운터 Percent Log Used의 성능 상태 경고를 통하여 모니터링해야 합니다.
    어떤 시스템의 경우에는 트랜잭션 로그 파일의 크기가 데이터 파일의 수십배에 달하는 경우를 간혹 볼 수 있습니다. 그 이유는 데이터베이스의 복구 모델이 전체(FULL) 또는 대량 로그(BULK_LOGGED)인데, 데이터베이스 전체 백업만 수행하고 로그 백업이나 삭제 작업은 수행하지 않았기 때문입니다. 전체 백업을 수행하더라도 트랜잭션 로그는 삭제되지 않으므로 주기적인 트랜잭션 로그 백업 또는 트랜잭션 로그 삭제가 필요합니다. 중요한 데이터가 저장된 데이터베이스라면 트랜잭션 로그를 정기적으로 백업하는 것을 권고하며, 테스트 DB와 같이 트랜잭션 로그 백업이 필요하지 않는 경우라면 트랜잭션 로그를 정기적으로 삭제해 주어야 합니다.

    [예제] 트랜잭션이 완료된 로그 삭제하기

    BACKUP LOG Sample WITH NO_LOG  -- 또는 BACKUP LOG Sample WITH TRUNCATE_ONLY

    [참고] 데이터베이스가 단순 복구 모델이거나 "truncate log on checkpoint" 옵션이 선택되어 있을 때 트랜잭션 로그 백업을 하면, 엔터프라이즈 관리자에서는 트랜잭션 로그 옵션이 비활성화 상태가 되고, 쿼리 분석기에서는 4208 오류가 반환됩니다. 트랜잭션 로그 백업을 수행하기 위해서는, "truncate log on checkpoint" 옵션이 비활성화 상태라야 합니다.

    수칙4. 백업 파일은 데이터베이스 파일이 저장된 디스크와 물리적으로 다른 디스크에 저장합니다.

    디스크로 백업하고 별도의 위치로 백업 파일을 저장하는 것이 원칙입니다만, 여건상 하드 디스크에만 백업받는 경우에는 최소한 데이터베이스 파일이 저장된 디스크와 물리적으로 다른 디스크로 백업합니다.

    수칙5. 주기적으로 백업 파일의 유효성과 백업이 실제로 정상적으로 복원되는지 테스트합니다.

    "백업 검증하기"에 있는 내용을 참조하여 백업 세트의 유효성을 점검할 것을 권고합니다. 만일의 경우를 대비하여 백업을 열심히 받아 두었는데 막상 문제가 발생해서 복원하려고 하면 복원이 정상적으로 되지 않아서 낭패를 겪는 고객사를 간혹 볼 수 있습니다. 백업 장비에 문제가 있는 경우도 있으므로, 특히 새로운 백업 장비 도입 시에는 백업 후 반드시 다른 DB 서버에서 복원을 테스트하기 바랍니다.


    백업 성능 향상시키기

    데이터베이스 파일이 여러 개의 디스크에 분산되어 있으면 병렬로 디스크 I/O를 처리할 수 있으므로 백업 성능에 도움이 됩니다. 그리고 다중의 백업 디바이스로 백업하면 백업 수행 속도가 향상됩니다. 스트라이핑된 백업 세트를 생성할 때에는, 모든 백업 디바이스의 미디어 타입이 동일해야 합니다. 디스크 드라이브가 테이프보다 훨씬 빠르며 테이프 백업은 SQL Server에 물리적으로 장착이 되어야만 가능합니다. 속도를 향상시키고자 한다면, 먼저 직접 디스크에 백업을 받은 다음에 백업 파일을 오프사이트로 저장하기 위해 써드 파티 도구를 사용하여 테이프로 복사하거나 다른 드라이브로 복사합니다.

    [참고] 네트워크 드라이브 백업이 가능하지만, 백업성능이 좋지 않으며 네트워크 부하를 가중시킬 수 있으므로 유의하기 바랍니다.

    백업 검증하기

    RESTORE VERIFYONLY를 사용하면 백업을 복원하지 않고 백업 디바이스를 검사하여 백업 세트가 올바른지 그리고 모든 볼륨을 제대로 읽을 수 있는지 확인할 수 있습니다. 그러나, 이 명령어는 DB 데이터의 손상 여부까지 확인해 줄 수는 없습니다. 그러므로 대기 서버를 사용하여 DBCC 명령어를 수행하여 데이터의 손상 여부를 확인해야 완벽한 점검이 가능합니다. 주기적으로 운영 서버가 아닌 대기 서버에서 DB를 복원하고 DBCC CHECKDB 명령어를 사용하여 백업에 포함된 데이터가 손상되지 않았는지를 확인할 것을 권고합니다.

    복원 전략 세우기

    손상된 데이터베이스를 복구하는 첫번째 단계는 현재의 트랜잭션 로그를 백업하는 것입니다. 이 작업은 트랜잭션 로그 파일이 액세스 가능하고 손상되지 않았을 때 가능합니다. 비록 데이터베이스가 suspect 상태일지라도, 마지막 트랜잭션 로그 백업의 시점부터 데이터베이스 파일이 손상되었을 시점까지의 전체 트랜잭션 로그를 백업합니다.
    복구 과정에서 복구되는 마지막 백업은 문제 발생 후 백업한 트랜잭션 로그 백업이거나 마지막 로그 백업이며, 사용 가능한 트랜잭션 로그 백업이어야 합니다. 마지막 백업 이전의 복원 단계에서는 NORECOVERY 옵션을 사용해야 하며, 마지막 백업의 복구 시에는 RECOVERY 옵션을 사용합니다.

    [참고] 트랜잭션 로그 백업이 RECOVERY 옵션으로 복구되면, 추가적인 로그는 복구될 수 없습니다. 만일 추가적인 로그가 존재하면, 복구 프로세스는 반드시 마지막 전체 데이터베이스 백업을 가지고 처음부터 다시 시작해야 합니다.

    • 전체 백업을 다른 서버에 복원하기
        백업 일시  백업
        월 05:00  BACKUP DATABASE Sample
        TO DISK='F:\DBBackup\sample.bak' WITH NOINIT
        화 05:00  BACKUP DATABASE Sample
        TO DISK= 'F:\DBBackup\sample.bak' WITH NOINIT
        수 05:00  BACKUP DATABASE Sample
        TO DISK= 'F:\DBBackup\sample.bak' WITH NOINIT

      [따라하기]
      전체 백업을 새로운 서버에 복원한 후, 새로운 서버의 로그인 정보를 복원한 데이터베이스의 사용자와 링크합니다. 사용자에 대한 로그인이 변경되는 경우에는 sp_change_users_login을 사용하면, 사용자의 권한을 상실하지 않고 새 로그인에 사용자를 링크할 수 있습니다.

      1. 백업 파일에 대한 정보를 확인합니다.
      -- 모든 백업 세트들에 대한 백업 헤더 정보를 검색합니다. RESTORE HEADERONLYFROM DISK='F:\DBBackup\sample.bak'GO-- 복원할 백업 세트에 포함된 데이터베이스와 로그 파일 정보를 확인합니다.RESTORE FILELISTONLYFROM DISK='F:\DBBackup\sample.bak'WITH FILE = 3GO
      2. 원하는 전체 백업 파일을 새로운 서버에 복원 합니다.
      USE masterGORESTORE DATABASE SampleFROM DISK='F:\DBBackup\sample.bak'WITH FILE = 3, RECOVERYGO
      만약 복원에 문제가 발생하면, DBCC VERIFYONLY 명령어를 사용하여 백업 세트의 유효성을 확인합니다. 이 명령어는 실제 복원 작업보다는 수행 시간이 조금 짧기는 하지만, 수행 시간이 오래 걸립니다.
      RESTORE VERIFYONLYFROM DISK='F:\DBBackup\sample.bak'WITH FILE = 3GO
      3. 복원이 완료되면, 사용자 정보를 연결합니다.
      USE SampleGOEXEC sp_change_users_login 'Update_One', 'dbadmin', 'dbadmin'GO
      [참고] SQL Server는 GUID를 생성하여 syslogins.sid에 저장하며 이 sid를 로그인 이름의 security_identifier로 사용합니다. 서버가 다르면 Login 계정이 동일하더라도 이 sid값은 달라지며 로그인과 사용자에 대한 처리는 sid를 사용하므로, 원격 서버로 데이터베이스를 복원한 경우에는 새로운 서버의 로그인 계정과 복원한 데이터베이스의 사용자를 연결하는 작업이 필요합니다.
      SELECT SUSER_SNAME (security_identifier)SELECT sid FROM master..syslogins WHERE name='dbadmin'SELECT sid FROM Sample..sysusers WHERE name='dbadmin'
    • 전체 백업과 차등 백업을 실행한 경우의 복원하기
        백업 일시  백업
        월 05:00BACKUP DATABASE Sample
      TO DISK='F:\DBBackup\sample.bak' WITH INIT
        화 05:00BACKUP DATABASE Sample
      TO DISK='F:\DBBackup\sample.bak'
      WITH DIFFERENTIAL, NOINIT
        수 05:00BACKUP DATABASE Sample
      TO DISK='F:\DBBackup\sample.bak'
      WITH DIFFERENTIAL, NOINIT

      [따라하기] 차등 백업을 사용하여 복원하기
      차등 백업은 마지막 데이터베이스 백업 이후에 수정된 모든 페이지의 복사본을 저장하므로, 전체 백업 이후의 최종 차등 백업만 복원하면 됩니다. 문제가 발생하여 복원하는 경우에는 항상 복원 전에 현재의 트랜잭션 로그를 백업받습니다. (로그 백업이 가능한 경우)

      1. 백업 세트에 대한 정보를 확인합니다. (전체 백업을 다른 서버에 복원하기 참조)

      2. 장애가 발생하기 전의 마지막 전체 백업을 복원합니다.

      USE masterGORESTORE DATABASE sampleFROM DISK='F:\DBBackup\sample.bak'WITH FILE = 1, NORECOVERYGO

      3. 복원한 전체 백업 후의, 마지막 차등 백업 파일을 복원합니다.

      RESTORE DATABASE sampleFROM DISK='F:\DBBackup\sample.bak'WITH FILE = 3, RECOVERYGO
    • 전체 백업과 트랜잭션 로그 백업을 실행한 경우의 복원하기
        백업 일시  백업
        월 05:00BACKUP DATABASE Sample
      TO DISK='F:\DBBackup\sample.bak' WITH INIT
        월 10:00BACKUP LOG Sample
      TO DISK='F:\DBBackup\sample_log.bak'
        월 15:00BACKUP LOG Sample
      TO DISK='F:\DBBackup\sample_log.bak'

      [따라하기] 문제가 발생하여 전체 데이터베이스 백업과 로그 백업으로 복구하기
      트랜잭션 로그는 로그 백업 이후의 변경된 자료만을 가지고 있기 때문에, 복원할 경우에는 모든 로그 파일이 순차적으로 필요합니다.

      1. NO_TRUNCATE 절을 사용하여 BACKUP LOG 문을 실행함으로써 현재 활성화된 트랜잭션 로그를 백업합니다.
      BACKUP LOG SampleTO DISK='F:\DBBackup\sample_log2.bak'WITH NO_TRUNCATEGO
      2. 장애가 발생하기 전의 마지막 전체 백업을 복원합니다.
      USE masterGORESTORE DATABASE SampleFROM DISK= 'F:\DBBackup\sample.bak'WITH FILE = 1, NORECOVERYGO
      3. 복원한 전체 백업 이후, 첫 번째 로그 백업을 복원합니다.
      RESTORE LOG SampleFROM DISK='F:\DBBackup\sample_log.bak'WITH FILE = 1, NORECOVERYGO
      4. 순차적으로 다음 로그 백업을 차례로 복원합니다.
      RESTORE LOG SampleFROM DISK='F:\DBBackup\sample_log.bak'WITH FILE = 2, NORECOVERYGO
      5. 단계1에서 백업받은 로그 백업을 복원합니다. (백업이 성공한 경우)
      RESTORE LOG SampleFROM DISK='F:\DBBackup\sample_log2.bak'WITH RECOVERYGO

      [참고] 복구 모델이 "대량 로그 복구"일 경우에는, SELECT INTO 등과 같은 대량 로그 작업은 복원할 수 없습니다.

    • 전체 백업과 파일 그룹 백업을 실행한 경우의 복원하기
        백업 일시  백업
        월 05:00BACKUP DATABASE Sample
      TO DISK='F:\DBBackup\sample.bak' WITH INIT
        화 05:00BACKUP DATABASE sample Primary
      TO DISK='F:\DBBackup\sample_prm.BAK'
        화 17:00BACKUP LOG Sample
      TO DISK='F:\DBBackup\sample_log.BAK'
        수 05:00BACKUP DATABASE Sample Secondary
      TO DISK='F:\DBBackup\sample_scn.BAK'
        수 17:00BACKUP LOG Sample
      TO DISK='F:\DBBackup\sample_log.BAK'

      [따라하기]
      위의 백업을 실행 후에, Secondary 파일 그룹이 깨졌다고 가정합니다. 전체 백업을 복구할 필요 없이, 파일 그룹 백업만으로 복구가 가능합니다. 대용량 데이터베이스일 경우, 파일 그룹 백업은 복원 시간 단축에 매우 효과적입니다.

      1. Secondary 백업을 복원합니다.

      RESTORE DATABASE Sample SecondaryFROM DISK=' F:\DBBackup\sample_scn.bak'WITH FILE = 1, NORECOVERYGO
      2. 복원한 백업 이후의, 로그 백업을 순차적으로 복원합니다.
      RESTORE LOG SampleFROM DISK='F:\DBBackup\sample_log.bak'WITH FILE = 2, RECOVERYGO
    • 파일 위치 지정하여 복원하기

      [따라하기]
      sample_dat 데이터 파일은 "c:\data\"에, sample_log 로그 파일은 "d:\log\"로 위치를 변경하여 복원하고자 한다면, MOVE … TO 옵션을 사용하여 파일의 위치를 지정하면 됩니다.

      RESTORE DATABASE Sample FROM DISK='F:\DBBAckup\Sample.BAK'WITH MOVE 'sample_dat' TO 'c:\data\sample_dat.mdf', MOVE 'sample_log' TO 'd:\log\sample_log.ldf', REPLACEGO

      [참고] REPLACE 옵션은 지정한 위치에 같은 파일이 이미 존재할 때 사용합니다.

    • 지정 시간 복구하기

      지정 시간 복구는 오직 트랜잭션 로그 백업 상태에서만 가능합니다. RESTORE 명령어에 STOPAT 옵션을 사용하면 날짜와 시간을 정하여 데이터베이스를 복구할 수 있습니다. 이 경우 DBA는 사용자로부터 오류가 발생한 정확한 날짜와 시간을 알아내야 합니다. STOPAT 옵션은 정확하지 않은 데이터를 테스트하기 위하여 NORECOVERY 옵션과 함께 사용할 수가 없습니다. 정확한 시간이 필요합니다. RESTORE 문에 기술된 날짜와 시간 이전에 커밋되지 않은 트랜잭션은 롤백될 것이며 이는 데이터의 손실을 초래합니다.

      [따라하기] 2004년 12월 30일 오전 12시 상태로 데이터베이스를 복원하고 여러 로그와 여러 백업 장치와 관련된 복원 작업입니다.

      USE masterGORESTORE DATABASE Sample    FROM DISK='F:\DBBackup\sample.bak'    WITH FILE = 1, NORECOVERYRESTORE LOG Sample    FROM DISK='F:\DBBackup\sample_log.bak'    WITH FILE = 1, NORECOVERYRESTORE LOG Sample FROM DISK='F:\DBBackup\sample_log.bak'    WITH FILE = 2, RECOVERY, STOPAT = '2004-12-30 15:36:00.000'GO
    • 표시된 트랜잭션 복구하기

      표시된 트랜잭션은 DBA가 잘못된 트랜잭션이 발생한 시점을 확인하는데 있어 유용하며, 보다 쉽게 복구를 할 수 있도록 해 줍니다. WITH MARK 옵션을 사용하면 트랜잭션 이름이 트랜잭션 로그에 저장되며, 이 옵션을 사욛하면 날짜와 시간 대신 표시된 트랜잭션을 사용하여 데이터베이스를 이전 상태로 복원할 수 있습니다.
      로그에서 표시로 복구하는 방법은 다음 두 가지가 있습니다.
      RESTORE LOG와 WITH STOPATMARK='mark_name' 절을 사용하여 표시된 부분까지 롤포워드하고 표시가 있는 트랜잭션을 포함시킵니다.
      RESTORE LOG와 WITH STOPBEFOREMARK='mark_name' 절을 사용하여 표시된 부분까지 롤포워드하고 표시가 있는 트랜잭션은 제외시킵니다.
      WITH STOPATMARK와 WITH STOPBEFOREMARK 절은 선택적인 AFTER datetime 절을 지원합니다. AFTER datetime이 생략되면 지정한 이름이 있는 첫 번째 표시 지점에서 복구가 중지됩니다. AFTER datetime이 지정되면 지정한 일시 또는 지정한 시점 이후에 지정한 이름이 있는 첫 번째 표시 지점에서 복구가 중지됩니다.

      [따라하기]

      /* 트랜잭션 표시 */BEGIN TRANSACTION UpdateCol3 WITH MARK 'Update Col3 values'GOUPDATE Tab_SampleSET Col3 = Col3 * 100 GOCOMMIT TRANSACTION UpdateCol3GO/* 표시된 트랜잭션 복원 */USE masterGORESTORE DATABASE Sample    FROM DISK='F:\DBBackup\sample.bak'    WITH FILE = 1, NORECOVERYRESTORE LOG Sample    FROM DISK='F:\DBBackup\sample_log.bak'    WITH FILE = 1, STOPATMARK = 'UpdateCol3'GO

    스크립트 백업

    번호수칙체크
    1사용자 데이터베이스의 오브젝트 스크립트도 주기적으로 백업합니다. 
    2JOB 스크립트도 주기적으로 백업힙니다. 

    • 오브젝트 스크립트 백업하기

      [따라하기]

      1. 엔터프라이즈 관리자에서 스크립트를 생성하고자 하는 데이터베이스를 선택하고 마우스의 오른쪽 버튼을 클릭하여, [모든 작업] ' [SQL 스크립트 생성]을 선택합니다.

      사용자 삽입 이미지

      2. SQL 스크립트 생성 창의 [모두 표시]를 클릭하고, 필요한 경우 스크립트 백업 받기를 원하는 오브젝트 종류를 선택합니다. 테이블 스크립트를 저장하려고 한다면, [모든 테이블]을 선택합니다.

      사용자 삽입 이미지

      3. [서식] 탭을 선택합니다. [개체마다 DROP <개체>명령 생성]의 선택을 제거할 것을 권고합니다. 생성된 SQL 스크립트를 실수로 운영 DB서버에서 수행하여 운영중인 오브젝트들이 모두 삭제되는 불상사가 간혹 발생하고 있으므로, 항상 DROP 옵션은 체크 해제한 상태에서 스크립트를 받을 것을 권고합니다.

      사용자 삽입 이미지

      4. [옵션] 탭을 선택합니다. 필요한 옵션을 선택하고, [확인]을 클릭합니다. 테이블의 경우에는 일반적으로 제약 조건과 인덱스 스크립팅을 선택합니다. 예를 들어 모데이터베이스 내 모든 저장 프로시저들의 스크립트를 받고자 하는 경우에 [개체마다 파일 하나씩 만들기] 옵션을 선택하기도 하는데, 저장 프로시저의 수가 매우 많은 경우에는 이 옵션은 성능 문제를 유발할 수 있으므로 작업 부하가 가장 적은 시점에 사용하기 바랍니다.

      사용자 삽입 이미지

      5. 저장할 파일명을 입력하고, [저장]을 클릭합니다.

    • JOB 스크립트 백업하기

      1. EM의 [관리] ' [SQL Server에이전트] ' [작업] 위에서 마우스 오른쪽 버튼을 클릭하여 [모든 작업]'[SQL스크립트 생성]을 선택합니다.

      사용자 삽입 이미지

      2. SQL 스크립트 생성 창의 파일 이름을 입력하고, SQL 생성 옵션의 [작업이 있으면 바꾸기]의 선택을 제거합니다.

      사용자 삽입 이미지

      3. [확인]을 클릭합니다.



    테이블 관리

    테이블 생성하기

    번호수칙체크
    1동일한 속성의 데이터 타입은 동일하게 할당합니다. 
    2컬럼에 저장되는 데이터의 값과 특성을 고려하여 가장 적합한 데이터 타입을 선택합니다. 
    3데이터 무결성을 보장할 수 있도록 적절하게 제약 조건을 정의합니다. 
    4항상 값이 저장되는 컬럼에 대해서는 반드시 NOT NULL로 정의합니다. 

    수칙1. 동일한 속성의 데이터 타입은 일관되게 동일하게 할당합니다.

    동일한 속성을 가진 데이터를 서로 다른 테이블들에서 다른 데이터 타입으로 선언한 경우에는 데이터의 불일치 뿐 아니라 성능 저하를 유발할 수도 있으므로 유의하기 바랍니다. 동일한 속성임에도 불구하고 테이블에 따라 데이터 타입이 다른 경우도 있고 데이터 타입은 동일하지만 길이가 다른 경우도 있습니다. 또한 예를 들어, 주민등록번호나 계좌번호와 같은 성격의 데이터들에 대해서 어떤 컬럼은 char(13)으로 선언하고 '-' (하이픈) 없이 데이터를 저장하고 어떤 컬럼은 char(14)로 선언하여 '-'을 추가하여 저장하는 경우가 있는데, 동일한 속성에 대해서는 동일한 데이터 타입, 동일한 데이터 포맷, 동일한 길이를 가지는 동일한 데이터 타입을 일관되게 사용해야 합니다.

    수칙2. 컬럼에 저장되는 데이터의 값, 특성 등을 고려하여 적합한 데이터 타입을 선택합니다.

    컬럼에 숫자만 저장되고 계산에 사용할 가능성이 있다면 숫자 데이터 타입을 할당합니다. 숫자 데이터 타입의 경우에는 tinyint, smallint, int, bigint의 네 가지 데이터 타입이 지원되므로 저장될 데이터 값의 범위를 확인하여 데이터 타입을 선택합니다. 예를 들어 0에서 255까지의 정수를 저장할 컬럼이라면 저장소 측면에서 int 대신 tinyint를 사용하는 것이 효율적이며, 21억이 넘는 큰 값이 저장될 컬럼이라면 bigint를 사용해야 오버플로우 오류가 발생하는 것을 방지할 수 있습니다.
    소수점 이하 값이 없는 컬럼에 불필요하게 numeric, decimal 타입을 사용하는 경우를 볼 수 있는데, 소수점 이하 값이 없는 숫자형 데이터에 대해서는 numeric, decimal 대신 정수형 타입을 사용할 것을 권고합니다.
    문자가 저장되는 컬럼은 문자 데이터 타입을 할당하며, 저장되는 값의 길이가 일정하거나 길이의 차이가 적은 경우에는 고정 길이 문자형(char)을 사용하는 것이 성능적인 측면에서 유리합니다.
    On/Off 또는 0/1, Yes/No와 같은 성격의 데이터는 bit 데이터 타입으로 설정하면, 하나의 테이블에 bit 타입이 여러 개 있는 경우에 레코드의 길이를 줄일 수 있습니다. 자세한 내용은 온라인 설명서를 참조하십시오.

    [참고] 데이터 타입

    분류데이터 타입범위저장소크기
    정수BitO 또는 1bit
    Int-2,147,483,648 ~ 2,147,483,6474 바이트
    Smallint-32,768 ~ 32,7672 바이트
    Tinyint0 ~ 2551 바이트
    Bigint-2^63 ~ 2^63-18 바이트
    부동소수점Float[n]-1.79E+308 ~ 1.79E+308
    n = 1~24
    4 바이트
    Float[n]-1.79E+308 ~ 1.79E+308
    n = 25~53
    8 바이트
    Real-3.40E + 38 ~ 3.40E + 384 바이트
    문자데이터char[n]n = 1~8000n 바이트
    Varchar[n]n = 1~8000입력한 데이터의 길이
    Text최대 2,147,483,647자의 가변길이 
    유니코드
    문자데이터
    Ncharn = 1~4000n*2 바이트
    nvarcharn = 1~4000입력한 데이터의 길이*2 바이트
    Ntext최대 1,073,741,823자의 가변길이 
    이진데이터binaryn = 1~8000n+4 바이트
    varbinaryn = 1~8000입력한 데이터의 길이+4 바이트
    Image최대 2,147,483,647자의 가변길이 
    날짜와시간datetime1753/1/1~9999/12/318 바이트
    smalldatetime1900/1/1~2079/6/64 바이트
    화폐money-922,337,203,685,477.5808~ +922,337,203,685,477.58078 바이트
    smallmoney-214,748.3648~214,748.36474 바이트

    [참고] 주요 키 컬럼에 대해서는 사용자 정의 데이터 타입을 활용하면 편리합니다.

    수칙3. 데이터 무결성을 보장할 수 있도록 제약 조건을 적절하게 정의합니다.

    데이터 무결성을 유지하여 데이터베이스의 품질을 보장할 것을 권고합니다. 테이블을 계획할 때 필요한 두 가지 주요 단계가 컬럼에 대하여 유효한 값이 무엇인지 확인하고 컬럼에 저장되는 데이터의 무결성을 유지하기 위한 방법을 결정하는 것입니다. 데이터 무결성은 엔터티 무결성, 도메인 무결성, 참조 무결성, 사용자 정의 무결성의 네 개의 범주로 구성되며, PRIMARY KEY 제약 조건, UNIQUE 제약 조건, FOREIGN KEY 제약 조건, CHECK 제약 조건, DEFAULT 정의, NOT NULL 정의, RULE 정의 등을 통하여 저장되는 값의 범위를 제한함으로써 무결성을 보장할 수 있습니다. 데이터 무결성에 대한 자세한 내용은 온라인 설명서에서 "데이터 무결성"에 기술되어 있는 내용을 참조하십시오. SQL Server 온라인 설명서에서 [검색] 탭을 클릭한 다음에 "검색할 단어 입력" 란에 "데이터 형식"을 입력하여 검색하면 쉽게 찾을 수 있습니다.

    PRIMARY KEY 제약 조건

    테이블 생성 시에는 PRIMARY KEY 제약 조건을 지정합니다. PRIMARY KEY 제약 조건은 테이블을 생성할 때에 생성하는 것이 바람직하지만, PK 제약 조건을 정의하지 않았더라도 테이블 생성 후에 추가로 생성할 수 있습니다. PRIMARY KEY 제약 조건을 설정할 컬럼은 NOT NULL 속성을 가지고 있어야 라며, 고유한 데이터를 가지는 컬럼이어야 합니다. 두 개 이상의 열에 PRIMARY KEY가 정의될 때에는, 한 열에 중복된 값이 있을 수 있지만, 열을 조합한 각 값은 고유해야 합니다.
    CREATE TABLE 문에서 PRIMARY KEY를 정의하는 구문에 인덱스의 종류를 지정하지 않으면 디폴트로 PK 키 컬럼(들)에 Clustered Index가 생성됩니다. 어떤 시스템의 경우에는 모든 테이블들의 PK가 무조건 clustered index로 만들어져 있고 또 어떤 시스템의 경우에는 모든 테이블들의 PK가 무조건 nonclustered index로 만들어져 있는 경우를 볼 수가 있는데, PK 제약 조건은 Clustered Index와 Nonclustered Index 두 가지 중 성능적인 측면에서 보다 효율적인 인덱스를 사용해야 한다는 것에 유의하기 바랍니다. PK를 정의할 때에는 테이블을 만들기 전에 쿼리를 종합적으로 분석하여 어떤 인덱스를 사용하는 것이 가장 효율적일지 고려하여 인덱스 유형을 정의하기 바랍니다.

    [따라하기]
    테이블 생성 시 PRIMARY KEY 제약 조건을 Nonclustered Index로 설정하기

    CREATE TABLE Tab_Sample (Col1 int identity(1,1)  NOT NULL PRIMARY KEY Nonclustered,Col2 char(3)  NULL,Col3 int   NULL)GO
    테이블 생성 후, PRIMARY KEY 제약 조건 설정하기
    CREATE TABLE Tab_Sample (Col1 int identity(1,1)  NOT NULL,Col2 char(3)  NULL,Col3 int  NULL)GOALTER TABLE Tab_Sample ADD CONSTRAINT PK_Tab_Sample PRIMARY KEY Nonclustered (Col1)GO

    UNIQUE 제약 조건

    PRIMARY KEY에 참여하지 않는 컬럼에 항상 고유한 값이 저장된다면 UNIQUE 제약 조건을 생성합니다. 예를 들어, 주민등록번호 컬럼이 PRIMARY KEY가 아닌 경우에 중복값이 저장되지 않도록 하기 위해서는 주민등록번호 컬럼에 UNIQUE 제약 조건을 추가하면 됩니다.

    FOREIGN KEY 제약 조건

    참조 무결성이 보장되어야 하는 경우에는 FOREIGN KEY 제약 조건을 생성합니다. FK 제약 조건이 없는 상태에서 응용 프로그램이 운영되는 상황에서 나중에 FK 제약 조건을 추가하게 되면 응용 프로그램을 수정해야 하는 경우가 발생하므로, FOREIGN KEY 제약 조건은 최초에 테이블을 생성할 때 만드는 것이 좋습니다.

    CHECK 제약 조건

    CHECK 제약 조건을 사용하면, 컬럼에 저장되는 값이나 포맷을 제한할 수 있습니다. CHECK 제약 조건을 추가하면 데이터 무결성을 보장할 수 있을 뿐 아니라, CHECK 제약 조건에 위배되는 범위의 값을 조건절에서 검색하는 경우에는 실제로 테이블을 액세스하지 않고 결과를 바로 반환하므로 성능에도 도움이 됩니다. 이와 같이 성능에 도움이 되도록 하기 위해서는 CHECK 제약 조건을 WITH CHECK 옵션으로 생성해야 합니다.
    동일한 테이블 내의 여러 컬럼에 대해서도 CHECK 제약 조건 설정이 가능합니다.예를 들어, 어떤 테이블에 MaxTemp(최고온도)와 MinTemp(최저온도)의 두 컬럼이 있을 때 항상 MaxTemp의 값이 MinTemp의 값보다 크도록 보장해야 한다면 컬럼 레벨이 아닌 테이블 레벨에 CHECK 제약 조건을 추가하면 됩니다. 만약 트리거로 무결성을 보장하고자 하는 경우가 발생하면 먼저 CHECK 제약 조건으로 구현 가능한지 점검한 다음에 CHECK 제약 조건으로 불가한 경우에 트리거를 사용하기 바랍니다.

    DEFAULT 제약 조건

    사용자가 컬럼에 저장되는 값을 명시적으로 지정하지 않은 경우에 디폴트로 어떤 값이 컬럼에 저장되도록 해 주는 기능입니다.

    [권고사항] 제약 조건별로 명명 규칙을 정하고 규칙에 의거하여 이름을 부여할 것을 권고합니다. 제약 조건 외에도 모든 사용자 오브젝트들에 대해서는 표준화된 명명 규칙을 수립하고 그 규칙에 의거하여 오브젝트의 이름을 부여하기 바랍니다. 다음은 제약 조건별 접두어 규칙 예입니다.

    제약 조건접두어이름 예제
    PRIMARY KEY 제약 조건PK_PK_Orders
    FOREIGN KEY 제약 조건FK_FK_Jobs_JobID
    UNIQUE 제약 조건UK_UK_SSN
    CHECK 제약 조건CK_CK_Quantity CK_MaxTemp_MinTemp
    DEFAULT 제약 조건DF_DF_CheckDate

    수칙4. 항상 값이 저장되는 컬럼에 대해서는 반드시 NOT NULL로 정의합니다.

    NULL이라는 값은 알 수 없는 값이라는 의미를 가지는 특수한 값입니다. NULL은 공백 문자나 0, 빈 문자열과는 전혀 다른 알 수 없는 값입니다. 항상 값이 저장되어야 하는 컬럼을 NULL 허용으로 정의하면 응용 프로그램의 오류로 NULL 값이 저장될 수 있으며, 그로 인하여 NULL 데이터로 인하여 논리적 비교가 더욱 복잡해지거나 오류 데이터로 인한 프로그램의 오동작을 유발할 수 있습니다. 그러므로 항상 명시적으로 값이 저장되는 컬럼에 대해서는 반드시 NOT NULL을 지정하기 바랍니다.

    [참고] Identity 컬럼은 tinyint, smallint, int, bigint, decimal(p,0) 또는 numeric(p,0) 열에 할당될 수 있습니다. Identity 컬럼은 자동으로 값이 증가 또는 감소하는 속성을 가지고 있으므로 overflow 또는 underflow가 발생하지 않도록 주기적으로 데이터 타입을 점검합니다. 다음은 Identity 컬럼 목록을 추출하는 예제 스크립트입니다.

    SELECT object_name(c.id) AS TableName, c.name AS Identity_ColumnName, CASE WHEN t.name IN ('decimal', 'numeric') THEN t.name + '(' + CAST(c.xprec AS varchar(5)) + ',' + CAST(c.xscale AS varchar(5)) + ')' ELSE t.name END  AS DataTypeFROM sysobjects o JOIN syscolumns c ON o.id = c.id JOIN master..systypes t ON c.xtype = t.xtype WHERE o.type = 'U' AND c.colstat & 1 = 1 ORDER BY o.nameGO

    테이블 삭제하기

    • 구문 : DROP TABLE table_name

      테이블을 삭제하면, 테이블과 해당 데이터 및 인덱스를 삭제합니다. Foreign key 제약 조건에 의해 참조되는 테이블은 삭제할 수 없습니다. 참조하는 Foreign key 제약 조건을 삭제한 후, 테이블을 삭제합니다. 삭제된 테이블을 참조하는 뷰나 저장 프로시저는 DROP VIEW나 DROP PROCEDURE를 사용하여 삭제 합니다.

      [따라하기] 다른 데이터베이스에 존재하는 테이블 삭제하기
      Sample 데이터베이스에 있는 Tab_sample 테이블을 삭제합니다.

      USE NorthwindGODROP TABLE Sample.dbo.Tab_sampleGO

    테이블 변경하기

    • 컬럼 추가하기

      테이블에 컬럼을 추가할 경우, NOT NULL 속성 컬럼을 추가할 수는 있지만, 이 경우에는 반드시 DEFAULT를 지정해야 합니다. DEFAULT를 지정할 수 없는 경우에는 NOT NULL 속성으로 컬럼을 추가한 후, 데이터를 UPDATE하고, NOT NULL 속성으로 컬럼을 변경합니다. 대용량 테이블인 경우에는, NOT NULL 속성으로 컬럼을 추가하면 Sch-M Lock으로 문제를 유발 시킬 가능성이 있으므로, 주의합니다.

      [따라하기]
      정해진 시간 내에 작업을 끝내야 하는 경우, 테이블 크기가 큰 테이블에 컬럼을 NOT NULL로 추가하였는데, 정해진 시간 내에 ALTER TABLE의 수행이 완료되지 않아서 장애로 이어지는 경우가 간혹 있습니다. 테스트 데이터베이스에서 소요시간을 미리 확인하고 소요시간이 제한된 시간을 초과한다면 다음의 팁을 활용하십시오.
      대용량 LargeTabAddNotNullCol 테이블에, 데이터 타입이 char(50), NOT NULL 속성을 가진 NotNullCol 컬럼을 추가하는 스크립트입니다.

      USE SampleGOALTER TABLE LargeTabAddNotNullColADD NotNullCol char(50) NULLGOCREATE INDEX IDX_1 ON LargeTabAddNotNullCol (NotNullCol)GOSET ROWCOUNT 1000UPDATE LargeTabAddNotNullCol SET NotNullCol = 'default value'WHERE NotNullCol IS NULLWHILE @@ROWCOUNT = 1000    UPDATE LargeTabAddNotNullCol SET NotNullCol = 'default value'    WHERE NotNullCol IS NULLSET ROWCOUNT 0GODROP INDEX LargeTabAddNotNullCol.IDX_1GOALTER TABLE LargeTabAddNotNullColALTER COLUMN NotNullCol CHAR(50) NOT NULLGO
    • 컬럼 삭제하기

      [따라하기]
      LargeTabAddNotNullCol 테이블에 DEFAULT를 설정한 Addcol 컬럼을 추가 한 다음에, 다시 그 컬럼을 삭제하는 예제입니다. 제약 조건이 설정된 컬럼은 제약 조건을 삭제한 후, 컬럼을 삭제합니다.

      USE SampleGOALTER TABLE LargeTabAddNotNullColADD Addcol CHAR(100) NOT NULL DEFAULT 'default value'GOALTER TABLE LargeTabAddNotNullColDROP CONSTRAINT DF__LargeTabl__Addco__0D6417DAGOALTER TABLE LargeTabAddNotNullColDROP COLUMN AddcolGO
    • Owner가 dbo가 아닌 사용자 테이블 목록 확인하기
      SELECT name FROM sysobjects WHERE type='U' AND uid <> 1
      ORDER BY name
      GO
      -- Owner 변경 스크립트 생성하기
      SELECT 'EXEC sp_changeobjectowner ''' + USER_NAME(uid) + '.' + name + ''', ''dbo''' FROM sysobjects WHERE type='U' AND uid <> 1
      ORDER BY name
      GO
    • 소유권 변경
      EXEC sp_changeobjectowner 'testuser.IncorrectOwner', 'dbo'GO/* 결과 창의 메시지주의: 개체 이름 부분을 변경하면 스크립트나 저장 프로시저를 손상시킬 수 있습니다.*/

        테이블 정보 확인하기

        • Foreign key 제약 조건 정보 확인하기

          [따라하기]
          Customers 테이블을 Foreign key로 참조하고 있는 테이블과 컬럼 등의 기본 정보를 반환합니다.

          USE NorthwindGOEXEC sp_fkeys N'Customers' GO
        • 테이블의 컬럼 Privilege 정보 확인하기

          [따라하기]
          Employees 테이블의 각 컬럼의 INSERT, UPDATE, DELETE, REFERENCES등의 Permission 정보를 반환합니다.

          USE NorthwindGOEXEC sp_column_privileges EmployeesGO
        • 테이블의 인덱스 정보 확인하기

          [따라하기]
          Employees 테이블의 인덱스 목록을 반환합니다.

          USE NorthwindGOEXEC sp_helpindex EmployeesGO
        • 테이블의 제약 조건 정보 확인하기

          [따라하기]
          Employees 테이블에 관련된 모든 제약 조건의 정보를 반환합니다.

          USE NorthwindGOEXEC sp_helpconstraint EmployeesGO
        • 테이블의 모든 정보 확인하기

          [따라하기]
          Employees 테이블에 관련된 컬럼, 인덱스, 제약 조건 등의 정보를 반환합니다.

          USE NorthwindGOEXEC sp_help EmployeesGO
        • 테이블이 사용하는 공간 확인하기
          [구문]  sp_spaceused [[@objname =] 'objname']     [,[@updateusage =] 'updateusage']

          [따라하기] 데이터베이스 내의 모든 테이블의 사용 공간 확인하기

          / 방법1. 기존의 시스템 SP를 단순히 활용한 예제 */
          EXEC sp_MSforeachtable 'EXEC sp_spaceused [?], ''TRUE'''
          GO

          /* 방법2. 기존의 시스템 SP를 활용하여 결과를 테이블에 저장한 예제 */
          USE DBAdmin
          GO
          CREATE TABLE spaceused_pubs (
          TableName sysname,
          Rows int,
          Reserved varchar(20),
          Data varchar(20),
          Index_size varchar(20),
          Unused varchar(20))
          GO
          USE pubs
          GO
          INSERT INTO DBAdmin..spaceused_pubs
          EXEC sp_MSforeachtable 'EXEC sp_spaceused [?], ''TRUE'''
          GO
          SELECT * FROM DBAdmin..spaceused_pubs
          GO

          /* 방법3. sp_spaceused의 소스 코드를 수정하여 사용하기 */
          CREATE PROCEDURE sp_spaceused_all
          AS
          /*
          작성자 : 전현경
          내용 : 데이터베이스내의 모든 테이블의 크기
          계산 근거 :
          reserved: sum(reserved) where indid in (0, 1, 255)
          data: sum(dpages) where indid < 2 + sum(used) where indid = 255 (text)
          indexsize: sum(used) where indid in (0, 1, 255) - data
          unused: sum(reserved) - sum(used) where indid in (0, 1, 255)
          */
          SET NOCOUNT ON

          DECLARE @Low bigint

          SELECT @Low = low FROM mASter.dbo.spt_values
          WHERE number = 1 and type = 'E'

          SELECT OBJECT_NAME(tmp.id) AS Name
          ,convert(char(11),sum(rows)) AS Rows
          ,ltrim(str(sum(tmp.reserved) * @Low / 1024.,15,0) + ' ' + 'KB') AS Reserved
          ,ltrim(str(sum(tmp.data) * @Low / 1024.,15,0) + ' ' + 'KB') AS Data
          ,ltrim(str((sum(tmp.used) - sum(tmp.data)) * @Low / 1024.,15,0) + ' ' + 'KB') AS Index_Size
          ,ltrim(str((sum(tmp.reserved) - sum(tmp.used)) * @Low / 1024.,15,0) + ' ' + 'KB') AS Unused
          FROM (
          SELECT obj.id AS id, sum(ind.rows) AS rows, sum(ind.reserved) AS reserved, sum(dpages) AS data,
          isnull(sum(used), 0) AS used
          FROM sysindexes ind JOIN sysobjects obj ON ind.id = obj.id
          WHERE obj.xtype='U' AND ind.indid < 2
          GROUP BY obj.id
          UNION
          SELECT obj.id AS id, 0 AS rows, sum(ind.reserved) AS reserved, isnull(sum(used), 0) AS data,
          isnull(sum(used), 0) AS used
          FROM sysindexes ind JOIN sysobjects obj ON ind.id = obj.id
          WHERE obj.xtype='U' AND ind.indid = 255
          GROUP BY obj.id ) tmp
          GROUP BY tmp.id
          ORDER BY sum(tmp.data) desc, sum(tmp.used) desc

          SET NOCOUNT OFF
          GO

        테이블 옵션 설정하기

        사용자 정의 테이블의 옵션 값을 설정합니다.

        [구문] sp_tableoption [ @TableNamePattern = ] 'table'       [@OptionName = ] 'option_name'       [@OptionValue = ] 'value'

        [따라하기]

        A. Orders 테이블에 'text in row' 옵션 설정하기

        'text in row' 옵션을 설정하면, Text, ntext, image 컬럼의 행에 저장할 최대 크기를 지정할 수 있습니다. 기본값은 256바이트이고, 값의 범위는 24에서 7000바이트입니다. 다음은 Orders 테이블의 text 컬럼에 저장할 데이터를 1000바이트로 지정합니다.
        EXEC sp_tableoption 'orders', 'text in row', '1000'GO-- 설정값 확인USE NorthwindGOSELECT OBJECTPROPERTY(OBJECT_ID('orders'),'TableTextInRowLimit')GO

        B. Orders 테이블에 'pintable' 옵션 설정하기

        'pintable' 옵션을 설정하면, 지정한 테이블의 데이터가 메모리에 상주합니다. 테이블 크기가 작고, 자주 사용하는 코드 테이블을 대상으로 사용할 수 있습니다.
        USE NorthwindGOEXEC sp_tableoption 'Orders', 'pintable', 'on'GO--메모리 고정 테이블 확인SELECT OBJECTPROPERTY (OBJECT_ID('Orders'), 'TableIsPinned')GO
        [참고] 메모리에 테이블의 데이터를 상주시키기 위해 DBCC PINTABLE을 사용할 수도 있습니다.
        -- 메모리 고정DECLARE @objid int, @dbid intSELECT @dbid = DB_ID('Northwind'), @objid = OBJECT_ID('Northwind..Orders')DBCC PINTABLE (@dbid, @objid)GO-- 메모리 고정 해제DECLARE @objid int, @dbid intSELECT @dbid = DB_ID('Northwind'), @objid = OBJECT_ID(' Northwind..Orders')DBCC UNPINTABLE (@dbid, @objid)GO-- 데이터베이스내의 메모리 고정 테이블의 전체 크기 확인SELECT sum(i.used * 8) AS [pin table space used (KB)] FROM sysindexes i JOIN sysobjects o ON i.id = o.idWHERE o.status & 1048576 <> 0 AND indid < 2GO

        [주의]
        이 기능은 성능을 향상시킬 수 있지만 주의해서 사용해야 합니다. 커다란 테이블을 고정할 경우 많은 용량의 버퍼 캐시를 사용하기 때문에 다른 테이블에서 사용할 캐시가 부족하게 됩니다. 버퍼 캐시보다 용량이 큰 테이블을 고정하면 전체 버퍼 캐시를 채울 수도 있습니다. 이런 경우 sysadmin 고정 서버 역할의 구성원이 SQL Server를 중지한 후 다시 시작한 다음, 테이블을 고정 해제해야 합니다. 너무 많은 테이블을 메모리에 고정해도 이와 같은 문제가 발생할 수 있습니다.



        시스템 오브젝트 생성

        시스템 저장 프로시저 생성하기

        시스템 저장 프로시저는 master 데이터베이스에 있으며 이름이 sp_ 라는 접두사로 시작하며, 모든 데이터베이스에서 master 데이터베이스라고 지정하지 않고 저장 프로시저의 이름 만으로 실행이 가능합니다. 그리고 master 데이터베이스가 아닌 데이터베이스에서 실행하면 그 데이터베이스의 컨텍스트 내에서 수행되는 특징을 가지고 있습니다. 예를 들어 저장 프로시저가 sysobjects 테이블을 참조한다고 가정하면 이 프로시저는 실제로는 master에 있음에도 불구하고 그 프로시저를 실행할 때 연결되어 있던 데이터베이스에 있는 sysobjects를 액세스합니다.

        [따라하기] 시스템 저장 프로시저를 생성하기
        1. master 데이터베이스에 연결합니다.
        2. sp_ 로 시작하는 이름으로 저장 프로시저를 생성합니다.

        시스템 함수 조회 및 생성하기

        SQL Server가 설치되는 동안 시스템 UDF(사용자 정의 함수)들이 생성되며, 이 시스템 함수는 모든 데이터베이스에서 함수의 이름만 사용하여 액세스가 가능합니다.
        시스템 뷰를 만드는 것과 유사하게 master 데이터베이스에 존재하지만 모든 데이터베이스에서 데이터베이스를 지정하지 않고 쿼리를 수행할 수 있는 함수를 사용자가 직접 생성할 수 있습니다. 시스템 함수가 되기 위해서는 함수를 생성할 때 소유자를 system_function_schema로 생성합니다.

        [따라하기] 시스템 함수 생성, 조회하기

        /* 시스템 함수 생성하기 */-- 시스템 테이블을 직접 수정할 수 있도록 설정합니다.EXEC sp_configure 'allow updates',1RECONFIGURE WITH OVERRIDEGO-- 함수는 master 데이터베이스에 생성하고,-- 소유자는 system_function_schema로 지정합니다.USE masterGOCREATE FUNCTION system_function_schema.fn_greatest (@x bigint, @y bigint)RETURNS bigintASBEGIN    RETURN(CASE WHEN @x>@y THEN @x ELSE @y END)ENDGOCREATE FUNCTION system_function_schema.fn_least (@x bigint, @y bigint)RETURNS bigintASBEGIN    RETURN(CASE WHEN @x<@y THEN @x ELSE @y END)ENDGO-- 시스템 테이블을 직접 수정할 수 없도록 0으로 변경합니다. (반드시 수행 요망)EXEC sp_configure 'allow updates',0RECONFIGURE WITH OVERRIDEGO-- 생성한 시스템 함수는 모든 데이터베이스에서 호출 가능합니다.USE NorthwindGOSELECT fn_greatest(989, 998), fn_least(989, 998)GO/* 시스템 함수 조회하기 */USE masterGOSELECT name FROM sysobjectsWHERE uid=USER_ID('system_function_schema')AND   (OBJECTPROPERTY(id, 'IsScalarFunction')=1 OR OBJECTPROPERTY(id, 'IsTableFunction')=1 OR OBJECTPROPERTY(id, 'IsInlineFunction')=1)GO

        INFORMATION 스키마 뷰 생성하기

        SQL Server 2000에서 메타데이터 정보를 가져오는 방법은 시스템 저장 프로시저를 사용하는 방법과 INFORMATION 스키마 뷰를 사용하는 방법의 두 가지가 있습니다.

        [참고] 메타데이터를 가져오기 위해서는 시스템 저장 프로시저, 시스템 함수 또는 시스템 제공 뷰를 사용할 것을 권고합니다. 시스템 테이블을 직접 쿼리하는 경우, 시스템 테이블이 이후 버전에서 변경될 때 정확한 정보를 제공하지 못할 수도 있습니다. 정보 스키마 뷰를 참조할 때는 다음과 같이 사용자 이름을 지정하는 위치에 INFORMATION_SCHEMA를 지정해야 합니다.

        SELECT *FROM Northwind.INFORMATION_SCHEMA.COLUMNSWHERE TABLE_NAME = N'Customers'[SQL Server 2000에서 제공하는 INFORMATION 스키마 뷰 목록]CHECK_CONSTRAINTSCOLUMN_DOMAIN_USAGECOLUMN_PRIVILEGESCOLUMNSCONSTRAINT_COLUMN_USAGECONSTRAINT_TABLE_USAGEDOMAIN_CONSTRAINTSDOMAINSKEY_COLUMN_USAGEPARAMETERSREFERENTIAL_CONSTRAINTSROUTINESROUTINE_COLUMNSSCHEMATATABLE_CONSTRAINTSTABLE_PRIVILEGESTABLESVIEW_COLUMN_USAGEVIEW_TABLE_USAGEVIEWS

        [따라하기]
        CHECK 제약 조건에 관한 정보를 제공해 주는 INFORMATION 스키마 뷰는 있지만 DEFAULT 제약 조건에 관한 정보를 제공해 주는 INFORMATION 스키마 뷰는 기본적으로 제공되지 않습니다. 이 예제에서는 기존의 CHECK_CONSTRAINTS라는 INFORMATION 스키마 뷰의 소스를 수정하여 DEFAULT 제약 조건에 관한 정보를 제공해 주는 INFORMATION 스키마 뷰를 만들어 보고자 합니다.

        -- 기본으로 제공되는 INFORMATION 스키마 뷰 활용하기USE PubsGOSELECT * FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTSGO-- 사용자가 INFORMATION 스키마 뷰 생성하기USE masterGOEXEC sp_configure 'allow updates', 1RECONFIGURE WITH OVERRIDEGOEXEC sp_MS_upd_sysobj_category 1GO CREATE VIEW INFORMATION_SCHEMA.DEFAULT_CONSTRAINTSASSELECT db_name()    as CONSTRAINT_CATALOG   ,user_name(c_obj.uid) as CONSTRAINT_SCHEMA   ,c_obj.name    as CONSTRAINT_NAME   ,com.text    as DEFAULT_CLAUSEFROM sysobjects c_obj, syscomments comWHERE c_obj.uid = user_id()    AND c_obj.id = com.id    AND c_obj.xtype = 'D'GOEXEC sp_MS_upd_sysobj_category 2GOEXEC sp_configure 'allow updates', 0GORECONFIGURE WITH OVERRIDEGO-- 생성한 INFORMATION 스키마 뷰 활용하기USE pubsGOSELECT *FROM INFORMATION_SCHEMA.DEFAULT_CONSTRAINTSGO


        사용자 관리

        로그인과 사용자 이해하기

        SQL Server에 접근하기 위해서는 로그인 계정이 필요하고, 데이터베이스에 접근하기 위해서는 사용자(user)가 필요합니다.

        권한 이해하기

        사용자는 권한을 받아 작업을 수행할 수 있습니다. 권한에는 문장을 실행할 수 있는지에 따라 권한을 제한하는 명령문(Statement) 사용권한과 테이블, 색인, 뷰, 프로시저에 따라 권한을 제한하는 개체(Object) 사용권한이 있습니다.

        역할 이해하기

        역할은 로그인 또는 사용자들의 집합이고, 역할에 권한이 설정되어 있습니다. 그러므로, 각 사용자에게 권한을 주는 것이 아니라, 그 권한이 있는 역할에 사용자를 추가시키는 것이 좋습니다. 시스템에서 미리 정의된 역할에는 로그인에게 사용할 수 있는 서버 역할과 사용자에게 사용할 수 있는 데이터베이스 역할 이 있습니다.

        로그인 계정 생성하고 권한 부여하기

        [따라하기]
        1. SQL Server 계정을 생성하여, Sample 데이터베이스에 사용자를 등록하고, 데이터베이스내의 테이블 읽는 권한을 주고, 서버내의 서버 차원의 설정을 구성할 수 있는 권한을 설정합니다. 고정 데이터베이스 역할 db_datareader은 데이터베이스내의 테이블을 읽는 권한을 가지고 있고, 서버 데이터베이스 역할 serveradmin은 서버차원을 설정을 구성합니다.
          EXEC sp_addlogin 'dbadmin','ad1234','sample'GOEXEC sp_addsrvrolemember 'dbadmin', 'serveradmin'GOUSE SampleGOEXEC sp_adduser 'dbadmin', 'dbadmin', 'db_datareader'GO
        2. NT 로그인 계정을 생성하여, sample 데이터베이스에 사용자로 등록하고, 데이터베이스내의 테이블 읽는 권한을 설정합니다.
          NT 로그인 계정은 윈도우의 [내 컴퓨터 관리]나 [액티브 디렉터리 사용자 및 컴퓨터]를 이용하여 생성합니다. 생성된 계정은 Admin\winadmin이라고 가정합니다.
          EXEC sp_grantlogin 'Admin\winadmin'GOEXEC sp_defaultdb 'Admin\winadmin', 'sample'GOUSE SampleGOEXEC sp_grantdbaccess 'Admin\winadmin', 'winadmin'GOEXEC sp_addrolemember 'db_datareader', 'winadmin'GO
        3. SQL Server 로그인은 'backupAdmin', 암호는 '1234'로 설정하여, sample 데이터베이스의 사용자로 등록하고, 데이터베이스 백업을 수행할 수 있는 권한을 부여합니다. 그 후, backupAdmin 로그인 계정을 삭제합니다. 고정 데이터베이스 역할 중에서 db_backupoperator 역할은 데이터베이스 백업을 수행할 수 있는 권한을 가지고 있습니다.
          EXEC sp_addlogin 'backupAdmin','1234','sample'GOUSE SampleGOEXEC sp_adduser 'backupAdmin', 'backupAdmin', 'db_backupoperator'GO-- 로그인 계정 삭제EXEC sp_droprolemember 'db_backupoperator', 'backupAdmin'GO EXEC sp_revokedbaccess 'backupAdmin'GOEXEC sp_droplogin 'backupAdmin'GO
        4. NETDOMAIN의 John. Sarah, Diane 계정을 courses 데이터베이스의 사용자로 등록하고, Student 역할에 등록합니다. 그 후, Student 역할에서 Diane 계정을 삭제하고, 로그인 계정에서도 Diane을 삭제합니다.
          USE masterGOEXEC sp_grantlogin 'NETDOMAIN\John'GOEXEC sp_defaultdb 'NETDOMAIN\John', 'courses'GOEXEC sp_grantlogin 'NETDOMAIN\Sarah'GOEXEC sp_defaultdb 'NETDOMAIN\Sarah', 'courses'GOEXEC sp_grantlogin 'NETDOMAIN\Diane'GOEXEC sp_defaultdb 'NETDOMAIN\Diane', 'courses'GOUSE coursesGOEXEC sp_grantdbaccess 'NETDOMAIN\John'GOEXEC sp_grantdbaccess 'NETDOMAIN\Sarah'GOEXEC sp_grantdbaccess 'NETDOMAIN\Diane'GOEXEC sp_addrole 'Student'GOEXEC sp_addrolemember 'Student','NETDOMAIN\John'GOEXEC sp_addrolemember 'Student','NETDOMAIN\Sarah'GOEXEC sp_addrolemember 'Student','NETDOMAIN\Diane'GO EXEC sp_droprolemember 'Student','NETDOMAIN\Diane'GO EXEC sp_revokedbaccess 'NETDOMAIN\Diane'GOEXEC sp_revokelogin 'NETDOMAIN\Diane'GO

        [참고]
        A. sp_revokelogin
        sp_grantlogin 또는 sp_denylogin으로 만든 NT 사용자 또는 로그인 항목을 SQL Server에서 제거합니다. NT 로그인 계정이 SQL Server에 연결하는 것이 금지됩니다.

        B. sp_denylogin
        NT 로그인 계정이 SQL Server에 연결하는 것을 금지합니다.


        기존 로그인과 사용자의 확인하기

        [따라하기]
        EXEC sp_helploginsGOEXEC sp_helpuserGO

        암호 변경하기

        [따라하기]
        로그인 계정 'dbadmin'의 암호 'ad1234'를 'ad5678'로 변경합니다.

        EXEC sp_password 'ad1234','ad5678', 'dbadmin'GO


        서버 및 데이터베이스의 정보 확인

        서버 이름, 버전, Edition 확인하기

        [구문] SERVERPROPERTY ( propertyname )
        [따라하기]
        SELECT SERVERPROPERTY('ServerName') AS ServerName, SERVERPROPERTY('MachineName') AS MachineName, SERVERPROPERTY('InstanceName') AS InstanceName, SERVERPROPERTY('Edition') AS Edition, SERVERPROPERTY('ProductVersion') AS ProductVersion, SERVERPROPERTY('ProductLevel') AS ProductLevelGO

        서버의 옵션 확인하기

        서버의 구성 옵션과 구성 옵션의 최소값과 최대값, 설정된 대상 값, 설정값을 확인합니다.

        [구문] sp_configure [ [ @configname = ] 'name' ][ , [ @configvalue = ] 'value' ]

        [따라하기]

        1. 서버 구성 옵션 확인하기
        EXEC sp_configureGO
        2. 서버의 고급 구성 옵션 확인하기
        서버의 일부 옵션은 고급으로 지정되어 있고, 이 값들도 변경할 수 있습니다. 고급 구성 옵션을 보기 위해서는 다음을 실행합니다.
        USE masterGOEXEC sp_configure 'show advanced option', '1'RECONFIGURE WITH OVERRIDEGO

        데이터베이스 파일에 대한 I/O 통계 정보 확인하기

        fn_virtualfilestats 함수는 시스템에서 기본으로 제공하는 함수로서, I/O에 대한 통계 정보를 제공합니다. 사용자들이 어떤 파일에 대하여 읽기나 쓰기를 수행하기 위하여 기다린 시간을 제공하므로 이 함수를 사용하면 어떤 파일들에 대하여 I/O가 많이 발생하는지 확인할 수 있습니다. IO로 인한 성능 저하가 의심되는 경우에는 fn_virtualfilestats 함수가 반환하는 IOStallMS를 점검할 것을 권고합니다.

        [구문] fn_virtualfilestats ( [@DatabaseID=] database_id , [ @FileID = ] file_id )
        [따라하기]
        1. 모든 데이터베이스의 파일들의 I/O 정보 확인하기
        SELECT * FROM ::fn_virtualfilestats(-1, -1)GO
        2. 모든 데이터베이스의 파일들의 I/O 정보 확인하기 (시스템 함수 활용)
        SELECT DB_NAME(Dbid) AS DBName, FileId, FILE_NAME(FileId) AS FileName, IoStallMS, NumberReads, NumberWrites, BytesRead, BytesWrittenFROM ::fn_VirtualFileStats (-1, -1) ORDER BY IoStallMS DESCGO
        3. 특정 데이터베이스의 모든 파일들에 대한 I/O 정보 확인하기 (예제: tempdb)
        SELECT * FROM ::fn_virtualfilestats(2, -1)GO
        4. 특정 데이터베이스의 특정 파일의 I/O 정보 확인하기 (Tempdb의 Primary Data File)
        SELECT * FROM ::fn_virtualfilestats(2, 1)GO
        5. 특정 데이터베이스의 특정 파일의 I/O 정보 확인하기 (Tempdb의 로그 파일)
        SELECT * FROM ::fn_virtualfilestats(2, 2)GO

        기본적인 파일 정보 확인하기

        현재 데이터베이스와 연관된 파일의 물리적 이름과 특징을 반환합니다. 파일 이름을 지정하지 않으면, 데이터베이스내의 모든 파일에 대한 정보를 확인할 수 있습니다.

        [구문] sp_helpfile [ [ @filename = ] 'name' ]
        [따라하기]
        USE SampleEXEC sp_helpfile-- 또는EXEC Sample..sp_help

        기본적인 파일 그룹 정보 확인하기

        현재 데이터베이스와 연관된 파일그룹의 이름과 특징을 반환합니다. 파일그룹의 이름을 지정하지 않으면, 데이터베이스내의 모든 파일그룹에 대한 정보를 확인할 수 있습니다.

        [구문] sp_helpfilegroup [ [ @filegroupname = ] 'name' ]

        기본적인 데이터베이스의 정보 확인하기

        지정된 데이터베이스 또는 모든 데이터베이스 정보를 반환합니다.

        [구문] sp_helpdb [ [ @dbname= ] 'name' ]
        • 데이터베이스를 지정하지 않았을 경우, 결과 집합입니다.
          컬럼명내용
          Name데이터베이스 이름
          Db_size데이터베이스의 총 크기
          Owner데이터베이스의 소유자
          Dbid데이터베이스의 ID
          Created데이터베이스의 생성일자
          Status옵션의 값을 쉼표로 분리하여 나열한 것
          Compatibility_level호환성 수준(60,65,70,80)
        • 데이터베이스를 지정했을 경우, 위의 결과 집합에 다음의 결과 집합이 추가로 나타납니다.
          Name논리적 파일 이름
          Fileid파일 ID
          Filename파일의 물리적 경로와 이름
          Filegroup파일이 속한 그룹
          Size파일 크기
          Maxsize파일이 증가할 수 있는 최대 크기
          Growth파일의 증가량
          Usage파일의 사용법

        데이터베이스 옵션 또는 현재 설정 확인하기

        지정한 Property에 따른 결과값이 반환됩니다. property의 값 목록과 그에 따른 결과의 종류는 BOL 참조해 주십시오.

        [구문] DATABASEPROPERTYEX(database_name, property)

        [따라하기]
        1. Northwind 데이터베이스의 통계 자동 업데이트 옵션 설정 확인하기

        SELECT DATABASEPROPERTYEX ('Northwind','IsAutoUpdateStatistics') AS IsAutoUpdateStatisticsGO
        2. Northwind 데이터베이스의 복구 모델 설정 확인하기
        SELECT DATABASEPROPERTYEX ('Northwind','Recovery') AS RecoveryGO

        데이터베이스 옵션 설정 확인하기

        [구문] sp_dboption [ [ @dbname = ] 'database' ][ , [ @optname = ] 'option_name' ][ , [ @optvalue = ] 'value' ]
        [따라하기]
        A. 설정 가능한 옵션의 목록 확인하기
        인수를 지정하지 않습니다.
        EXEC sp_dboptionGO
        B. 지정한 데이터베이스의 설정 옵션 목록 확인하기
        데이터베이스만을 지정합니다. Northwind데이터베이스의 설정 옵션 목록을 확인합니다.
        EXEC sp_dboption 'Northwind'GO
        C. 지정한 데이터베이스의 해당 옵션의 설정 상태 확인하기
        데이터베이스와 해당 옵션을 설정합니다. Northwind데이터베이스의 자동 통계 갱신 옵션의 설정을 확인합니다.
        EXEC sp_dboption 'Northwind', 'auto update statistics'GO
      1. 데이터베이스 옵션의 종류
        Auto create statistics
        Auto update statistics
        Autoclose
        Autoshrink
        ANSI null default
        ANSI nulls
        ANSI padding
        ANSI warnings
        Arithabort
        concat null yields null
        cursor close on commit
        Dbo use only
        default to local cursor
        merge publish
        numeric roundabort
        Offline
        Published
        quoted identifier
        read only
        Recursive triggers
        select into/bulkcopy
        single user
        Subscribed
        Torn page detection
        trunc. Log on chkpt.

        Tempdb에 대한 공간 사용 정보 확인하기

        [구문] sp_tempdbspace

        테이블 크기 확인하기

        [구문] sp_spaceused [[@objname =] 'objname'][,[@updateusage =] 'updateusage']
        [따라하기] Orders 테이블의 크기 확인하기
        EXEC sp_spaceused 'Orders'

        [참고] 테이블을 지정하지 않으면, 해당 데이터베이스의 크기가 반환됩니다.

        로그 공간의 사용 정보 확인하기

        서버 내에 존재하는 모든 데이터베이스의 로그 공간의 사용에 관한 통계를 확인합니다.

        [구문] DBCC SQLPERF ( LOGSPACE )

        테이블의 조각화 정보 확인하기

        테이블의 조각화는 INSERT, UPDATE, DELETE문 등의 데이터를 수정할 때에 발생합니다. 이러한 수정들은 각 페이지의 채움 정도를 다르게 만들고, 테이블의 일부 또는 전부를 스캔하는 쿼리의 경우, 테이블 조각으로 인한 성능 저하가 발생할 가능성이 있습니다.

        [구문] DBCC SHOWCONTIG[     ( { table_name | table_id | view_name | view_id }       [ , index_name | index_id ]         )      ]       [ WITH { ALL_INDEXES                 | FAST [ , ALL_INDEXES ]                 | TABLERESULTS [ , { ALL_INDEXES } ]                 [ , { FAST | ALL_LEVELS } ]              }     ]
        [따라하기]
        A. 지정한 테이블의 조각화 정보 확인하기
        Orders 테이블의 조각화 정보를 확인합니다.
        USE NorthwindGODBCC SHOWCONTIG ('Orders')GO
        B. 지정한 테이블의 지정한 인덱스의 조각화 정보 확인하기
        Orders 테이블의 CustomerID 인덱스에 대한 조각화 정보를 확인합니다.
        USE NorthwindGODBCC SHOWCONTIG ('Orders', 'CustomerID')GO
        C. 테이블 ID와 인덱스 ID로 조각화 정보 확인하기
        테이블 이름과 인덱스 이름 대신, 테이블 ID와 인덱스 ID를 사용합니다.
        USE NorthwindGODECLARE @ObjectId int, @IndexId intSELECT @ObjectId = OBJECT_ID ('Orders')SELECT @IndexId = indid FROM sysindexes WHERE id = @ObjectId DBCC SHOWCONTIG (@ObjectId, @IndexId)GO
        D. 데이터베이스내의 모든 테이블의 모든 인덱스에 대한 조각화 정보 확인하기
        USE NorthwindGODBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXESGO
        E. 데이터베이스에 수행 결과를 저장하기
        -- 결과를 저장할 테이블 생성하기USE DBAdminGOCREATE TABLE ShowContig_Pubs( ObjectName  sysname, ObjectId   int, IndexName  sysname, IndexId   tinyint, Level   tinyint, Pages   int, Rows   bigint, MinimumRecordSize smallint, MaximumRecordSize smallint, AverageRecordSize smallint, ForwardedRecords bigint, Extents   int, ExtentSwitches  numeric(10,2), AverageFreeBytes numeric(10,2), AveragePageDensity numeric(10,2), ScanDensity  numeric(10,2), BestCount  int, ActualCount  int, LogicalFragmentation numeric(10,2), ExtentFragmentation numeric(10,2), CheckDate smalldatetime DEFAULT (GETDATE()))                            GO-- 시스템 저장 프로시저 생성하기USE masterGOCREATE PROCEDURE sp_DBCCSHOWCONTIGASDBCC SHOWCONTIG WITH TABLERESULTSGO-- 실행 예제USE PubsGOINSERT INTO DBAdmin..ShowContig_Pubs (ObjectName, ObjectId, IndexName, IndexId, Level, Pages, Rows, MinimumRecordSize, MaximumRecordSize,AverageRecordSize, ForwardedRecords, Extents, ExtentSwitches, AverageFreeBytes, AveragePageDensity, ScanDensity, BestCount, ActualCount, LogicalFragmentation, ExtentFragmentation) EXEC sp_DBCCSHOWCONTIGGO-- 실행 결과 확인하기SELECT * FROM DBAdmin..ShowContig_Pubs  WHERE ObjectName = 'Authors' GOSELECT * FROM DBAdmin..ShowContig_Pubs  WHERE LogicalFragmentation > 30 OR ExtentFragmentation > 30 GO

        [참고] WITH FAST 옵션을 사용하면, 인덱스의 잎 또는 데이터 수준 페이지를 읽지 않기 때문에, 생략된 정보를 빠르게 반환합니다.

        [주의] 크기가 큰 테이블에 대해서는 서비스 중에 DBCC SHOWCONTIG를 수행하면 성능 저하를 유발할 수 있으므로 유의합니다.

        [권고사항] 수행 결과를 확인하고 단편화가 심한 테이블들에 대해서는 인덱스 재구성 작업을 수행합니다.


        대기 정보 확인하기

        각 waittype별 대기 시간을 확인합니다. 가장 대기가 많은 유형을 확인하고, 작업 부하에 따른 대기 유형의 변화도 확인합니다.

        [구문] DBCC SQLPERF (WAITSTATS)

        인덱스 재구성하기

        인덱스 조각화로 인한 성능 저하를 방지하기 위해서는 주기적으로 인덱스 조각화가 진행된 테이블들에 대한 조각화 제거 작업이 필요합니다. 가능한 한 인덱스 재구성 작업을 자동화하여 주기적으로 용이하게 수행할 수 있는 체계를 갖출 것을 권고합니다.

        [주의] DBCC DBREINDEX 작업은 서비스 휴지 시간에 수행해야 합니다.

        [예제 스크립트] 다음은 인덱스 조각화 제거를 위해 활용할 수 있는 예제 스크립트입니다. 아래 예제 스크립트를 시스템의 환경에 적합하도록 수정 보완하여 활용하기 바랍니다.

        ----------------------------------------------------------------------------------------------------------------
        -- Written by Kimberly L. Tripp - all rights reserved.
        -- For more scripts, sample code and Kimberly's schedule check out
        -- www.SQLSkills.com
        -- For "More than Just Training," see the Industry Experts at
        -- www.SolidQualityLearning.com
        -- Disclaimer - Thoroughly test this script, execute at your own risk.
        ----------------------------------------------------------------------------------------------------------------
        /*
        Execute this whole script to create the sp_RebuildIndexes stored procedure in Master.
        Best Viewed with Courier New 12pt. and Tabs saved as 4 spaces not 8. (Tools, Options, Editor)
        To use the sp_RebuildIndexes procedure once created use:
        sp_RebuildIndexes
        To Rebuild All Indexes on All Tables for all that have a Scan Density < 100%
        sp_RebuildIndexes @ScanDensity = 80
        To Rebuild All Indexes on All Tables with a Scan Density of < 80%
        sp_RebuildIndexes 'Authors'
        To Rebuild All Indexes on the authors table - for a Scan Density of < 100%
        sp_RebuildIndexes 'Authors', 80
        To Rebuild All Indexes on the authors table - for a Scan Density of < 80%
        Object Name and ScanDensity are both optional parameters.
        ScanDensity must be a whole number between 1 and 100.
        */
        USE master
        GO
        IF OBJECTPROPERTY(object_id('sp_RebuildClusteredIndex'), 'IsProcedure') = 1
        DROP PROCEDURE sp_RebuildClusteredIndex
        GO

        IF OBJECTPROPERTY(object_id('sp_RebuildIndexes'), 'IsProcedure') = 1
        DROP PROCEDURE sp_RebuildIndexes
        GO

        CREATE PROCEDURE sp_RebuildClusteredIndex
        (
        @TableName sysname = NULL,
        @IndexName sysname = NULL
        )
        AS
        -- Written by Kimberly L. Tripp of SYSolutions, Inc.
        -- For more code samples go to http://www.sqlskills.com
        -- NOTE: If your clustered index is NOT unique then rebuilding the clustered
        -- index will cause the non-clustered indexes to be rebuilt.
        -- If the nonclustered indexes were fragmented
        -- then this series of scripts will build them again.
        IF @TableName IS NOT NULL
        BEGIN
        IF (OBJECTPROPERTY(object_id(@TableName), 'IsUserTable') = 0
        AND OBJECTPROPERTY(object_id(@TableName), 'IsView') = 0)
        BEGIN
        RAISERROR('Object: %s exists but is NOT a User-defined Table.
        This procedure only accepts valid table names to process for index rebuilds.', 16, 1, @TableName)
        RETURN
        END
        ELSE
        BEGIN
        IF OBJECTPROPERTY(object_id(@TableName), 'IsTable') IS NULL
        BEGIN
        RAISERROR('Object: %s does not exist within this database. Please check the table name and location (which database?).
        This procedure only accepts existing table names to process for index rebuilds.', 16, 1, @TableName)
        RETURN
        END
        END
        END

        IF @IndexName IS NOT NULL
        BEGIN
        IF INDEXPROPERTY(object_id(@TableName), @IndexName, 'IsClustered') = 0
        BEGIN
        RAISERROR('Index: %s exists but is a Clustered Index.
        This procedure only accepts valid table names and their clustered indexes for rebuilds.', 16, 1, @IndexName)
        RETURN
        END
        ELSE
        BEGIN
        IF INDEXPROPERTY(object_id(@TableName),
        @IndexName, 'IsClustered') IS NULL
        BEGIN
        SELECT @TableName, @IndexName,
        INDEXPROPERTY(object_id(@TableName),
        @IndexName, 'IsClustered')
        RAISERROR('There is no index with name:%s on this table.
        Please check the table name and index name as well as location (which database?).
        This procedure only accepts existing table names and their clustered indexes for rebuilds.', 16, 1, @IndexName)
        RETURN
        END
        END
        END

        -- So now we have a valid table, a valid CLUSTERED index and we're ready to rebuild.
        -- Here's a quick overview of what this code will do:
        -- Get the Column List and Index Defintion (Use the output from sp_helpindex)
        -- Figure out if it's UNIQUE - to specify in CREATE INDEX statement
        -- Build and Execute the CREATE INDEX command through dynamic string execution

        DECLARE @ExecStr nvarchar(4000)
        -- more than enough even if 16 cols of 128 chars,
        -- Tablename of 128 and Indexname of 128...
        -- but if this is the case you have other problems :).
        , @ColList nvarchar(3000)
        , @Unique nvarchar(7)
        -- Will be either '' or 'Unique ' and added to CR Index String
        , @FillFactor nvarchar(100)

        CREATE TABLE #IndexInfo
        (
        IndexName sysname,
        IndexDesc varchar(210),
        IndexKeys nvarchar(2126)
        )

        INSERT INTO #IndexInfo EXEC sp_helpindex @TableName

        SELECT @ColList = IndexKeys
        , @Unique = CASE
        WHEN IndexDesc LIKE 'clustered, unique%'
        THEN 'Unique '
        ELSE ''
        END --CASE Expression
        , @FillFactor = ', FILLFACTOR = ' + NULLIF(convert(nvarchar(3)
        , (SELECT OrigFillFactor
        FROM sysindexes
        WHERE id = object_id(@TableName) AND Name = @IndexName)), 0)
        FROM #IndexInfo
        WHERE IndexName = @IndexName

        SELECT @ExecStr = 'CREATE ' + @Unique + 'CLUSTERED INDEX '
        + QUOTENAME(@IndexName, ']') + ' ON '
        + QUOTENAME(@TableName, ']') + '(' + @collist
        + ') WITH DROP_EXISTING ' + ISNULL(@FillFactor, '')
        -- For testing the String
        -- SELECT @ExecStr

        -- Create the Clustered Index
        EXEC(@ExecStr)
        GO

        CREATE PROCEDURE sp_RebuildIndexes
        (
        @TableName sysname = NULL,
        @ScanDensity tinyint = 100
        )
        AS
        -- Written by Kimberly L. Tripp of SYSolutions, Inc.
        -- For more code samples go to http://www.sqlskills.com
        -- This procedure will get the Fragmentation information for all tables and indexes
        -- within the database.
        -- Programmatically it will then walk the list rebuilding all indexes that have a scan
        -- density less than the value passed in - by default any less than 100% contiguous.
        -- Use this script as a starting point. Modify it for your options, ideas, etc.
        -- and then schedule it to run regularly.
        -- NOTE - This gathers density information for all tables and all indexes.
        -- This might be time consuming on large databases.
        -- DISCLAIMER - Execute at your own risk. TEST THIS FIRST.
        SET NOCOUNT ON

        IF @ScanDensity IS NULL
        SET @ScanDensity = 100

        IF @ScanDensity NOT BETWEEN 1 AND 100
        BEGIN
        RAISERROR('Value supplied:%i is not valid. @ScanDensity is a percentage.
        Please supply a value for Scan Density between 1 and 100.', 16, 1, @ScanDensity)
        RETURN
        END
        IF @TableName IS NOT NULL
        BEGIN
        IF OBJECTPROPERTY(object_id(@TableName), 'IsUserTable') = 0
        BEGIN
        RAISERROR('Object: %s exists but is NOT a User-defined Table.
        This procedure only accepts valid table names to process for index rebuilds.', 16, 1, @TableName)
        RETURN
        END
        ELSE
        BEGIN
        IF OBJECTPROPERTY(object_id(@TableName), 'IsTable') IS NULL
        BEGIN
        RAISERROR('Object: %s does not exist within this database.
        Please check the table name and location (which database?).
        This procedure only accepts existing table names to process for index rebuilds.', 16, 1, @TableName)
        RETURN
        END
        END
        END

        -- Otherwise the Object Exists and it is a table so we'll continue from here.
        -- First thing to do is create a temp location for the data returned from
        -- DBCC SHOWCONTIG

        CREATE TABLE #ShowContigOutput
        (
        ObjectName sysname,
        ObjectId int,
        IndexName sysname,
        IndexId tinyint,
        [Level] tinyint,
        Pages int,
        [Rows] bigint,
        MinimumRecordSize smallint,
        MaximumRecordSize smallint,
        AverageRecordSize smallint,
        ForwardedRecords bigint,
        Extents int,
        ExtentSwitches numeric(10,2),
        AverageFreeBytes numeric(10,2),
        AveragePageDensity numeric(10,2),
        ScanDensity numeric(10,2),
        BestCount int,
        ActualCount int,
        LogicalFragmentation numeric(10,2),
        ExtentFragmentation numeric(10,2)
        )

        IF @TableName IS NOT NULL
        -- then we only need the showcontig output for that table
        INSERT #ShowContigOutput
        EXEC('DBCC SHOWCONTIG (' + @TableName + ') WITH FAST, ALL_INDEXES, TABLERESULTS')
        ELSE
        -- All Tables, All Indexes Will be processed.
        INSERT #ShowContigOutput
        EXEC('DBCC SHOWCONTIG WITH FAST, ALL_INDEXES, TABLERESULTS')
        PRINT N' '
        -- Quick test to see if everything is getting here correctly
        -- SELECT * FROM #ShowContigOutput
        -- Walk the showcontig output table skipping all replication tables
        -- as well as all tables necessary for
        -- the UI. This is also where you can list large tables
        -- that you don't want to rebuild all at one time.
        -- NOTE: If you take out a large table from rebuilding this script may have
        -- already checked density
        -- meaning that the expense in terms of time may have been
        -- expensive.
        -- Also, you should use a different procedure to rebuild a large table
        -- specifically.
        -- Even when you pass in the tablename it will be avoided here if
        -- MANUALLY added to the list by you.
        -- Test, Test, Test!

        DECLARE @ObjectName sysname,
        @IndexName sysname,
        @QObjectName nvarchar(258),
        @QIndexName nvarchar(258),
        @IndexID tinyint,
        @ActualScanDensity numeric(10,2),
        @InformationalOutput nvarchar(4000),
        @StartTime datetime,
        @EndTime datetime

        DECLARE TableIndexList CURSOR FAST_FORWARD FOR
        SELECT ObjectName, IndexName, IndexID, ScanDensity
        FROM #ShowContigOutput AS sc JOIN sysobjects AS so ON sc.ObjectID = so.id
        WHERE sc.ScanDensity < @ScanDensity
        AND (OBJECTPROPERTY(sc.ObjectID, 'IsUserTable') = 1
        OR OBJECTPROPERTY(sc.ObjectID, 'IsView') = 1)
        AND so.STATUS > 0
        AND sc.IndexID BETWEEN 1 AND 250
        AND sc.ObjectName NOT IN ('dtproperties')
        -- Here you can list large tables you do not WANT rebuilt.
        ORDER BY sc.ObjectName, sc.IndexID

        OPEN TableIndexList
        FETCH NEXT FROM TableIndexList INTO @ObjectName, @IndexName, @IndexID, @ActualScanDensity
        WHILE (@@fetch_status <> -1)
        BEGIN
        IF (@@fetch_status <> -2)
        BEGIN
        SELECT @QObjectName = QUOTENAME(@ObjectName, ']')
        SELECT @QIndexName = QUOTENAME(@IndexName, ']')
        SELECT @InformationalOutput = N'Processing Table: '
        + RTRIM(UPPER(@QObjectName))
        + N' Rebuilding Index: ' + RTRIM(UPPER(@QIndexName))
        PRINT @InformationalOutput
        IF @IndexID = 1
        BEGIN
        SELECT @StartTime = getdate()
        EXEC sp_RebuildClusteredIndex @ObjectName, @IndexName
        SELECT @EndTime = getdate()
        SELECT @InformationalOutput = N'Total Time to process = '
        + convert(nvarchar, datediff(ms, @StartTime, @EndTime))
        + N' ms'
        PRINT @InformationalOutput
        END
        ELSE
        BEGIN
        SELECT @StartTime = getdate()
        EXEC('DBCC DBREINDEX(' + @QObjectName + ', '
        + @QIndexName + ') WITH NO_INFOMSGS')
        SELECT @EndTime = getdate()
        SELECT @InformationalOutput = N'Total Time to process = '
        + convert(nvarchar, datediff(ms, @StartTime, @EndTime))
        + N' ms'
        PRINT @InformationalOutput
        END
        PRINT N' '
        FETCH NEXT FROM TableIndexList
        INTO @ObjectName, @IndexName, @IndexID, @ActualScanDensity
        END
        END
        PRINT N' '
        SELECT @InformationalOutput = N'** All Indexes have been rebuilt. ** '
        PRINT @InformationalOutput
        DEALLOCATE TableIndexList
        GO

        오류 로그 보기

        SQL Server에서는 이벤트를 SQL Server 오류 로그 및 응용 프로그램 로그에 기록합니다. 문제가 발생하였을 경우, 오류 로그에 기록되어 있는 정보를 사용하여, 문제의 원인을 찾을 수 있습니다.

        • SQL Server 오류 로그 보기

          SQL Server 로그는 응용 프로그램의 상태 정보를 알기 위한 훌륭한 자료입니다. SQL Server 로그는 서비스가 시작할 때부터 서비스가 중지될 때까지 계속 메시지를 기록합니다.
          모니터링 관리의 효율을 위하여 모니터링 담당자가 SQL Server 로그에서 찾아야 할 것을 정의합니다. 이 로그는 심각도 수준 19~25의 값을 가진 모든 오류를 기록합니다. 모니터링할 때, SQL Server 로그에서 심각도 수준 19~25 사이의 값을 가진 오류는 반드시 체크해야 합니다. 이 심각도 수준을 가진 오류는 트랜잭션을 실패하게 하고 응용 프로그램이 적절하게 운영되지 않도록 합니다. 심각도 수준 20에서 25사이의 오류는 치명적입니다. 만일 이 오류가 발생되면, 클라이언트 연결은 오류 메시지를 받은 후에 종료됩니다.
          또한, RAISERROR…WITH LOG 문법을 사용하여 각각의 오류를 발견해 낼 수 있습니다. 이것은 오류 정보를 SQL Server 로그에 나타나게 합니다.

          [따라하기]

          1. EM에서 원하는 데이터베이스 서버를 선택합니다.

          2. [관리]폴더를 클릭하고, [SQL Server 로그]를 클릭합니다.

          사용자 삽입 이미지

          3. 원하는 로그파일을 클릭하면, 오른쪽 창에 로그가 나타납니다.

          [참고] 로그 파일의 정보 확인 및 개수 변경하기
          SQL Server 로그 파일의 개수는 현재 기록하고 있는 로그와 이전의 6개의 로그에 대한 백업을 가지고 있습니다. 이 로그 파일의 수를 크게 설정하면 SQL Server 재시작으로 인하여 문제를 진단하는데 단서가 될 수 있는 ERRORLOG 파일이 overwrite되어 유실되는 것을 방지할 수 있습니다. 이 로그의 개수는 레지스트리 값을 수정하여 변경할 수 있습니다.

          -- 오류 로그 파일들의 파일 정보 확인EXEC master..xp_enumerrorlogsGO-- 3번째 로그 파일 내용 보기EXEC sp_readerrorlog 3GO-- 로그 파일의 개수 20으로 변경하기 EXEC master..xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer', 'NumErrorLogs', 'REG_DWORD', 20 GO-- 확인EXEC master..xp_regread 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer', 'NumErrorLogs'GO

          [참고] SQL Server 재시작 없이 새 오류 로그 생성하기
          새 오류 로그는 SQL Server가 시작되는 경우에 생성되지만, SQL Server의 재시작 없이도 새 로그를 생성할 수 있습니다. 어떤 이유로 ERRORLOG 파일의 크기가 지나치게 커진 경우에는 sp_cycle_errorlog를 사용하여 새로운 ERRORLOG 파일을 생성할 것을 권고합니다.

          -- 새 로그 생성EXEC sp_cycle_errorlogGO-- 오류 로그 파일별 정보 조회EXEC master..xp_enumerrorlogsGO
        • 응용 프로그램 로그 보기

          이벤트 뷰어는 사용자가 응용 프로그램, 보안, 시스템 로그에 기록되는 이벤트를 모니터링할 수 있도록 합니다. 이 로그는 SQL Server 로그와 SQL 에이전트 로그로 분리시켜 추가적인 정보를 제공합니다. SQL Server 메시지는 응용 프로그램 로그에서 발견됩니다.
          SQL Server 메시지는 "MSSQLSERVER" 또는 "SQLSERVERAGENT"라는 원본을 가진 메시지로 구별될 수 있습니다. RAISERROR 메시지도 여기에서 볼 수 있습니다.

          [따라하기]

          1. [시작] → [설정] → [관리도구] → [이벤트 뷰어]를 선택합니다. (OS마다 다름)

          사용자 삽입 이미지

          2. 디폴트로 로컬컴퓨터의 로그가 나타난다. 다른 컴퓨터의 [연결]을 클릭하여 원격 컴퓨터의 로그를 확인합니다.

          사용자 삽입 이미지

          3. 원하는 사항을 더블 클릭하면, 자세한 정보를 얻을 수 있습니다.

        • SQL Server 에이전트 오류 로그 보기

          SQL Server 에이전트 서비스는 작업 및 복제를 관리합니다.

          1. EM에서 원하는 데이터베이스 서버를 선택합니다.

          2. [관리] 폴더를 클릭합니다.

          사용자 삽입 이미지

          3. [SQL Server 에이전트]에 마우스를 대고 오른쪽 버튼을 클릭하고, [오류 로그 표시]를 선택합니다.

          사용자 삽입 이미지

          4. 오류를 선택하여 목록을 확인합니다.



        성능 모니터링

        성능 모니터링 하기

        1. [시작] → [설정] → [제어판] → [관리] → [성능]을 선택합니다.

        사용자 삽입 이미지

        2. 상단 그래픽 메뉴에서 [+]를 클릭하여 카운터 추가화면이 나타나면, 원하는 모니터 카운터를 추가합니다.

        3. [로컬 컴퓨터 카운터 사용] 또는 [다른 컴퓨터에서 카운터 선택]을 선택합니다.

        4. [성능개체]를 선택합니다.

        5. [모든 카운터]를 선택하거나, [다음 목록에서 카운터 선택]를 선택한 후, 원하는 카운터를 선택합니다.

        6. [모든 인스턴스]를 선택하거나, [다음 목록에서 인스턴스 선택]을 선택한 후, 원하는 인스턴스를 선택합니다.

        7. [추가]를 클릭합니다.

        8. 카운터 추가를 완료 한 후, [닫기]를 클릭합니다.

        사용자 삽입 이미지

        9. 선택한 카운터가 하단에 나타납니다.

        10. 카운터를 제거할 경우에는, 제거하기를 원하는 카운터를 선택한 후, 상단 그래픽 메뉴에서, [x] (삭제키)를 클릭합니다.


        성능 로그 생성하기

        [따라하기]

        1. [시작] → [설정] → [제어판] → [관리] → [성능]을 선택합니다.

        2. [성능 로그 및 경고]의 더하기 기호(+)를 클릭합니다.

        3. 카운터 로그를 선택합니다.

        4. 오른쪽 창에 마우스를 대고 오른쪽 버튼을 클릭하여, [새 로그 설정]을 선택합니다.

        사용자 삽입 이미지

        5. [새 로그 설정]에 원하는 로그 이름을 입력하고, [확인]을 클릭합니다.

        사용자 삽입 이미지

        6. Counter_Log화면에 사용 정보와 파일 포맷을 설정합니다.

        사용자 삽입 이미지

        7. [개체추가]를 선택하여, 원하는 개체를 추가합니다.

        8. [카운터추가]를 선택하여, 원하는 카운터를 추가합니다.

        9. [데이터 샘플 간격]의 [간격]과 [단위]를 선택합니다.

        10. [로그파일]탭을 선택합니다.

        11. [로그 파일 종류]를 선택합니다.

        12. 구성을 클릭하면, 로그 파일 구성 화면이 나타납니다.

        사용자 삽입 이미지

        13. 구성을 클릭하면, 로그 파일 구성 화면이 나타납니다.

        사용자 삽입 이미지

        14. [찾아보기]를 클릭하여 로그 파일을 저장할 위치를 선택합니다.

        15. 파일이름을 입력합니다.

        16. 로그 파일 크기를 선택합니다. [다음으로 제한]할 경우, 제한 파일 크기를 입력합니다.

        17. [확인]을 클릭합니다.

        18. 파일명의 마지막 부분을 어떻게 설정할 것인지를 선택합니다.

        19. 파일명의 마지막 부분을 일련 번호로 할 경우, 시작번호를 설정합니다.

        20. 로그 파일의 설명을 입력합니다.

        21. [일정]탭을 선택합니다.

        사용자 삽입 이미지

        22. 로그 시작 시간을 설정합니다.

        23. 로그 중지 시간을 설정합니다.

        24. 로그 파일을 닫을 때 실행할 명령이 있다면 선택합니다.

        25. [확인]을 클릭합니다.

        26. 오른쪽 창에 추가한 로그 파일의 목록이 나타납니다.

        27. 새로 추가한 성능 로그의 이름위에서 마우스의 오른쪽 버튼을 클릭한 후 [다른 이름으로 설정 저장]으로 설정을 저장해 놓으면, 설정 파일을 재사용할 수 있습니다.

        [참고]
        1. 성능 카운터에서 서버의 많은 정보를 얻을 수 있습니다. 문제를 확인할 수 있도록, 충분한 시간 동안 필요한 카운터를 수집합니다.
        2. 로그 파일 종류를 csv로 선택하여 수집하면, 분석 또는 집계하기에 편리합니다.
        3. 수집 시간을 고려하여 데이터 샘플 간격을 설정합니다. 샘플 간격이 커질수록, 그래프의 정확도는 떨어지고, 샘플 간격이 작다면, 데이터의 크기가 커집니다.
          수집 시간샘플 간격
          2시간4 초
          1일30 초
          5일180 초
          1일15초
        4. SQL Server를 모니터링하기 위하여 어떤 서버를 사용할지 결정합니다. 원격으로 모니터링할 수 있으나 장기간 동안 네트워크를 연결하여 카운터를 사용하는 것은 네트워크 트래픽을 가중시킵니다. 만일 SQL Server에 성능 모니터링 로그를 위한 공간이 있다면, 성능 로그 정보를 로컬로 기록합니다.
        5. 수집 파일 크기는 적정한 값으로 제한합니다. 수집 파일이 너무 커지면, 파일이 열리지 않는 경우가 있습니다.
        6. 기존의 설정 파일(HTM)이 있는 경우에는 [기존 설정에서 새 로그 설정]을 사용하면 쉽게 구성이 가능합니다.

        성능 로그의 재생

        [따라하기]

        1. [시작] → [설정] → [제어판] → [관리] → [성능]을 선택합니다.

        사용자 삽입 이미지

        2. [로그 데이터 보기] 버튼을 클릭하면, [시스템모니터 등록 정보] 창이 나타납니다.

        사용자 삽입 이미지

        3. 로그 파일을 선택하고, 추가 버튼을 클릭하여, 원하는 파일을 추가합니다.

        4. [시간 범위]를 클릭하여, 원하는 시간대를 조절합니다.

        5. 데이터 탭을 클릭합니다.

        사용자 삽입 이미지

        6. [추가]를 클릭하여, 원하는 개체를 추가합니다.

        7. [확인]을 클릭합니다.



        프로필러

        성능 문제의 디버깅은 문제의 원인을 알아내는 것으로 시작합니다. 많은 경우, 성능 문제는 비효율적인 SQL 문에서 기인합니다. 비효율적인 SQL 문이 문제의 원인이라고 의심될 때, SQL 프로필러는 특정 SQL 문을 찾는 것에 도움을 줄 수 있습니다. 문제의 원인이 되는 SQL 문을 찾아, 튜닝하여 성능에 많은 도움을 줄 수 있습니다.

        추적 수행하기 - GUI 사용

        [따라하기]

        1. 다음 방법 중 하나를 이용하여 프로필러를 실행합니다.
        [시작] → [프로그램] → [Microsoft SQL Server] → [프로필러] 또는 엔터프라이즈 관리자의 상단 메뉴에서 [도구] → [SQL 프로필러]를 선택합니다.

        2. [파일] → [새로 만들기] → [추적]을 선택합니다.

        사용자 삽입 이미지

        3. 원하는 SQL 서버에 연결하면, [추적 속성]창이 나타납니다.

        사용자 삽입 이미지

        4. 추적이름을 입력합니다.

        5. 추적할 SQL Server를 선택합니다.

        6. 템플렛을 사용할 경우에 템플렛 이름을 선택합니다.

        7. 파일에 저장하려면, [파일에 저장]을 선택하고, 저장할 위치와 파일명을 입력합니다.

        8. 최대 파일 크기 설정을 합니다.

        9. 이벤트 탭을 선택한 후, 원하는 이벤트를 추가하거나, 제거합니다.

        사용자 삽입 이미지

        10. 데이터 열 탭을 선택한 후, 수집할 데이터 열을 선택합니다.

        사용자 삽입 이미지

        11. 필터를 이용하고 싶다면, 필터 탭을 선택하여, 원하는 필터를 정의합니다. 예를 들어, LoginName이 Test인 것만 수집하고 싶다면 다음과 같이 설정합니다.

        사용자 삽입 이미지

        12. [실행]을 클릭하면, 수집이 시작됩니다.

        사용자 삽입 이미지

        13. 수집 중지를 위해서, 중지 버튼(붉은 네모)을 클릭합니다.


        추적 수행하기 - SP 사용

        [파일] → [추적 스크립팅]을 이용하면, 원하는 확장 프로시저를 생성할 수 있습니다.
        [추적 스크립팅]을 이용하여 작성한 저장 프로시저를 첨부합니다.

        [따라하기]

        1. 오래 실행되는 SQL 문 찾기
          오래 실행되는 쿼리는 잘못 튜닝된 시스템, 잘못 작성된 응용 프로그램, 또는 단순히 많은 동작을 수행하는 작업등을 의미할 수 있습니다. 어떠한 경우건, 이러한 오래 실행되는 SQL 문을 찾아서 튜닝하는 것은 그 작업의 성능은 물론 전반적인 시스템 성능까지도 향상시킬 수 있습니다.
          권장되는 추적 이벤트 :TSQL, SQL:BatchCompleted
          정렬 기준 컬럼 :Duration
        2. 과도한 자원 사용자 찾기
          과도한 자원을 사용하는 응용 프로그램이나 사용자를 찾는 추적은 DBA에게 유용한 도구가 될 수 있습니다. 이러한 추적 유형은 CPU와 I/O 자원 모두를 많이 사용하는 SQL 문을 살펴야 합니다. 프로세스나 사용자를 식별하여, 응용 프로그램을 튜닝할 수 있습니다.
          권장되는 추적 이벤트 :TSQL, SQL:BatchCompleted
          정렬 기준 컬럼 :CPU, Reads, 및 Writes
        3. 교착 상태 알아내기
          사용자의 작업에 따라 교착상태는 시스템에서 문제가 될 수도 있고 또 그렇지 않을 수도 있습니다. 많은 경우에 있어 교착 상태는 심각한 문제일 수 있는데, 이 경우 원인을 알아내는 것은 성능을 향상시키는데 핵심이 됩니다. 그러나 이러한 이벤트를 프로파일 하는 것은 자원을 많이 사용하게 되므로 주의해야 합니다.
          권장되는 추적 이벤트
          TSQL, SQL:BatchStarting동작하는 SQL 일괄 처리(batch)
          Locks, Lock:Deadlock교착 상태 자체의 이벤트
          Locks, Lock:Deadlock Chain교착 상태에 이르는 이벤트 순서

        [참고]

        1. 불필요한 이벤트의 추가는 삼가합니다. 너무 많은 이벤트의 추가는 서버의 성능에 영향을 줄 수 있습니다.
        2. 일반적인 경우라면, 모든 컬럼들을 포함시킵니다. 어떤 이벤트들은 보조적인 항목을 반환하는 어떤 항목들에 의존합니다. 적어도 다음 컬럼들은 포함하는 것이 좋습니다.
          - BinaryData
          - ClientProcessID
          - CPU
          - Duration
          - EndTime
          - EventClass
          - EventSubClass
          - HostName
          - IntegerData
          - LoginName
          - NTUserName
          - Reads
          - SPID
          - StartTime
          - TextData
          - Writes
        3. 테이블에 추적을 직접 저장하는 것은 좋지 않습니다. 추적 파일을 생성한 후, fn_trace_gettable 함수를 사용하면 테이블에 저장할 수 있습니다.

        추적에 관련된 저장 프로시저의 예제 스크립트

        다음은 추적 스크립팅을 저장 프로시저화한 예제 스크립트입니다. 시스템의 환경에 적합하도록 수정 보완하여 활용하기 바랍니다.

      2. 추적을 시작하는 저장 프로시저의 예제 스크립트 : sp_trace_start
        USE master
        GO
        CREATE PROCEDURE sp_trace_start @TraceFileName sysname=NULL,
        @TraceName sysname='trace',
        @Options int=2, -- TRACE_FILE_ROLLOVER
        @MaxFileSize bigint=5,
        @StopTime datetime=NULL,
        @Events varchar(300)=
        '10,12',
        -- 10 - RPC:Completed
        -- 12 - SQL:BatchCompleted
        @Cols varchar(300)=
        '1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,',
        -- 모든 컬럼
        @IncludeFilter sysname=NULL,
        @ExcludeFilter sysname=NULL
        AS
        SET NOCOUNT ON
        -- 변수 선언
        DECLARE @TraceId int
        DECLARE @On bit
        DECLARE @rc int

        SET @On=1

        -- 이벤트와 컬럼을 확인한다.
        IF @Events IS NULL or @Cols IS NULL BEGIN
        PRINT 'No Events or Coloumns.'
        RETURN -1
        END

        -- 파일경로와 파일명을 설정한다.
        IF @TraceFileName IS NULL
        SELECT @TraceFileName = 'c:\Trace\trace_' + CONVERT(CHAR(8),getdate(),112)

        -- 추적 큐를 만든다
        EXEC @rc =sp_trace_create @TraceId OUT, @Options, @TraceFileName, @MaxFileSize, @StopTime
        IF @rc<>0 BEGIN
        PRINT 'Trace not started.'
        RETURN @rc
        END
        PRINT 'Trace started.'
        PRINT 'The trace file name is '+@TraceFileName+'.'

        -- 추적할 이벤트 클래스들과 컬럼들을 지정한다
        DECLARE @i int, @j int, @Event int, @Col int, @Colstring varchar(300)

        IF RIGHT(@Events,1)<>',' SET @Events=@Events+','
        SET @i=CHARINDEX(',',@Events)
        WHILE @i<>0 BEGIN
        SET @Event=CAST(LEFT(@Events,@i-1) AS int)
        SET @Colstring=@Cols
        IF RIGHT(@Colstring,1)<>',' SET @Colstring=@Colstring+','
        SET @j=CHARINDEX(',',@Colstring)
        WHILE @j<>0 BEGIN
        SET @Col=CAST(LEFT(@Colstring,@j-1) AS int)
        EXEC sp_trace_setevent @TraceId, @Event, @Col, @On
        SET @Colstring=SUBSTRING(@Colstring,@j+1 ,300)
        SET @j=CHARINDEX(',',@Colstring)
        END
        SET @Events=SUBSTRING(@Events,@i+1,300)
        SET @i=CHARINDEX(',',@Events)
        END

        -- 필터를 설정한다
        EXEC sp_trace_setfilter @TraceId, 10, 0, 7, N'SQL Profiler'
        EXEC sp_trace_setfilter @TraceId, 1, 0, 7, N'EXEC% sp_%trace%'

        IF @IncludeFilter IS NOT NULL
        EXEC sp_trace_setfilter @TraceId, 1, 0, 6, @IncludeFilter

        IF @ExcludeFilter IS NOT NULL
        EXEC sp_trace_setfilter @TraceId, 1, 0, 7, @ExcludeFilter

        -- 추적을 활성화한다
        EXEC sp_trace_setstatus @TraceId, 1

        -- 추적을 기록한다. (테이블 사용)
        IF OBJECT_ID('tempdb..TraceQueueList') IS NULL BEGIN
        CREATE TABLE tempdb..TraceQueueList (TraceID int, TraceName varchar(20), TraceFile sysname)
        END

        IF EXISTS(SELECT * FROM tempdb..TraceQueueList WHERE TraceName = @TraceName) BEGIN
        UPDATE tempdb..TraceQueueList
        SET TraceID = @TraceId, TraceFile = @TraceFileName
        WHERE TraceName = @TraceName
        END
        ELSE BEGIN
        INSERT tempdb..TraceQueueList
        VALUES(@TraceId, @TraceName, @TraceFileName)
        END

        RETURN 0
        GO

        /* 실행 하기 */
        EXEC sp_trace_Start
        [참고]
        • output 파일을 지정하지 않으면, "c:\Trace"밑에 추적 파일이 생성됩니다. 이 스크립트를 직접 실행하려면, "c:\Trace"를 생성합니다.
        • 추적 파일이 커질 수도 있으므로, output 파일이 생성되는 곳의 공간을 충분히 확보합니다.
        • 원하는 이벤트와 컬럼은 번호로 설정합니다. 이벤트와 컬럼 번호는 BOL을 참조하십시오.
      3. 추적을 중지하는 저장 프로시저의 예제 스크립트 : sp_trace_stop
        USE masterGOCREATE PROCEDURE sp_trace_stop @TraceName sysname='trace'ASSET NOCOUNT ON-- 변수를 선언한다DECLARE @TraceId int  DECLARE @TraceFileName sysname -- 추적 목록을 확인하여, 추적을 중지한다IF OBJECT_ID('tempdb..TraceQueueList') IS NOT NULL BEGIN    SELECT @TraceId = TraceID, @TraceFileName=TraceFile FROM tempdb..TraceQueueList    WHERE TraceName = @TraceName    IF @@ROWCOUNT<>0 BEGIN        EXEC sp_trace_setstatus @TraceId, 0        EXEC sp_trace_setstatus @TraceId, 2        DELETE tempdb..TraceQueueList WHERE TraceName = @TraceName        PRINT 'Trace is stopped. ' + 'The trace output file name is '+@TraceFileName    END    ELSE         PRINT 'No active traces.'ENDELSE    PRINT 'No active traces.'RETURN 0GO/* 실행하기 */EXEC sp_trace_stop

        [참고] sp_trace_stop은 sp_trace_start로 실행한 추적(Trace)를 중지하는 저장 프로시저입니다.


        추적 재생하기

        1. 프로필러를 시작하고, [파일] → [열기] → [추적 파일]을 선택합니다.

        사용자 삽입 이미지

        2. 원하는 파일을 선택합니다.

        유용한 유틸리티

        • PSSDIAG

          PSSDIAG는 성능 분석에 필요한 여러가지 로그와 데이터를 수집할 수 있는 유틸리티입니다. 이 유틸리티를 사용하면 프로필러에 비해 부하를 덜 주면서 추적 데이터를 수집할 수 있으므로, 대용량 시스템의 경우에는 프로필러 대신 이 툴을 사용할 것을 권고합니다. 자세한 내용은 다음 url을 참조하십시오.
          http://support.microsoft.com/?kbid=830232 

          사용자 삽입 이미지
           

        • Read80Trace

          수집한 추적 정보를 분석하는데 매우 유용한 유틸리티입니다. 추적 데이터를 분석하여 로컬 데이터베이스에 분석한 정보를 저장해 주고, htm 파일 형태로 리소스를 많이 사용한 쿼리 또는 저장 프로시저, duration이 긴 쿼리 또는 저장 프로시저 등에 대한 분석 결과를 제공합니다. 자세한 내용은 다음을 참조하십시오.
          http://support.microsoft.com/default.aspx?scid=kb;en-us;887057 

          사용자 삽입 이미지
           



        문제 점검 및 해결

        사용자 데이터베이스가 suspect로 표시된 경우에 문제 해결하기

        Northwind 데이터베이스의 status 컬럼이 suspect로 설정된 경우를 예를 들어 설명합니다.

        [주의] sp_resetstatus SP는 아래와 같은 문제 해결을 위해서만 사용해야 하며, 사용 시 주의를 요합니다.

        [참고] SQL Server Errorlog 파일에 "Bypassing recovery for database 'Northwind' because it is marked SUSPECT." 와 같은 메시지가 기록됩니다.

        [따라하기]

        1. sp_resetstatus가 없으면 생성합니다.
        USE masterGOEXEC sp_configure 'allow updates', 1 RECONFIGURE WITH OVERRIDE GO CREATE PROCEDURE sp_resetstatus @dbname varchar(30) ASDECLARE @msg varchar(80)IF @@trancount > 0BEGIN    PRINT 'Can''t run sp_resetstatus from within a transaction.'    RETURN (1)ENDIF suser_id() != 1BEGIN    SELECT @msg = 'You must be the System Administrator (SA)'    SELECT @msg = @msg + ' to execute this procedure.'    RETURN (1)ENDIF (SELECT COUNT(*) FROM master..sysdatabases WHERE name = @dbname) != 1BEGIN    SELECT @msg = 'Database ' + @dbname + ' does not exist!'    PRINT @msg    RETURN (1)ENDIF (SELECT COUNT(*) FROM master..sysdatabases WHERE name = @dbname AND status & 256 = 256) != 1BEGIN    PRINT 'sp_resetstatus can only be run on suspect databases.'    RETURN (1)ENDBEGIN TRAN    UPDATE master..sysdatabases SET status = status ^ 256    WHERE name = @dbname    IF @@error != 0 OR @@rowcount != 1        ROLLBACK TRAN    ELSE     BEGIN        COMMIT TRAN        SELECT @msg = 'Database ' + @dbname + ' status reset!'        PRINT @msg        PRINT ''        PRINT 'WARNING: You must reboot SQL Server prior to  '        PRINT '         accessing this database!'        PRINT ''    ENDGOEXEC sp_configure 'allow updates', 0RECONFIGURE WITH OVERRIDE GO
        2. Suspect 상태가 된 데이터베이스에 대하여 sp_resetstatus를 실행합니다.
        EXEC sp_resetstatus NorthwindGO

        3. ALTER DATABASE를 사용하여 Northwind 데이터베이스에 파일을 추가하여 여유 공간을 확보해 줍니다.

        4. SQL Server를 중지하고 다시 시작합니다.

        Tempdb가 suspect 상태가 된 경우의 문제 해결하기

        Tempdb가 suspect 상태가 된 경우에 문제를 해결하는 방법을 설명합니다. 참고로 tempdb가 suspect 상태가 되면 SQL Server 서비스 시작이 실패할 수도 있습니다.

        [참고] SQL Server Errorlog 파일에 "Database 'tempdb' cannot be opened. It has been marked SUSPECT by recovery." 와 같은 메시지가 기록됩니다.

        [따라하기]

        1. tempdb.mdf 파일과 tempdb.ldf 파일이 있는지 확인하고, 만약 있으면 파일들의 이름을 변경합니다.

        2. 다음과 같은 명령어를 사용하여 명령 프롬프트 상에서 SQL Server를 시작합니다. 명명된 인스턴스인 경우에는 -s 매개변수를 지정합니다.

        sqlservr -c -f -T3608 -T4022

        [주의] 명령 프롬프트 창이 열린 채로 두어야 합니다. 명령 프롬프트 창을 닫으면 SQL Server 프로세스가 중지됩니다.

        3. 쿼리 분석기에서 sp_resetstatus를 수행하여 tempdb의 suspect 상태를 해제합니다.

        EXEC master..sp_resetstatus Tempdb

        4. 명령 프롬프트 찾에서키를 눌러 SQL Server 서비스를 중지합니다.

        5. SQL Server 서비스를 시작합니다. 이렇게 작업하면 Tempdb 데이터베이스 파일들이 새로 생성되며 tempdb가 정상적으로 복구됩니다.

        손상된 데이터베이스 복구하기 (DBCC CHECKDB를 사용하여 오류 복구하기)

        DBCC CHECKDB 명령어를 사용하면 특정 데이터베이스의 일관성(consistency)를 점검할 수 있습니다. DBCC CHECKDB 명령어는 데이터베이스 손상을 점검하는 주요 수단이며, 다음과 같은 사항들을 점검합니다.

        - 인덱스 페이지와 데이터 페이지들이 제대로 연결되어 있는가
        - 인덱스가 최신 상태이고, 제대로 정렬되어 있는가
        - 포인트들이 일관성이 있는가 (Consistent)
        - 각 페이지 상의 데이터가 최신 상태인가
        - 페이지 오프셋이 최신 상태인가

        [구문]
        DBCC CHECKDB     ( 'database_name'             [ , NOINDEX                 | { REPAIR_ALLOW_DATA_LOSS                     | REPAIR_FAST                     | REPAIR_REBUILD                    } ]     )     [ WITH { [ ALL_ERRORMSGS ]                    [ , [ NO_INFOMSGS ] ]                     [ , [ TABLOCK ] ]                     [ , [ ESTIMATEONLY ] ]                     [ , [ PHYSICAL_ONLY ] ]                     }         ]

        [사전지식]
        DBCC CHECKDB나 DBCC CHECKTABLE에 REPAIR 옵션을 지정하여 수행하고자 하는 경우에는 SQL Server를 단일 사용자 모드로 시작해서는 안되고 해당 데이터베이스를 단일 사용자 모드(single user mode)로 설정해야 합니다.

        [참고] 데이터베이스를 단일 사용자 모드로 설정하는 방법 세 가지
        • 엔터프라이즈 관리자에서 설정하기
          1. 해당 데이터베이스에서 마우스의 오른쪽 버튼을 클릭한 다음에 [속성]을 선택합니다.
          2. 속성 창에서 [옵션] 탭을 선택합니다.
          3. "액세스 제한" checkbox를 선택한 다음에 "단일 사용자"를 선택하고 [확인] 버튼을 클릭합니다.
        • 쿼리 분석기에서 sp_dboption을 사용하여 설정하기
          USE masterGOEXEC sp_dboption db_name, single, trueGO
        • 쿼리 분석기에서 ALTER DATABASE를 사용하여 설정하기 (작업단계)
          1. 지정한 시간이 경과한 후에 완료되지 않은 트랜잭션들을 롤백하고 단일 사용자 모드로 변경하고자 하는 경우
          2. 완료되지 않은 트랜잭션들을 즉시 롤백하고 단일 사용자 모드로 변경하고자 하는 경우
        [참고] 복구 옵션에 대하여 이해하기
        • REPAIR_FAST 옵션 : 사소한 손상을 복구하는 작업을 수행하며 수행 시간되 빠르고 데이터 유실도 유발하지 않습니다.
        • REPAIR_REBUILD 옵션 : comprehensive error checking and correction 을 수행하며, 소요 시간이 길고 데이터 유실도 발생하지 않습니다.
        • REPAIR_ALLOW_DATA_LOSS 옵션 : REPAIR_REBUILD가 수행하는 모든 작업들을 동일하게 수행하며, 데이터 유실이 발생할 수 있는 작업을 추가로 수행합니다. 구조적인 문제와 페이지 오류를 정정하고 손상된 텍스트 오브젝트를 삭제하는 작업을 수행하기 때문에 데이터 유실이 발생할 수도 있습니다.

        [참고] 복구 작업 단계

        1. 해당 데이터베이스를 단일 사용자 모드로 변경합니다.
        2. REPAIR 옵션을 지정하여 DBCC CHECKDB를 수행합니다.
          2-1. 먼저 REPAIR_FAST 나 REPAIR_REBUILD 옵션을 지정하여 문제 해결을 시도합니다.
          2-2. REPAIR_FAST 나 REPAIR_REBUILD 옵션으로 문제가 해결되지 않으면 REPAIR_ALLOW_DATA_LOSS 옵션을 사용합니다.
          [주의] REPAIR_ALLOW_DATA_LOSS 옵션을 사용하면 데이터의 유실이 발생할 수 있다는 점을 명심하기 바랍니다.
          [권고사항] REPAIR_ALLOW_DATA_LOSS 옵션을 사용하는 경우에는 명령어 수행 후에 다시 원래 상태로 복구할 수 있도록 하기 위해서 트랜잭션 내부에서 DBCC 명령어를 수행할 것을 권고합니다. 이와 같이 작업하면 복구 작업을 수행하고 결과를 확인한 다음에 필요한 경우에 롤백이 가능해집니다.
        3. 복구가 완료되면 데이터베이스를 백업합니다.
        [따라하기]
        SELECT DATABASEPROPERTYEX ('Northwind', 'UserAccess')GO/* 결과:MULTI_USER*/ALTER DATABASE Northwind SET SINGLE_USER WITH ROLLBACK AFTER 10 --10초 후에 완료되지 않은 트랜잭션들을 롤백GOSELECT DATABASEPROPERTYEX ('Northwind', 'UserAccess')GO/* 결과:SINGLE_USER*/DBCC CHECKDB ('Northwind', REPAIR_FAST)GOALTER DATABASE Northwind SET MULTI_USER GO

        손상된 테이블 복구하기 (DBCC CHECKTABLE을 사용하여 오류 복구하기)

        개별 테이블의 문제를 복구하고자 하는 경우에는 DBCC CHECKTABLE 명령어를 사용하면 됩니다.

        [구문]
        DBCC CHECKTABLE( 'table_name' | 'view_name'          [ , NOINDEX   | index_id   | { REPAIR_ALLOW_DATA_LOSS                | REPAIR_FAST         | REPAIR_REBUILD }           ]      )     [ WITH { [ ALL_ERRORMSGS | NO_INFOMSGS ]                    [ , [ TABLOCK ] ]                    [ , [ ESTIMATEONLY ] ]                     [ , [ PHYSICAL_ONLY ] ] }                ]
        [따라하기]
        SELECT DATABASEPROPERTYEX ('Northwind', 'UserAccess')GO/* 결과:MULTI_USER*/ALTER DATABASE Northwind SET SINGLE_USER -- 10초 후에 완료되지 않은 트랜잭션들을 롤백WITH ROLLBACK AFTER 10 GOSELECT DATABASEPROPERTYEX ('Northwind', 'UserAccess')GO/* 결과:SINGLE_USER*/USE NorthwindGODBCC CHECKTABLE (Orders, REPAIR_FAST)GOALTER DATABASE Northwind SET MULTI_USER GO-- EXEC sp_dboption 'Northwind', 'single user', 'FALSE'-- GO

        단일 로그 파일로 구성된 데이터베이스의 새로운 로그 파일 생성하기

        [주의] 로그 파일이 오직 하나인 데이터베이스에 대해서만 사용할 수 있습니다.

        [따라하기] 단일 로그 파일을 가지는 'TestDB'의 로그 파일이 유실/손상된 경우에 새로운 로그 파일을 생성하는 방법

        EXEC sp_detach_db 'TestDB'GOEXEC sp_attach_single_file_db 'TestDB', 'E:\DBdata\TestDB_dat.mdf'GO

        DBCC REBUILD_LOG를 사용하여 새로운 로그 파일 생성하기

        DBCC REBUILD_LOG는, 데이터베이스의 트랜잭션 로그 파일을 사용할 수 없는 경우에 새로운 로그를 재구축하는데 사용되는 명령어입니다.
        예를 들어, 하드웨어의 장애로 인하여 로그 파일이 손상되거나 실수로 로그 파일을 삭제하여 기존의 로그 파일을 액세스할 수 없어서 데이터베이스를 사용할 수 없는 경우에 DBCC REBUILD_LOG를 사용하여 로그를 재구축할 수 있습니다. 로그 파일이 하나인 경우에는 먼저 위의 해결 방법을 적용해 본 다음에 실패하면 이 방법을 사용하기 바랍니다.
        그러나, 이 명령어를 사용하면 로그에 반영되지 않은 유실된 트랜잭션들의 발생으로 데이터베이스의 일관성이 손상될 가능성이 매우 높다는 점을 유의해야 합니다. 문제가 발생하면 일단 다른 방법 (예를 들어, sp_attach_single_file_db)을 동원하여 문제 해결을 시도하고, 도저히 다른 방법으로는 데이터베이스를 복구할 수 없는 경우에 이 명령어를 사용하기 바랍니다. 이 명령어를 수행하면 로그에 반영되지 않는 트랜잭션의 발생으로 인하여 데이터 무결성이 손상될 가능성이 높기 때문입니다. 이 명령어는 문서로 제공되지 않는 명령어이며 마이크로소프트 기술 지원 서비스의 지원 하에서 사용하는 것이 원칙이지만, 기술 지원 서비스를 받을 수 없는 경우의 응급 복구 작업에 참고하시라고 알려 드립니다. 또한, 하드웨어 장애와 같은 문제가 발생한 경우에는 트랜잭션 로그 파일 뿐만 아니라 데이터까지 손상시켰을 가능성이 높으므로, DBCC REBUILD_LOG가 성공적으로 완료된 이후에 단일 사용자 모드에서 DBCC CHECKDB를 수행하여 데이터의 일관성 (Consistency) 을 확인하는 작업이 반드시 필요합니다.

        [구문] DBCC REBUILD_LOG('db_name','log_filename')

        db_name : 문제가 발생한 데이터베이스의 이름
        log_filename : 새로운 로그 파일에 대한 완전한 물리적 경로

        [주의] 이 방법을 사용하면 데이터 일관성이 손상될 가능성이 매우 높으므로 다른 방법으로는 도저히 데이터베이스를 복구할 수 없는 경우에 최후의 방법으로서 사용해야 하며, 매우 신중하게 작업해야 하며, 이 명령어는 문서로 제공되지 않는 명령어로서 마이크로소프트 제품 기술 지원 서비스의 지원 하에서 사용해야 합니다.

        [오류 발생]
        로그 파일이 유실 또는 손상된 경우에는 그 데이터베이스는 엔터프라이즈 관리자에 "주의 대상" (suspect)로 표시되며, 쿼리 분석기나 엔터프라이즈 관리자에서 주의
        대상 상태가 된 데이터베이스를 액세스하려고 하면 다음과 같은 오류가 발생합니다

        서버: 메시지 945, 수준 14, 상태 2, 줄 1
        파일을 액세스할 수 없거나 메모리 또는 디스크 공간이 부족하여 'RebuildLogTest' 데이터베이스를 열 수 없습니다. 자세한 내용은 SQL Server 오류 로그를 참조하십시오.

        그리고 SQL Server를 재시작하면 ERRORLOG 파일에 다음과 같은 오류 메시지가 기록됩니다.

        2005-01-12 14:51:56.72 spid11 'RebuildLogTest' 데이터베이스를 시작하는 중입니다.
        2005-01-12 14:51:57.24 spid11 장치 활성화 오류입니다. 물리적 파일 이름 'C:\Program Files\Microsoft SQL Server\MSSQL\data\RebuildLogTest_log.LDF'이(가) 잘못된 것 같습니다.

        이와 같은 오류가 발생하고 데이터베이스에 연결할 수 없는 경우에 다음과 같은 작업 단계로 복구 작업을 수행하면 로그를 재구축할 수 있습니다.

        [예제] 다음은 RebuildLogTest라는 데이터베이스를 복구하는 예제입니다.

        1. 설정된 옵션들을 확인합니다.
          EXEC sp_dboption RebuildLogTestGO
        2. 시스템 테이블에 대한 직접적인 업데이트가 가능하도록 변경합니다.
          EXEC sp_configure 'allow updates', 1RECONFIGURE WITH OVERRIDEGO
        3. 문제가 발생한 데이터베이스를 응급 모드(bypass recovery)로 설정합니다
          UPDATE master..sysdatabases SET status = 32768 WHERE name = 'RebuildLogTest'GO
        4. SQL Server 서비스를 중지하고 다시 시작합니다.
        5. DBCC REBUILD_LOG를 수행합니다. 이 때 로그 파일의 이름에는 로그 파일이 저장될 경로까지 전체 이름을 기술해야 하며, 로그 파일은 기존에 존재하지 않는 이름을 지정해야 합니다.
          USE master
          GO
          DBCC REBUILD_LOG('rebuildlogtest','C:\Program Files\Microsoft SQL Server\MSSQL\data\RebuildLogTest_log.LDF')
          GO

          [참고]
          이 명령어가 정상적으로 수행되면 결과창에 다음과 같은 메시지가 반환되며, 데이터베이스는 'dbo use only' 모드가 됩니다. 이전의 status 값과 무관하게 sysdatabases 테이블의 status 값이 2048로 설정됩니다. sp_dboption이나 엔터프라이즈 관리자를 사용하여 status 값을 원하는 값으로 변경하면 됩니다.

          경고: 'RebuildLogTest' 데이터베이스에 대한 로그가 다시 작성되었습니다. 트랜잭션에 일관성이 없습니다. 물리적 일관성을 검사하려면 DBCC CHECKDB를 실행해야 합니다. 데이터베이스 옵션을 원래대로 설정하고 다른 로그 파일을 삭제해야 합니다.

          DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.

          만약 이미 있는 파일 이름을 지정한 경우에는 다음과 같은 오류 메시지가 반환됩니다.

          서버: 메시지 5025, 수준 16, 상태 1, 줄 2
          'C:\Program Files\Microsoft SQL Server\MSSQL\data\RebuildLogTest_log.LDF' 파일이 이미 있습니다. 새 로그 파일을 만들려면 이 파일의 이름을 바꾸거나 삭제해야 합니다.

          DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.

        6. 시스템 테이블을 직접 업데이트할 수 없도록 원래 값으로 변경합니다.
          EXEC sp_configure 'allow updates', 0RECONFIGURE WITH OVERRIDEGO
        7. 데이터베이스를 단일 사용자 모드로 변경하고 DBCC CHECKDB를 수행하여 일관성을 점검합니다. 데이터베이스를 단일 사용자 모드로 변경하는 보다 자세한 방법은 "손상된 데이터베이스 복구하기" 를 참조하기 바랍니다.
          EXEC sp_dboption ' RebuildLogTest ', 'single user', 'true'DBCC CHECKDB('RebuildLogTest')GO
        8. DBCC CHECKDB를 수행한 결과 문제가 없으면, 그 데이터베이스를 정상적으로 사용할 수 있습니다. 그러나 롤백되어야 할 트랜잭션이 롤백되지 않거나, 데이터에 반영되어야 할 수정 작업이 반영되지 않는 문제가 발생할 수 있으므로, 논리적인 데이터의 무결성은 별도의 점검이 필요합니다.
        9. 데이터베이스 옵션을 원래대로 설정하고, 로그 파일의 크기도 원래 크기로 확장합니다. 로그파일을 재구축하면, 504KB의 작은 크기의 로그 파일이 생성됩니다.

        교착상태(Deadlock) 발생 시 교착상태 추적하기

        추적 플래그 1204를 사용하면 교착상태(Deadlock)에 대한 내용을 확인하는 것이 가능합니다. 명령 프롬프트에서 추적 플래그를 추가하여 SQL Server 서비스를 시작할 수도 있고, 엔터프라이즈 관리자에서 SQL Server 시작 매개 변수에서 추적 플래그를 추가할 수도 있습니다.

      4. 명령 프롬프트에서 추적 플래그를 지정하는 방법

        [따라하기]

        1. SQL Server 서비스를 중지해도 되는 시점에 SQL Server 서비스를 중지합니다.
        2. 다음과 같이 추적 플래그를 추가하고 SQL Server 서비스를 시작합니다.
          [주의] SQL Server 서비스를 시작한 명령 프롬프트의 창은 그대로 두어야 합니다. 명령프롬프트 창을 닫거나,를 입력하면 SQL Server 서비스가 중지됩니다. [참고] sqlservr.exe 파일은 SQL Server 설치 폴더의 하위 폴더 중 하나인 binn에 있습니다.

          [예] 추적 플래그를 추가하여 디폴트 인스턴스 SQL Server 서비스를 시작하는 예제 (SQL Server 2000 서비스 팩3부터는 -T3605를 추가하지 않아도 ERRORLOG에 추적결과가 기록됩니다.)
          sqlservr -c -T1204  -T3605
        3. 위와 같이 작업하면 교착상태 추적 결과가 SQL Server 서비스가 시작된 콘솔 화면과 ERRORLOG 파일로 기록됩니다.

      5. 엔터프라이즈 관리자에서 추적 플래그를 지정하는 방법
        1. 엔터프라이즈 관리자에서 [속성] → [시작 매개 변수] "매개 변수"에 -T1204와 -T3605를 입력하고 [추가] 버튼을 클릭한 다음에 [확인] 버튼을 클릭합니다.
        2. SQL Server 서비스를 중지하고 재시작 합니다.
        3. 교착상태가 발생하면 교착상태 추적 결과가 ERRORLOG 파일로 기록됩니다.

        [교착상태에 대한 추적결과 예]
        추적 플래그 1204를 추가하고 SQL Server 서비스를 시작하면 교착상태에 대한 추적결과가 다음과 같은 형태로 반환 또는 기록됩니다.

        2003-02-25 05:12:55.13 spid4
        Deadlock encountered .... Printing deadlock information
        2003-02-25 05:12:55.13 spid4
        2003-02-25 05:12:55.13 spid4 Wait-for graph
        2003-02-25 05:12:55.13 spid4
        2003-02-25 05:12:55.13 spid4 Node:1
        2003-02-25 05:12:55.14 spid4 RID: 2:1:15:0     CleanCnt:1 Mode: X Flags: 0x2
        2003-02-25 05:12:55.14 spid4 Grant List 0::
        2003-02-25 05:12:55.14 spid4 Owner:0x192e32e0 Mode: X  Flg:0x0 Ref:0 Life:02000000 SPID:52 ECID:0
        2003-02-25 05:12:55.15 spid4 SPID: 52 ECID: 0 Statement Type: DELETE Line #: 1
        2003-02-25 05:12:55.15 spid4 Input Buf: Language Event: delete deadt2

        2003-02-25 05:12:55.15 spid4 Requested By:
        2003-02-25 05:12:55.15 spid4 ResType:LockOwner Stype:'OR' Mode: U SPID:51 ECID:0 Ec:(0x19CA3500) Value:0x192e3340 Cost:(0/98)
        2003-02-25 05:12:55.16 spid4
        2003-02-25 05:12:55.16 spid4 Node:2
        2003-02-25 05:12:55.16 spid4 RID: 2:1:28:0     CleanCnt:1 Mode: X Flags: 0x2
        2003-02-25 05:12:55.17 spid4 Grant List 0::
        2003-02-25 05:12:55.17 spid4 Owner:0x192e3400 Mode: X   Flg:0x0 Ref:0 Life:02000000 SPID:51 ECID:0
        2003-02-25 05:12:55.17 spid4 SPID: 51 ECID: 0 Statement Type: DELETE Line #: 1
        2003-02-25 05:12:55.18 spid4 Input Buf: Language Event: delete deadt1

        2003-02-25 05:12:55.18 spid4 Requested By:
        2003-02-25 05:12:55.18 spid4 ResType:LockOwner Stype:'OR' Mode: U SPID:52 ECID:0 Ec:(0x19AB9508) Value:0x192e3300 Cost:(0/98)
        2003-02-25 05:12:55.19 spid4 Victim Resource Owner:
        2003-02-25 05:12:55.19 spid4 ResType:LockOwner Stype:'OR' Mode: U SPID:52 ECID:0 Ec:(0x19AB9508) Value:0x192e3300 Cost:(0/98)

        블로킹 발생 시 원인 추적하기

        다음에 소개하는 저장 프로시저들은 블로킹을 점검하는데 유용하게 사용할 수 있는 저장 프로시저들입니다. 다음의 저장 프로시저들은 master 데이터베이스에 생성해 두고 블로킹 발생 시에 활용하실 것을 권고합니다.

        • sp_blocker_pss80
          블로킹에 관한 전반적인 정보를 수집할 수 있는 매우 유용한 저장 프로시저입니다. Microsoft 웹사이트의 다음 아티클에 sp_blocker_pss80 저장 프로시저 생성 스크립트가 있으므로 활용하시기 바랍니다.
          http://support.microsoft.com/default.aspx?scid=kb;ko-kr;271509
          (아티클 제목 : How to monitor SQL Server 2000 blocking)
        • sp_leadblocker, sp_blockinglocks
          Inside SQL Server 책에 있는 스크립트로서, 블로킹 발생의 원인이 되는 프로세스에 대한 정보와, 블로킹에 관련되는 잠금에 대한 정보를 제공하는 저장 프로시저입니다.
        [따라하기]
        1. 블로킹 추적에 유용한 저장 프로시저들을 생성합니다. (sp_blocker_pss80, sp_leadblocker, sp_blockinglocks)
          USE masterGOCREATE PROCEDURE sp_leadblocker  AS  IF EXISTS      (SELECT * FROM master.dbo.sysprocesses      WHERE spid IN (SELECT blocked FROM master.dbo.sysprocesses))      SELECT           spid, status, loginame=SUBSTRING(SUSER_SNAME(sid), 1, 12),          hostname=substring(hostname, 1, 12),              blk=CONVERT(char(3), blocked),          dbname=substring(db_name(dbid),1,10),cmd, waittype      FROM master.dbo.sysprocesses      WHERE spid IN (SELECT blocked FROM master.dbo.sysprocesses)      AND blocked=0  ELSE  SELECT 'No blocking processes found!'GOCREATE PROCEDURE sp_blockinglocks ASSET NOCOUNT ON  SELECT  DISTINCT CONVERT (SMALLINT, L1.req_spid) AS SPID,     L1.rsc_dbid AS DBID,     L1.rsc_objid AS OBJID,    L1.rsc_indid AS INDID,    SUBSTRING (V.name, 1, 4) AS TYPE,    SUBSTRING (L1.rsc_text, 1, 16) AS RESOURCE,    SUBSTRING (U.name, 1, 8) AS MODE,    SUBSTRING (X.name, 1, 5) AS STATUS  FROM  master.dbo.syslockinfo L1,      master.dbo.syslockinfo L2,    master.dbo.spt_values V,    master.dbo.spt_values X,    master.dbo.spt_values U  WHERE L1.rsc_type = V.number     AND V.type = 'LR'     AND L1.req_status = X.number     AND X.type = 'LS'     AND L1.req_mode + 1 = U.number     AND U.type = 'L'     AND L1.rsc_type <>2 /* 2 : DB LOCK */     AND L1.rsc_dbid = L2.rsc_dbid     AND L1.rsc_bin = L2.rsc_bin     AND L1.rsc_objid = L2.rsc_objid      AND L1.rsc_indid = L2.rsc_indid      AND L1.req_spid <> L2.req_spid     AND L1.req_status <> L2.req_status    --AND(L1.req_spid IN (SELECT BLOCKED FROM master..SYSPROCESSES)    -- OR L2.req_spid IN (SELECT BLOCKED FROM master..SYSPROCESSES))  ORDER BY SUBSTRING (L1.rsc_text, 1, 16), SUBSTRING (X.name, 1, 5)   RETURN (0) GO
        2. 시스템 SP 및 DBCC 명령어와 작업 단계 1에서 추가한 SP를 수행하여 그 결과를 분석합니다.
          2-1. sp_blocker_pss80 활용예
          WHILE 1=1BEGIN     EXEC master.dbo.sp_blocker_pss80     -- Or for fast mode     -- EXEC master.dbo.sp_blocker_pss80 @fast=1     -- Or for latch mode     -- EXEC master.dbo.sp_blocker_pss80 @latch=1     WAITFOR DELAY '00:00:15'ENDGO
          2-2. sp_leadblocker, sp_blockinglocks 활용예
          EXEC sp_leadblockerEXEC sp_blockinglocksGO
          2-3. 블로킹을 유발하는 프로세스에 대하여 sp_lock, sp_who2, sp_who 등의 시스템 SP를 수행하면 잠금과 프로세스에 대한 보다 자세한 내용을 별도로 점검할 수 있습니다.
          EXEC sp_who2 53 EXEC sp_lock 53 GO
          2-4. 트랜잭션을 오픈한 채로 있는 프로세스가 블로킹을 유발하는 경우에는 DBCC OPENTRAN을 사용하여 특정 데이터베이스에서 가장 오래된 활성 트랜잭션에 대한 정보를 점검할 수 있습니다. 참고로, 트랜잭션에 트랜잭션 이름을 기술하면 문제가 있는 트랜잭션을 확인하는 작업이 용이해집니다.
          USE pubs DBCC OPENTRAN  GO -- 또는 DBCC OPENTRAN ('pubs') GO

        대기(wait) 점검하기

        [따라하기]
        1. wait 정보를 저장할 데이터베이스를 생성합니다.
          USE masterGOCREATE DATABASE DBAdmin ON (NAME = DBAdmin_dat, FILENAME = 'D:\DBdata\DBAdmin_dat.mdf'SIZE = 500 MB, MAXSIZE = 1 GB, FILEGROWTH = 100 MB) LOG ON (NAME = DBAdmin_log, FILENAME = 'D:\ DBData\DBAdmin_log.ldf', SIZE = 100 MB, MAXSIZE = 500 MB, FILEGROWTH = 100 MB) GO
        2. wait 정보를 추적할 저장 프로시저를 생성합니다.
          USE DBAdmin
          GO
          CREATE PROCEDURE get_waitstats
          AS
          -- This stored procedure is provided "AS IS" with no warranties,
          -- and confers no rights.
          -- Use of included script samples are subject to the terms specified at
          -- http://www.microsoft.com/info/cpyright.htm
          -- this proc will create waitstats report listing wait types by percentage
          -- can be run when track_waitstats is executing
          SET NOCOUNT ON

          DECLARE @now datetime, @totalwait numeric(20,1)
          ,@endtime datetime,@begintime datetime
          ,@hr int, @min int, @sec int

          SELECT @now=max(now),@begintime=min(now),@endtime=max(now)
          FROM waitstats WHERE [wait type] = 'Total'

          -- subtract waitfor, sleep, and resource_queue from Total
          SELECT @totalwait = sum([wait time]) + 1
          FROM waitstats
          WHERE [wait type] not in
          ('WAITFOR','SLEEP','RESOURCE_QUEUE', 'Total', '***total***')
          AND now = @now

          -- insert adjusted totals, rank by percentage descending
          DELETE waitstats WHERE [wait type] = '***total***' and now = @now
          INSERT INTO waitstats select '***total***',0,@totalwait,@totalwait,@now

          SELECT [wait type],[wait time]
          ,percentage=cast (100*[wait time]/@totalwait as numeric(20,1))
          FROM waitstats
          WHERE [wait type] not in
          ('WAITFOR','SLEEP','RESOURCE_QUEUE','Total')
          AND now = @now
          ORDER BY percentage DESC
          GO

          CREATE PROCEDURE track_waitstats (@num_samples int=10,@delaynum int=1,@delaytype nvarchar(10)='minutes')
          AS
          -- T. Davidson
          -- This stored procedure is provided "AS IS" with no warranties,
          -- and confers no rights.
          -- Use of included script samples are subject to the terms specified at
          -- http://www.microsoft.com/info/cpyright.htm
          -- @num_samples is the number of times to capture waitstats,
          -- default is 10 times. default delay interval is 1 minute
          -- delaynum is the delay interval.
          -- delaytype specifies whether the delay interval is minutes or seconds
          -- create waitstats table if it doesn't exist,
          -- otherwise truncate
          SET NOCOUNT ON
          IF NOT EXISTS (SELECT 1 FROM sysobjects WHERE name = 'waitstats')
          CREATE TABLE waitstats ([wait type] varchar(80),
          requests numeric(20,1),
          [wait time] numeric (20,1),
          [signal wait time] numeric(20,1),
          now datetime default getdate())
          ELSE TRUNCATE TABLE waitstats

          DBCC SQLPERF (waitstats,clear) -- clear out waitstats
          DECLARE @i int,@delay varchar(8),@dt varchar(3)
          , @now datetime, @totalwait numeric(20,1)
          ,@endtime datetime,@begintime datetime
          ,@hr int, @min int, @sec int
          SELECT @i = 1
          SELECT @dt = CASE lower(@delaytype)
          WHEN 'minutes' THEN 'm'
          WHEN 'minute' THEN 'm'
          WHEN 'min' THEN 'm'
          WHEN 'mm' THEN 'm'
          WHEN 'mi' THEN 'm'
          WHEN 'm' THEN 'm'
          WHEN 'seconds' THEN 's'
          WHEN 'second' THEN 's'
          WHEN 'sec' THEN 's'
          WHEN 'ss' THEN 's'
          WHEN 's' THEN 's'
          ELSE @delaytype
          END
          IF @dt not in ('s','m')
          BEGIN
          PRINT 'please supply delay type e.g. seconds or minutes'
          RETURN
          END

          IF @dt = 's'
          BEGIN
          SELECT @sec = @delaynum % 60
          SELECT @min = cast((@delaynum / 60) as int)
          SELECT @hr = cast((@min / 60) as int)
          SELECT @min = @min % 60
          END
          IF @dt = 'm'
          BEGIN
          SELECT @sec = 0
          SELECT @min = @delaynum % 60
          SELECT @hr = cast((@delaynum / 60) as int)
          END
          SELECT @delay= right('0'+ convert(varchar(2),@hr),2) + ':' +
          + right('0'+convert(varchar(2),@min),2) + ':' +
          + right('0'+convert(varchar(2),@sec),2)
          IF @hr > 23 or @min > 59 or @sec > 59
          BEGIN
          SELECT 'hh:mm:ss delay time cannot > 23:59:59'
          SELECT 'delay interval and type: ' + convert (varchar(10),@delaynum)
          + ',' + @delaytype + ' converts to ' + @delay
          RETURN
          END
          WHILE (@i <= @num_samples)
          BEGIN
          INSERT INTO waitstats ([wait type], requests, [wait time],[signal wait time])
          EXEC ('DBCC SQLPERF(WAITSTATS)')
          SELECT @i = @i + 1
          WAITFOR DELAY @delay
          END
          --- create waitstats report
          EXEC get_waitstats
          GO
        3. 수집 간격과 반복 실행 횟수를 지정하여 대기 정보를 수집합니다.
          -- 2초 간격으로 10번 반복 수행 예제USE DBAdminEXEC Track_waitstats @num_samples=10,@delaynum=2,@delaytype='seconds'GOSELECT * FROM waitstatsGO-- 실행 예제 : 디폴트 ( 실행 소요 시간 : 10분 ) USE DBAdminEXEC Track_waitstatsGO


        마치면서

        본 포켓 관리 가이드는 DBA가 기본적으로 알아야 할 내용을 담고 있습니다. 자세한 내용은 이를 바탕으로 더욱 정진하시기 바랍니다. 또한 지면 관계상 성능에 대한 내용은 포함시키지 못했습니다. 성능에 대해서는 포켓 가이드 시리즈인 "SQL Server 성능 향상을 위한 튜닝 가이드"를 참조하시기 바랍니다.

        - SQL Server 컨설턴트 전현경

    • '2010년 이전 글 > computer' 카테고리의 다른 글

      vi 사용법의 모든것 !!! [리눅스]  (0) 2007.05.01
      리눅스 명령어 모음 !!!  (0) 2007.05.01
      patch & diff & CVS  (0) 2007.05.01
      UNIX 명령어 정리...  (0) 2006.09.06
      메모리 타이밍에 대한 이해  (0) 2005.11.29
      and