블로그 이미지
좋은느낌/원철
이것저것 필요한 것을 모아보렵니다.. 방문해 주셔서 감사합니다..

calendar

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

Notice

    2008. 9. 26. 14:44 개발/DB2
    출처 : http://myoung76.tistory.com/60
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    사용법 기초 정리

    IBM DB2 EE 7.2.1
    Windows 2000 Advanced Server
    RAM 512MB

    IBM DB2 PE 8.1
    OS: RedHat 8.0
    Kernel: 2.4.20
    CPU: Celeron (Mendocino) 400MHz
    RAM: 160MB

    작성자: 강명규(kang@dbakorea.pe.kr)

    내가 테스트해본 것을 개인적으로 정리한 것이다.
    DB2는 하나의 인스턴스가 여러개의 데이터베이스를 가질 수 있다.
    MySQL, MS-SQL과 유사한 구성이라고 하겠다.


    [DB2 기초 정리]

    윈도에서 DB2를 설치하고 사용한 것을 정리한 것이다.
    프로그램의 위치등을 제외하면 리눅스등의 OS와 별 차이가 없을 것이다.

    설치디렉토리: C:\Program Files\SQLLIB
    등록된 사용자: db2admin (내 컴퓨터 - 관리 - 로컬 사용자 및 그룹 - 사용자)
    등록된 서비스: TCP/IP서비스(db2cDB2)가 C:\WINNT\system32\drivers\etc\services에 등록됨

    관리도구 - 서비스에 서비스들이 등록됨(자동시작되는 서비스는 o로 표시)
    (o) DB2 - DB2
    (o) DB2 - DB2CTLSV
    (o) DB2 - DB2DAS00
    (x) DB2 Governor
    (o) DB2 JDBC Applet Server
    (x) DB2 JDBC Applet Server - Control Center
    (o) DB2 License Server
    (o) DB2 Security Server


    DB2 Command실행 방법(콘솔)
    db2콘솔을 사용하려면 일단 db2환경을 꾸며줘야 하는데 윈도의 경우, db2cmd.exe를 실행해주면 되고,
    유닉스계열은 db2profile를 실행해주면 된다. 그런 후 db2명령을 사용할 수 있게 된다.
    아래 2가지 방법중 원하는 방식을 택해서 하면 되겠다.

    1. 명령프롬프트: 'db2cmd db2 get dbm cfg' 실행
    2. Command Window(명령창): 'db2 get dbm cfg' 실행 (시작 - 프로그램 - IBM DB2)
    3. Command Line Processor: 'get dbm cfg' 실행(시작 - 프로그램 - IBM DB2)

    db2cmd, db2명령은 각각 독립적으로 실행할 수도 있다.
    즉, db2cmd를 치고 나서, db2를 치고 나온 프롬프트에서 'get dbm cfg'를 실행해도 된다.
    'get dbm cfg'는 'get database manager configuration'로도 쓸 수 있다.
    이후부터 질의어는 3번째에 나온 Command Line Processor에서 작업한다고 가정하겠다.
    이 명령을 실행하면 앞에서 언급한 DB2의 TCP/IP서비스(svcename)인 db2cDB2도 발견할 수 있다.
    서비스명 db2cDB2를 다른 이름으로 변경하려면 다음과 같이 할 수 있다.(지금은 수정하지 마라)

    인스턴스명의 설정 변경 : db2 update dbm cfg using svcename server1

    서비스이름으로 지정된 server1은 C:\WINNT\system32\drivers\etc\services(유닉스는 /etc/services)
    에 설정되어 있으면 위와 같이 문자열로 써줘도 되고, 그렇지 않다면, 포트번호를 명시적으로 지정한다.
    이것은 클라이언트로부터 연결을 수용하는 포트로, 오라클 리스너의 수신포트와 같은 역활을 한다고 하겠다.
    클라이언트/서버 연결방법에 대해선 아래에서 다시 설명하겠다.


    1. 명령창
    DB2 종료 : db2stop (강제종료: db2stop force)
    DB2 시작 : db2start

    2. 관리도구 - 서비스
    DB2 - DB2서비스

    3. Control Center(제어센터) - GUI툴
    Instances하위의 DB2를 선택한 다음 우측클릭하여 컨텍스트메뉴중 Stop을 선택
    제어센터는 오라클의 DBAStudio나 EM, MS-SQL의 Enterprise Manager와 그 기능이 같다고 하겠다.
    인터페이스가 그리 좋은 건 아니지만, 초기에 관리작업을 여기서 시작하는 것이 수월할 것이다.

    질의어의 실행을 위해 제공되는 GUI툴은 명령센터이다.
    연습삼아, Script 편집창에서 다음 명령을 실행해 보라.

    create database testdb
    connect to testdb
    revoke createtab on database from public
    revoke bindadd on database from public
    grant dbadm on database to user db7dba1
    grant dbadm on database to user db7dba2


    *
    에러메시지에 대한 설명을 알아내기 위해 다음과 같이 한다.
    시작 - 프로그램 - IBM DB2 - Information - DB2 Information 을 실행
    웹페이지가 열리는데 Adminstration섹션의 Message Reference 라는 부분을 찾아서 링크를 클릭
    top,left,right프레임으로 된 페이지가 표시되는데 left프레임에서 SQL Messages라는 부분이 있다.
    여기서 SQL1000 - SQL1099부분을 선택하고, 이에 해당하는 내용이 표시된 우측프레임에서 SQL1025N을 찾는다.
    사실, 콘솔에서 ?다음 에러번호를 적어주는 것이 더 수월하다.

    D:\>db2set db2instance
    DB2

    D:\>db2set DB2COMM=tcpip

    D:\>db2stop
    SQL1064N  DB2STOP processing was successful.

    D:\>db2start
    SQL1063N  DB2START processing was successful.

    D:\>db2set DB2ADMINSERVER
    DB2DAS00

    D:\>db2set DB2COMM=tcpip -i DB2DAS00

    D:\>db2admin stop
    SQL4407W  The DB2 Administration Server was stopped successfully.  SQLSTATE=00000

    D:\>db2admin start
    SQL4406W  The DB2 Administration Server was started successfully.  SQLSTATE=00000


    D:\>type con >> "C:\WINNT\system32\drivers\etc\services"
    server1  3700/tcp # DB2 connection service port
    ^Z

    db2 => update database manager configuration using svcename server1
    db2 => db2stop
    db2 => db2start


    에러로그기록되는 곳
    C:\Program Files\SQLLIB\DB2\db2diag.log
    C:\Program Files\SQLLIB\DB2DAS00\db2diag.log



    리눅스에서 작업
    윈도에 설치된 DB2서버에 접속하는 클라이언트로서 사용한다고 가정하겠다.

    [root@linux root]# cat >> /etc/services
    server1  3700/tcp # DB2 connection service port

    [db2inst1@linux db2inst1]$ db2
    db2 => catalog tcpip node DB2 remote 192.168.0.1 server server1 (opp: uncatalog node db2)
    db2 => catalog database testdb at node db2 (opp: uncatalog database testdb )
    db2 => terminate ( to do cache flush: do it at another terminal )
    db2 => list node directory
    db2 => list db directory
    db2 => connect to testdb user Administrator xxxxxx (xxxxxx는 암호)
    db2 => disconnect testdb

    (에러) - 어떻게 하다보니 되던데 아마
    db2 => list tables      
    SQL0805N  Package "NULLID.SQLC2E03" was not found.  SQLSTATE=51002

    (조치)
    아래 내용을 root, db2inst1유저에서 각각 실행해줬다.
    둘 중에 하나만 하면 될 것 같은데.. 자세한 내용은 나중에 파악해야겠다.
    db2 connect to testdb user Administrator using xxxxxx
    cd /opt/IBM/db2/V8.1/bnd
    db2 bind @db2ubind.lst blocking all grant public
    db2 bind @ddcsmvs.lst blocking all grant public


    일반유저가 db2를 사용하기 위해선
    [kang@linux kang]$ cat >> .bash_profile
    source ~db2inst1/sqllib/db2profile        
    [kang@linux kang]$ source ~db2inst1/sqllib/db2profile
    [kang@linux kang]$ db2
    db2 => connect to testdb user kang using xxxxxx

       Database Connection Information

    Database server        = DB2/NT 7.2.1
    SQL authorization ID   = KANG
    Local database alias   = TESTDB

    db2 => list tables

    Table/View                      Schema          Type  Creation time
    ------------------------------- --------------- ----- --------------------------
    TEST                            KANG            T     2003-02-22-05.11.43.391000

      1 record(s) selected.

    db2 => select * from test

    ID                  
    --------------------
    dbakorea            

      1 record(s) selected.

    db2 =>

    db2ca : Client Assistant
    db2cc : Control Center







    [명령어 정리]

    기본 명령어

    db2 => ? deregister
    db2 => ? SQL1024N
    db2 => get db cfg for testdb


    데이터베이스 관련 명령어

    C:\DB2\NODE0000\ 하위에 SQL00001 와 같이 하위폴더에 생성된 데이터베이스가 위치된다.
    db2 => create database testdb2 on d:
    db2 => drop database testdb2
    db2 => create database testdb2 alias an_alias
    db2 => create database testdb2 with "This is my testing DB"
    db2 => drop database testdb2
    db2 => connect to testdb
    db2 => disconnect testdb
    db2 => get connection state
    db2 => activate database testdb
    db2 => deactivate database testdb
    db2 => list active databases
    db2 => catalog database aaa
    db2 => uncatalog database aaa
    db2 => change database testdb comment with "Primary Test Database"
    db2 => backup database testdb to d:
    db2 => list db directory DB목록

    테이블스페이스 관련 명령어
    db2 => list tablespaces
    db2 => create tablespace ts_kang managed by system using ('ts_kang')
    db2 => drop tablespace ts_kang
    db2 => list tables


    테이블관련 명령어
    db2 => connect to testdb
    db2 => create table test \
    db2 (cont.) => ( \
    db2 (cont.) => id varchar(10), \
    db2 (cont.) => name varchar(10), \
    db2 (cont.) => sex char(1), \
    db2 (cont.) => age integer, \
    db2 (cont.) => nation char(3) with default '001' \
    db2 (cont.) => ) in ts_kang
    db2 => alter table test add desc varchar(50)
    db2 => rename table test to test2
    db2 => drop table test2


    DML관련 명령어
    db2 => insert into test values ('dbakorea','강명규', 'm', 30, '001')
    db2 => insert into test values ('maddog','강명규', 'm', 30, '001')
    db2 => select * from test
    db2 => update test set age=29
    db2 => update test set name='성인군자' where id='maddog'
    db2 => delete from test where id='maddog'
    db2 => select age+10 from test
    db2 => select age+10 age from test
    db2 => select age+10 as "10년후 나이" from test
    db2 => select min,(age), max(age), avg(age), count(*) from test
    db2 => select * from test where id like 'mad%'
    db2 => select * from test where id like 'mad___'


    VIEW관련 명령어
    db2 => create view v_test as select id, name from test
    db2 => update v_test set name='강명규님' where id='maddog'
    db2 => drop view v_test


    유저생성
    OS유저를 생성하고, DB2에서 이 OS유저에게 권한(Connect)을 GRANT해준다.
    유저의 패스워드는 OS에서 지정한 암호로 정해진다.
    db2 => connect to testdb
    db2 => list tablespaces
    db2 => grant createtab,connect on database to user kang
    db2 => grant use of tablespace ts_kang to user kang
    db2 => connect to testdb user kang using xxxxxx


    get 관련 명령
    db2 => ? get
    db2 => get admin configuration
    db2 => get alert configuration for containers
    db2 => get alert configuration for database manager
    db2 => get alert configuration for databases
    db2 => get alert configuration for tablespaces
    db2 => get authorizations  : 사용자가 가진 권한 표시
    db2 => get connection state
    db2 => get cli configuration
    db2 => get database configuration
    db2 => get database manager configuration
    db2 => get instance


    접속된 놈들 보기
    db2 => list application

    Auth Id  Application    Appl.      Application Id                 DB       # of
             Name           Handle                                    Name    Agents
    -------- -------------- ---------- ------------------------------ -------- -----
    ADMINIST>db2bp.exe      6          *LOCAL.DB2.030416143953        DBAKOREA 1

    db2 => get snapshot for application agentid 6  접속된 놈의 상세정보보기


    SMS의 extent단위 증가:
    테이블스페이스가 SMS(System Managed Space)로 관리되고 있다면,
    테이블스페이스크기는 1 page단위로 증가한다. 이는 성능상 별로 좋지 않다.
    extent(page의 집합. page는 오라클의 db block개념이다)단위로 증가시키려면, 다음과 같다.
    dbakorea : DB명

    C:\Program Files\IBM\SQLLIB\BIN>db2empfa.exe dbakorea


    테이블 분석:
    옵티마이저의 실행계획에 도움을 주기 위해 테이블에 대한 통계정보를 수집하여 시스템 카칼로그 테이블에 저장한다..
    오라클에서의 analyze table 명령과 같다고 보면 되겠다.

    예) kang.test: 사용자.테이블명
    db2 => runstats on table kang.test
    DB20000I  RUNSTATS 명령이 완료되었습니다.
    db2 => runstats on table kang.test with distribution and indexes all shrlevel change
    DB20000I  RUNSTATS 명령이 완료되었습니다.
    db2 =>

    분석결과는 syscat.tables에 기록된다.
    db2 => select card, overflow, npages, fpages from syscat.tables

    CARD                 OVERFLOW    NPAGES      FPAGES
    -------------------- ----------- ----------- -----------
                      -1          -1          -1          -1
    ..

    테이블 분석이 필요한 시점
    1. 대량의 insert, update, delete발생시
    2. import작업후
    3. 테이블에 새로운 컬럼을 추가시
    4. 인덱스 추가시
    5. 테이블 재구성(reorganization)시

    라이선스 보기
    (평가용으로 90일동안 사용가능한데, 재설치해주면 계속 사용가능하다. 어차피 테스트용이므로 상관없음..)
    D:\>db2licm -l
    제품 이름                    = "DB2 Workgroup Server Edition"
    제품 암호                    = "DB2WSE"
    버전 정보                    = "8.1"
    만기 날짜                    = "2004-07-04 (사용 후 구매)"
    동시 사용자 규정             = "사용 가능"
    등록 사용자 규정             = "사용 가능"
    권한이 부여된 사용자 수      = "1"
    제한조건                     = "소프트 중지(사용권 종료시 기록 후 사용 허가)"
    프로세서의 수                    = "1"
    사용권 받은 프로세서의 수        = "4"
    주석                         = ""
    기타 정보                    = ""

    D:\>db2set /?    :db2set사용법
    D:\>db2set -all  :현 인스턴스에 정의된 registry변수.
    D:\>db2set -lr   :지원되는 모든 registry변수


    * DB2와 관련된 정보 보기(괄호안의 값은 8.1버전에서 등록된 개수)
    D:\>db2set -all    System(Environment) Configuration. (registry variables) - 68개
    db2 => get dbm cfg Instance Configuration(DB2 Database Manager configuration parameters) - 82개
    db2 => get db cfg  Database Configuration(DB2 Database configuration parameters)

    * DB2와 관련된 정보 변경(각각 위의 순서대로)
    D:\>db2set 등록변수=변경값
    update dbm cfg            using 패러미터명 변경값 <immediate|deferred>
    update db  cfg (for DB명) using 패러미터명 변경값 <immediate|deferred>


    Configuration Advisor
    DB에 대한 적절한 환경을 만들어 준다. DB변경시마다 다시 해주는 것이 좋다.
    command line processor에서 autoconfigure 사용하면 각 설정키워드를 수동으로 입력하여야 하나,
    제어센터에서 작업할 데이터베이스를 선택후, 메뉴의 선택항목 - 구성 어드바이저를 이용하면
    마법사기능으로 좀 더 쉽게 설정할 수 있다.

    db2 => ? autoconfigure
    AUTOCONFIGURE [USING config-keyword value [{,config-keyword value}...]]
    [APPLY {DB ONLY | DB AND DBM | NONE}]

    config-keyword:
      MEM_PERCENT, WORKLOAD_TYPE, NUM_STMTS, TPM, ADMIN_PRIORITY, IS_POPULATED
      NUM_LOCAL_APPS, NUM_REMOTE_APPS, ISOLATION, BP_RESIZEABLE.

    예) 지정하지 않은 키워드에는 디폴트값이 사용됨.
    db2 => autoconfigure apply db only : 지가 알아서 설정함
    db2 => autoconfigure using mem_percent 40 apply db only : 전체 물리메모리의 40%만 DB2가 사용하도록 구성해라.

    This article comes from dbakorea.pe.kr (Leave this line as is)
    posted by 좋은느낌/원철