1. 개요
언두 테이블스페이스 사용량이 지속적으로 증가하거나 감소하지 않는 경우, 원인을 정확히 파악하고 이에 따른 적절한 조치를 수행해야 합니다.
일반적으로 언두 사용량은 다음과 같은 상황에서 증가하거나 해제되지 않습니다.
장시간 변경 트랜잭션 수행: 디스크 테이블에 대한 DML 트랜잭션이 종료되지 않고 장시간 지속되는 경우
미종료 트랜잭션: SQL 수행은 완료되었으나, 커밋 또는 롤백이 수행되지 않아 트랜잭션이 열린 상태로 유지되는 경우
언두 이미지 참조: 조회 질의문이 변경 전 데이터를 참조하여 해당 언두 영역이 재사용되지 못하고 장시간 유지되는 경우
LOB 자원 미해제: Non-autocommit 모드에서 LOB 데이터를 조회한 후, LOB 커서 또는 트랜잭션을 적시에 종료하지 않은 경우
롤백 진행 중: 대량 변경 트랜잭션이 취소되어 복구 작업이 장시간 진행되는 경우
본 문서는 이러한 언두 사용량 증가 원인을 진단하기 위한 주요 모니터링 항목을 정리하고, 상황 별 조치 방안 및 증가 방지 방안을 제공합니다.
2. 모니터링 쿼리
언두 테이블스페이스 사용량이 감소하지 않거나 지속적으로 증가하는 경우, 언두를 사용하거나 언두 이미지에 접근하고 있는 트랜잭션과 그 상태를 확인해야 합니다.
아래는 이러한 트랜잭션을 조회하기 위한 모니터링 쿼리입니다.
Altibase 5.3.3 이상
3. 모니터링 시 확인해야 할 주요 항목
모니터링 결과를 해석할 때 다음 항목들을 중점적으로 분석하여 원인을 진단합니다.
판단 기준
| 항목 | 설명 | 비고 |
|---|---|---|
| SESSION_ID | 트랜잭션을 수행한 세션 ID | 이중화 트랜잭션의 경우 이중화 객체 이름 출력 |
| STATEMENT_ID | 트랜잭션에서 실행한 SQL문의 ID | 값이 NULL이면 statement가 해제된 상태 |
| TX_TYPE | 트랜잭션 유형 | UPDATE : 변경 트랜잭션 (데이터 변경이 한 번이라도 발생) SELECT : 조회 전용 트랜잭션 |
| TX_STATUS | 트랜잭션 상태 | BEGIN : 트랜잭션이 열린 상태 ABORT : 트랜잭션 롤백 상태 |
| SQL_STATUS | 질의문의 상태 | SQL_ING : 질의문이 수행 중인 상태 SQL_END : 질의문의 수행이 완료된 상태 값이 NULL이면 statement가 해제된 상태 |
| CLIENT_IP | 클라이언트 접속 유형 및 IP, PORT, 프로세스 ID 정보 | 이중화 트랜잭션의 경우 원격 서버 IP와 이중화 포트 출력 값이 NULL이면 세션이 종료된 상태 |
| AUTOCOMMIT | 세션의 AutoCommit 설정 | 값이 NULL이면 세션이 종료된 상태 |
| DISK_VIEW_SCN | 트랜잭션이 바라보는 언두 이미지의 SCN | 변경 이전 버전을 조회 중임을 의미 |
| MIN_DISK_LOB_VIEW_SCN | LOB 커서가 사용하는 언두 이미지의 SCN | LOB 커서가 열려 있음을 의미 |
| UNDO_USED(KB) | 질의문에서 사용 중인 언두 크기 | 변경 트랜잭션에서 사용한 언두 테이블스페이스의 크기 |
| UNDO_PAGE | 질의문에서 접근한 언두 페이지 수 | 언두 페이지에 접근하고 있음을 의미 |
4. 상황 별 진단 기준
4.1 장시간 수행 중인 변경 트랜잭션
변경 트랜잭션은 변경 전 데이터를 언두 영역에 기록하므로 언두 사용량이 증가합니다.
판단 기준
| 항목 | 값 | 설명 |
|---|---|---|
| TX_TYPE | UPDATE | 변경 연산 트랜잭션을 의미 |
| TX_STATUS | BEGIN | 트랜잭션이 열린 상태 |
| SQL_STATUS | SQL_ING | 질의문이 수행 중인 상태 |
| UNDO_USED(KB) | 증가 | 언두 사용량 증가 여부 판단 |
※ 외래키, 트리거가 걸린 테이블에 데이터를 입력하는 경우에도 언두가 사용됩니다.
출력 예시
데이터를 변경하는 SQL 문의 수행이 진행 중인 상태
4.2 열린 상태로 장시간 유지 중인 변경 트랜잭션
질의문의 수행이 종료된 이후에 트랜잭션이 종료되지 않으면, 해당 트랜잭션이 사용 중인 언두 영역은 해제되지 않습니다.
판단 기준
| 항목 | 값 | 설명 |
|---|---|---|
| TX_TYPE | UPDATE | 변경 연산 트랜잭션을 의미 |
| TX_STATUS | BEGIN | 트랜잭션이 열린 상태 |
| SQL_STATUS | SQL_END / NULL | SQL_END : 질의문이 종료된 상태 NULL : 질의문이 해제된 상태 |
| UNDO_USED(KB) | 고정 | 변경 연산을 수행하는 질의문이 종료되면 더 이상 증가하지 않음 |
출력 예시
예시 1: 질의문이 종료되고 트랜잭션이 열려 있는 상태
예시 2: 질의문은 해제되고 트랜잭션이 열려 있는 상태
4.3 변경 전 데이터를 장시간 조회하는 질의문
조회 질의문이 변경 트랜잭션에서 생성한 언두 이미지를 보고 있는 동안에는 언두가 해제되지 않습니다.
판단 기준
| 항목 | 값 | 설명 |
|---|---|---|
| TX_TYPE | UPDATE / SELECT | UPDATE는 과거에 변경 연산을 한 번이라도 수행한 트랜잭션 SELECT는 조회 전용 트랜잭션 |
SQL_STATUS | SQL ING | 질의문이 수행 중인 상태 |
| DISK_VIEW_SCN | SCN 값 | 변경 이전 데이터를 조회 중인 상태를 의미 |
| UNDO_USED(KB) | NULL 또는 고정 | 조회 트랜잭션 또는 조회 질의문은 언두 사용량이 증가하지 않음 |
| UNDO_PAGE | 증가 | 증가하면 언두 데이터를 조회 중인 상태를 의미하며 멈춰있거나 0 이면 언두 데이터를 조회하지 않은 상태를 의미함. |
출력 예시
예시 1: 조회 전용 트랜잭션이 수행 중인 경우
예시 2: 변경 트랜잭션에서 조회 질의문이 수행 중인 경우
4.4 non-autocommit 모드에서 LOB 조회 트랜잭션이 열린 상태인 경우
non-autocommit 모드에서 LOB 데이터를 조회한 후 트랜잭션을 종료하지 않거나, LOB 커서를 닫지 않은 상태로 statement만 해제하는 경우 언두가 해제되지 않습니다.
이로 인해 언두 사용량이 지속적으로 증가할 수 있습니다.
판단 기준
| 항목 | 값 | 설명 |
|---|---|---|
TX_STATUS | BEGIN | 트랜잭션이 열려 있는 상태 |
| MIN_DISK_LOB_VIEW_SCN | SCN 값 | LOB 커서가 열려 있는 상태 |
출력 예시
예시 1: LOB 데이터를 조회한 후 트랜잭션을 종료하지 않은 경우
예시 2: LOB 데이터를 조회한 후 statement만 해제하고 트랜잭션은 열려 있는 상태
4.5 롤백 진행 중인 트랜잭션
롤백 중에는 언두를 사용하여 데이터를 원래 상태로 복구하므로, 롤백이 완료될 때까지 언두 사용량이 유지될 수 있습니다.
판단 기준
| 항목 | 값 | 설명 |
|---|---|---|
| STATEMENT_ID | 숫자 / NULL | 숫자: 세션이 살아 있음 NULL: 세션이 종료된 상태에서도 롤백이 진행 중 |
| TX_TYPE | UPDATE | 변경 트랜잭션 |
| TX_STATUS | ABORT | 트랜잭션이 롤백 상태임을 의미 |
출력 예시
예시 1: 명시적으로 롤백을 수행한 상황
예시 2: 세션을 강제로 종료한 상황
4.6 이중화 트랜잭션
이중화 복제 트랜잭션으로 인해 언두가 사용되는 경우입니다.
판단 기준
| 항목 | 값 | 설명 |
|---|---|---|
| SESSION_ID | 이중화 객체 이름 | 이중화 트랜잭션의 경우 이중화 객체 이름을 표시 |
| CLIENT_IP | 원격 서버 IP | 원격 서버의 IP를 표시 |
| TX_STATUS | BEGIN | 트랜잭션 진행 상태 |
| QUERY | REMOTE_TX_ID | 주 트랜잭션의 트랜잭션 ID |
출력 예시
5. 조치 방법
언두 테이블스페이스 사용량이 임계치에 도달했을 때, 즉각적으로 취할 수 있는 조치는 크게 물리적 공간 확장과 원인 세션 제거 두 가지입니다.
5.1 언두 테이블스페이스 확장
언두 공간 부족으로 인한 서비스 장애가 우려되는 경우, 언두 테이블스페이스 용량을 확장합니다. 확장 전 반드시 파일시스템의 물리적 여유 공간을 확인하십시오.
방법 A: 데이터 파일 추가
기존 파일 외에 새로운 데이터 파일을 추가하여 공간을 확보하는 방식입니다. 우선 현재 구성된 파일을 확인합니다.
방법 B: 기존 파일 크기 확장
기존 데이터 파일의 최대 크기나 현재 크기를 증가하는 방식입니다.
5.2 세션 강제 종료
공간 확장이 어렵거나 특정 세션의 비정상적인 점유가 확실할 때 수행합니다.
주의
대량의 데이터를 처리하던 DML 세션을 종료할 경우, 롤백 작업으로 인해 언두 자원이 즉시 확보되지 않을 수 있습니다.
트랜잭션 유형 별 영향
| 트랜잭션 유형 | 종료 시 영향 | 자원 회수 시점 |
| 조회(SELECT) | 즉시 종료 가능 | 세션 종료 즉시 |
| 변경(DML) | 롤백(Rollback) 수행 | 롤백 완료 후 |
세션 강제 종료
V$DATABASE에서 데이터베이스 이름을 확인한 후, 모니터링 쿼리에서 확인한 SESSION_ID를 지정하여 종료합니다.
클라이언트 프로세스 종료
DB 접속이 원활하지 않거나 애플리케이션 레벨에서 연결을 끊어야 할 경우, OS에서 프로세스를 직접 종료합니다.
process_id 값은 모니터링 쿼리의 CLIENT_IP 항목에서 확인할 수 있습니다.
6. 언두 테이블스페이스 증가 방지 방안
장시간 수행되는 트랜잭션(벌크 트랜잭션)은 변경 작업이 장시간 유지되면서 언두 테이블스페이스 사용량을 증가시키는 주요 원인이 됩니다.
대량 변경 작업이 하나의 트랜잭션으로 처리하는 경우 다음과 같은 문제가 발생할 수 있습니다.
언두 공간의 급격한 증가: 변경 전 데이터를 보관하기 위한 언두 세그먼트가 단시간에 크게 증가합니다.
자원 해제 지연: 트랜잭션이 최종 완료(COMMIT/ROLLBACK)될 때까지 사용 중인 언두 이미지가 유지되어 재사용이 제한됩니다.
복구(롤백) 부하 증가: 장애 또는 취소 시 처리해야 할 언두 데이터가 증가하여, 트랜잭션 수행 시간보다 더 긴 롤백 시간이 소요될 수 있습니다.
이와 같은 상황을 방지하기 위해 아래 항목을 검토하여 트랜잭션 처리 방식을 최적화해야 합니다.
6.1 대량 트랜잭션 분할 처리
대량의 데이터를 하나의 트랜잭션으로 처리하는 대신, 작업을 여러 개의 작은 배치로 나누어 수행합니다.
이러한 방식은 언두 공간의 재사용성을 높여 전체적인 언두 부하를 줄여줍니다.
또한, 장애 등으로 인해 롤백이 발생할 경우 복구해야 할 범위를 최소화할 수 있다는 장점이 있습니다.
예시
방법 1: 범위 조건(BETWEEN ~ AND) 활용
고유 키(PK)나 인덱스가 있는 칼럼을 기준으로 범위를 나누어 커밋합니다.
방법 2: 행 제한(LIMIT) 활용
특정 조건에 맞는 데이터를 일정 개수만큼씩 반복해서 삭제합니다.
6.2 UTRANS_TIMEOUT 설정
변경 트랜잭션이 장시간 활성 상태로 유지되면 언두 이미지가 오래 남게 되어 언두 사용량이 증가할 수 있습니다.
이를 방지하기 위해 UTRANS_TIMEOUT 을 설정하면, 지정된 시간을 초과하는 트랜잭션을 자동으로 종료하고 롤백할 수 있습니다.
세션 단위 설정
iSQL 예시:
커넥션 스트링 예시:
Java
APRE
시스템 단위 설정
다음 구문을 수행하면 이후 접속하는 모든 세션에 설정이 적용됩니다.
설정을 영구적으로 반영하려면 altibase.properties 파일을 수정합니다.
6.3 미종료 트랜잭션 점검
Non-Autocommit 모드를 사용하는 애플리케이션에서 예외 처리 누락이나 로직 미비로 인해 트랜잭션이 종료되지 않고 방치(Idle)되지 않도록 주의해야 합니다. 업무 로직이 종료되는 시점에는 반드시 COMMIT 또는 ROLLBACK이 명시적으로 수행되어야 합니다.
6.4 LOB 자원 해제
LOB 작업 과정에서 생성된 LOB 커서는 트랜잭션이 종료되거나 커서가 닫힐 때까지 언두 데이터를 유지합니다.
LOB 데이터 처리 후에는 다음 중 하나의 작업을 반드시 수행해야 합니다.
LOB 커서 닫기
트랜잭션 종료(COMMIT 또는 ROLLBACK)
주의
SQLCLI에서
SQLFreeLob()함수는 호출 즉시 서버로 요청을 보내지 않고, 이후 발생하는 다른 요청과 함께 전송됩니다. 이로 인해 클라이언트의 호출 시점과 실제 서버에서의 LOB 자원 해제 시점 사이에 차이가 발생할 수 있습니다. 즉각적인 자원 해제가 필요한 경우, 트랜잭션을 완전히 종료하는 것이 가장 확실한 방법입니다.