728x90

jip102님 | 2013-09-03 20:10:24


안녕하세요. 관련된 사항에 대해 질문을 드리고자 글을 올립니다.
DBMS : DB29.5 Fixpack10 
WAS    : Tmax의 JEUS
을 사용하고 있습니다.
application을 모니터링하다보면 
appl Name        :  db2jcc_application
appl Status        :  Executing
Stmt operation  :  Sql Prepare
인데 이게 "Lock Waiting" 을 많이 유발합니다.(Lock Holder)
관련하여 "Sql Prepare" 의 상태가 어떤일을 하는지 Tool 이나 snapshot을 떠보아도 보이지 않는데,
이게 왜 이렇게 Lock Wating을 유발할까요? 




pajama 2013-09-04 00:40:53
안녕하세요. sql prepare라고 하면 sql문을 실행하기 위한 준비작업이라고 보시면 됩니다.
db의 카탈로그 테이블을 참조할때 내부적으로 Lock을 사용하기 때문에 다른 세션에서 Lock Waiting이 발생할 수 있습니다.


728x90
728x90

jnmallcom님 | 개발 | 2013-09-01 17:38:12


php에서 갑자기
odbc_connect() 함수에서 10초 딜레이가 발생합니다.
거의 정확하게 10초 입니다.

0.1초 걸려야 하는데, 왜 그럴까요..




pajama 2013-09-01 22:54:59
가능하시다면 db2 클라이언트에서 리모트서버로 연결테스트를 해보십시오.
그리고 iptables, 방화벽을 확인해보시기 바랍니다.

jnmallcom 2013-09-01 23:44:03
동일 클라이언트 서버에 php와 jsp 설치되어 있는데 php에서 odbc_connect()함수 호출하면 10초 지나서 커넥션되요. jsp에서는 바로 커넥션되고.

pajama 2013-09-02 00:50:27
jsp는 jdbc드라이버, odbc는 db2 cli 드라이버로 접속하기 때문에 접속방법이 다릅니다.
jsp에서 정상적으로 접속이 되신다고 하니 db에 이상은 없는 걸로 보이는데요.
클라이언트 환경에서 CLI/ODBC bind 파일을 다음과 같이 db2 bind 명령으로 수행한후 다시 확인해보세요. (DB2 9.7버전 기준입니다)

db2 bind ~/sqllib/bnd/@db2cli.lst blocking all sqlerror continue messages cli.msg grant public

그 문제가 아니라면 DB2 클라이언트에서는 DB 카탈로그 내역, db2cli.ini 파일 설정을 살펴봐야 할것같습니다.

참조
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.apdv.cli.doc/doc/t0006343.html



728x90
728x90

DB는내운명님 | 2013-08-29 17:42:54


db2 관해서 검색 중에...

$ db2logsForRfwd DB2TSCHG.HIS –all

----------------------------------------------------------

Log file number : S0000000.LOG

First New Record LSN : 00000138800C

Log Extent Tail LSN : 000001770000

Backup End Time Stamp : 0

Flags : 107

pID : 1209781597 2008-05-03-02.26.37.000000 GMT

cID : 1215376321 2008-07-06-20.32.01.000000 GMT

Tablespace ID :

----------------------------------------------------------

Log file number : S0000001.LOG

First New Record LSN : 00000177000C

Log Extent Tail LSN : 000001B58000

Backup End Time Stamp : 0

Flags : 107

pID : 1215376321 2008-07-06-20.32.01.000000 GMT

cID : 1215376322 2008-07-06-20.32.02.000000 GMT

Tablespace ID :

----------------------------------------------------------

Log file number : S0000002.LOG

First New Record LSN : 000001B5800C

Log Extent Tail LSN : 000001F40000

Backup End Time Stamp : 0

Flags : 107

pID : 1215376322 2008-07-06-20.32.02.000000 GMT

cID : 1215376323 2008-07-06-20.32.03.000000 GMT

Tablespace ID : 0 2

---------------------------------------------------------------------------
DB2TSCHG.HIS 파일을 이용해 LSN과 timestamp를 조회하는 중입니다.

설명으로는 LSN과 timestamp를 조회할수 있다고 합니다. 그런데 결과에 back end timestamp가 0으로 나와있습니다. 

왜 back end timestamp가 0으로 나오는지 궁금합니다. 

그리고 LSN과 TIMESTAMP를 동시해 조회할 수 있는 명령어는 $ db2logsForRfwd DB2TSCHG.HIS –all -> 이 명렁어가 맞나요?

아님 다른 명렁어가 있나요?

고수님들의 답변 부탁 드립니다.




pajama 2013-08-29 18:56:54
list backup history 명령에서 필요한 로그파일 번호가 표시되어있습니다.

backup end time stamp는 리스토어 할때 마지막에 필요한 로그파일에 기록되는 것 같습니다.

백업했을 때 아래와 같이 로그파일 2번까지 백업이 되었습니다.


Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
B D 20130829182137001 N D S0000002.LOG S0000002.LOG
----------------------------------------------------------------------------
Contains 5 tablespace(s):

00001 SYSCATSPACE
00002 USERSPACE1
00003 IBMDB2SAMPLEREL
00004 IBMDB2SAMPLEXML
00005 SYSTOOLSPACE
----------------------------------------------------------------------------
Comment: DB2 BACKUP SAMPLE onLINE
Start Time: 20130829182137
End Time: 20130829182142
Status: A
----------------------------------------------------------------------------
EID: 10 Location: /home/db2inst1


백업이 끝난 시점이 기록된 로그파일에는 아래와 같이 time stamp 값이 기록되었습니다.

----------------------------------------------------------
Log file number : S0000001.LOG
First New Record LSN : 0000000002710010
Log Extent Tail LSN : 0000000002AFC000
Backup End Time Stamp : 0
Flags : 107
pID : 1377763120 2013-08-29-07.58.40.000000 GMT
cID : 1377763121 2013-08-29-07.58.41.000000 GMT
Tablespace ID :
----------------------------------------------------------
Log file number : S0000002.LOG
First New Record LSN : 0000000002AF8010
Log Extent Tail LSN : 0000000002EE4000
Backup End Time Stamp : 521f12a6
Flags : 107
pID : 1377763121 2013-08-29-07.58.41.000000 GMT
cID : 1377763122 2013-08-29-07.58.42.000000 GMT
Tablespace ID : 0 3
----------------------------------------------------------


매뉴얼에서는 해당 내용을 찾을 수가 없네요.

DB는내운명 2013-08-30 08:59:21
답변 감사합니다. 그러면 로그 시퀀스 넘버 하고 타임스탬프를 동시해 조회할수 있는 명령어는 없는건가요?

pajama 2013-08-30 11:33:39
다른 유틸리티나 솔루션이 있을지도 모르겠습니다만 말씀하신 명령으로 보시는게 맞을 것 같습니다.

-all 옵션으로 했을 때
해당 로그파일의 lsn 범위 (First New Record LSN, Log Extent Tail LSN),
해당 로그파일의 timestamp 범위 (pID, cID)
를 참조하시면 되겠습니다.

아마 찾으셨을지 모르겠습니다만 다음 블로그 내용을 참고하십시오.

http://blog.naver.com/darkich/140057050670
http://radheshk.blogspot.kr/2008/07/peek-on-db2-log-record.html



728x90
728x90

SON님 | 2013-08-29 16:27:18


안녕하세요?

HADR 구성 테스트 중입니다.

Primary 서버의 DB2 계정은 db2inst1 으로 구성하였고,
Standby 서버의 DB2 계정은 db2inst2 로 구성하였습니다.

Primary 에서 Sample DB 에 대해 HADR 구성은 잘 되었는데,
Standby 에서 Readonly 로 접속하여 조회를 해보니, 오류가 발생하네요.
(테스트용 테이블로 'test' 를 만들었습니다,)
 
select * from test 를 수행하니, 'test' 파일을 찾지 못한다고 나오고,
select * from db2inst1.test 라고 수행하니 권한이 없다고 나옵니다.

HADR 구성시 Primary 와 Standby 의 OS 계정명을 동일하게 하면 해결될거 같긴 합니다만,
다르게 할 경우에도 데이터가 조회 가능하게 할 수 있을까요?




pajama 2013-08-29 17:35:14
인포센터 노트에 보면 인스턴스명이 같을필요는 없다고 합니다.

Determine the host name, host IP address, and the service name or port number for each of the HADR databases.
If a host has multiple network interfaces, ensure that the HADR host name or IP address maps to the intended one. You need to allocate separate HADR ports in /etc/services for each protected database. These cannot be the same as the ports allocated to the instance. The host name can only map to one IP address.

Note: The instance names for the primary and standby databases do not have to be the same.

권한은 primary에서 standby 인스턴스명인 db2inst2에 아래와 같이 권한을 주시면 됩니다.

grant select on db2inst1.test to user db2inst2


SON 2013-08-30 10:53:05
자세한 설명 감사합니다~



728x90
728x90

스캇님 | 쿼리 | 2013-07-29 12:00:39


안녕하세요. db2 as400을 사용하고 있습니다. 오라클 같은경우는 lead 함수 이용해서 바로 될것 같은데 잘 되지 않네요.
아래와 같은 쿼리는 어떻게 만들어야 되나요? 

고수님들 한수 부탁 드리겠습니다
.

테이블 : emp 

sdate

sabn

etc

20121022

10000

휴가

20130121

10000

휴직

20130601

10000

경영지원


아래의 결과로 도출

sdate

edate

sabn

etc

20121022

20130121

10000

휴가

20130121

20130601

10000

휴직

20130601

현재

10000

경영지원




pajama 2013-07-29 13:41:06
참고하시기 바랍니다.

with emp(sdate,sabn,etc)
as (
values ('20121022',10000,'휴가')
union all values ('20130121',10000,'휴직')
union all values ('20130601',10000,'경영지원')
)
select
sdate,
lead(sdate,1,'현재')over(order by sdate) as edate_1,
coalesce(min(sdate)over(partition by 1 order by sdate rows between 1 following and 1 following), '현재') as edate_2,
sabn, etc
from emp;


http://stackoverflow.com/questions/8124756/teradata-equivalent-for-lead-and-lag-function-of-oracle
http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0000780.htm

스캇 2013-07-29 15:32:10
ㅠㅠㅠ. 안되네요. 근데. coalesce(min(sdate)over(partition by 1 order by sdate rows between 1 following and 1 following), '현재') as edate_2, -> 빼야 되지 않나요? 제가 원하는 결과는 sdate,edate,sabn,etc 만 있으면 되는데요..

pajama 2013-07-29 17:24:07
lead 함수는 비교용으로 만든것인데 빼고 실행하셔도 안되시는지요? 

with emp(sdate,sabn,etc)
as (
values ('20121022',10000,'휴가')
union all values ('20130121',10000,'휴직')
union all values ('20130601',10000,'경영지원')
)
select
sdate,
coalesce(min(sdate)over(partition by 1 order by sdate rows between 1 following and 1 following), '현재') as edate
sabn, etc
from emp;

스캇 2013-07-29 20:30:09
감사드립니다. 많은 도움 되었습니다. 항상 행운이 있기를 기원합니다.



728x90
728x90

DB는내운명님 | 2013-07-18 18:32:26


db2를 배우고 있습니다. 

v 9.7.7. 일때  

db2 "decribe select nvl('20130101010101', sysdate) from sysibm.sysdummy1"
 
결과 는 SQL TYPE  이 VARCHAR로 나왔습니다. 

db2 v9.7.4 에서는 SQL TYEP이 TIMESTAMP로 나옵니다. 

왜 V9.7.7 에서는 SQL TYPE이 VARCHAR로 나오는 걸까요? 




pajama 2013-07-19 02:17:10
안녕하세요. 테스트를 하다가 저도 혼동이 왔는데요 정리를 해보겠습니다.
테스트 환경은 DB2 9.7, 오라클호환모드 설정했습니다.

우선 예로 들어주신 쿼리 결과는 아래와 같았습니다.

① DB2 9.7.0.0
db2 "select nvl('20130101010101', sysdate) from sysibm.sysdummy1"

1
-------------------
2013-01-01-01.01.01


② DB2 9.7.0.8
$ db2 "select nvl('20130101010101', sysdate) from sysibm.sysdummy1"

1
-------------------
20130101010101

결과가 이렇게 나오니 앞의 것은 TIMESTAMP, 뒤의 것은 VARCHAR가 나올 수 밖에 없었습니다.

DB2의 NVL은 COALESCE 함수와 같습니다. 9.5부터 동일하게 사용되었습니다.
아시겠지만 오라클에서는 COALESCE와 NVL의 기능이 좀 다른데요. DB2는 같아서 혼동이 왔습니다.
어쨌든 결과적으로 COALESCE 함수를 썼을때 동일한 결과가 출력됩니다.

그리고 위의 결과
2013-01-01-01.01.01 이것이 나온이유는 대체..

인포센터를 좀 천천히 읽어보니 인수는 호환가능해야 한다고 합니다. 그리고 필요한 경우 변환이 된다고 합니다. sysdate는 current timestamp와 동일하기 때문에 20130101010101이 2013-01-01-01.01.01과 같은 TIMESTAMP 형식으로 변환이 되는 것 같습니다. 어느것을 기준으로 변환이 되는지는 모르겠습니다. 가능하면 같은 타입을 쓰는 것이 좋겠네요.
예) db2 "select coalesce('20130101010101', cast(sysdate as varchar)) from sysibm.sysdummy1"

그러면 밑에 NVL은 왜 20130101010101이 나왔는지..
오라클호환모드로 DB가 작동하기 때문에 오라클의 NVL함수와 동일하게 작동하기 때문에 그렇습니다.
사실 인포센터나 Developerworks를 보면 9.7버전 Fix Pack 5부터 오라클호환모드에서 NVL2 등의 오라클 함수를 지원한다고 되어있는데요.
아마 이시점부터 오라클 방식의 NVL함수도 같이 지원을 하는 것으로 보입니다.
Fix Pack 4까지는 오라클 호환모드를 켜도 DB2의 NVL(=COALESCE)함수로 작동하는 것으로 보이고요.

썩 정리가 잘 안된것 같습니다.
제가 잘못 알고 있는 부분은 다른분들께서 알려주시면 좋겠습니다.
참고하세요.


- NVL scalar function
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0052627.html
- COALESCE scalar function
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0000780.html
- DB2 10: Run Oracle applications on DB2 10 for Linux, UNIX, and Windows
http://www.ibm.com/developerworks/data/library/techarticle/dm-0907oracleappsondb2/


728x90
728x90

MRRRRR님 | 개발 | 2013-07-05 18:09:17


이것이 가능 한 것인지요? ㅠㅠ

알고 싶습니다.!




pajama 2013-07-05 18:48:22
방법은 두가지가 있습니다

1. sqlecrea API를 사용해서 데이터베이스를 만드는 방법인데 아래 pdf에서 검색해보시면 dbcreate.c 등의 데모소스에 대한 내용이 있습니다.
2. 스트립트를 호출해서 create database 문을 실행하는 방법

http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.admin.dbobj.doc/doc/t0004916.html
http://public.dhe.ibm.com/ps/products/db2/info/vr97/pdf/ko_KR/DB2AdminAPIRef-db2b0k970.pdf


728x90
728x90

쏘가리님 | 쿼리 | 2013-06-30 15:58:21


syscat.datapartitionexpression 과 syscat.datapartitions 를 제외하고 range partition 테이블인지  알수 있는 뷰와 칼럼이 있는지요?
syscat.tables에 있으면 좋겠는데 없는 것 같아서요...




pajama 2013-06-30 21:43:41
테이블이 range 파티션 구성인지 명시적으로 표시하는 컬럼은 없고 말씀하신 뷰를 사용하셔서 리스트를 추출하셔야 합니다

sdlove 2013-07-01 10:51:54
select tabschema, tabname, case when tableid < 0 then 'Y' else ' ' end as rangep from syscat.tables 로 확인해도 될듯 합니다.



728x90
728x90

DB는내운명님 | 쿼리 | 2013-06-27 18:39:52


db2를 배우고 있습니다.

CREATE TABLE db2test.G2 (
                  A DECIMAL(20,0) NOT NULL GENERATED BY DEFAULT AS IDENTITY (  
                    START WITH +1  
                    INCREMENT BY +1  
                    MINVALUE +1  
                    MAXVALUE +99999999999999999999  
                    NO CYCLE  
                    CACHE 20  
                    NO ORDER ) , 
                  B VARCHAR(14) , C VARCHAR(10) ) ;   
alter table db2test.g2 alter A set generated always ;
db2 "declare mycurs cursor for select * from db2test.g"
db2 "load from mycurs of cursor modified by identityoverride insert into db2test.g2 NONRECOVERAB
db2 "insert into G2 values ( defalut , '','') ;

 원본/복제 테이블을 생성 후  원본 테이블에 있는 데이터를 복제 테이블로 cursor  load를 했습니다. 그런데 원본 테이블과 복제 테이블의 값이 다르게 나옵니다. 

원본 테이블이 9까지 입력이 된 상태에서 load를 한 후, 복제 테이블에 1~9까지 값이 기록 됬는데, 복제 테이블에 insert를 하니까 다시 1부터 값이 입력이 되는것입니다. 

원본과 복제 테이블의 값이 똑같이 나올려면 어떻게 해야 되나요?




pajama 2013-06-27 21:20:24
로드를 다음과 같이 수행하면 IDENTITY 컬럼값을 생성합니다. 
db2 "load from mycurs of cursor method P(2,3) insert into db2test.g3 (b,c) NONRECOVERABLE"

만약에 원본테이블 값을 그대로 가져온다면 identityoverride 옵션으로 로드한 후에 identity 컬럼 시작값을 변경합니다.
db2 "alter table db2test.g3 alter column a restart with 10"

DB는내운명 2013-06-28 10:41:06
위에 내용 중 method P(2,3)은 어떤 의미 인가요?

pajama 2013-06-28 11:44:34
컬럼 순서를 지정하여 로드하는 방식입니다. 
위의 예는 P(2,3)이면 로드할 데이터의 2번째, 3번째 컬럼을 지정한 컬럼으로 로드합니다.



728x90
728x90

db2user님 | 개발/설치 | 2013-06-27 16:48:17


이번에 회사에서 DB를 리눅스 서버로 이전한다고 해서요.
그 전에 먼저 혼자 로컬에서 테스트를 해보려고 했는데 아는 게 없어 어려움이 많네요ㅜㅜ

db2 express-C를 우분투(Unbuntu 12)에 설치하던 중에 자꾸 실행이 안됩니다ㅜㅜ

db2_install을 이용해서 설치했구요, db2setup으로도 다시 설치했습니다.

그랬는데 db2inst1 계정으로 들어가서 db2를 치면 
No command 'db2' found
이런에러가 뜨네요
다른 계정으로도 동일한 에러가 발생하구요.

db2start도 안돼고, db2도 안먹히고 해서 어떻게해야할지 막막합니다ㅜㅜ





pajama 2013-06-27 17:08:12
안녕하세요 root 계정에서 db2ls 명령을 수행하면 db2 제품 설치 디렉토리가 표시됩니다.
실행이 안된다면 설치제품 파일에 포함되어 있습니다.

$ db2ls
Install Path Level Fix Pack Special Install Number Install Date Installer UID
---------------------------------------------------------------------------------------------------------------------
/opt/ibm/db2/V9.7 9.7.0.4 4 
/opt/ibm/db2/V10.5 10.5.0.0 0


인스턴스가 생성되었는지 확인해보십시오

$ /opt/ibm/db2/V9.7/instance/db2ilist
db2inst1


없다면 인스턴스를 생성하고 확인해보시길 바랍니다.
$ /opt/ibm/db2/V9.7/instance/db2icrt -u db2fenc1 db2inst1


db2user 2013-06-27 17:54:57
답변 감사합니다. 확인해보니 인스턴스는 잘 생성되었구요, bin디렉토리 안에서 ./db2를 실행하면 db2가 실행이 되긴 하는데요, 다른 경로에서 db2start같은 명령어들이 실행이 안됩니다. db2set같은 명령어도 실행이 안되구요. 다른 확인할 사항은 없나요?


pajama 2013-06-27 18:08:59
설치로그를 확인해보시는게 좋겠습니다.
/tmp 디렉토리에 db2setup.log db2icrt.log db2_install.log 가 있는데 파일에서 에러발생한 내역을 확인해보세요


db2user 2013-06-27 18:26:20
아!제가 질문을 잘못했네요. 설치는 제대로 다 되었습니다. 성공 메세지 뜬 것을 확인하고 db2를 시작하던 중에 모든 명령어가 되지 않아 질문을 했습니다. ^^;; 번거롭게 해드렸네요ㅜㅜ그런데 linux는 원래 bin폴더 밑에 db2set이 없나요??


pajama 2013-06-27 21:34:57
말씀하신 db2set은 adm디렉토리에 있습니다.

설치가 모두 정상적으로 되었다면 인스턴스 홈디렉토리에 sqllib 디렉토리가 있습니다.
sqllib 디렉토리에 있는 db2profile 스크립트를 실행하면 db2를 실행할 수 있는 환경변수등이 설정됩니다.

보통은 .bash_profile이나 .profile에서 실행이 되도록 변경이 됩니다.

예)
. /home/db2inst1/sqllib/db2profile



728x90

'Db2 > KDUG 2013 Q·A' 카테고리의 다른 글

range partition 인지 여부  (0) 2013.12.23
cursor load 질문  (0) 2013.12.23
db2dart 로 HWM 내릴때 HWM가 내려가지 않아 질문드립니다.  (0) 2013.12.23
질문드립니다.  (0) 2013.12.23
procedure 생성시 에러 입니다.  (0) 2013.12.23

+ Recent posts