개요
메모리 테이블에 변경 트랜잭션 수행 중 발생하는 에러에 관해 설명합니다.
버전
Altibase 4.3.9 이상
현상
메모리 테이블에 대해 변경 트랜잭션 수행 중 발생할 수 있는 에러입니다.
iSQL>
update
t5
set
c1=
'xxxxxxxxx'
;
[ERR-11118 : The
update
log
size
'10486749'
is
bigger than TRX_UPDATE_MAX_LOGSIZE
'10485760'
]
iSQL>
Altibase 버전에 따라 에러 코드에 차이가 있습니다.
원인
하나의 변경 트랜잭션에 의해 생성되는 온라인 트랜잭션 로그의 크기가 TRX_UPDATE_MAX_LOGSIZE 설정 값을 초과하여 발생하는 에러입니다.
TRX_UPDATE_MAX_LOGSIZE는 알티베이스 서버 프로퍼티로, 대량의 변경 트랜잭션에 의해 생성되는 메모리 테이블의 버전닝으로 인해 메모리를 과도하게 사용하는 것을 막기 위한 역할을 합니다.
메모리 테이블의 버전닝?
알티베이스는 동시성 제어를 위해 다중 버전 동시성 제어 (MVCC, Multi-Version Concurrency Control) 기법을 사용합니다. MVCC란 하나의 레코드에 대해 DML구문이 발생할 경우 그 레코드는 원래 상태 그대로 둔 채, 그 레코드의 복사본에 DML 구문을 실행하여 그 레코드의 새로운 버전을 만드는 것을 말합니다. 이 기법으로 하나의 레코드에 대한 조회 트랜잭션은 변경 트랜잭션에 영향을 받지 않습니다.
디스크와 메모리는 각각이 가지고 있는 특성 상 디스크 테이블은 in-place, 메모리 테이블은 Out-place기법으로 서로 다른 MVCC 기법이 사용됩니다.
메모리 테이블의 Out-place MVCC는 하나의 레코드에 update가 일어나면, 기존 레코드는 그대로 두고 새 공간에 새 버전을 추가함으로서 여러 버전을 유지합니다. 이로 인해 메모리가 증가하는 등 시스템에 부하가 발생하는 것을 방지하기 위해 TRX_UPDATE_MAX_LOGSIZE 및 LOCK_ESCALATION_MEMORY_SIZE 프로퍼티를 제공합니다.
INSERT는 이전 버전이 없기 때문에 버저닝이 발생하지 않고, DELETE는 새로운 버전이 없기 때문에 delete flag 만 세팅하므로 여러 버전의 버저닝이 발생하지 않습니다.
조치
이 에러가 발생할 경우 아래의 방법 중 하나로 조치할 수 있습니다.
UPDATE 대상 레코드 수 줄이기
UPDATE문에 의해 한번에 변경되는 레코드 수를 줄여 하나의 트랜잭션에 의해 생성되는 트랜잭션 로그의 양을 줄입니다.
한 테이블에 변경해야 할 레코드가 많은 경우
Autocommit 모드의 경우Non Autocommit 모드의 경우하나의 트랜잭션에서 여러 테이블에 UPDATE를 수행하는 경우
TRX_UPDATE_MAX_LOGSIZE프로퍼티는 트랜잭션 단위로 적용되므로 아래와 같이 하나의 트랜잭션에 여러 문장이 사용된 경우, COMMIT 또는 ROLLBACK을 수행할 때까지 TRX_UPDATE_MAX_LOGSIZE가 증가할 수 있습니다.
TRX_UPDATE_MAX_LOGSIZE 프로퍼티 설정값 변경
TRX_UPDATE_MAX_LOGSIZE 프로퍼티의 기본값은 10M입니다. 이 값이 너무 작다고 판단될 경우 세션 또는 시스템 레벨에서 값을 변경할 수 있습니다.
먼저, 특정 트랜잭션에서 생성하게 될 트랜잭션 로그의 크기를 산정하는 방법과 TRX_UPDATE_MAX_LOGSIZE 변경 시 주의사항에 관해 설명한 후 변경 방법에 관해 설명합니다.
트랜잭션의 TRX_UPDATE_MAX_LOGSIZE 값 산정
TRX_UPDATE_MAX_LOGSIZE를 변경하기 위해 특정 트랜잭션에서 사용할 트랜잭션 로그의 양을 산정하는 방법입니다.
세션1 - UPDATE 문 수행 세션2 - 성능 뷰 조회 아래 쿼리문을 수행하여 나온 결과 중 UPDATE_SIZE * 'update 대상 레코드 수' 가 해당 트랜잭션에서 생성하게 될 트랜잭션 로그의 크기입니다.
TRX_UPDATE_MAX_LOGSIZE 변경 시 주의사항
- TRX_UPDATE_MAX_LOGSIZE는 LOCK_ESCALATION_MEMORY_SIZE 보다 작게 설정할 것을 권장합니다.
메모리 테이블 MVCC로 인해 메모리가 증가하는 것을 방지하기 위해 TRX_UPDATE_MAX_LOGSIZE와 LOCK_ESCALATION_MEMORY_SIZE 프로퍼티를 제공하고 있습니다.
- 하나의 트랜잭션에서 생성하는 트랜잭션 로그의 크기가
TRX_UPDATE_MAX_LOGSIZE를 초과할 경우 해당 트랜잭션을 에러 처리하고 롤백합니다.
LOCK_ESCALATION_MEMORY_SIZE를 초과할 경우 해당 트랜잭션의 LOCK 모드가 레코드 레벨 IX_LOCK에서 테이블 레벨 X LOCK으로 전환됩니다. - X LOCK의 경우 대상 테이블에 대한 조회 트랜잭션도 대기하게 하므로 서비스에 문제를 발생시킬 수도 있습니다.
- 이런 문제를 방지하기 위해서는 TRX_UPDATE_MAX_LOGSIZE를 LOCK_ESCALATION_MEMORY_SIZE보다 작게 설정하여 X LOCK으로 전환하는 일이 발생하지 않도록 해야 합니다.
변경 방법
프로퍼티 설정값 확인 방법
TRX_UPDATE_MAX_LOGSIZE는 LOCK_ESCALATION_MEMORY_SIZE 보다 작게 설정해야 하므로 두 프로퍼티를 같이 확인합니다.
TRX_UPDATE_MAX_LOGSIZE 및 LOCK_ESCALATION_MEMORY_SIZE 설정값 확인 방법세션 별 TRX_UPDATE_MAX_LOGSIZE 설정 값 확인 방법세션 단위 변경 방법
ALTER SESSION 수행 후 수행하는 트랜잭션에 적용됩니다.
시스템 레벨 변경 방법
ALTER SYSTEM 수행 후 신규 세션에서 수행하는 트랜잭션부터 영향을 받습니다. ALTER SYSTEM 으로 변경한 값은 Altibase 서버 구동 중에만 적용되며 Altibase 서버를 재구동하면 기본값으로 되돌아갑니다.
변경값을 Altibase 서버에 영구적으로 반영하고 싶을 경우 altibase.properties 파일도 변경합니다.위와 같이 수행하면 Altibase 서버 재구동을 하여도 변경값을 유지할 수 있습니다.
참고
관련 버그
몇몇 버전에서 TRX_UPDATE_MAX_LOGSIZE 관련 버그로 인해 TRX_UPDATE_MAX_LOGSIZE의 설정값을 변경하여도 정상적으로 동작하지 않는 경우가 있습니다.
Altibase 서버 버전 | 현상 | 버그 |
---|---|---|
4.3.9.103 ~ 4.3.9.133 | TRX_UPDATE_MAX_LOGSIZE의 기본값이 10M인데 V$SESSION의 TRX_UPDATE_MAX_LOGSIZE 컬럼 값이 0(무제한)으로 설정된 현상. | BUG-20511 |
4.3.9.163 ~ 4.3.9.165 | TRX_UPDATE_MAX_LOGSIZE를 잘못 읽는 버그로 TRX_UPDATE_MAX_LOGSIZE로 인해 에러가 발생해야 할 상황에서 에러가 발생하지 않는 현상. | BUG-26311 |