출처 : http://blog.theple.com/scarabe/folder/15.html?uid=599
2006/11/28 10:47
http://blog.naver.com/ikatoo/90011339110
DB2 사용에 대한 Hint & Tips (Q & A)
IBM DB2 기술지원팀 배 황
설치
Q :
Hangeul Window 98 에서 English Version DB2 6.1 Client Enabler 를 설치했습니다.
Server DB2도 물론 English Only입니다.
아래와 같은 문제를 만났는데, Hangeul Window 98 환경이라서 connection 이 Fail했나요?
어떻게 해야 할지 도와주시면 감사하겠습니다.
================================
The connection test failed.
[IBM][CLI Driver] SQL0332N There is no available conversion for the source code page "1363" to the target code page "819". Reason Code "1". SQLSTATE=57017
For additional information, press the help button. Correct the problem described in the help message and retry.
A :
한글 win98에서의 code page 설정값이 문제인거 같습니다..
서버가 영문으로 설정되어있기때문에..client인 win98도 영문으로 설정을 해야 합니다
설정방법은 AUTOEXEC.BAT 에 코드페이지를 완전히 설정하는 방법입니다
SET DB2CODEPAGE=437 이라구 추가하시구...리부팅하신후 사용하시면 되겠습니다..
설치
Q :
Alzza Linux 6.1(REDHAT 6.1)에 DB2 6.1 리눅스판을 깔아볼랴 그러는데,,
ksh이 설치되지 않은 관계로 설치보류상태입니다.
ksh을 다운받고 있긴한데,,
1. 반드시 ksh에서 설치해야 하나여? ksh없이 설치하는 다른 꽁수는 없나여?
2. 설치이후, DB2는 ksh에서만 운영되나여?
A :
DB2 UDB는 ksh이 있어야 설치가 되고, 돌아갑니다. 다른 꽁수는 절대 없습니다.
설치하실 때는 pdksh rpm이 설치되어 있어야 되고, ksh에서 설치하실 필요는 없습니다.
그리고, ksh은 웬만한 linux CD의 RPMS 디렉토리내에 들어 있습니다.
설치
Q :
Linux 에 udb 7.1을 설치하여 사용하려 합니다.
Linux 버전은 레드햇 7.0기반, UDB : Linux 용 UDB V7.1 Workgroup Edition
설치하는 데에는 아무 문제가 없더군요.
한글에 문제가 있어 db2set DB2CODEPAGE=970 설정을 하고.
설치를 하고 나서 데이터베이스를 하나 만드는데 다음과 같은 에러가 뜨며 더이상 진행이
되지 않더군요.
SQL1009N The codeset "IBM-eduKR" and/or territory "US" that has been specified is not valid.
원래 버전이 한글이 지원이 되지 않는 것인가요? 아니면 설정을 따로 해주어야 하나요.
빠른 답변 부탁드립니다.
A :
db2set DB2CODEPAGE=970 으로 설정을 하셨다는 것은 DB2를 한글용 DB2로 Setting
하셨다고 보시면 됩니다.
하지만 설치하고자 하시는 RedHat 7.0은 자체가 영문 OS인 것 같군요.
제가 테스트한 결과 Database 생성시 강제로 Codeset과 Territory를 줄 경우 생성은 됩니다만
한글 Data에는 문제가 있습니다.
따라서 RedHat 6.x에서 사용하시기를 권장합니다.
6.x에서는 아무런 문제 없이 잘 수행됩니다.
RedHat 7.1 한글판에서는 이런 문제가 없을 것 같군요.
설치
Q :
win2000+DB27.1을 설치 했구요. 다 설치한 후 Sample DB를 만들려고 하니까 다음과 같은
에러가 발생 하는군요.
------------------------------------------------------------------------------------------------------------------------
데이터베이스 별명 "SAMPLE"은(는) 지역 데이터베이스 디렉토리나 시스템 데이터베이스 디렉토리에 이미 있습니다.
SQL1013N 데이터베이스 별명 이름 또는 데이터베이스 이름 "SAMPLE"을(를) 찾을 수 없었습니다. SQLSTATE=42705
----------------------------------------------------------- ------------------------------------------------------------
A :
DB2 Uninstall 시에 기존 DB2에 있던 DB들은 자동으로 지워지지 않습니다. 새로 Sample을
작성하시고자 한다면 기존의 Sample DB 를 지워주어야 합니다. 기존의 Sample DB가 있던 인스턴스명에
해당하는 디렉토리 (Default : C:\DB2) 밑의 Sample DB를 지워야 합니다.
기존의 Sample DB를 지웠는데도 같은 에러가 발생한다면
C:\DB2\NODE0000\SQLDBDIR 밑의 화일 3개를 다른 곳에 백업해놓고
C:\Program Files\SQLLIB\인스턴스명(Default : DB2)\SQLDBDIR 디렉토리 밑의 화일 3개를
위의 디렉토리에 Copy하고 시도해 보십시요.
설치
이런 문제는 여러 원인이 있겠지만 대체로
1. 기존의 같은 이름의 DB가 있는데(Catalog는 되어 있지 않음) 똑같은 이름으로 새로
만들려고 할 때
2. DB는 없지만 DB 디렉토리에 대한 정보가 남아 있을 때
위의 방법으로 안돼신다면 다시 인스톨을 하시고 시도해 보시기 바랍니다.
기존 DB Uninstall 시에 필요 없는 DB는 Drop 시키고 Uninstall 하시는게 좋습니다.
또한 가능하시다면 Registry 에서 DB2와 관련된 항목을 지우고 다시 Install 하시는게
좋습니다.
관리
관리
Q :
Table생성시 [Table 행의길이가 4005를 초과 하였습니다.] 오류 메세지가 나오는데
OS : WINDOWS2000
DB : DB2 Universal Database 6.0
A :
DB2 에서 TABLE 의 한행의 크기는 4K에 제한을 받습니다.
가장 간단한 방법은 TABLE를 분리하는 것입니다.
그래도 하나로 하고 싶으시다면, VARCHAR는 LONG VARCHAR로 바꾸시던가(그래도
어느 정도는 제한있음)
긴문자열을 저장하는 것을 LOB 유형으로 바꾸시는 겁니다. LOB 유형은 최대 약 2GB 까지
설정할 수 있으며, TABLE 한행의 크기에 제한을 받지 않습니다.
관리
아래와 같이 Database 생성시에 Bufferpool을 따로 하나 만듭니다.
그리고, Tablespace 생성시 위에서 생성한 Bufferpool을 직접 지정하구선 Pagesize도
지정합니다.
이렇게 생성한 Tablespace 에 4k를 초과하는 Table이 있을시 Scripts 문에 이 Tablespace 를
지정하면 테이블이 생성이 됩니다.
db2 create db test;
CREATE Bufferpool IBMDEFAULTBP1 SIZE 250 PAGESIZE 16K;
commit work;
disconnect all;
connect to test user test using test ;
Create tablespace ttt_dt2 PAGESIZE 16K managed by database using
( file /aaa/testdat1 1000M ) BUFFERPOOL IBMDEFAULTBP1;
관리
Q :
NT에서 WAS와 DB2 5.2로 운영 중 시스템 장애로 인하여 NT WIN2000으로 업그레이드를
하고 DB2 V5.2를 재설치 한 후 Restore를 하려고 합니다.
물론 업그레이드 전에 Database Bacukup(Online Backup)을 받아 두었습니다.
이를 업그레이드 후 Restore하려고 보니 기존 LOG 화일을 지워버려서 Restore를 할 수가
없습니다.
또한 계속 “Roll Forward Pendding 상태이므로 액세스 할 수 없습니다” 라는 메시지만
나옵니다.
그래서 만약 로그화일 디렉토리(DB2, DB2LOG)를 백업해두지 않은 상태라면 복구 방법은
없는지요? 즉, 백업 이미지 화일만으로 복구할 수 있는 방법은 없는지요?
데이터가 상당히 중요하기에 데이터 만이라도 복구할 수 있는 방법이 필요합니다.
관리
A :
일반적으로 백업을 받을경우는 Online백업을 3번중에 1번쯤은 Offline백업을 받아두시는게
좋습니다. Offline Backup은 나중에 혹시 문제가 생기더라두..로그가 필요없이 복구가
가능하기 때문이지요.. Online Backup 이미지만 가지구 계신거 같군여.(Offline 백업 이미지가
있다면 Restore 할 때 명령어 마지막 줄에 Without Rolling Forward 라는 명령을 주게되면
Restore후에 롤포워드 작업을 안하게 됩니다.)
현재로서는 님의 데이타를 완벽하구 손쉽게 복구하실수가 없을 것 같습니다. 하지만 혹시
기존의 가지고 있던 데이터의 Tablespace id, Table id, 시작페이지,페이지수 등을 정보를
가지고 계시다면 약간의 수고를 하신다면 안에 있는 데이터는 복구할 수 가 있을지도
모르겠습니다. db2dart 의 명령을 이용해서 안에있는 데이터의 내용을 Ascii파일로 뽑아낼
수도 있을것 같습니다
위의 정보를 모르신다고 해도 추측으로 값을 넣어서 하나씩 하나씩 변경해서 맞추어본다면
데이터의 내용을 복구 하실 수도 있을것 같습니다. 다음과 같이 작업을 해보시기 바랍니다.
일단 Online Backup 이미지로 Restore를 합니다. 그리고 db2dart DBNAME /ddel 엔터 라구
치게되면 각각의 tableID, tablespaceID, firstPAGE, NUMofPAGE 정보를 넣으라는 화면이
나오게 됩니다
그러면 위의 정보를 알고 계시다면 알맞은 값을 넣어주시고 만약 모르신다면 각각의 값을
추측해서 넣어주시기 바랍니다. 제가 테스트한(Sample DB를 만들어서 테스트해봤음)
바로는
tableid => 2 , tablespaceid(SMS)=>2 , firstPAGE=> 0(보통 0에서 시작) ,
numofPAGE => 10000(데이타양만큼 대충 많이 잡았어여)
관리
위에같이 주니까. 테이블 하나씩 또 하나씩 복구가 되더라구여. 물론 Ascii파일루 말이져.
암튼 위의 방법이나마. 데이타를 복구할수 있는 최선의 방법인거 같군여.
관리
Q :
AIX4.3에 DB2 V5.2를 사용하고 있습니다. 다름이 아니라 ps -ef 를 해보면 db2agent라는
프로세스가 떠 있는데 그 뒤에 idle이라고 떠있습니다. 어떤 의미며 문제가 있는 거라면
어떤 식의 해결을 해야 되는지 이런 프로세스가 5-6개 떠있습니다. 이로 인해 Websphere에
에러가 발생 하는것 같아서 이렇게 문의 드립니다. 그리고 db2관련된 프로세스중 db2dart,
db2licd등이 있는데 이 프로세스가 어떤 역할을 하는 것인지 알고 싶습니다.
A :
db2agent(idle)와 websphere 가 죽는 문제와는 관련이없습니다.
그렇다면 db2agent(idle)는 왜 생기는 것일까요. db2에서 agent와 관련되는 설정값이 있습니다.
db2 get db cfg for sample 라구 쳐보면 중간 부분에 다음과 같은 설정값들이 있습니다.
------------------------------------------------------------------------------
기존 에이전트의 최대 수 (MAXAGENTS) = 200
에이전트 풀 크기 (NUM_POOLAGENTS) = 4 (계산됨)
풀에 있는 초기 에이전트 수 (NUM_INITAGENTS) = 0
------------------------------------------------------------------------------
여기에있는 값대로 Agent가 생기는 것입니다. 여기서 보면 초기 에이전트 수가 0으로
설정되어있지요 다시말해서 db엔진이 스타드되도 에이전트가 생기지는 않는다는
얘기입니다 여기서 에이전트는 DB엔진에 Connection이 맺어져서 처리되어지고 있는
Process라구 생각하시면 될 겁니다.
관리
그리고 에이전트 풀 크기 라는 옵션이 있는데. 그건 예를 들어 사용자들이 db2 엔진에
Connection을 맺어서 사용하면 에이전트가 하나씩 하나씩 늘어나게 되겠지요.
그래서 현재 20개의 에이전트가 생겨서 작업을 하고 있다가 현재는 작업을 마치고 필요가
없으면 에이전트가 사라지겠지요. 그런데 현재 DB엔진에 붙어서 사용하는 사용자가
없다고 하더라도 에이전트수가 4개 이하로는 내려가지 않게 됩니다. 그걸 설정하는 값이
에이전트 풀 크기 옵션이지요. 그러니까 보신 db2agent(idle)는 에이전트를 사용하다가
완료된 에이전트라고 할 수 있습니다. 에이전트당 메모리를 약간은 사용할 수 는 있지만
그리 큰 크기의 메모리는 아니니까 별로 신경 안쓰셔도 무리는 없을것 같습니다.
그리고 에이전트 최대수는 말 그대로 에이전트 크기가 증가할 수 있는 최대값으로 보시면
되겠습니다.
그리고 db2lice는 db2의 라이센스관리 데몬으로 보시면 될 겁니다.
관리
Q :
저는 db2를 처음 써보는 초보자입니다.
DB2 UDB V7.1베타를 설치했는데요 쿼리를 할수있는 툴이 있을텐데
뭔지 잘 모르겠습니다.
Command Center 에서 Script를 선택하고 Sample 데이터베이스의 Sales라는 테이블을
쿼리해 봤습니다. "select * from sales" 라고 했는데요. Connect가 안되어있다고 나오거든요.
아니면 그런 객체가 없다고. Control Center에서 테이블들을 열어볼 수 있으면 Connect가 된
게 아닌가요?
A :
처음은 대부분 실수하는 부분입니다.
어떠한 데이터 베이스 시스템이던지 데이터 베이스를 사용하려면(예, 쿼리) 반드시 데이터
베이스에 접속해야 합니다. 일반적으로 공개형 데이터 베이스같이 데이터 베이스가 하나만
있다면, 구태여 접속하지 않아도 사용할 수 는 있을 것입니다.
(그래도 어떤 데이터 베이스든지 접속은 합니다. 단지, 시스템에 따라 그 과정이 보이지
않을 수도 있지요.)
데이터 베이스를 사용하시려면, 사용할 데이터 베이스를 선택하고 접속해야 합니다.
물론, DB2 에서는 친절하게 Sample 데이터 베이스를 만들고 사용할 수 있도록 제공되어
있습니다.
Sample 데이터 베이스가 만들어져 있지 않다면 간단한 명령 한 줄이면 만들어 집니다.
db2sampl
관리
만약, 만들어졌다면,
connect to sample
이렇게 하면 접속되고요,
list tables
하면, Sample 데이터 베이스에 소속된 Tables의 목록을 보실 수가 있지요.
select * from staff
Staff 라는 테이블을 질의 하는 것입니다.
그리고, 사용이 끝나셨을 때는
connect reset
이렇게 하시면 됩니다.
관리
Q :
TABLE내의 불필요한 컬럼의 삭제방법 있으면 도움을 구합니다.
A :
추가는 가능하나 기존에 존재하는 컬럼을 삭제하는 것은 불가능 합니다.
Alter 로 가능한 작업은
- 테이블에 하나 이상의 컬럼 추가
- 기본 키 추가 또는 삭제
- 하나 이상의 참조 제한조건 추가 또는 삭제
- 하나 이상의 점검 제한조건 정의 추가 또는 삭제
- VARCHAR 컬럼 길이 변경
- 영역을 추가할 참조 유형 컬럼 변경
- 생성된 컬럼의 생성 표현식 변경
- 파티션 키 추가 또는 삭제
- 데이터 캡쳐 옵션, pctfree, 잠금 크기 또는 부가 모드와 같은 테이블 속성 변경
- 초기에 로그되지 않은 상태로 테이블 설정
등 입니다.
관리
Q :
SQLSTATE=57019에러 해결 방법 좀 ( heap parmeter?)
DB2에서 Database a, b에다 새로운 db "c"를 Create 해서 Connect 하려니까 다음과 같은 에러가
납니다.
Shared memory segments cannot be allocated. SQLSTATE=57019
도움말에는 리소스가 부족하거나 heap parameter 가 너무 적게 설정 되어있다고 되어있는데
heap parameter를 설정하는 방법 좀 가르쳐 주세요.
A :
우선 실지로 메모리가 부족한 것인지 확인해 보세요. 한 시스템에서 여러 DB를 사용하다
보면 메모리를 많이 사용하므로 유의하여 사용해야 합니다.
heap parameter 설정법은 다음 명령을 수행하시면 됩니다.
db2 update db cfg for dbname using dbheap size
관리
- Heap Parameter
이 구성 매개 변수들은 데이터 베이스 공유 메모리 세트에서 할당된 다양한 메모리
힙(heap)의 크기를 제어합니다.
dbheap 데이타베이스 힙(heap)(4 KB 페이지 단위).
- 로그 버퍼 크기 (logbufsz)
- 버퍼 풀 크기 (buffpage)
- 잠금 일람표를 위한 최대 저장영역 (locklist)
- 유틸리티 힙(heap) 크기 (util_heap_sz)
관련매개변수
마지막 적용업무가 데이터 베이스에서 분리될 때
해제시기
데이터 베이스에 처음 연결될 때
할당시기
페이지(4KB)
측정단위
UNIX : 1200 [ 32 - 60000 ]
[범위]
OS/2와 NT 국지 및 원격 클라이언트가 있는 데이터 베이스 서버:
600 [ 32 - 60000 ]
OS/2와 NT 국지 클라이언트가 있는 데이터 베이스 서버: 300 [ 32 - 60000 ]
생략시(범위)
구성 가능
매개변수유형
데이터 베이스
구성유형
관리
데이터 베이스 당 하나의 데이터 베이스 힙(heap)이 있어, 데이터 베이스 관리 프로그램이
데이터 베이스에 연결된 모든 적용업무 대신에 이를 사용합니다. 여기에는 테이블, 색인,
테이블 공간에 대한 제어 블록 정보뿐 아니라, 로그 버퍼 공간(logbufsz)에 대한 제어블록
정보도 들어 있습니다. 그러므로 힙(heap)의 크기는 주어진 시간에 힙(heap)에 저장된 제어
블록의 수에 따릅니다. 제어 블록 정보는 모든 적용업무가 데이타베이스에서 분리될 때까지
힙(heap)에 남아 있습니다.
첫번째 연결시에는 데이터 베이스 관리 프로그램이 시작하는 데 필요한 최소 양이 할당
됩니다. 데이터 영역은 필요에 따라 dbheap이 지정하는 최대 값까지 확장됩니다.
권고사항: 데이터 베이스 힙(heap)에 명령문을 처리하는 데 사용할 수 있는 저장영역이
충분치 않음을 나타내는 오류를 적용업무가 수신하면, 이 값을 늘려야 합니다. 적용업무의
SQL 오류 처리 루틴이 이와 같은 비정상적인 SQL 오류를 트랩할 수 있도록 기록되어야
합니다. 그렇지 않으면, 이를 찾을 수 없어 적용업무 논리가 실패하는 결과를 가져올 수도
있습니다. 데이터 베이스 시스템 모니터를 사용하여 데이터 베이스 힙(heap)에 사용된 가장
큰 메모리를 추적할 수도 있습니다.
자세히 알려면, Database System Monitor Guide and Reference 에 있는 db_heap_top (할당된
최대 데이터 베이스 힙) 모니터 요소 설명을 참조하십시오.
이 매개변수를 설정할 때, 로그 버퍼가 데이터 베이스 힙(heap)으로부터 할당되기 때문에
logbufsz의 값을 고려해야 합니다. 또한 dbheap이 버퍼 풀(buffpage), 잠금 일람표(locklist) 및
유틸리티 힙(util_heap_sz)과 동일한 공유 메모리 세그먼트내에서 할당됨을 유의하십시오.
관리
Q :
DB2에서 화일로된 sql문 실행법?
A :
files내용을 실행시
1.우선 DB2 명령창으로 들어간다.
2.file이 있는 directory로 change directory한다. 가령 c:\file.sql라면 c:로 간다.
3.db2 -tvf filename으로 실행한다.
ex) db2 -tvf file.sql
4.참고로 option의 의미는 다음과 같다.
-t : file안에 sql이 여러개 있으명 ;으로 구분한다.
-v : 입력문 출력에 보여준다.
-f : file을 입력으로 받아들인다.
관리
Q :
만들었던 인스턴스를 삭제하고 제어센터를 다시 열고 원래 있던 인스턴스 DB2안의 데이터
베이스 안을 봤더니 테이블이 이 안에 만들어졌어요 왜 그렇죠? 제가 알기론 국지에
인스턴스를 몇 개 만들 수 있는 걸로 알고 있는데 인스턴스 추가로 하면 다른 컴에 있는 것을
추가하는건가요? 국지에 인스턴스를 만드는 방법이 따로 있는 건지 좀 알려주세요.
A :
하나의 로컬 머신 안에 여러 개의 인스턴스를 생성할 수 있습니다.
물론 다른 머신의 인스턴스도 추가하실 수 있구요 제어센터에서는 인스턴스를 만드실 수
없구요 기존이 있던 인스턴스 또는 리모트의 인스턴스를 추가 하실 수는 있습니다.
로컬에 인스턴스를 만드시려면 매뉴얼리 만드셔야 합니다.
db2icrt 가 인스턴스를 만드는 명령어 입니다.
db2icrt로 새로운 인스턴스를 만든 후에 제어센터에서 ‘추가’ 메뉴로 인스턴스를 추가 시켜야
합니다.
관리
Q :
현재시간을 가져오는 함수가 뭐죠?(오라클에서 sysdate같은)
테이블에 레코드가 기록된 시간을 한 필드로 잡아서 사용하려고 하는데
인서트되는 시간값을 가져오는 함수가 뭔지 모르겠네요.
A :
DB2에서는 특수레지스터로 시간과 관련된 것에 다음과 같은 것이 있습니다.
current date,
current time,
current timestamp
이 있으며 사용법은 오라클의 sysdate를 사용하는 것처럼 select나 insert에서 사용하시면
됩니다. 그리고 현재 시간을 확인하기 위해서 오라클의 dual과 같은 테이블은 필요하지
않고요. 테이블이나 뷰 select시 칼럼목록에 위와 같은 특수 레지스터를 나열하시거나
db2 values(current time) 과 같이 사용하시면 현재의 시간을 아실 수가 있습니다.
관리
Q :
클라이언트에서 DB2서버에 접속시 서버 엑세스 프로파일 사용에서 클라이언트
구성지원프로그램--추가--소스(프로파일사용)--데이타베이스이름--열기(엑세스 프로파일
열기)에서 리모트의 DB2서버컴의 어느 디렉토리에서 어떤 파일을 찾아야 하는지여?
A :
서버 엑세스 프로파일을 사용하시려면 기존에 등록되어진 DB 서버가 있어야 합니다.
제어센타에 등록된 DB 서버가 있으면 해당 DB서버명을 선택하여 마우스 오른쪽 버튼을
클릭하시면 서버 프로파일 내보기라는 메뉴가 있는데 여기서 원하는 경로와 파일명을
지정하신 후에 생성된 파일을 가지고 원하시는 다른 클라이언트에서 클라이언트 구성 지원
프로그램을 통해서 엑세스 프로파일 열기에서 위의 파일명을 지정하시면 원하시는 결과를
얻으실 수 있을 겁니다.
관리
Q :
DB에서 인증유형설정은 어디서?
데이터베이스에서 인증유형이 클라이언트,서버,DCS인증 이 있는데 이것은 제어센터 어디서
변경할 수 있는지요?
A :
제어센터 오른쪽의 시스템 창에서 해당 서버의 인스턴스 명에서 마우스 오른쪽 버튼을 클릭
하시면 구성이라는 메뉴가 나온답니다. 새로운 창이 뜨면 여러개의 탭이 있는데 그 중 관리
탭을 선택하시면 인증이란 것이 나오고 아래의 라디오 버튼 중 원하시는 인증을 선택하시면
됩니다. 그렇게 하시면 DBM 파라미터가 변경되기 때문에 해당 DB를 STOP 하신 후 START
하셔야 변경된 값이 활성화 됩니다.
관리
Q :
RS6000/h80 AIX db2를 사용하고 있습니다.
CDE상태가 아닌 terminal 상에서 특정 데이터베이스를 테입으로 백업 받기를 원합니다.
테이프(4gb) 온라인 백업도 가능한지요? 가능하다면 사용법(커맨드)을 알고싶습니다.
또한 NT에도 DB2를 설치하여 rs/6000 fail시 NT 로 접속케 하려는데 replicating도 가능한지
알고 싶습니다.
A :
db2 backup database db_name [online] to /backup_directory/장치명
예) db2 backup database dsca01 to /FSCABKUP
db2 backup database dsca01 to /dev/rmt0
db2 backup database dsca01 to /dev/rmt0.1
* tape에다가 바로 받으면 속도가 너무 떨어지므로 권하고 싶지는 않습니다.
먼저 disk(filesystem)에다가 먼저 받고 그렇게 생긴 backup file을 tape으로 받는 것이
효율적입니다.
관리
Q :
insert와 update 를 select 된 row를 가지고 하려고 하는데요.
전에 sybase에서는 이렇게 썼던 기억이 나서 해봤는데 에러가 나서요.
아래 두문장이 틀렸는지요?
1. insert into bb (bb.title ,bb.writer ,bb.content ) values (select aa.title ,aa.writer ,aa.content from aa);
select 가 복수컬럼을 지정한다고 합니다.
2. update bb set bb.title = aa.title, bb.writer = aa.writer, bb.content = aa.content from aa
where aa.number = bb.number;
A :
DB2에서도 물론 하시려는 Subquery를 지원합니다.
그런데 사용하신 sql문이 틀렸네요. 아래와 같이 해보세요.
1. insert into bb (bb.title, bb.writer) select aa.title, aa.writer from aa
2. update bb set (bb.title, bb.writer) = (select aa.title, aa.writer from aa where deptnumb=??)
관리
Q :
테스트 머신으로 사용하고있는 컴에서 Db2 7.1를 설치하여 데이타베이스 CDLIB라고 만들어
놓았는데, 언제부턴가 컴을 부팅하고 제어센터를 열어보니 않보이더군요.(그동안 만들어
놓은 데이터베이스가 모두 않보입니다.)
그래서 새로 테스트용으로 데이터베이스를 만들었는데, 데이터베이스가 존재한다고
생성되지 않는군요. 무슨 설정값을 바꿔서 그런지. 뭐 해결책 없나요?
A :
catalog로 cdlib이라는 db를 등록해 보신 후 연결해 보십시오.
1) db2 catalog db cdlib
2) db2 connect to cdlib
실수로 uncatalog 명령을 사용하시거나 또는 제어센타에서 삭제나 제거를 사용하시면
(주. 삭제는 실제로 db를 삭제하는 것이고, 제거는 catalog 정보만 없어지는 겁니다.)
catalog 정보가 삭제 됩니다. 또는 가끔이지만 drop db 명령을 사용할때 catalog 정보만
없어지는 경우도 있더군요.
관리
Q :
디스크가 풀난후 SELECT는 되는데 INSERT등이 안됩니다. LOCK 이 걸린것 같은데
정상작동이 되는 방법을 아시는 분 답변 부탁 드립니다.
A :
DB2는 Data Integrity보장을 위해 select에도 S Lock을 사용합니다.
insert에는 X Lock을 사용합니다.
이 S Lock과 X Lock은 공유가 가능하지 않습니다.
(예외 : isolation level 이 Uncommitted Read인 경우에는 가능)
따라서 해당되는 Lock을 Release하기 위해 반드시 해당 트랜잭션을 Commit하거나
Rollback해야 합니다.
관리
Q :
DB를 다른 머신으로 이동시키는 방법 문의합니다.
원래 DB가 설치되어 있는 장비에서 다른 머신으로 옮기려고 하는데요.
이것은 데이터만 backup받는 것이 아니고 DB정보(table, index, data등)를 모두 옮기려는
것입니다. 제가 한 방법이 맞는 방법인지 모르겠습니다.
성공하지 못한 것으로 봐서 잘못알고 있는 것이겠지요?
1. DB를 BackUp받아서
2. 새로운 머신의 DB2 control center에서 add메뉴를 선택하여 동일한 이름의 database를
추가함.
3. 추가후 The database alias name or database name "REDB" could not be found. SQLSTATE=42705
라는 오류메시지가 발생하여 진행시키지 못함.
A :
DB를 다른 머신으로 옮기기 위해서는 일단 두머신이 같은 OS이고, 설치된 DB2버전이
같다면 Backup & Restore를 하시면 됩니다. 두 머신의 OS가 다르거나 DB버전이 다르면
Export & Import or load 를 하시면 됩니다. OS가 NT인지 Unix에 따라 조금 차이가 있습니다.
(NT환경이란 가정하에 설명을 드리겠습니다.)
DB를 Full Backup을 받으시면(Default가 Fullbackup임) 전체 DB정보를 Backup받으실 수
있습니다.
관리
<작업순서.>
우선 명령창을 실행시킵니다. 시작->프로그램->IBM DB2->명령창. 옮길 DB를 Backup
받습니다.
db2 backup db db_name
이 명령으로 백업을 받으시면 현재 경로 밑에 db_name.0이란 디렉토리가 생깁니다.
이 디렉토리를 그대로 옮길 머신에 copy하신후에 Restore를 하시면 됩니다.
옮길 머신에서 명령창을 실행합니다.
만일 C:\db_name.0\db2\node0000\.... 이런식으로 경로가 되어 있으면
C:\> 프롬프트 상태에서 Restore명령을 수행하십시요.
db2 restore db db_name
정상적으로 완료가 되면 DB가 잘 옮겨진 것입니다.
Restore를 하고나면 몇몇 경우에 Rollforward Pending 상태에 빠지게 됩니다.
(Online Backup이나 OffLine Backup 시에 Without Rolling Forward 옵션을 빼고
Restore를 하게 되면 Pending 상태에 빠집니다.)
Rollforward작업을 하시면 정상적으로 연결하실 수 있습니다.
명령창에서
db2 rollforward db db_name end of logs and stop
이렇게 하시면 연결하실 수 있을겁니다.
관리
Q :
container drop은 어떻게?
tablespace에 공간이 모자라서 다음과 같이 해서 추가를 하였습니다.
alter tablespace dms01 add (file /home/inst04/dms/dms012 40);
그런데 너무 적게 page를 할당해서 drop하고 다시 추가 하려고 하는 데
어떻게 해야 되는 지요.
메뉴얼에는 drop이라는 option은 없더군요.
감사합니다.
A :
현 상황에서 container를 drop 시킬 수 있는 방법은 없습니다.
따라서 다음과 같은 대체 방안으로 해결하셔야 할 것 같습니다.
1. 원하는 크기 만큼 Tablespace에 새로운 container를 추가한다.
현재 사용하고 있는 Tablespace의 관리 방식이 DMS인 관계로 새로운 container만
추가하시면 사용하시는 데는 아무런 문제가 없습니다.
2. 해당 Tablespace를 백업 받으신 후 그 Tablespace를 새로 작성해서 restore한다.
Tablespace 단위 백업을 위해서는 logging 방식이 archival(db cfg에 log retain이 on 상태)
방식 이어야 합니다.
백업이 완료 된 후 drop tablespace 하신 후 원하는 container 크기로 새로이 작성, 백업본을
restore하시면 됩니다.
관리
(참고)
db2 UDB V7에서 추가된 기능으로 현재 처해 있는 상황을 해결하실 수 있습니다.
V6까지는 한 번 만들어진 container를 수정하는 것이 불가능했던 것이 사실입니다.
하지만, V7에 다음과 같은 기능들이 추가되었습니다.
1.extend : 해당 테이블스페이스에 존재하는 모든 container의 크기를 주어지는 값만큼 늘린다.
ex) db2 alter tablespace DMS01 extend (all 1024)
DMS01에 있는 container의 크기를 1024page 만큼 늘린다.
2.resize : 해당 테이블스페이스의 특정 container의 크기를 원하는 크기만큼 늘린다.
기존의 continer size를 줄이실 수는 없습니다.
ex) db2 alter tablespace DMS01 resize (file d:\test\dms01_1 2048)
DMS01 테이블스페이스에 존재하는 dms01_1이라는 container의 크기를 2048로 만든다.
V7을 사용하고 계신다면, resize라는 옵션으로 문제를 해결하실 수 있으실 겁니다.
관리
Q :
저희는 AIX 4.3 환경에서 DB2 6. 을 사용하고 있습니다.
그런데 windows98에 DB2 버젼 7.1인 Client 프로그램을 깔고 client에서 Table을 만들고 그
만든 Table을 Telnet으로 접속해서 Drop시켰는데 그 후에 ODBC연결도 안되고 어플리케이션
에서 DB Open Error(에러코드 1402)가 뜹니다.
원인을 알고 싶습니다.(의문점 : client 버전이 높아서 문제가 되지 않는지 ?)
그리고 db2ckpw화일은 어떤일을 하는것인가요?
<------------------------------------------------------------------>
SQL1402N 예기치 않은 시스템 오류로 인해 사용자를 인증할 수
없습니다.
설명: 시스템 관리자에게 연락하십시오. unix 기본 시스템에서 파일
db2ckpw에 올바른 허가 비트가 설정되지 않았거나 시스템에
스왑/페이징 공간이 없을 수가 있습니다. Windows NT에서 DB2 보안
서비스가 시작되지 않았을 것입니다.
<------------------------------------------------------------------->
관리
A :
SQL1402N 에러에 대한 조치사항은 다음과 같습니다.
$HOME/sqllib/security/db2ckpw 파일의 permission과 owner를 확인해 보시기 바랍니다.
-r-s--x--x 1 root udbadmgm 19576 Aug 9 1999 db2ckpw
위와 같이 root 사용자와 instance owner group으로 설정되어 있어야 합니다.
파일의 permission과 owner 확인하시고 다시 해 보시기 바랍니다.
감사합니다.
관리
Q :
1.lock을 걸려고 하는데 전체 테이블이 아닌 해당 Row에 대해서만 걸려고 합니다.
(Cursor는 사용하지 않구요)
예를 들어
func ( char emp_no, ..) {
EXEC SQL LOCK TABLE emp WITH EXCLUSIVE MODE;
EXEC SQL select name, salary from emp where emp_no = :emp_no;
sleep(10);
EXEC SQL update emp set salary = :salary;
EXEC SQL commit;
}
라는 문장이 있다고 하면 :emp_no에 해당하는 Row만 다른 프로그램에서 access를
못하게 하고 싶습니다. 위와 같이 하고 build시 isolatin CS 를 주고 했는데
테스트를 해보니 전체 테이블에 LOCK이 걸리는것 같더군요.
위 프로그램을 연속 두번 실행 시키면 (물론 서로 다른 emp_no로) 두번째 실행된 프로그램은
첫번째가 sleep(10)을 하고 commit을 한 후에야 LOCK이후를 진행을 하더군요.
테이블 전체에 LOCK이 걸려서 두번째는 첫번째가 LOCK을 RELEASE하기를 기다리고
있다는 이야기겠지요.
제가 의도하는 바는, 서로 다른 emp_no를 주고 위와 같은 프로그램을 두개를 실행시키면,
LOCK을 각각 한 Row씩에만 걸기 때문에 서로 영향을 주지 않고 각자 제 시간에 제 할일을
끝내는 것입니다.
그렇게 할려면 어떻게 해야 합니까?
관리
2. For Update문의 정확한 용도는 무었입니까?
메뉴얼에 보면 다음 Positioned Update문에서 update할 칼럼을 지정해 주기 위해 사용한다고만
나와있는데, 그럼 Lock을 건다는 얘긴가요? 미리 지정해 주면 달라지는게 뭔지 안나와
있어서 답답하네요. 그리고 Cursor문이 아닌 일반 단일 select into 문에서는 사용할수 없나요?
A :
먼저 첫번째 질문에 대한 답은요. 코드상에서
EXEC SQL LOCK TABLE emp WITH EXCLUSIVE MODE;
에 해당하는 SQL 문이 있어서 해당 access하는 table 전체에 X-lock 을 걸기 때문입니다.
따라서 transaction이 commit 되기 전에는 해당 Lock을 계속 유지합니다.
저 구문을 빼고 실행해 보세요. Isolation Level (default CS) = CS로 precompile 또는 bind하여
실행하시면 Row lock이 하나하나 걸린후 fetch되어 오면서 해당 row의 lock이 release될
것입니다.
2번째 질문.... For Update of... 는 해당 트랜잭션이 U lock을 얻기 위해서 사용합니다.
U Lock은 김신혜님의 code에서처럼 동일한 Table 또는 Row에 대한 두개의 SQL 구문
(1: Select, 2: Update)이 하나의 트랜잭션으로 묶인 어플리케이션이 있을때, 이러한
어플리케이션이 동시에 실행됨으로써 발생할 수 있는 deadlock을 방지하기 위해 도입된
lock의 한 형태입니다. 따라서 S lock을 걸고, X Lock을 거는 것이 아니라 먼저 들어온
어플리케이션이 U lock을 걸면, 나중에 들어온 어플리케이션은 S lock만을 획득하여 나중
어플리케이션의 동일 트랜잭션상에 있는 Update구문, 즉 X lock을 못걸도록 처음부터
방지하는 것입니다.
따라서 먼저 들어온 어플리케이션이 commit한 이후에나 Update 구문이 실행될 수 있습니다.
그러므로 U Lock이 사용되기 위해서 for update... 구문을 프로그램에서 써야 하는거구요.
select into 문장에서는 Select 대상과 Update 대상이 다르기 때문에 상관이 없습니다.
관리
Q :
DB connect 명령을 아래와 같이 주어서
"db2 connect to vpmdb user vpmadm using vpmadm"
VPM을 실행해서 사용하고 있습니다.
그런데 vpmadm으로 로그온 상태에서 "db2 connect to vpmdb" 하면 DB에 Connect가 되는데
위와 같이 user ID 와 Password를 사용하면 아래와 같은 메세지가 출력 됩니다.
"SQL1402N 예기치 않은 시스템 오류로 인해 사용자를 인증할 수 없습니다."
그리고 db2ckpw화일은 어떤일을 하는것인가요?
꼭 답변 부탁드리겠습니다.
A :
DB2는 Connection시에 UserID, PWD를 지정하지 않은 경우에는 OS가 User를 인증하게 하고,
UID와 PWD를 지정한 경우 User를 인증하기 위해 AIX API가 호출됩니다.
다음을 확인하세요.
1. 인스턴스 홈 디렉토리 $HOME/sqllib/db2ckpw 파일의 Ownership을 확인하십시요.
이 파일은 Root Authority가 있어야 합니다. (-r-s--x--x root db2adm1)
2. /etc/security/lastlog 파일이 존재하는지, Corruption이 있는지, Permission이 있는지
확인하십시요. (-rw-r----- root security)
DB2는 Connection시에 AIX API loginsuccess를 Call 하는데, 이 파일이 없거나
Permission이 제대로 설정되어 있지 않는 경우, API는 error EACCESS를 리턴하고,
DB2는 이것을 SQL1402로 변경하여 리턴합니다.
관리
Q :
온라인 백업만으로도 데이타베이스가 손상을 입었을 경우에 복원이 가능한가요?
꼭 오프라인 백업을 해야하는건지 궁금하네요.
온라인 백업과 오프라인 백업의 차이점이 무언지 알고싶습니다.
A :
온라인 backup만 하시면 만약 log 파일을 모두 날렸을 경우에는 기본적으론 복구 불가합니다.
편법이 있긴 하지만 데이터 손실은 감수해야 합니다.
그러기 때문에 offline backup을 일주일(한달)에 한번씩은 꼭 받아야 합니다.
온라인으로 받은것을 복구하려면 log가 있어야 합니다.
backup 당시의 log가 있으면 복구 가능합니다.
관리
Q :
select convert(numeric,substr(colnum,7,2)) from tablename
이러한 방식으로 가져온 값을 다른 값과 비교하려고 하거든요
그런데 numeric 에 integer,double, int 등여러가지로 실험해보았으나
오류메세지:
SQL0206N "numeric"이(가) 사용되는 문맥 내에서 유효하지 않습니다.
가 나옵니다...
고수님의 조언을 기다립니다..
A :
DB2에서는 convert함수가 없습니다. 이에 대응하는 함수가 바로 decimal(), integer()
및 char() 함수 등 입니다.
물론, DB2에서 UDF(User Defined Function)를 이용하여 convert함수를 생성하여 DB2에
등록하여 사용할 수 있지만, 이를 위해 프로그램 코딩을 해야 합니다.
사용 예는 다음과 같습니다.
db2 "select decimal(substr(deptno,2,2),3,1) from department"
db2 "select integer(substr(deptno,2,2)) from department"
관리
Q :
흑흑 계속 여러 고수님들께 도움을 받고 있는데도 또 에러가 납니다. 코드는 다음과 같습니다.
CREATE TRIGGER INS_PART_PSN_OUT2
AFTER INSERT ON PARTS.PART_LIST
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
BEGIN ATOMIC
UPDATE PARTS.PART_LIST SET PSN_OUT=
CASE
WHEN (N.SHOWN_ON_PART_NO IS NULL) THEN
CONCAT(CONCAT(CONCAT(RTRIM(S_STATUS), ),RTRIM(S_PART_NUMBER)),CONCAT(
,RTRIM(C_PART_VERSION)))
WHEN (SHOWN_ON_PART_NO IS NOT NULL) THEN
CONCAT(CONCAT(CONCAT(CONCAT(RTRIM(S_STATUS), ),RTRIM(S_PART_NUMBER))
,CONCAT( ,RTRIM(C_PART_VERSION))),CONCAT( ,RTRIM(SHOWN_ON_PART_NO)))
END ;
END
관리
즉 SHOWN_ON_PART_NO 라는 필드가 NULL 값일 때와 NULL 값이 아닐때의 값이 다르게
변화 시키는 문입니다.
그런데 다음과 같은 에러 가 계속 해서 나오네요.
===="(SHOWN_ON_PART_NO)))" 다음에 예기치 않은 토큰 "END"가 있었습니다.예상된
토큰은 다음을 포함할것입니다."END".SQLSTATE = 42601 ====
그리고 아직 BEGIN ATOMIC 에대한 이해가 많이 부족한것 같아요.
BEGIN ATOMIC 를 어떤때 사용 하는지 & 외 사용하는지를 메뉴얼 에도 없고 잘모르겠고요
END 문으로 마무리를 하는것 같은데 계속 ERROR 가 발생하니 원 ...^^;;
그리고 DB2 에 입력 하는 방법은 위의 코드를 FILE 로 저장해서 # db2 -stvf FileName 으로
실행 시켜 합니다.
관리
A :
화일로 저장해서 Command Line Processer 에서 실행할 경우에 옵션설정을 달리 해야 합니다.
이 SQL 같은 경우에 중간에 Triggered SQL 부분 마지막에
; 이 들어가는데 이것을 Command Line Processer 에서는 명령문 종료 문자열로 인식해버립니다.
따라서 옵션 설정을 달리하여 명령문 종료 문자열을 다른 문자로 대체 하면 실행 됩니다.
예) 종료 문자열을 ; 아닌 ! 로 설정하려면
#db2 -td! -svf FILENAME
(-stvf 에서 t는 ; 을 명령문 종료문자열로 쓴다는 의미입니다. 따라서 여기선 빠집니다.)
이런 형식으로 실행하고
스크립트는 제일 마지막 END 뒤에 명령문이 끝났다는 표시로 ! 를 붙여줘야 합니다.
예) (S_PART_NUMBER)),CONCAT( ,RTRIM(C_PART_VERSION))),CONCAT( ,RTRIM(SHOWN_ON_PART_NO)))
END ;
END!
관리
Q :
NT에서 리눅스 DB2 접근시.. 권한부여 에러?
윈2000 에서 리눅스쪽에 DB2를 클라이언트 툴을 이용하여 등록 후
제어센타를 통해 접근 ( 접근시 계정 입력 ) 잘됨..
명령센터 실행 ( 계정입력 창 계정입력 error 발생)
↓
-------------------------------- 입력된 명령 --------------------------------
connect to WAS ;
-----------------------------------------------------------------------------
SQL1046N 권한 부여 ID가 유효하지 않습니다. SQLSTATE=28000
리눅스 DB2 계정에 어떠한 작업을 해줘야 외부 클라이언트(윈2000)에서
서버(리눅스 - DB2)쪽에 DB를 생성 수정 등을 할수 있는지
관리
A :
명령센타를 통해 원격지(LINUX 머신)의 DB를 접속하기 위해서는 접속하고자 하는 ID가
서버쪽에 등록되어 있어야 합니다. 이는 DB2가 서버에 등록된 ID를 사용하기 때문입니다.
따라서 우선 LINUX에 유저를 등록하셔야 하구요 또한 원격지 DB에 접속하기 해서는
(DBM CFG 파라미터에 따라서 달라질 수 있지만 - AUTHENTICATION) 일반적으로
connect to was user 유저명 using 암호
하셔야 합니다. 그리고 DB를 생성하고자 할경우
일반 유저는 권한이 없구요 시스템의 관리자 권한(root)이거나
DB CFG 파라미터의 SYSADM, SYSCTRL 그룹에 속한 유저라만 가능합니다.
관리
Q :
DB전체의 생성스크립트를 받고싶은데...
ms sql처럼 스크립트의 전체내용을 보고싶습니다.
db2look이라는 명령어를 쓴다고 하는데 명령행처리기에서
책내용대로
db2look -d dbname -u username -o filename -e
이렇게 해봤는데 자꾸 에러가 나네요..
답변주시면 고맘겠습니다
A :
db2look -d db명 -l -a -e -o 저장할화일명
(예) db2look -d sample -l -a -e -o sampledb.sor
관리
Q :
db2diag.log 파일에 다음과 같은 에러의 내용이
있습니다. 원인이 무엇인지 정확히 알고 싶어 이렇게 글을 올렸습니다.
정확히 어느곳이 full이 난것인지.
< db2diag.log 내용 >
PID:24980(db2pclnr) Appid:none
buffer_pool_services sqlbWritePageToContainer Probe:20
SMS Tablespace 1(TEMPSPACE1) is FULL or file is too large (at OS or user limit).
Detected on Container 0. ContPage= 28905 Obj=3 Type=128
2001-02-02-11.53.36.076971 Instance:db2inst1 Node:000
PID:24980(db2pclnr) Appid:none
buffer_pool_services sqlbWritePageToContainer Probe:20
SMS Tablespace 1(TEMPSPACE1) is FULL or file is too large (at OS or user limit).
Detected on Container 0. ContPage= 28906 Obj=3 Type=128
2001-02-02-11.53.36.177909 Instance:db2inst1 Node:000
PID:24980(db2pclnr) Appid:none
buffer_pool_services sqlbWritePageToContainer Probe:20
있습니다. 원인이 무엇인지 정확히 알고 싶어 이렇게 글을 올렸습니다.
정확히 어느곳이 full이 난것인지.
관리
A :
db2diag.log 파일의 내용을 보아서는 TEMPORARY 테이블 스페이스가 full 난 것 같네요.
임시 테이블 스페이스가 full이 나는 경우는 sort, join이 할당된 메모리 공간을 초과하거나
임시 테이블을 사용할 경우 등에 임시 테이블 스페이스를 사용하게 됩니다.
현재 구성으로는 임시 테이블스페이스가 SMS로 되어 있고, 컨테이너 ID가 0번인 곳에서
full이 났습니다. 데이터가 들어 있는 SMS의 테이블 스페이스는 공간을 늘리는 문제가 좀
복잡하지만 임시 테이블 스페이스는 그것보다는 좀 쉽죠. SMS 테이블스페이스는 OS가
관리하는 디스크 공간에 여유가 있는한 계속 확장됩니다. 이 점을 먼저 기억하시구요.
우선 NT의 경우는 별다른 방법이 없습니다.
하드를 추가하시거나 불필요한 프로그램을 삭제해서 공간을 확보해야겠지요.
하드를 추가했을 경우 추가한 하드에 디렉토리를 하나 만드시고 create temporary tablespace
문으로 임시 테이 스페이스를 만들어 주세요.
그러면 임시 테이블스페이스가 2개 생기겠지요?
근데 권장사항은 임시 테이블스페이스는 큰 공간으로 1개로 사용하는게 좋다고 하더군요.
그러고 기존의 임시 테이블스페이스는 삭제를 해주시구요.
AIX의 경우는 lv, jfs의 해당 파일시스템을 확장해주시면 됩니다.
위와 마찬가지로 디스크 공간이 없을 경우는 하드를 추가해야겠죠?
DMS 테이블스페이스와는 달리 SMS 테이블스페이스는
한번 생성되면 새로 container를 추가할 수 가 없습니다.
그렇다고 임시 테이블스페이스를 DMS로 생성하는 것은 권장하고 싶지 않습니다.
관리
Q :
DB2 UDB V7.1을 첨사용하는 초보입니다.
우선은 제가 DB2 UDB V7.1을 접하게된 사유는 저의 회사에서 이번에 DB2를 사용하게 되어서
이렇게 관심이 생기게 되는가 봅니다.
우선 이글을 올린 사유 부터 말씀을 드릴까 합니다.
DB2 기술영업 지원팀에서 작성된 메뉴얼(?)을 가지고 Windows NT V4.0에 설치를 하고나서
DB를 생성을 할려는데 문제(?)가 생겼음다.
뭔문젠고 하면 기본으로 생성이 되는 인스턴스에서 작업을 하기보다는 제가 잡아논 특정
하드에다
인스턴스 및 DB를 생성할려고 하는데 부터 문제가 발생하더라구요
새로운 인스턴스를 사용하기위한 fenced_user_id(임의의 사용자-id:지금은 Administrator로
지정했음)
를 생성도 하고나서 다음과 같이 작성을 했음니다.
db2icrt db2inst2 -u Administrator -p f:\container
db2inst2는 임의로 인스턴스명으로 제가 지정을 했음니다
이렇게 하고 나니 F:\container에 DB2inst2, function이라는 폴더가 생기더라구요 해서 제대로
인스턴스가 생겼구나하고 다음작업을 진행했죠....
관리
근데 아 여기서 부터 도저히 진도가 나가질 않는데요 어쩜좋죠.
그다음 Database를 생성 할려구 다음과 같이 입력을 했죠
(명령행 처리기 및 제어센터 등에서도 똑같이 했음)
1) create database mydb01
2) create database mydb01 on f:\container
1), 2)중 1)은 Default로 잡힌 인스턴스로 DB가 정상으로 성공을 했고 2)은 다음과 같이 에러
"sql1052n 데이터베이스 경로가 없읍니다" 라고 합니다
윈탐색기에서는 분명 존재를 하는데 파일도 카피가 되는데 웬일인지 .
2)은 그렇다 치고 1)은 일딴 생성이 되었으니까 이제 tablespace를 지정해줄려고 하는데 이것또한
db2 create tablespace myts02 managed by database using (file f:\container\db
2inst2 1000) 또는
db2 create tablespace myts02 managed by database using (file f:\container 1000)
이렇게 입력을 하면
"DB21034E 명령이 유효한 명령행 처리기(CLP) 명령이 아니므로 SQL문으로
처리되었습니다. SQL 처리중에 이 명령은 다음을 리턴했습니다.
SQL0970N 시스템이 읽기 전용 파일에 쓰려고 시도했습니다. SQLSTATE=55009"
라고 합니다. 분명 해당 폴더의 사용권한과 소유권도 다 가지고 있는 Administrator계정으로
작업을 했는데 왜 안되는지.
관리
A :
Windows 계열에서는 기본적으로 인스턴스를 1개 밖에 지원을 하지 않습니다.
그래서 인스톨 시에 인스턴스를 디폴트로 만들어 주는 것이구요.
굳이 2개 이상을 만들수는 있지만 권장하고 싶지는 않군요.
환경변수에서는 DB2INSTANCE로 1개 밖에 설정을 할 수 없기 때문에 예상치 못한 문제가
발생할 수 있을거 같습니다. 예를 들어 db2start 를 했는데 2개 중에 어떤게 활성화 될것인가
혹은 두 인스턴스가 같이 활성화 되어 있는 상태에서 db를 만들면 이 db는 어떤 인스턴스에
속하게 될 것인가에 관한 문제들 말이죠. (테스트 해본 결과로는 DB2INSTANCE로 설정되어 있는 인스턴스에 우선권이 있는거 같습니다.)
굳이 디폴트로 만들어진 인스턴스(DB2)가 아닌 다른 인스턴스를 쓰고자 한다면 디폴트로
만들어진 인스턴스를 db2idrop DB2 로 drop 시키고 만드시길 바랍니다. 또 환경변수에서
DB2INSTANCE 가 새로 만든 인스턴스명으로 되어 있는지도 확인하구요.
그 다음 DB를 만들어야 겠죠?
아래 DB create 문에서 1)번의 경우에 디폴트 인스턴스(DB2)에 DB가 생성되는 이유는
Window환경변수에서 DB2INSTANCE가 DB2로 설정되어 있고 DB2 인스턴스가 살아 있기
때문입니다. 2)번의 경우는 Unix 계열에서 유효한 명령입니다. 윈도우나 OS/2라 면 "create
database my01 on f:" 이렇게 해야 맞습니다. 그러면 f 드라이브의
해당 인스턴스 디렉토리로 찾아서 들어가게 됩니다. 이때 DB2 인스턴스가 살아 있는
상태라면 물론 DB2 인스턴스 밑으로 들어갑니다. 그러나 새로 생성한 인스턴스만 살아
있다면 그 밑으로 들어가겠죠.
관리
Q :
Windows ME에서 UDB 7.1 PE 설치후 문제
설치후 제어센터나 커맨드 센터 다 잘동작되는데,
유독 db2cmd.exe 만 실행하면,
“DB21061E 명령행 환경이 초기화되지 않았습니다. “ 라고만 나옵니다..
ME에서 적용이 안되는 것 같은데... 패치가 없나요? 아니면 어떻게 방법이 없나요??
A :
UDB는 여러가지 시스템 환경 변수 값을 설정합니다.
그러나, Win/ME는 자동으로 잡기 때문에 프로그램 상에서(문의 하신 내용중의 db2cmd)
설정하면 ME가 설정값을 무시 해버리더라구요....
해결책이라 하기 좀 뭐하지만, 명령창에서는 부분적으로 설정이 가능하거든요.(수동으로)
명령창(제목 라인에서)에서 오른쪽을 눌러 환경변수 영역이 auto로 되어 있는데 auto 아닌
수치중에 최대값으로 잡아주세요.... 그러면 명령창을 실행시키고 있는 중에만 적용된다는
것이지요...
답변이 되었는지 모르겠지만, 현재 제가 알고 있는사항은 여기까지 입니다.
관리
Q :
테이블에 데이타를 Upload하는 중 에러가 발생했습니다.
1. 제어센터에서 해당테이블에 "컬럼식별자가 있는 ASCII형식(DEL)로 몇번 시도했고.
2. Delphi5.0 에 포함되어있는 Datapump로 ORACLE에 있는 테이블을 그대로 업로드
하려고 시도했습니다.
1번의 경우 File I/O에러가 나면서 에러가났고
2번의 경우 테이블은 생성되면서 데이터가 에러가 나면서 Import되지는 않았습니다.
그래서 바로 생성된 임시테이블을 삭제한 상태입니다.
제생각에는 2번 작업을 하고 난후부터 "SQL0290N 테이블공간 액세스가 허용되지 않습니다
SQLSTATE=55039"라는 에러가 나면서 전혀 테이블스페이스를 액세스 할 수 없습니다.
"db2 list tablespaces show detail"
명령을 수행하면 아래와 같은 리스트가 나옵니다.
아래에 "로드 보류"라고 하는것이 문제인것 같은데
어떻게 하면 해결이 가능한지요.
고수님들의 조언 부탁합니다. 참고로 전 오늘 DB2에 입문한 초보입니다.
서버는 RS/6000 F80, AIX 4.3입니다.
관리
현재 데이터베이스에 대한 테이블 공간
테이블 공간 ID = 2
이름 = USERSPACE1
유형 = 시스템 관리 공간
내용 = 임의의 데이터
상태 = 0x0008
세부사항 설명: 로드 보류
전체 페이지 수 = 981
사용 가능한 페이지 수 = 981
사용된 페이지 수 = 981
사용 가능한 페이지 수 = 적용되지 않음
할당된 최고 페이지 수(페이지) = 적용되지 않음
페이지 크기(바이트) = 4096
Extent 크기(페이지) = 32
프리페치 크기(페이지) = 32
컨테이너의 수 = 1
상태 변경 테이블 공간 ID = 2
상태 변경 오브젝트 ID = 34
A :
USERSAPCE1 에 Load Pending이 걸려 있는 상태군요. Pending 상태에서는 해당 Pending에 대한 조치를
취해주지 않으면 접근이 불가능 합니다. Load Pending의 경우 이전의 Load를 오류시점부터 이어서 하거나
LOAD커맨드의 로드 모드중에 Terminate모드를 이용하면 제거 할 수 있습니다.
관리
Q :
WINDOWS 2000에서 DB2서버가 돌아가고 LINUX(RedHat6.2K)에서 DB2서버가
돌아가는데요. WINDOWS 2000에서 LINUX로 데이타 마이닝을 할려면 어떻게 합니까?
복제, 복사, EXPORT/IMPORT를 다 써보았는데 잘 안되더군요
이것말고 또 다른 방법은 없습니까?
아니면 제가 제시한 방법을 잘못쓰고 있는지도 모르겠군요
A :
데이터를 이전하는 방법으로써 Backup & Restore, Load, Import & Export 등의 여러 방법이
있겠습니다. Backup & Restore가 가장 손쉬운 이동방법이긴 하지만 DB2에서는 Platform이
다르거나 DB2 버전이 다를경우 Backup & Restore를 지원하지 않습니다.
Load, Import & Export 의 방법을 사용해야 하는데, 이를 쉽게 해주는 유틸리티로서
db2move라는 유틸리티가 있습니다.
db2move의 사용법에 대해선 1163번의 답변을 참고 하시기 바랍니다.
참고로 Windows 2000을 클라이언트로 Linux를 서버로 사용하고 클라이언트에서 서버의
데이터를 보는게 목적이라면, 단순히 클라이언트에서 서버의 DB를 Catalog 하는 작업만
해주면 됩니다.
(단, 서버의 DB2버전을 기준으로 클라이언트의 DB2버전이 +1, -2 버전까지의
클라이언트까지 지원합니다. 즉 서버가 Ver 6.x 라면 Ver 7.x ~ Ver 4.x 의 클라이언트를
지원합니다.)
응용프로그램
Q :
저희는 weblogic 에서 connection pool 을 만들어 DB와 연결하고 있습니다.
Oracle 을 쓰다가 최근에 DB2로 바뀌었는데 DB2 JDBC Class path 는 어떤식으로 되어
있는지 궁금합니다. 그리고 weblogic 용 jdbc drive class 를 따로 받아야 하는지도..궁금합니다.
Oracle 의 경우는 따로 class file 을 받았거든요.
connection pool 생성시 (sample file 을 참조하여)
url=jdbc:defalut:connection:@00.0.000.000:50002:SID,\
driver=COM.ibm.db2.jdbc.app.DB2Driver,\
식으로 했는데 connection pool 이 안 생깁니다. 도움 부탁드립니다..
A :
DB2 JDBC Driver는 DB2 Client라는 제품에 포함되어 있습니다.
DB2 Client나 DB2를 설치하면 /sqllib/java,sqllib/java12 라는 디렉토리가 만들어지는데
이 디렉토리 안에 DB2JAVA.zip 파일이 있습니다. 이 파일이 바로 JDBC Drive를 가지고
있는 파일입니다. 이것만 Class Path에 묶어 주면 됩니다.
다만 그냥 java Directory에 있는 것은 JDK1.x.x버전을 지원하는 것입니다.
그리고 url은 Jdbc:db2:[db2명] / jdbc:db2://[호스트명:포트]/[db2명]입니다.
DB2는 app, net 두가지의 종류의 JDBC 드라이브가 있습니다. app 드라이브는
JDBC가 있는 로컬에 mount되어 있는 DB에 연결할때 사용하는 것이고
net 드라이브는 원격에 잇는 DB에 연결 할 때 사용하는 드라이브 입니다.
응용프로그램
그래서 앞의 Url은 app, 뒤는 net 입니다.
app = COM.ibm.db2.jdbc.app.DB2Driver
net = COM.ibm.db2.jdbc.net.DB2Driver
net Driver를 사용할 때는 DB가 있는 쪽의 컴퓨터에 JDBC Service가 실행되어 있어야 합니다.
>>db2jdstrt 50001(서비스 포트)
응용프로그램
<참고 – 프로그램 작성시 SQL Error 유형>
1. sql30090n (XA 환경)
이유 코드 = ""에서 나온 코드로 유형을 찾아 해결할 수 있지만
모르는 경우 ?
==> 예) 커서를 OPEN 하려고 할때 에러 발생하면
ㅇ 그것은 OPEN 한 커서를 다시 OPEN 하려고 할때 발생
ㅇ OPEN 하고나서 처리중에 에러 발생하면 CLOSE 를 하지않고 종료하는
경우에 발생한다.
해결방법 !
==> 프로그램 LOGIC를 파악하여 해결한다.
2. sqlcode : -501
커서를 OPEN 하지않고 FETCH 또는 CLOSE 하는 경우에 발생
3. sqlcode : -305
원 인 : FETCH 또는 Embedded SELECT 또는 VALUES 조작의 결과로, 표시기 변
수가 제공되지 않은 호스트 변수에 삽입될 NULL 값이 검색되었음.
컬럼이 NULL값을 리턴할 수 있으면, 표시기 변수가 있어야 한다.
조 치 : FETCH 또는 SELECT 오브젝트 테이블, 또는 VALUES 목록 요소의 정의
를 확인해야 한다.
프로그램을 정정하여 이러한 컬럼으로부터 NULL 값이 검색될 수 있는
모든 호스트 변수에 대해 표시기 변수를 정의해야 한다.
EXEC SQL BEGIN DECLARE SECTION;
short f_ind; <--------- 선 언 부
EXEC SQL END DECLARE SECTION;
:name:f_ind <--------- 기 술 부
응용프로그램
4. sqlcode : -818
원 인 : 사전 처리 컴파일(precompile)시 사전 처리 컴파일러(precompiler)
에 의해 생성된 시각이 바인드시 패키지와 함께 저장된 시각과 동일
하지 않아서 발생
o 응용프로그램 바인드를 수행하지 않고, 사전 처리 컴파일,컴파일
및 링크한 경우
o 프로그램 컴파일과 링크를 수행하지 않고, 사전 처리 컴파일 및
바인드한 경우
o 응용프로그램 모듈에 링크된 오브젝트 모듈을 생성한 사전 처리
컴파일이 아닌, 프로그램의 다른 사전 처리 컴파일로부터의 바인
드 파일을 사용하여, 응용프로그램을 바인드한 경우
o 기존 계획과 동일한 이름으로 응용프로그램을 바인드하고,
기존(old) 응용프로그램을 실행했을 경우
해결책 : 프로그램명과 바인드명을 한번 더 확인하고 다시 바인드 한다.
컴파일이나 바인드가 정상적으로 수행했는지를 확인한다.
5. sqlcode : -805
원 인 : 이 메세지(SQLCODE)의 가능한 원인은 다음과 같습니다.
o 지정한 패키지 또는 프로그램이 데이타베이스에서 정의되지
않은 경우
o 프로그램이 바인드되지 않았거나 삭제(drop)된 경우
o 수행되는 응용프로그램은 데이타베이스에 바인드되지 않았다.
o DB2 유틸리티나 CLI 응용프로그램의 수행을 시도하면, DB2
유틸리티를 데이타베이스에 리바인드해야 할 것입니다.
해결책 : 올바른 패키지명을 지정하거나 프로그램을 바인드해야 한다.
응용프로그램
6. sqlcode : -551
원 인 : 권한부여 ID "<authorization ID>"가 적절한 권한 없이 "<name>"에
대해 지정된 "<operation>"을 수행하려 했기 때문에 발생
ㅇ 참조 제한조건이 있는 테이블을 작성하거나 변경할 경우
이 메세지(SQLCODE)는, 사용자에게 FOREIGN KEY를 작성하거나
삭제(drop)할 REFERENCES 특권이 없음을 나타낼 수 있다.
이러한 경우, "<operation>"은 "REFERENCES"이며 "<name>"은
제한조건이 참조하는 오브젝트이다.
해결책 : "<authorization-ID>"에 조작을 수행하는 데 필요한 권한이 있는지
확인한다. 그리고 DB 관리자에 요청을 한다.
ㅇ DB2 유틸리티나 CLI 응용프로그램의 수행을 시도하는 경우
- DB2 유틸리티의 경우
# DB2 bind @db2ubind.lst blocking all grant public
- CLI의 경우
# DB2 bind @db2cli.lst blocking all grant public
응용프로그램
7. sqlcode : -803
원 인 : INSERT 또는 UPDATE 오브젝트 테이블이 특정 컬럼 또는 컬럼의 그룹
내에 유일한 값을 가지기 위해, 하나 이상의 UNIQUE 색인에 의해 제
한을 받는다.
또는, 특정 칼럼이나 컬럼의 그룹에 고유 값이 있도록 모(parent)
테이블에 있는 DELETE 문으로 인해 하나 이상의 UNIQUE 색인으로 제
한된 종속 테이블에 외부 키의 갱신이 초래되었다.
고유한 색인이 해당 테이블에 대해 정의된 기본 키 또는 고유한 제
한조건을 지원하기 위해 존재하는데 요청된 삽입 또는 갱신의 완료
로 컬럼 값의 중복이 되어서 에러 발생
해결책 : 오브젝트 테이블에 정의된 모든 UNIQUE 색인에 대한 정의를 조사하
여, 이러한 색인이 고유성 제한조건을 야기하는지 판별해야 한다.
ㅇ UPDATE문의 경우
지정한 조작이 그러한 고유성 제한조건으로 일관성이 없는 상태
에 있는지 확인하고, 이것이 오류를 표시하지 않으면, 오브젝트
테이블 내용을 조사하여 문제의 원인을 판별해야 한다.
ㅇ INSERT문의 경우
오브젝트 테이블 내용을 조사하여 지정된 값 목록 내의 어떤 값
이 제한조건을 위반하는지 판별해야 한다.
ㅇ INSERT문에 부속조회가 들어 있으면
그 부속조회에 의해 주소지정된 오브젝트 테이블 내용은 문제의
원인을 판별하기 위한 오브젝트 테이블 내용과 일치해야 한다.
ㅇ DELETE문의 경우
규칙 ON DELETE SET NULL로 정의된 외부키에서 고유 제한조건에
대한 종속 테이블을 검토해야 한다.
이 테이블에 대한 컬럼에 이미 널(NULL)이 있으므로 이러한 하
나의 테이블에는 널(NULL)로 설정될 수 없는 고유 색인에 외부
키 컬럼이 있다.
응용프로그램
8. sqlcode : -205
원 인 : 해당 TABLE에서 Column 이 정의되지 않은 칼럼 사용해서 에러 발생
"<object-name>"이 구조화된 유형인 경우, "<name>"은 "<object-
name>"에서 정의되지 않은 속성을 사용해서 발생
해결책 : "<object-name>"이 테이블이나 뷰인 경우
==> 칼럼과 테이블 또는 뷰 이름(필요한 규정자 포함)이 SQL문에서
제대로 지정되었는 지 확인
"<object-name>"이 구조화된 유형인 경우
==> 속성과 유형명( 필요한 규정자 포함)이 SQL문에서 제대로 지정
되었는 지 확인.
9. sqlcode : -303
원 인 : 포함된 SELECT 또는 VALUES문이 호스트 변수로 선택했으나, 변수의
자료 유형이 해당 SELECT 목록 또는 VALUES 목록 요소의 자료 유형
과 호환되지 않아서 발생.
둘 다 숫자, 문자 또는 그래픽이어야 한다. 예를 들어, 컬럼의 자
료 유형이 날짜 또는 시간인 경우, 변수의 자료 유형은 최소한
적정 길이로 된 문자이어야 한다.
해결책 : 테이블 Layout 를 확인하고, 호스트 변수의 자료유형이 올바른지
확인하여야 한다.
응용프로그램
10. sqlcode : -811
원 인 : Embedded SELECT INTO 또는 VALUES INTO의 실행 결과, 두행 이상의
결과 테이블을 생성했기 때문에 에러 발생
해결책 : 명령문에 올바른 조건 스펙이 들어 있는지 확인하고,
그런 경우, 한 행을 예상했으나, 두 개 이상의 행을 리턴하는 자료
인경우는 문제점이 발생할 수 있다.
그런 경우는 ?
ㅇ CURSOR 문을 사용하여 해결한다.
ㅇ " Fetch First n Rows Only " SQL 문을 이용한다.
==> # select * from tsilb52 fetch first 1 rows only
응용프로그램
11. sqlcode : -911
원 인 : 현재 작업 단위에 오브젝트 사용에 대한 미해결 경합이 발생하여
작업 단위가 구간 복원(rollback)되었다.
이유 코드 "<reason-code>" ?
2 교착 상태로 인하여 트랜잭션이 구간 복원되었다.
68 잠금 시간종료로 인하여 트랜잭션이 구간 복원되었다.
해결책 : 교착 상태 또는 잠금 시간종료를 피하려면
ㅇ 장시간 실행되는 응용프로그램이나 교착 상태에 봉착하게 될
응용프로그램의 경우
==> 가능하면 빈번하게 COMMIT 조작을 수행해야 한다.
==> 프로그램 설계를 간단하게 다시 설계를 하여야 한다.
(프로그램을 분할하는 방법과 같이 ....)
ㅇ 어쩔수 없이 오래 걸리는 프로그램일 경우
==> DB 관리자와 의논하여 "잠금시간종료" 시간을 조정한다.
※ 교착 상태는 가끔은 정상적이거나 특정한 SQL문 조합을 처리하는
동안 예상되는 것이다. 교착 상태가 발생하는 범위를 피하도록
응용프로그램을 설계하는 것이 바람직하다.
응용프로그램
12. sqlcode : -206
원 인 : 삽입된 테이블, 갱신된 테이블 또는 FROM절에서 식별된 테이블에
있는 컬럼이 아닌 경우에 에러 발생
ㅇ INSERT문 또는 UPDATE문의 경우
지정된 컬럼이 삽입 또는 갱신 오브젝트로 지정된 테이블이나
뷰(view)의 칼럼이 아닌 경우
o SELECT문 또는 DELETE문의 경우
지정된 컬럼이 명령문의 FROM절에서 식별된 임의의 테이블이나
뷰의 칼럼이 아닌 경우
o ORDER BY절의 경우, 지정된 컬럼이 부속조회 내의 상관 칼럼
이나, 허용되지 않는 경우
해결책 : 컬럼명과 테이블 이름이 SQL문에서 올바르게 지정되었는지 확인
ㅇ SELECT문의 경우, 필요한 모든 테이블들이 FROM절에서 명명되는
지 확인
ㅇ ORDER BY절내의 부속선택의 경우, 상관 컬럼 참조가 없음을 확
인.
ㅇ 컬럼명이 테이블에 사용된 경우
==> 후속 참조에서 그 상관명을 사용하고 테이블명은 사용하지
않음을 확인해야 한다.
13. sqlcode : -304
원 인 : 호스트 변수가 검색된 값을 보유할 수 있을 만큼 크지 않아서 호스
트 변수 목록으로의 FETCH, VALUES 또는 SELECT가 실패했음.
OVERFLOW 발생
해결책 : 테이블 정의가 현재 상태인지와 호스트 변수의 자료 유형이 올바른
지 확인해야 한다.
응용프로그램
14. sqlcode : -203
원 인 : 컬럼 "<name>"이 명령문에 사용되었고, 참조할 수 있는 컬럼이 둘
이상 있다.
ㅇ FROM절에 동일한 이름의 컬럼을 가진 두 개의 테이블이 지정되
어 있는 경우
ㅇ ORDER BY절은 선택 목록에서 둘 이상의 컬럼에 적용되는 명칭
을 참조하는 경우
해결책 : SQL 문을 다시 한번 확인하고, 컬럼명에 규정자를 추가하면 된다.
규정자는 테이블명이거나 상관(correlation)명이고,
컬럼은 선택 일람표에서 재명명해야 할 것.
15. sqlcode : -208
원 인 : ORDER BY 목록에 지정된 컬럼 "<name>"이 SELECT 목록에 지정되지
않았고 결과 테이블에 없으므로, 명령문이 유효하지 않은 경우.
select 문의 fullselect가 부속선택이 아닐 때 결과 테이블 내의
컬럼만 그 결과를 순서화하는 데 사용될 수 있다.
해결책 : 명령문의 구문을 정정하려면, 지정된 컬럼을 결과 테이블에 추가
하거나 ORDER BY절에서 그 컬럼을 삭제해야 한다.
응용프로그램
<프로그램 작성시 유의사항>
가. 변수명 뒤에는 항상 변수에 대한 주석을 기록하며 특히 DataBase 변수일 경우
에는 Column 명을 변수로 사용한다.
EXEC SQL BEGIN DECLARE SECTION;
char g_org_cd[4]; /* 소속코드 */
varchar p_emp_name[ARRYSZ][11]; /* 성명 */
EXEC SQL END DECLARE SECTION;
int i; /* loop count */
long sql_code = 0; /* SQL code 용 */
char sql_txt[300]; /* SQL message 용*/
나. VARCHAR 타입을 사용할 경우
EXEC SQL BEGIN DECLARE SECTION;
struct tag {
short f_ind;
char f_name[13];
} firstname;
EXEC SQL END DECLARE SECTION;
/* f_ind : 변수의 실제 길이
f_name : 변수의 내용 */
응용프로그램
다. HOST VARIABLE 선언할 경우 Table 의 "Column Size + 1" 로 설정
문자의 끝을 나타내는 NULL 문자("\n")가 들어가지 때문
EXEC SQL begin declare section;
char col_2[8];
varchar col_1[11] , col_3[21];
EXEC SQL end declare section;
라. Program 내에서 DB 를 Connect 한 경우 반드시 Program 종료하기전에
Connect reset 명령을 수행한다.
마. 커서를 OPEN 한 경우 반드시 CLOSE 한다.
바. CURSOR OPEN , FETCH , CURSOR CLOSE 의 경우에도 반드시 SQLCODE 를 CHECK
한다.
사. Program 내에서 TABLE 변경(U/I/D) 시켰을 경우 반드시 Program 종료전에
COMMIT 를 수행한다.
아. CURSOR 를 선언해서 단지 SELECT만 할 경우에는 반드시 CURSOR 절에
=> " FOR FETCH ONLY " 절을 사용한다.
자. CURSOR 를 선언해서 UPDATE 할 경우에는 “ FOR UPDATE OF ” 절을 사용하는데
UPDATE 하는 칼럼만 명시하여 사용한다.
차. BATCH성 Program 작성시에는 COMMIT 를 주기적으로 수행한다.
카. TABLE이 바뀌었거나 TABLE이 Drop 되었다가 다시 Create 된 경우는 반드시
그 TABLE를 사용한 Program을 REBIND 해주어야 한다.
타. makefile 내에 " export LANG=ko_KR.eucKR " 문구를 삽입하여 실행한다.
응용프로그램
Q :
Websphere+DB2를 기반으로 자바프로그램을 개발하고 있습니다.
DB2에서 커서를 이용해 프로그램을 해야 하는데 syntax나 구문등을 알 수가 없어서
질문드립니다. DB2온라인도움말에 나와있는 sqlj를 이용하는 방법말고 쿼리문으로 이를
해결 할 수는 없는지. 답글 부탁드립니다. C나 COBOL에 내장된 것 말고, db2자체의
문법으로만 된것, 아니면 자바코드에 내장된 소스를 보고싶습니다.
A :
[ 형식 ]
DECLARE cursor_name CURSOR ______________________ FOR slect문
: :
:__ WITH HOLD __:
[ 유의사항 ]
1. Bind 또는 Precompile시에 BLOCKING 옵션 사용
가) UNAMBIG
☞ "FOR UPDATE OF"로 지정하지 않은 것
☞ "FOR READ ONLY"로 지정한 것
나) ALL
☞ FETCH ONLY를 하지 않은 것도 Blocking 한다
다) NO
응용프로그램
2. CURSOR 사용시에 Read Only Mode 사용(Update를 사용하지 않을 경우)
가) FOR READ ONLY
나) FOR FETCH ONLY
다) FOR UPDATE OF
3. CURSOR사용시에 FOR UPDATE OF 절을 사요하면 DBMS한테 Update 작업을
한다는 것을 알려줌으로써 성능을 향상할 수 있다(Deadlock을 방지)
4. WITH HOLD 옵션
cursor 선언하고 loop를 수행하면서 처리할떼 commit를 찍으면
자동으로 close가 된다.
그 때, with hold 옵션을 사용하면 중간에 commit를 찍어도 close 되지 않는다.
응용프로그램
Q :
웹서버와 DB2가 다른 IP를 사용하고 있습니다.
webserver는 vaj가 설치된 win98이고, db는 AS/400 db2입니다.
차후에는 AS/400에 모두 올려서 사용하겠지만 개발중인 현 시점에서는 일단 DB가
연결되는지를 먼저 확인하기 위해 이원화해서 작업을 하고 있습니다.
그래서 jdbc Driver를 app.Driver대신 net.Driver를 사용하고 있는데 port번호는 어떻게
맞춰주는지를 모르겠습니다.
그냥 IP만 사용해서 실행해보았더니 아래와 같은 오류가 뜨더군요...
port를 맞춰주지 않아서인것 같은데.... 답변좀 부탁드립니다.
---------------------------------------------------------------------------
Instantiate: servlet.Test2
Class file loading Complete....
SQL Exception 1 : [IBM][JDBC 드라이버] CLI0616E 소켓 열기 오류. SQLSTATE=08S01
---------------------------------------------------------------------------
응용프로그램
A :
VAJ - Web Server - DB2/400 의 환경에서는 사용하는 JDBC Driver가 다릅니다.
App (type 2)나 net Driver (type 3)를 사용할 수 없어요.
AS/400의 DB2/400용 별도의 JDBC Driver (type 4)를 사용하셔야 합니다.
근데 제가 죄송하게도 이 Driver에 대한 테스트를 수행해보지 못했거든요.
AS/400용 JDBC Driver는 AS/400쪽에서 얻을 수 있습니다. 예전에 Java toolbox for AS/400
이런 package가 있어서 이 안의 JDK와 Driver를 썼던 걸로 알고 있는데, 자세한걸 알려면
저도 IBM website에서 AS/400에서의 Java 환경에 대한 document를 찾아보아야지
모라고 답변드릴 수 있을것 같습니다.
꼭 type4 JDBC Driver를 쓰지 않고 App Driver를 쓸 수 있는 방법은 있습니다.
Web Server에 DB2 UDB Client가 설치되고, DB2/400의 DB가 Web Server가 있는 DB2 Client에
catalog가 되어 있으면 App Driver로 구성하셔서 Java Application을 짤 수 있습니다.
DB2 Catalog에 대한 항목을 "DB2 FAQ" (게시판 왼쪽 패널에 있지요)에서 찾아보셔서 test를
수행해 보시길 바랍니다. 아니면, DB2/400용 JDBC Driver를 다운로드 받아서
사용하시던가요.
응용프로그램
Q :
Embedded SQL 을 이용하여 개발한다고 했을 때,
Source 내에 Static SQL 과 Dynamic SQL 을 같이 썼읍니다.
이 Source 를 Precompile 이나 Bind 하면 Package 가 생기나요?
Static SQL 문들에 대해서만 Package 가 생기는 걸까요?
A :
bind 를 하게 되면 dynamic이든 static이든 package는 생성이 됩니다.
다만 dynamin의 경우 package만 생성되는 것이고 static의 경우는 실제 access path를 가지고
있는 package가 생성되는 것이죠.
응용프로그램
Q :
sqlj.zip 파일은 어디에 위치하게되는건가요?
리눅스용 7.1 버전을 사용하고 있습니다.
db2가 이상하여 설정파일을 확인하던중..
/usr/IBMdb2/V7.1/cfg/db2profile 을 살펴보게되었는데
#--------------- # Only add sqlj.zip if SDK is nstalled
#-----------------------------------------------------
CLASSPATH=${CLASSPATH:-""}
if [ -f ${INSTHOME}/sqllib/java/sqlj.zip ]; then CLASSPATH=$CLASSPATH:${INSTHOME}/sqllib/java/sqlj.zip ---> 아무리 찾아봐도 없네여 ㅠㅠ
fi
if [ -d ${INSTHOME?}/sqllib/function ] then CLASSPATH=$CLASSPATH:${INSTHOME}/sqllib/function fi CLASSPATH=$CLASSPATH:${INSTHOME}/sqllib/java/db2java.zip CLASSPATH=$CLASSPATH:${INSTHOME}/sqllib/java/runtime.zip:.
A :
sqlj.zip의 위치는 $HOME/sqllib/java 입니다.
이 파일은 DB2 설치시 DB2 Enterprise Edition과 함께
Application Development Client 모듈을 선택하여 설치해야 존재합니다.
다시 한번 확인해 보세요.
응용프로그램
Q :
DB2 C API 에서 테이블 정보 읽어오는 함수가 뭔가요?
즉 테이블 이름을 알경우 필드 타입과 필드 사이즈 등을 알아오고 싶습니다.
혹시 예제가 있다면 좀 알려주시면 감사하겠습니다. 제가 이제 막 DB2를 시작한 초자거든요.
A :
DB2를 설치하신 후 DB2정보센터 -> 서적 페이지에서 "CLI Reference and Guide"를 더블
클릭하면, DB2 Call Level Interface에 대한 정보를 보실 수 있습니다.
SQLRETURN SQLColumns (
SQLHSTMT StatementHandle, /* hstmt */
SQLCHAR FAR *CatalogName, /* szCatalogName */
SQLSMALLINT NameLength1, /* cbCatalogName */
SQLCHAR FAR *SchemaName, /* szSchemaName */
SQLSMALLINT NameLength2, /* cbSchemaName */
SQLCHAR FAR *TableName, /* szTableName */
SQLSMALLINT NameLength3, /* cbTableName */
SQLCHAR FAR *ColumnName, /* szColumnName */
SQLSMALLINT NameLength4); /* cbColumnName */
컬럼에 관련된 정보를 보기 위해 DB2가 제공하는 C 함수(CLI function)입니다.
이러한 정보는 해당 Database에 connect한 다음, syscat.cloumns 테이블을 쿼리(Query)하는
동일한 정보를 얻을 수 있습니다.
select tabschema, tabname, colname, typename, length, scale, nulls from syscat.columns
응용프로그램
Q :
정보->온라인서적 에서 Call Level Interface 와 administrative API 문서를 보았습니다.
이 둘의 차이점은 무엇인지 알고 싶습니다. 그리고 저는 SQL 쿼리 문을 이용해서 데이터
베이스에 데이터 입력및 출력, 테이블의 생성 등의 작업을 하려고 합니다. 둘중에 어떤것을
써야 하는지요? 어제 처음 DB2를 접하게 되었는데.. 어렵군요.. 고수님들의 조언을 듣고
싶습니다. 그리고, 초보자가 보기에 좋은 도서가 있다면, 추천해 주십시오.
A :
둘의 차이점은 말 그대로 administrative API의 경우
DB관리에 관련된 API 입니다. DBM Control 및 DB Control 등의 관리용 API 들이지요.
CLI의 경우는 C나 C++에서 SQL 쿼리문을 실행하기 위해 사용합니다.
응용프로그램
Q :
AS400에서 DB2와 CLI application이 같이 사용가능 합니까.?
데이터 베이스 DB2를 사용하는 AS400 서버에서 DB2를 사용하기 위해서
CLI 인터페이스를 사용할 수 있습니까..?
CLI는 ODBC를 사용하는것 같은데.. AS400에서 CLI SDK가 사용가능합니까..?
자세히 좀 가르쳐 주십시오..
그리고, 정보를 얻을 수 있는 사이트가 있으면 가르쳐 주십시오.. 부탁드립니다.
A :
예 가능합니다. 관련 책자가 있습니다. 버전별로 있습니다.
SQL 호출레벨인터베이스(ODBC)라는 메뉴얼이 있습니다. 한글로 되어 있구요
http://publib.boulder.ibm.com/pubs/html/as400/v4r5/ic2986/info/db2/rzadpmst.pdf\
입니다. 다운 받아서 보세요
정보를 얻을 수 있는 사이트는 www.as400.ibm.com/db2
그리고 www.redbooks.ibm.com에 가셔서 as/400에 관한 부분을 들어 가 보시면
2000년 이후 최신 redbook을 pdf로 받을 수 있습니다.
많은 참고 되시길 바랍니다.
응용프로그램
Q :
저는 요번에 db2 데이터 베이스를 이용한 프로그램을 개발하게 되었습니다.
그런데 샘플 프로그램을 보면 전부 nmake 방식에 대해서만 나와있습니다.
그리고 요구 사항에 보면 "Your environment initialized to a valid db2 instance" 가 있는데.
도스 명령프롬프트 상에서는 하면 환경이 안맞았다는 에러가 나오더군요..
프리컴파일 할때 반드시 DB2 명령창에서만 해야됩니까?
도스 명령프롬프트 상에서도 DB2 명령창에서 처럼 컴파일 할수 있는 방법이
없나요?
A :
DB2 데이터베이스를 이용해서 개발을 하려면 개발 환경이 정의되어 있어야 합니다.
물론 개발하기 위한 precomplier두 설치되어 있어야 하겠구여.
그게 바로 예전 버전에서는 SDK(software Development Kit)였구요, 지금 버전(V7.1)에서는
Application Develoment client 입니다.(명칭이 정확한지는 잘 모르겠네요.. ^.^)
procompiler는 DB2에서 제공하는 complier 이기 때문에 명령창에서는 사용하실 수가
없는거구요.
환경을 설정을 해주시구 해보세요..
연결
Q :
db2 connect error의 해결책을 찾습니다.
1번서버의 db2에 클라이언트 컴퓨터로 접속을 하면 다음과 같은 메세지가 나타납니다.
연결 시험이 실패했습니다.
[IBM][CLI Driver] SQL30081N 통신 오류가 발견되었습니다.
사용 중이던 통신 프로토콜: "TCP/IP". 사용 중이던 통신 API: "SOCKETS". 오류가 발견된
위치: "". 오류를 발견한 통신 함수 : "connect".
프로토콜 고유의 오류 코드: "10061", "*", "*". SQLSTATE=08001
주) 2번서버는 이상없이 연결됩니다.
개인적으로 판단하기에 클라이언트 쪽은 이상이 없는것 같고 1번서버의 db2를 다시
세팅해야하나요?
해결책이 있으면 부탁드리겠습니다.
연결
A :
1. 우선 장애 내용을 보면 ?
--> db2 "? sql30081n"
- 내용을 보면 1) db catalog가 제대로 되지 않아서
2) 통신 모듈이 제대로 올라오지 않아서
3) 통신 서비스가 등록이 제대로 되지 않아서
2. 상황을 점점 하면
- ping server_ip_address
- db cfg 확인(server / client)
- 서비스 name 확인
- db catalog 확인
. node catalog
-> catalog tcpip node node_name remote host_name server service_name
. db catalog
-> db2 catalog database db_name as db_alias_name at node node_name authentication client
* authentication 를 확인해 보세요..
server 의 환경과 client의 catalog가 제대로 되어 있는지 반드시 확인하세요
연결
Q :
AIX 환경에서 db2 UDB를 사용하고 있습니다. 그런데... DB에 connect하려고 하면 이런 에러가 납니다.
"SQL1042C 예기치 않은 시스템 오류가 발생했습니다. SQLSTATE=58004"
db2diag.log를 보니..
"2000-11-17-16.13.47.373119 Instance:db2inst1 Node:000
PID:16268(db2agent (DMSG)) Appid:0A0A0113.8628.001117071345
data_management sqldScanOpen Probe:800 Database:DMSG
DIA9999E 내부 오류가 발생했습니다. 다음 오류 코드를 보고하십시오: "FFFFF176".
2000-11-17-16.13.47.398125 Instance:db2inst1 Node:000
PID:16268(db2agent (DMSG)) Appid:0A0A0113.8628.001117071345
data_management sqldScanOpen Probe:800 Database:DMSG
" 라는 내용을 이해할 수 없는 에러가..
초보라서 게시판과 온라인 서적을 찾아 보니.. 이런 저런 내용이 있긴 하지만 명확한 답이
나와 있지는 않습니다. 제가 새로운 테이블을 만들때 다른 테이블과 인덱스 이름을 똑같이
잡아줘서 이러는 걸까요? 해결 방법을 꼬~옥 좀 가르쳐 주세요. 만약 해결 방법이 없다면
어떻게 해야 하는지라도 가르쳐 주세요~~
연결
A :
"SQL1042C" 에러를 보아서는 메모리에 DB2쪽 일부 작업이 올라가서 엉켜 있는듯 합니다.
DB2 엔진이 시작되면 기본적으로 메모리 일부분을 사용합니다..
- 메모리, 큐, 세마포어 이 세부분입니다..
이 메모리는 엔진이 끝나면 당연히 사용을 안 하겠죠..
하지만 간혹 DB 엔진이 비정상적으로 종료를 하게 되면 메모리에 그 잔재가 남아 있어
해제 시켜줘야 겠죠..
우선 확인을 해 보시고 강제로라두 kill하시기 바랍니다..
List 확인 : ipcs
Kill : ipcs -m(메모리) [process id]
ipcs -q(큐) [process id]
ipcs -s(세마포어) [process id] 하시면 프로세스를 해제하게 됩니다..
도움이 되길.
연결
Q :
SQL30082N에러......
----------------------------- 입력된 명령 ------------------------------
connect to test_pax user db2 using db2
----------------------------------------------------------------------------
SQL30082N 연결하려는 시도가 보안 이유
"21"("RESOURCE TEMPORARILY UNAVAILABLE")(으)로 인해 실패했습니다
. SQLSTATE=08001
현제 DB2는 PTF가 적용되지 않음...
RS/6000 : AIX4.3.3.0
DB2 : 6.1
WebSphere : 3.02
A :
이 문제는 AIX 상의 maximum number licensed useres 에 다달했기 때문입니다.
우선 concurrent user 수를 확인하시고 수정해 주시기 바랍니다.
check 방법 :
lslicense -> displays the actual settings for concurrent login.
다음 필요한 사용자수만큼 수정해 주시면 됩니다..
chlicense -u xx -> where xx is the number of concurrent logins and can be from 1-32767.
연결
Q :
CCA 의 Network 탐색 범위는?
CCA 를 이용하여 Client 환경을 설정할 때, Network 탐색이라는 것을 이용할 수 있는데,
이 때 탐색의 범위는 어디까지입니까? Local Network 인가요? 아니면 그 이상?
A :
CCA의 네트워크 탐색을 하기 위해서는 instacne와 database가 있어야 합니다.
그리고 db2 admin server가 살아 있어야 합니다..(DB2 DAS Server)
LAN 환경에서 일정한 시간동안 검색 가능한 데이터 베이스는 모두 찾습니다..
따라서 데이터 베이스가 너무 많거나 LAN환경이 너무 크면 간혹 검색되지 않는 데이터
베이스두 있습니다.
그럴 경우 등록을 하시려면 CCA의 "수동으로 찾기" 또는 수동으로 catalog 작업을 하시면
됩니다.
연결
Q :
ASP 로 DB2 의 데이타를 억세스 해야 할 일이 생겼는데요
여기 저기에서 알아본 결과 Client Acess Express / AS400 을 설치하면 된다고 하는데.
어디서 이 프로그램을 구하는지 알 수가 없군요..
그리고 웹서버에 저것만 설치하면 되는건가요? DB2 쪽에는 아무런 셋팅을 해주지 않아도
되는지? 잘 아시는 분 있으면 꼭 답변 좀 부탁드리겠습니다.
A :
Client Acess Express / AS400을 문의하려면,IBM 대표 전화(02-3781-7114)로 전화하여
DB2/400 팀 전화번호를 아신다음, 그 팀과 상의하셔야 될 것 같습니다.
저희는 DB2/Windows,UNIX,Linux와 ASP와의 연계부분만을 테스트했습니다.
다른 솔루션은 DB2 connect/Windows,UNIX,Linux를 통해 DB2/400의 DB를 로컬 DB로
사용할 수 있게 DRDA구성을 한 다음, 웹 서버/Windows와 ASP 연동을 하는 것입니다.
기타
<참고 – SQL작성시 고려사항>
1) 인덱스 사용을 가급적 많이 합니다. 정의된 인덱스에 Match되는 Predicate를
가능한 사용합니다.
예) 테이블 : T_ADDRESS
인덱스 : T_STREET, T_NUMBER, T_NAME
SQL문 : SELECT * FROM T_ADDRESS WHERE T_STREET =
’SUNSET BLVD’
2) Sort를 피합니다.
▶ WHERE절의 컬럼이 Unique하다면, 굳이 DISTINCT를 코딩하지 않습
니다.
▶ ORDER BY절의 Column List를 최소화합니다.
▶ Join query할 때, 인덱스가 있는 테이블의 컬럼에 대해서 ORDER BY를
선택합니다.
▶ 불필요한 ORDER BY와 GROUP BY는 피합니다.
3) CPU 비용을 최소화합니다.
▶ 불필요하거나 중복되는 Predicate를 제거합니다.
▶ 불필요한 컬럼 선택을 피합니다. (특히 DISTINCT 또는 UNION)
4) ‘%’ 나 ‘_’로 시작하는 LIKE문 사용을 피합니다.
5) 실제로 Update될 컬럼에 대해서만 ‘FOR UPDATE OF’를 명시합니다.
6) Stage 2 predicate보다는 Stage 1 predicate를 사용합니다.
7) Filtering이 높은 Predicate를 먼저 씁니다.
기타
8) 불필요한 컬럼이 선택되지 않도록 합니다.
9) 같은컬럼에 대해서 ‘>= AND <=’ 대신에 ‘BETWEEN’을, ‘OR’ 를 여러번
사용하는 것보다는 ‘IN’을 사용합니다. 이는 코딩시간을 줄이고, 이해를
쉽게 합니다.
10) 모든 Predicate가 가능한 한 Indexable하도록 쓰여져 있는지 검토합니다.
▶ 불필요한 또는 중복적인 Predicate가 있나 ?
▶ 테이블의 컬럼과 해당 Host Variable의 Data Type이 일치하는지 ?
11) REORG 작업이 필요한지 검토합니다. REORG작업은 Access Performance
향상과 단편화 된 공간을 회복하기 위해서 Tablespace나 인덱스를 재편성
합니다. DB2 Object에 대량의 변경이 발생하였다면 REORG 작업을 해야
합니다.
12) RUNSTATS 작업이 필요한지 검토합니다. DB2는 BIND시Catalog의 정보를
이용해 Access Path를 결정하므로 항상 최신의 정보가 유지되도록 합니다.
13) Join 고려 사항
① Join에 참가하는 데이터를 줄입니다.
▶ Join되는 테이블의 수를 제한합니다.
▶ Select list를 제한합니다.
▶ Filtering을 최대한 높입니다.
▶ 모든 테이블에 적절한 Predicate를 코딩 합니다.
▶ 인덱스 된 컬럼들을 참조합니다.
▶ Stage 1 predicate을 사용합니다.
② Join컬럼에 대해서 인덱스를 만듭니다.
③ Join컬럼에 대해서 데이타 타입과 길이를 같게 합니다.
기타
<참고 - 백업 받다가 SQL3706N 발생할 때의 조치방법>
SQL3706N "/01BKUP"에서 디스크 가득 참 오류가 발견되었습니다.
03/01BKUP>ls -l
-rw-r----- 1 inst1 dbadm 2147483647 8월 5일 07:04 DSCC01.4.inst1.NODE0000.CATN0000.19991
백업도중에 다음과 같이 메세지가 나오면 ?
(filesystem에 공간이 있는데도 가득 찼다고 하는것은 file 최대 size가 2 gbyte를 넘지 못하기 때문에)
==> 03/01BKUP>db2 "backup db dscc01 tablespace(SSRLRV02,SSRLXV02) online"
SQL2059W 장치가 가득 찼음을 알리는 경고가 장치 "/01BKUP"에 대해 표시되었습니다.
계속하시겠습니까(c), 이 장치만을 종료하시겠습니까(d), 유틸리티를 중단하시겠습니까(t) ? (c/d/t) c
백업 성공. 이 백업 이미지에 대한 시각 : 19990805100413
=> 위와 같은 문제를 해결하려면
-> ( root user 가 filesystem 의 i-node size 를 8192 로 변경한다.
기타
<참고 - sql1034c ffff f92c 에러 발생시 에러 대처방법>
원인 :
1. Db2diag.log 에서 Index에 관련된 Error Message 나타남
2. Db2dart 수행결과 Error가 검출된 Index에서 중복적으로 장애가 발생함.
조치 :
1. 모든 Index 의 Recreation 작업
- . Database Offline Image backup 수행
- . db2look 으로 현재 DB 구조를 조사함.
- . db2look 으로 검출된 모든 Index Drop 수행
- . db2look 으로 검출된 모든 Index Creation 수행
==> log file 내용
2000-07-15-09.54.42.629963 Instance:db2inst1 Node:000
+85770 PID:43010(db2agent (DSCTIA01)) Appid:AC11425F.0413.000715001853
+85771 index_managersqlischd.proc_leaf Probe:2 Database:DSCTIA01
+85772
+85773 DiagData
+85774 ffff f92c...,
+85851 PID:43010(db2agent (DSCTIA01)) Appid:AC11425F.0413.000715001853
+85852 index_manager sqlischd Probe:99 Database:DSCTIA01
+85853
+85854 Obj={10;5;INX} Par={9;5} pagenum: 0003 88a8 ...
기타
+85855
+85856 Dump File:/db2dump/43010.000 Data:SQLI_CB
+85857 Dump File:/db2dump/43010.000 Data:SQLI_SDGLOB
+85858 Dump File:/db2dump/43010.000 Data:SCHD_LOCAL
+85859 Dump File:/db2dump/43010.000 Data:TRACE_DATA
85894 2000-07-15-09.54.44.218701 Instance:db2inst1 Node:000
+85895 PID:43010(db2agent (DSCTIA01)) Appid:AC11425F.0413.000715001853
+85896 index_manager sqlidelk Probe:99 Database:DSCTIA01
+85897 DIA3841C 색인 키를 찾을 수 없었습니다. 그 값은 ""이었습니다.
+85898
+85899 ZRC=FFFFF92C
+85900
+85901 String Title: PID:43010 Node:000
+85902 Obj={10;5;INX} Par={9;5} RID=x63AF411
+99965 2000-07-15-10.32.33.142318 Instance:db2inst1 Node:000
+99966 PID:43010(db2agent (DSCTIA01)) Appid:AC11425F.0413.000715001853
+99967 base_sys_utilities sqleTermDbConnect Probe:5 Database:DSCTIA01
+99968 DIA3727C 데이타베이스가 손상된 것으로 표시되었습니다.
+99969
+99970 ZRC=FFFFE11A
+99971
+99972 2000-07-15-10.32.51.586641 Instance:db2inst1 Node:000
+99973 PID:47560(db2agent (DSCTIA01)) Appid:AC11425C.0432.000715013236
+99974 base_sys_utilities sqledint Probe:0 Database:DSCTIA01
+99975
+99976 Crash Recovery is needed.
+99977
+99978 2000-07-15-10.33.05.653937 Instance:db2inst1 Node:000
+99979 PID:47560(db2agent (DSCTIA01)) Appid:AC11425C.0432.000715013236
기타
+99980 data_protection sqlpresr Probe:0 Database:DSCTIA01
+99981 DIA3908W 시스템 이상 복구(crash recovery)가 시작되었습니다.
+99982
+99983 2000-07-15-10.33.05.685835 Instance:db2inst1 Node:000
+99984 PID:47560(db2agent (DSCTIA01)) Appid:AC11425C.0432.000715013236
+99985 data_protection sqlpresr Probe:0 Database:DSCTIA01
+99986
+99987 Low transaction lsn: 0005 9e3b eebb ...;..
+99990 2000-07-15-10.33.05.786050 Instance:db2inst1 Node:000
+99991 PID:47560(db2agent (DSCTIA01)) Appid:AC11425C.0432.000715013236
+99992 data_protection sqlpresr Probe:0 Database:DSCTIA01
+99993
+99994 Minimum buffer lsn: 0005 9e3b 894f ...;.O
+99996
+99997 2000-07-15-10.33.06.996121 Instance:db2inst1 Node:000
+99998 PID:47560(db2agent (DSCTIA01)) Appid:AC11425C.0432.000715013236
+99999 data_protection sqlpresr Probe:50 Database:DSCTIA01
+100000 DIA3909W 시스템 이상 복구(crash recovery)가 완료되었습니다.
기타
<참고 – Oracle DB2>
Q :
Oracle에서....substr, instr 이라는 함수는 DB2에서 어떤 함수인지 알려주세요.
A :
Substr(substring)은 DB2에서는 문자열의 n번째부터 n번째까지를 리턴하는 함수입니다.
사용 방법은 substr("string,n,n) 이고 예를 들어 name 컬럼의 데이터가 samson 있다면
substr("name ,1,4) 하게 되면 sams 만 리턴이 되는 거죠.
instr 같은 기능은 DB2에 없습니다. UDF를 만들어서 사용하세요.
기타
Q :
Oracle에서 서버쪽의 날짜를 읽어오려면
select to_char(sysdate, yyyy/mm/dd ) from dual
이런 형식으로 읽어올 수 있는데. DB2에서는 어떻게 읽어와야 되죠??
A :
[ 해결책 ]
오늘 날짜 구하기
==> values(current timestamp)
values(current date)
values(current time)
values 함수를 이용하면 됩니다.
[ 예 제 ]
>db2 "values(current date)"
1
----------
2000-06-29
1 record(s) selected.
기타
>db2 "values(current timestamp)"
1
--------------------------
2000-06-29-00.53.17.930772
1 record(s) selected.
아니면 아래처럼 system catalog를 조회해보면 되겠지만 값이 여러개면
distinct 를 추가하거나 where 조건을 추가하여 조회하면 됨.
>db2 "select current date from syscat.dbauth "
1
----------
2000-06-29
2000-06-29
2 record(s) selected.
기타
Q :
Oracle에서 rownum이라는게 있는데 DB2에는 없나요??
이와 비슷한게 있을 듯 한데.
A :
Oracle의 rownum 기능은 limit와 count 기능을 수행 할 수 있습니다.
Limit에 해당하는 DB2의 기능이라면 fetch first n rows only option 입니다..
(v5.0 인가 5.2부터제공 되었습니다.. 제가직접 test)
=> 원하는 갯수만큼의 row를 얻을 수 있습니다.
[예제]
select * from aaa where rownum < 6
라고 쿼리하면 5건의 레코드가 출력됩니다.
db2에서는 어떤식으로 구현하나요 ?
-> select * from aaa fetch first 5 rows only
* OPTIMIZE FOR n ROWS 라는 명령이 있는데 이것은
옵티마이저가 plan를 세울때 사용되는데
host db2에서는 fetch first n rows only이제공 되었습니다.
기타
또한 count의 기능을 할 수 있는 DB2 기능중에 DB2 V7.1 이상에서 제공돼는
Identity Column 기능이 있습니다.
Table을 만드실때 sequential num로 사용할 column에 대해 정의를 하시면
(시작 번호와 증가분을 정의할 수 있음 ) Data insert 시에 Table안에 자동으로 Sequential
Number가 들어갑니다.
CREATE TABLE TESTTB
(TEST INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE )
,NAME VARCHAR (15)
,YEAR INTEGER ) ;
위와 같은 경우라면 데이터 Insert 시에 TEST 컬럼에 초기치 1, 증가치 1로 자동으로 값이 저장됩니다.
제어센터에서 테이블을 만드는 경우에 컬럼 데이터 유형이 Integer, BIGINT, SMALLINT, DECIMAL 이라면 컬럼내용생성 이라는 체크 박스가 활성화 됩니다. 체크박스에 체크를 하고 초기치와 증가치를 설정해주면 됩니다.
위와 같이 만들어진 테이블 이라면
데이터를 Insert 하고 나면 다음과 같은 결과가 나옵니다.
TEST NAME YEAR
----------- --------------- ----------
1 bae 30
2 bat 26
3 KIM 21
기타
Q :
to_char(), to_number(), to_date() DB2에서 어떻게 되나요?
A :
DB2에서는 아래와 같이 유형변환(casting)합니다. 방법이 조금 틀리죠 ?
1. Oracle의 TOCHAR는 DB2의 CHAR입니다. 굉장히 많은 경우가 있는데, 여기서는
한 가지 예만 들겠습니다.
(예) 테이블에 있는 생일 이라는 컬럼에 1992-09-02 에 해당하는 값이 있을때,
CHAR( 생일, USA ) 라고 하면, 결과값은 문자값으로 09/02/1992 가
출력됩니다. (참고 : DB2에서는 컬럼명이 한글도 됩니다)
2. Oracle의 TODATE는 DB2의 DATE입니다.
(예) DATE( 1999027 ) 이라고 쓰면, 해당 컬럼에는 1999-01-27의 외부형태로 저장됩
니다.
DATE(35)라고 쓰면 ? 0001-02-04 의 형태로 변환됨.
db2에서는 data 형이 기본적으로 YYYY-MM-DD 형태이고,
이것을 프로그램에서는 char(10) 로 선언합니다.
아래 오라클같이 다양한 function이 있진 않구요.
년월일을 자르려면 substr을 써야 하구요.
기타
Q :
Oracle에서의 sql 문을 제가 DB2로 바꿨는데...
################################################################################
DBA2191E SQL 실행 오류.
com.ibm.db.DataException: 데이터베이스 관리 프로그램에서 오류가 발생했습니다. :
[IBM][CLI Driver][DB2/NT] SQL0104N ")" 다음에 예기치 않은 토큰 ""이(가) 있었습니다.
예상된 토큰은 다음을 포함할 수 있습니다: "AS". SQLSTATE=42601
################################################################################
이런 에러가 납니다.
기타
Oracle 쿼리
###########################################################################################################
select ltrim(rtrim(A.prodname)) prodname, '<a href="propdetailservlet?type=gradeDetail&path=grdppt&grade=' ||
decode ( instr(ltrim(rtrim(A.gradename)), ' ', 1, 1), '0', ltrim(rtrim(A.gradename)),
substr(ltrim(rtrim(A.gradename)), 1,instr(ltrim(rtrim(A.gradename)), ' ', 1, 1) - 1) ||
'_' || substr(ltrim(rtrim(A.gradename)), instr(ltrim(rtrim(A.gradename)), ' ', 1, 1) + 1) ) || '">' ||
ltrim(rtrim(A.gradename)) ||
'</a>' gradename, B.Z0320, B.Z0570, B.Z0460, B.Z0600, B.Z0700 from lgtc_gradeinfo_t A,
( select gradename, Z0320, Z0570,Z0460, Z0600, Z0700
from ( select gradename, sum(decode(physicode, '0320', stdvalue, null)) ||
sum(decode(physicode, '0321', stdvalue, null)) ||
sum(decode(physicode, '0340', stdvalue, null)) ||
sum(decode(physicode, '0342', stdvalue, null)) ||
sum(decode(physicode, '0350', stdvalue, null)) ||
sum(decode(physicode, '1530', stdvalue, null)) "Z0320",
sum(decode(physicode, '0570', stdvalue, null)) ||
sum(decode(physicode, '0571', stdvalue, null)) ||
sum(decode(physicode, '0572', stdvalue, null)) ||
sum(decode(physicode, '0580', stdvalue, null)) ||
sum(decode(physicode, '0581', stdvalue, null)) ||
sum(decode(physicode, '0582', stdvalue, null)) ||
sum(decode(physicode, '4030', stdvalue, null)) ||
sum(decode(physicode, '4031', stdvalue, null)) ||
sum(decode(physicode, '4032', stdvalue, null)) ||
sum(decode(physicode, '4033', stdvalue, null)) "Z0570",
sum(decode(physicode, '0460', stdvalue, null)) ||
sum(decode(physicode, '0471', stdvalue, null)) ||
sum(decode(physicode, '0480', stdvalue, null)) ||
sum(decode(physicode, '0481', stdvalue, null)) ||
sum(decode(physicode, '0490', stdvalue, null)) "Z0460",
기타
sum(decode(physicode, '0600', stdvalue, null)) ||
sum(decode(physicode, '0610', stdvalue, null)) ||
sum(decode(physicode, '0611', stdvalue, null)) ||
sum(decode(physicode, '0612', stdvalue, null)) ||
sum(decode(physicode, '0613', stdvalue, null)) ||
sum(decode(physicode,'0620', stdvalue, null)) "Z0600",
sum(decode(physicode, '0700', stdvalue, null)) "Z0700"
from ( select gradename, ltrim(rtrim(physicode)) physicode, ltrim(rtrim(stdvalue)) stdvalue
from lgtc_gradeprop_t where ltrim(rtrim(physicode))
in ( '0320', '0321', '0340', '0342', '0350', '1530', '0570', '0571', '0572', '0580', '0581', '0582', '4030',
'4031', '4032', '4033', '0460', '0471', '0480', '0481', '0490', '0600', '0610', '0611', '0612', '0613', '0620', '0700' )
and ltrim(rtrim(stdvalue)) not in ('-', ' ') and substr(ltrim(rtrim(stdvalue)), 1, 1)
not in ('<', '>') group by gradename, physicode, stdvalue ) group by gradename )
where Z0320 between 1 and 11111 and Z0570 between 1 and 11111 ) B
where A.gradename = B.gradename
###########################################################################################
기타
바꾼 DB2 쿼리문....
###########################################################################################################
select ltrim(rtrim(A.prodname)) prodname, '<a href="propdetailservlet?type=gradeDetail&path=grdppt&grade=' ||
(case posstr(ltrim(rtrim(A.gradename)), ' ') when '0' then ltrim(rtrim(A.gradename))
else substr(ltrim(rtrim(A.gradename)), 1, posstr(ltrim(rtrim(A.gradename)), ' ') - 1) ||
'_' || substr(ltrim(rtrim(A.gradename)), posstr(ltrim(rtrim(A.gradename)), ' ') + 1) end ) || '">' ||
ltrim(rtrim(A.gradename)) ||
'</a>' gradename, B.Z0320, B.Z0570, B.Z0460, B.Z0600, B.Z0700 from lgtc_gradeinfo_t A,
( select gradename, Z0320, Z0570, Z0460, Z0600, Z0700
from ( select gradename, sum(case physicode when '0320' then stdvalue else null end) ||
sum(case physicode when '0321' then stdvalue else null end) ||
sum(case physicode when '0340' then stdvalue else null end) ||
sum(case physicode when '0342' then stdvalue else null end) ||
sum(case physicode when '0350' then stdvalue else null end) ||
sum(case physicode when '1530' then stdvalue else null end) "Z0320",
sum(case physicode when '0570' then stdvalue else null end) ||
sum(case physicode when '0571' then stdvalue else null end) ||
sum(case physicode when '0572' then stdvalue else null end) ||
sum(case physicode when '0580' then stdvalue else null end) ||
sum(case physicode when '0581' then stdvalue else null end) ||
sum(case physicode when '0582' then stdvalue else null end) ||
sum(case physicode when '4030' then stdvalue else null end) ||
sum(case physicode when '4031' then stdvalue else null end) ||
sum(case physicode when '4032' then stdvalue else null end) ||
sum(case physicode when '4033' then stdvalue else null end) "Z0570",
sum(case physicode when '0460' then stdvalue else null end) ||
sum(case physicode when '0471' then stdvalue else null end) ||
sum(case physicode when '0480' then stdvalue else null end) ||
sum(case physicode when '0481' then stdvalue else null end) ||
sum(case physicode when '0490' then stdvalue else null end) "Z0460",
sum(case physicode when '0600' then stdvalue else null end) ||
sum(case physicode when '0610' then stdvalue else null end) ||
기타
sum(case physicode when '0611' then stdvalue else null end) ||
sum(case physicode when '0612' then stdvalue else null end) ||
sum(case physicode when '0613' then stdvalue else null end) ||
sum(case physicode when '0620' then stdvalue else null end) "Z0600",
sum(case physicode when '0700' then stdvalue else null end) "Z0700"
from ( select gradename,ltrim(rtrim(physicode)) physicode, ltrim(rtrim(stdvalue)) stdvalue
from lgtc_gradeprop_t where ltrim(rtrim(physicode))
in ( '0320', '0321', '0340', '0342', '0350', '1530', '0570', '0571', '0572', '0580', '0581', '0582', '4030',
'4031', '4032', '4033', '0460', '0471', '0480', '0481', '0490', '0600', '0610', '0611', '0612', '0613', '0620', '0700' )
and ltrim(rtrim(stdvalue)) not in ('-', ' ') and substr(ltrim(rtrim(stdvalue)), 1, 1)
not in ('<', '>') group by gradename, physicode, stdvalue ) group by gradename )
where Z0320 between 1 and 11111 and Z0570 between 1 and 11111 ) B
where A.gradename = B.gradename
###########################################################################################
A :
DB2 에서는 From 절에 SubQuery로 레코드 셋을 지정하는 경우에 레코드 셋 이름전에 AS를
붙여 줘야 합니다. 즉
Select …
From (Select ………… FROM ……..) AS B
Where …..
이런 식으로 해야 하는 거죠. 만드신 SQL문에 From 절에서 AS 가 빠졌네요.
기타
Q :
오라클 데이터를 DB2로 어떻게 이동 시킬수 있나요?
A:
방법은 여러가지가 있습니다.
첫째, 직접 DATA를 export하여 받아 내려서 (.dat File) 이를 script
(Oracle Schema와 같은 DB authroty, previlege는 별도 생성 및 적용 script)를 이용해 DB2
Table로 import하여 이동하실 수도 있고,
둘째, DB2 UDB V7.1이라면 (Relational Connect Feature를 이용해서)
직접 Oracle Table에 access해서 Table상의 data를 읽어올 수도 있습니다.
(마치 DB2의 Table인양)
세째, SQL-CW (www.mantech.com)와 같은 별도의 Oracle DB -> DB2 DB
DB Migration Tool을 이용할 수 도 있습니다.
제가 지금 떠오르는 건 일반적으로 저렇게 3가지 방법으로 데이타 이동이 가능하다라고
말씀드릴 수 있겠구요. 또다른 방법이 있는지는 잘 모르겠습니다.
(제 Oracle 실력이 좀 딸려서^^)
제가 알고 있기론 Oracle DataFile을 직접 DB2로 이동할 수 있는 방법은 없으니, 3가지 정도로
말씀드릴 수 있을거 같습니다.
둘째, 세째에 대한 자세한 방법은 DB2 UDB V7.1 Relational Connect에 대한 정보와 위의
URL에 접속하셔서 찾아보시면 될 것 같습니다.
기타
Q :
oracle의 desc명령어 같은건 없나요?
A :
describe문이 있습니다.
db2 describe select * from employee
하시면 employee 테이블의 구조를 보실 수가 있습니다.
특정 칼럼의 구조만 보고 싶을때는 * 대신 칼럼명을 지정해 주시면 됩니다.
'DataBase > DB2' 카테고리의 다른 글
DECIMAL형의 데이터를 CHAR로 바꿀때 '0....00' 없애기. (0) | 2009.09.18 |
---|---|
DB2 테이블 수정시 잠김 Table Lock 해결 (0) | 2009.05.06 |
DB2 자주 쓰는 함수 모음. (0) | 2009.02.27 |