database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
ㆍSybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Sybase Q&A 1286 게시물 읽기
No. 1286
ASIQ 의 Versioning 해결책을 알고싶습니다.
작성자
작성일
2005-09-14 19:59
조회수
5,250

여러분들 노고가 많습니다. 이번에 질문을 드리고자 하는 내용은

여기서도 가끔 올라온 문제인 Versioning 에 관해서입니다. 여기저기 찾아보고 했으나..ㅠ.ㅠ

과연 제가 하고자 하는게 되는건지 감이 안잡힙니다.

 

현재 상황을 말씀드리겠습니다.

 

DW ETT 툴인 DataStage 를 이용하여 여러 JOB 을 동시에 실행을 시킵니다. 여기 JOB 중에는

XXX.sql 화일을 서버측에서 돌리도록 코딩이 되어 있습니다. (isql -Uxx -Pxx 서버명 xxx.sql)

이러한 구조로 된 JOB 이 200여개 정도 되는데..이넘들은 DataStage 에 특별한 실행 로그가

남질 않습니다, 그런관계로 LOG 테이블을 하나두고, 해당 SQL 화일이 정상적으로 끝났는지

확인코자 SQL 화일 BEGIN 다음에 LOG 테이블에 시작한다고 표시하고,

END; 전에 해당 SQL 끝났다고 LOG_TBL 이라는 곳에 씁니다. 프로시져를 호출할려고 했으나,

실패를 하고, 그냥 DML 문장을 앞뒤로 넣었습니다.

 

앞에는 그냥 지우고 시작하고..

DELETE FROM LOG_TBL

WHERE EXEDT = '작업시작날짜'

AND JOBNAME = 'TTB210_TEAMCOCN';

COMMIT;

 

최종적으로 실행했다는 표시 하고...

INSERT INTO LOG_TBL (EXEDT, JOBNAME, GUBUN)

VALUES ('작업시작날짜', 'JOB_NAME', 'E');

COMMIT;

 

이렇게 했는데도 불구하고...

 

iqmessage 에서는

Txn 6645860

2005-09-14 19:38:11 0000001415 Exception Thrown from db_catx.cxx:1135, Err# 52, tid 852 origtid 852

2005-09-14 19:38:11 0000001415 O/S Err#: 0, ErrID: 1025 (hdb_catexception)

2005-09-14 19:38:11 0000001415 Cannot open the requested object for write in the current transaction (6645860). Ano

-- (db_catx.cxx 1135)

 

trace 인가..ㅡㅡ;

09/14 19:38:11.053 ** WARNING conn: 587515664 code: 100 "Row not found"

09/14 19:38:11.071 ** WARNING conn: 594970896 code: 100 "Row not found"

09/14 19:38:11.093 ** ERROR conn: 594970896 code: -1000029 "Cannot open the requested object for write in the current

transaction (6645860). Another user has write access in transaction 6645858. -- (db_catx.cxx 1135) "

 

 

이게 Versioning 이라는 거 때문에 그렇다는데...

 

정말이지 이거 스크립트로 즉 DML 문장으로 해결 못하나요?

특별하게 테이블을 lock 을 걸어야 하나요? (Lock 걸줄모름 ㅡㅡ;)

 

 

 

사이베이스 IQ 초짜가 질문드립니다.

 

 

이 글에 대한 댓글이 총 8건 있습니다.

예전에 제가 사용하던 환경이랑 비슷한 상태에서 작업을 하시는거 같네요.. ^^

 

작업의 결과를 남기는 것도 중요하겠지만, 작업을 진행시 error 가 난 경우 log 를 남기는 방법을 먼저 고려를 해보면,  datastage 에서 아무런 status 를 남기지 않는 건 한 shell 파일에서 여러개의 dbisql 을 실행한 경우 일겁니다.

 

1개의 shell 파일에서 1개의 dbisql 을 실행아여 error 가 난 경우는 별 문제가 없지만, 1개의 shell 파일에서 여러개를 실행한 경우 그중 마지막이 정상적으로 끝난다면, 별 error 없이 진행이 되는것 같더라고요.. --;

 

그래서 해결은 이런 식으로 했습니다..

 

shell 에서 dbisql 을 돌리고, shell 을 돌린 결과를 log 파일로 생성을 시킵니다. 생성된 log 파일을 읽어서 error 가 난 경우 fail 을 error 가 없는 경우 정상값을 return 하는 shell 을 생성합니다.

 

이런식으로 처리를 하면 datastage 에서도 깔끔하게 처리를 하실 수 있고요.. 전체 작업이 끝나면,  전체 log 파일을 읽어서 결과치를 한꺼번에 log table 에 반영을 할 수 있습니다.

 

 

coolrock님이 2005-09-15 09:47에 작성한 댓글입니다. Edit

ETL Job에 관련된 로그를 ASE 등 상용 RDBMS에 남기도록 하세요^^

존넘님이 2005-09-15 11:10에 작성한 댓글입니다. Edit

coolrock 님께서는 로그화일을 만드셨다는데...

어떻게 만들어서 사용하셨는지요? (제가 넘 몰라서요.ㅠ.ㅠ)

혹시라도 예전에 사용했던 스크립트가 있으시면, 제 메일로라도

좀 보내주십시요. 부탁드립니다. 제가 좀 급해서 그렇습니다. ㅡㅡ;

 

 

참 존넘님이 말씀하신 ASE 에 접근해서 로그테이블 생성케 하는 방법이

깔끔할것 같았는데...

여기서 CIS 관련 정보를 찾아서 ASIQ 에서 일단 서버를 등록해야

할것 같아서 sp_addserver 를 돌리니..

Syntax error or access violation: Transact-SQL feature not supported

 

에러가 나타나서... 시도도 못해봤습니다. ㅠ.ㅠ

 

 

댓글 달아주신 분께 감사의 마음을 전합니다. 추석전에 끝내야 하는데..

 

홍님이 2005-09-15 14:46에 작성한 댓글입니다. Edit

ASE에 로그를 남기는 것은 의외로 간단합니다.

 

ASE서버에 테이블을 생성하세요.

create table LOG_TBL

(

STARTDT datetime not null,

JOBNAME varchar(20) null,

GUBUN    char(1) null,

ENDDT     datetime null

)

go

 

JOB 시작할 때 다음과 같이 하면 되지요

isql -Usa -P -SASE -DLOGDB<<EOF

Insert into  LOG_TBL (STARTDT, JOBNAME, GUBUN)

values (getdate(), '$JOBNAME', 'S')

go

EOF

 

JOB이 끝날때는 다음과 같이요

isql -Usa -P -SASE -DLOGDB<<EOF

declare @startdt datetime

 

select @startdt = max(STARTDT)

from LOG_TBL

where JOBNAME='$JOBNAME'

and STARTDT < getdate()

 

update LOG_TBL

set GUBUN='E'

where JOBNAME='$JOBNAME'

and STARTDT = @startdt

go

EOF

 

IQ서버에 addserver할 필요가 없이

isql 수행할 때 -S옵션에 ASE 서버명을 주시면 됩니다.

직접 ASE 서버에 접속하여 로그를 남기는 것이지요.

 

즐거운 추석 명절 보내세요.

존넘님이 2005-09-15 16:18에 작성한 댓글입니다.
이 댓글은 2005-09-15 16:28에 마지막으로 수정되었습니다. Edit

앞글에 이어서,

 

다음과 같은 프로시저를 미리 생성해 놓고 호출하십시오.

 

create proc ETL_JOB_LOG

(

@JOBNAME varchar(20) = null,

@GUBUN char(1) = null

) as

if @JOBNAME is null or @GUBUN is null

   return

 

declare @startdt datetime

 

if @GUBUN='S'

BEGIN

  Insert into  LOG_TBL (STARTDT, JOBNAME, GUBUN)

  values (getdate(), @JOBNAME, @GUBUN)

END

else

BEGIN

  select @startdt = max(STARTDT)

  from LOG_TBL

  where JOBNAME=@JOBNAME

and STARTDT < getdate()

 

update LOG_TBL

set GUBUN=@GUBUN

where JOBNAME=@JOBNAME

and STARTDT = @startdt

END

go

 

DS Job의 Pre shell과 Post shell에서 동일한 모듈을 호출하시면 됩니다.

 

먼저 호출용 shell script를 만듭시다.

# vi ~/bin/ett_job_log.sh

JOBNAME=$1

GUBUN=$2

 

cat <<EOF > /tmp/job_log_$JOBNAME.sh

exec proc ETL_JOB_LOG '$JOBNAME', '$GUBUN'

go

EOF

 

sh /tmp/job_log_$JOBNAME.sh

 

Pre Job :

sh ~/bin/ett_job_log.sh $JOBNAME 'S'

 

Post Job :

sh ~/bin/ett_job_log.sh $JOBNAME 'E'

 

PATH는 로컬 환경에 맞추어서 사용하세요.

존넘님이 2005-09-15 16:27에 작성한 댓글입니다.
이 댓글은 2005-09-15 16:31에 마지막으로 수정되었습니다. Edit

존넌님이 좋은 답변을 남겨주셨네요..

 

IQ 자체가 OLTP 처리에는 맞지 않다 보니. 여러 방법이 있겠습니다만..

 

isql -Usa -P -SASE -DLOGDB<<EOF

Insert into  LOG_TBL (STARTDT, JOBNAME, GUBUN)

values (getdate(), '$JOBNAME', 'S')

go

EOF

 

==> 이부분을 shell 에서 관리하기 불편하니 파일을 만드셔서 작업을 하시고, isql -Usa .. -i파일명 으로 작업을 하시면 되고요..

 

허나 이렇게 작업을 할경우 문제점은 무엇때문에 에러가 났는지 log 가 남지 않는게 문제점이라 할수 있겠죠.

 

즉 shell 에서 작업을 수행시

 

ett_test.sh

 

isql -Usa -istart.sql

dbisql -U..  > ett_1.log

dbisql -U.. > ett_2.log

isql -Usa -iend.sql

 

뭐 이런 형태로 작업을 하시면, log 파일을 떨어뜨릴 수가 있고, 이걸 모아서 특정 message 를 grep 등으로 잡아서 사유를 찾을 수가 있겠죠..

 

지금 shell 은 가지고 있지않아서 방법만 말씀을 드렸는데. 도움이 되실지 모르겠네요..

 

 

 

coolrock님이 2005-09-15 17:51에 작성한 댓글입니다. Edit

너무나 감사합니다.

 

즐거운 명절이 될것 같습니다.

 

존넘님, coolrock님 복 받을 실 겁니다.

 

 

ps.

 

제시해준 방법도 다시금 시도 해봐야 겠습니다.

 

전.. 부랴부랴 SAVEPOINT [name]; RELEASE SAVEPOINT [name];

 

방법으로 해보니 되는듯 해서 손을 놓고 있었는데..

 

제시해주신 내용들은 검증되고, 현재도 돌아가는 것이니 언능

 

적용을 해봐야 겠습니다.

 

 

 

홍님이 2005-09-15 18:13에 작성한 댓글입니다. Edit

이제 마음 편안하게 집으로 출발할 수 있습니다.

 

존넘님, coolrock님 덕분에 아주 깔끔하게 끝냈습니다.

 

문서좀 만들어주고 DataStage JOB 에 연결만 하면...끝입니다. 푸하하

 

기분이 넘 좋습니다.

 

그리고.. 여기 AIX 사용하는데..

shell 만들때

 

JOBNAME=$1

GUBUN=$2

 

이게 적용이 안되는것 같아서

 

isql -Uxx -Pxx -Sxx -Dxx

 

exec exe_shell_log '$1','$2','$3'

 

go

 

이런식으로 해버렸습니다.

 

아무튼 넘 감사드립니다.. 다음에 또 모르는게 있으면 질문올리겠습니다.

 

 

메리추석~ ^________^

홍님이 2005-09-16 14:28에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1290sybase sdk는 어디에서 받는지요? [1]
사이
2005-09-21
3181
1289급한요청(부탁)MSSQL문장을 Sybase문장으로변경(Stored Procedure)... [3]
송윤선
2005-09-21
4117
1287원격에 있는 sybase사용시 PHP컴파일을 어떻게 해줘야 하나요? [1]
싸이
2005-09-20
3171
1286ASIQ 의 Versioning 해결책을 알고싶습니다. [8]
2005-09-14
5250
1285웹로직 + 사이베이스를 처음 해보는데 어떻게 해야할지 난감하네요. [1]
사이초보
2005-09-14
3722
1284패치버전을 내릴수 있는 방법을 알수있나요? [3]
알고파
2005-09-12
2888
1283oracle의 tablespace에 해당하는 것이 sysbase [2]
김충관
2005-09-12
4314
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다