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 4392 게시물 읽기
No. 4392
데이타 Insert 시 DB가 죽는 현상(ASE 15.5)
작성자
김은진(kkiwi77)
작성일
2014-06-03 14:43ⓒ
2014-06-03 14:55ⓜ
조회수
6,371

Sybase 초보입니다.

이번에 Sybase로 프로젝트를 할꺼 같아서, 지금 PC에 Sybase ase 15.5 평가판 설치해서 테스트 중입니다.

DB생성이나,User, 테이블, SP 생성은 모두 잘 되는데,

Insert나 Update, Delete 할때 건수가 많아지면, DB가 그냥 죽어 버립니다.

근데, 그렇게 많은 건수도 아니고,,2,500건 정도 되면 죽어 버립니다.

DB가 꺼지는것도 아니고, 계속 돌고 있는? 그런 상태입니다.

몇시간이고 기다려도 완료되지 않고, 계속 돕니다.

강제로 DB를 종료하고 다시 시작해도 다른작업(insert,update,delete)은 안됩니다.

다른 작업을 하면 그 작업도 그냥 계속 돌고 있습니다.

그래서, 그냥 Sybase가 설치된 PC를 재부팅하고

구글링해서 찾아낸 명령문 [dump tran db_name with no_log]를 실행시킵니다 ㅡ0ㅡ;;

뭐가 문제 인지 잘 모르겠습니다.

이게 DB lock인지도 잘 모르겠고, 애초에 DB설치시에 뭔가 옵션 설정을 못한건가 싶기도 하고..

사용하는 툴은 기본적으로 설치되어 있는 Sybase Central v6.0 과 Toad for Sybase2.0 입니다.

아시는 분 좀 상세하게 답변 좀 부탁드립니다.

 

테이블 --------------------------------

/***** create table dbo.AAA *****/

create table dbo.AAA (

AAA int null,

BBB int null,

CCC varchar(20) null,

DDD datetime null

) on 'default'

partition by roundrobin(

AAA_576002052 on 'default')

 

lock allpages

 

go

 

SP ------------------------------------

Setuser 'dbo'

go

/***** create procedure dbo.DFLPR_TEST_TRAN *****/

create procedure dbo.DFLPR_TEST_TRAN

@AAA INTEGER

as

begin

 

DECLARE @A INTEGER

SELECT @A=1

 

begin transaction

 

WHILE @A <=@AAA

BEGIN

 

INSERT INTO AAA

VALUES (@AAA, @A, 'T', GETDATE())

 

SELECT @A=@A + 1

END

 

commit transaction

 

end

go

 

Setuser

go

 

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

아, 그리고,,

ASE도 한 세션(혹은 사용자)에서 누군가 특정한 테이블에 write(insert, update, delete) 작업을 하면,

다른 세션에서 write 작업을 할 수 없나요? 그건 아닌거죠?;;;;;

 

 

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

1. 그렇게 많은 건수도 아닌 2500건 정도 되면 멈추는 이유는 

2500건 정도의 트랜잭션을 단일 트랜잭션(begin tran - commit)으로 처리하면서

log 영역 공간이 부족한 현상이 발생되어 DB 프로세스가  기다리고 있는 중인거죠. 

select @@errorlog

결과 파일을 에디터로 열어보면, Error: 1105 코드가 있을 것으로 판단됩니다. 

DB log 크기를 증가시켜 주면 되지만, 

로그와 데이터 영역을 분리시켜 생성한 DB가 아닐 수 있으므로, DB SIZE 를 추가시키는 것으로

작업이 진행되는지 확인해 보면 될 것 같습니다. 로그가 분리되어 생성된 DB라면, 당근 로그 공간만

키워주는 것으로 문제가 해결되지 않을까 생각됩니다.   Sybase나 MSSQL에서의 log  공간은

오라클의 undo-redo 공간을 합쳐놓은 것과 같습니다.   

 

 

 

2. 개발단계에서는 DB 옵션중에 trunc log on chkpt  옵션과 abort tran on log full 옵션을 설정

해보시길 권합니다.  최소한 트랜잭션은 롤백이 되더라도 DB를 내렸다 올리는 상황은 없을 겁니다. 

문제가 DB size문제라면, 크게만들면 되니까요...   프로덕션에서는  백업 정책에 따라 transaction

백업을 하는 경우가 있어서 trunc log on chkpt 옵션은 프로덕션에서는 주의해서 사용해야 합니다. 

오라클의 archive backup과 같다고 보면 될 것 같습니다. 

 

암튼 개발 시스템에서는 다음과 같이 설정해 주시면 됩니다. 

use master

go

 

sp_dboption 'USERDB이름','trunc log on chkpt','true'    

--- 트랜잭션이 종료되면, 다음 checkpoint 시 로그공간을 확보

go

 

sp_dboption 'USERDB이름','abort tran on log full', 'true'

--- 트랜잭션이 log 공간부족으로 더이상 로그를 기록할 수 없는 경우, 해당 트랜잭션을 rollback 시킴.

go

 

 

 

3.  테이블 생성시 lock allpages 옵션으로 테이블을 생성하시게되면, 

해당 테이블에 DML 로 인한 트랜잭션 발생시 특정 페이지(데이터가 저장되는 공간 단위)의

데이터가 1 row 가 변경되더라도 해당 페이지 전체를 lock을 거는 방식을 선택한 겁니다.

하나의 페이지에는 여러 row가 존재할 수 있으므로, 불필요한 lock contention을 일으킬 수 있습니다.

일단은 lock allpages 방식은 너무 구닥다리 방식이라 lock datarows  방식으로 테이블 생성을

권합니다. DML  이 발생하는 row 단위로 lock을 잡도록 하는게 여러 사람이 사용하는 DB에서

lock contention을   줄일 수 있겠죠?

추가적으로, lock scheme (allpages, datapages, datarows) 방식을 바꾼다고 하더라도, lock 에 대한 

리소스는 한정되어 있기 마련입니다. 무한정 증가하도록 DBMS 가 놔둘리 만무하죠. 종종 MSSQL 과

SYBASE에서 사용하는 방법은 특정 조건에서 lock escalation(또는 promotion) 시켜, lock에 대한

리소스를 확보해 갑니다. 오라클 처럼 lock escalation이 없는 DB를 사용하다가 Sybase 나 MSSQL 을

보면, lock sleep이 많다고 느껴지는 이유는 lock escalation 때문입니다.

 

Sybase 에서는 lock scheme에 따라 promotion 값을 지정해서 테이블 lock으로 전환되는 시점을

바꿔줄 수 있습니다. 테이블 단위로도 가능합니다만, 통상 서버 단위로 설정을 많이 합니다.

sp_configure " promotion"  하면 6개의 설정 항목이 나옵니다. datarows lock scheme을 사용한다면, 

row lock promotion HWM, row lock promotion LWM 값을 같은 값으로 조정하는 방법으로

lock escalation 조정이 가능합니다.  예를 들이 500 을 설정했다면, 500row에 대해 lock 이 걸리면, table

lock 으로 전환되도록 설정한다는 의미가 될 겁니다. 

추가적으로 lock promotion 조절은 결과적으로 전체적인 lock 리소스를 많이 쓰겠다는 의미이므로, 

sp_configure "number of locks" 를 충분한 숫자만큼 늘려주는게 현명하겠죠. lock 이 부족하면, 

트랜잭션 자체가 rollback 된다고 보면 될 것 같습니다. 

 

 

 

4.  어느 DB나 마찬가지입니다만,  

DB에서 락 발생 사항과 락 sleep 상황(blocking lock) 상황 모니터링이 가능한가가 참 중요하다고 

생각합니다. 

Sybase 에서는 sp_lock 으로 lock 에대한 정보를 볼 수 있습니다만,   조금 불편하기 때문에,

www.rocket99.com/techref/sybase8704.html  에서 sp_locks 스크립트를 얻을 수 있을겁니다. 

sybsystemprocs DB 에서 sp_locks 프로시져를 생성해 놓으면, 어디서든 lock 에 대한 간단한 

정보 확인이 가능합니다. 

 

 

5.  또한 현재 running 프로세스가 뭔짓을 하는지 알고 싶을 때가 있죠. 

Sybase 에서는 sysprocesses 라는 테이블을 조회하면 됩니다. 

보통 제가 보는 컬럼은 spid, status, cpu, pysical_io, object_name(id,dbid),  linenum정도입니다. 

physical_io / 512 값이 물리io Mega 양이고, status 값을 통해

 running, runnable, lock sleep, sleep  등의 상태를 알 수 있습니다.

object_name(id,dbid) 는 프로시져 같은 것을 호출할 경우 프로시져 이름을 보여주며, 

linenum 에서는 해당 프로시져의 몇번째 라인에서 뻘짓을 하는지 보여줍니다. 

 

짧게 설명해야 좋은 글이라는데 망쳤습니다.  죄송합니다. 

소이화님이 2014-06-09 17:46에 작성한 댓글입니다. Edit

우와 소이화님 정말 보물같은 정보 감사합니다~

우동균(ggree1)님이 2014-06-12 23:07에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4396서버 복구시 Data(dat)파일 과 master(dat) 을 어찌 올려야하나요? [2]
천영수
2014-07-29
3803
4395pda 윈도우모바일 6.0 에서 Sybase 연결 문의 입니다. [1]
펄링스
2014-07-27
4200
4393Sybase ASE 유저 권한에 대한 질문입니다. [1]
박영수
2014-07-10
5671
4392데이타 Insert 시 DB가 죽는 현상(ASE 15.5) [2]
김은진
2014-06-03
6371
4391allpages lock 으로 설정된 테이블을 datarows 로 변경시? [4]
우동균
2014-05-26
4665
4390오라클의 forall, bulk collect 같은 기능 질문 [1]
호야
2014-05-16
4386
4389Sybase ASE 접속 기록 [1]
손병관
2014-05-08
3830
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다