개요
언두 테이블스페이스 사용량이 지속적으로 증가할 경우 모니터링 방법에 대해 설명합니다.
모니터링 항목
언두 테이블스페이스의 사용량이 증가한다면 다음 두 가지 경우를 확인해야 합니다.
- 디스크 테이블의 데이터를 변경하는 변경 트랜잭션이 존재하는지
- 변경 트랜잭션에서 생성한 old image 를 바라보는 조회 트랜잭션이 존재하는지
버전 별 모니터링 방법
Altibase 5.3.3 ~ 7.3.1
트랜잭션 별 언두 테이블스페이스 사용량 모니터링 쿼리
아래 모니터링 쿼리를 통해 TX_STATUS 가 BEGIN 또는 END 상태로 장시간 수행 중인 트랜잭션을 찾아 조치합니다.
쿼리 결과에서 아래와 같은 정보들을 확인할 수 있습니다.
- 언두 테이블스페이스를 사용하거나 접근하고 있는 세션의 정보. (Autocommit mode, Client IP 및 Process id, UTRANS_TIMEOUT 설정 값)
- 언두 영역을 사용하는 변경 트랜잭션 존재 여부
- 언두 영역에 접근하는 조회 트랜잭션 존재 여부
- 변경 트랜잭션에서 사용 중인 언두 사용량
- 트랜잭션의 마지막 SQL 문장 및 수행 시각
- SQL 문장 수행 여부
SELECT RPAD(DECODE(TX.LOG_TYPE, 1, REP.REP_NAME, TX.SESSION_ID), 10) SESSION_ID -- 트랜잭션을 수행한 세션 ID.
, RPAD(TX.ID, 20) TX_ID -- 트랜잭션 ID
, RPAD(DECODE(ST.ID, NULL, 'REP''S TX', ST.ID), 20) STATEMENT_ID -- STATEMENT ID
, RPAD(DECODE(TX.TSS_RID, 0, 'SELECT', 'UPDATE'), 7) TX_TYPE -- 트랜잭션 타입. SELECT : 조회 문장만 있는 트랜잭션. UPDATE : DELETE, UPDATE 등 데이터를 변경한 트랜잭션
, RPAD(DECODE(TX.STATUS, 0, 'BEGIN', 1, 'PRECOMMIT', 2, 'COMMIT_IN_MEMORY', 3, 'COMMIT', 4, 'ABORT', 5, 'BLOCKED', 6, 'END'), 16) TX_STATUS -- 트랜잭션 상태
, RPAD(DECODE(ST.EXECUTE_FLAG, NULL, 'REP''S TX', 1, 'SQL ING', 0, 'SQL END'), 10) SQL_STATUS -- SQL 상태
, RPAD(DECODE(TX.LOG_TYPE, 1, 'REP '||REP.PEER_IP||':'||REP.PEER_PORT, S.COMM_NAME||' PID:'||S.CLIENT_PID), 40) CLIENT_IP -- 클라이언트 IP와 프로세스 ID
, RPAD(DECODE(S.AUTOCOMMIT_FLAG, 1, 'ON', 0, 'OFF', NULL, 'REP''S TX'), 10) AUTOCOMMIT -- AUTOCOMMIT 모드
, RPAD(DECODE(TX.LOG_TYPE, 1, 'REP''S TX', S.UTRANS_TIME_LIMIT), 15) UTRANS_TIMEOUT -- 세션의 UTRANS_TIMEOUT 설정값
, TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') CURRENT_TIME -- 현재 시각
, DECODE(ST.LAST_QUERY_START_TIME, NULL, TO_CHAR(TO_DATE('1970010109','YYYYMMDDHH') + TX.FIRST_UPDATE_TIME / (60*60*24), 'YYYY-MM-DD HH:MI:SS'), ST.LAST_QUERY_START_TIME) LAST_QUERY_START_TIME -- SQL문 시작 시각
, RPAD(LTRIM(TXM.SYS_MIN_DISK_VIEWSCN), 10) SYS_MIN_DISK_VIEWSCN -- 언두 영역을 보고 있는 SCN 중 가장 작은 SCN
, DECODE(TX.DISK_VIEW_SCN, 'INFINITE( 0)', '-', LTRIM(TX.DISK_VIEW_SCN)) DISK_VIEW_SCN -- 조회 트랜잭션에서 바라보는 가장 작은 SCN
, DECODE(TX.MIN_DISK_LOB_VIEW_SCN, 'INFINITE( 0)', '-', LTRIM(TX.MIN_DISK_LOB_VIEW_SCN)) MIN_DISK_LOB_VIEW_SCN -- LOB 데이터를 조회하는 트랜잭션에서 바라보는 가장 작은 SCN
, TO_CHAR(((UD_S.TOTAL_EXTENT_COUNT*UD_S.PAGE_COUNT_IN_EXTENT*8192)/1024), '999,999,999') 'UNDO_USED(KB)' -- 변경 트랜잭션의 언두 사용량
, DECODE(TX.LOG_TYPE, 1, 'REMOTE_TX_ID : '||REP_TX.REMOTE_TID, ST.QUERY) QUERY -- 언두를 사용하거나 접근한 트랜잭션에서 수행한 마지막 쿼리
FROM V$TRANSACTION TX LEFT OUTER JOIN (SELECT SESSION_ID , TX_ID , ID , TO_CHAR(TO_DATE('1970010109','YYYYMMDDHH') + (LAST_QUERY_START_TIME) / (60*60*24), 'YYYY-MM-DD HH:MI:SS') LAST_QUERY_START_TIME, EXECUTE_FLAG, UNDO_READ_PAGE , UNDO_GET_PAGE , SUBSTR(QUERY, 1, 60) QUERY
FROM V$STATEMENT
WHERE (SESSION_ID
, TX_ID
, LAST_QUERY_START_TIME) IN (SELECT SESSION_ID
, TX_ID
, MAX(LAST_QUERY_START_TIME) LAST_QUERY_START_TIME
FROM V$STATEMENT
GROUP BY SESSION_ID
, TX_ID)) ST ON TX.ID = ST.TX_ID LEFT OUTER JOIN V$SESSION S ON TX.SESSION_ID = S.ID LEFT OUTER JOIN V$REPRECEIVER_TRANSTBL REP_TX ON TX.ID = REP_TX.LOCAL_TID LEFT OUTER JOIN V$REPRECEIVER REP ON REP_TX.REP_NAME = REP.REP_NAME
LEFT OUTER JOIN V$TXSEGS TX_S ON TX.ID = TX_S.TRANS_ID LEFT OUTER JOIN V$UDSEGS UD_S ON TX_S.ID = UD_S.TXSEG_ENTRY_ID
, V$TRANSACTION_MGR TXM
WHERE 1=1
AND (TX.TSS_RID <> 0
OR ST.UNDO_READ_PAGE <> 0
OR ST.UNDO_GET_PAGE <> 0)
ORDER BY SESSION_ID
, TX_ID
, LAST_QUERY_START_TIME;
출력 결과
아래는 언두를 사용하는 변경 트랜잭션을 보여주는 출력 예입니다.
- TX_TYPE 이 UPDATE 인 경우 해당 트랜잭션에 데이터 변경 작업이 한 번이라도 발생했음을 의미합니다.
- SQL_STATUS 가 SQL_END 인 경우 트랜잭션에서 수행한 SQL 문의 수행이 종료하였으나 트랜잭션은 종료되지 않은 상태를 의미합니다. (위 결과에서 4번 세션의 TX_ID 61397121)
- SQL_STATUS 가 SQL_ING 인 경우 트랜잭션에서 수행한 SQL 문장이 수행 중임을 의미합니다. (위 결과에서 6번 세션의 TX_ID 586566273)
- LAST_QUERY_START_TIME 으로 트랜잭션에서 수행한 마지막 SQL문의 시작 시각을 알 수 있습니다. 현재 시각과 차이로 해당 트랜잭션이 얼마나 오래 수행 중인지 판단할 수 있습니다.
- UTRANS_TIMEOUT 은 변경 트랜잭션이 수행할 수 있는 최대 소요 시간(초 단위)을 의미합니다.
UNDO_USED(KB)는 해당 트랜잭션에서 사용한 언두의 크기를 kbyte 단위로 보여줍니다.
아래는 변경 트랜잭션에서 언두 영역에 생성한 변경 전 데이터를 바라보는 조회 트랜잭션을 보여주는 출력 결과입니다.
- TX_TYPE 이 SELECT 인 경우 변경 문장을 한 번도 수행하지 않은 트랜잭션을 의미합니다.
LOB 데이터가 포함되지 않은 SELECT 문은 데이터베이스로부터 데이터를 fetch 한 후에는 언두 이미지를 더 이상 바라보지 않습니다.
- Autocommit-Mode 의 트랜잭션은 fetch 를 완료하면 결과에서 사라집니다. (5번 세션의 TX_ID 1613185 참고. DISK_VIEW_SCN 에 SCN 이 표시된 것은 LOB데이터를 포함하지 않음을 의미함.)
- Non-autocommit-Mode 의 트랜잭션은 fetch 종료 후 commit 수행 전까지 DISK_VIEW_SCN, MIN_DISK_LOB_VIEW_SCN 이 모두 - 로 표시됩니다. (9번 세션의 TX_ID 376196)- LOB 데이터를 포함한 SELECT 문은 fetch 가 종료되어도 commit 또는 rollback 을 수행하기 전까지 언두 이미지를 바라봅니다.
DISK_VIEW_SCN - 이고 MIN_DISK_LOB_VIEW_SCN 에 SCN 이 표시되어 있으면 LOB 데이터를 조회하는 트랜잭션을 의미합니다. (2번 세션의 TX_ID 7374720)
LOB 데이터의 경우 lob cursor 라는 정보가 존재하는데 이것이 open 된 상태에서는 언두 이미지를 바라보게 됩니다. lob cursor 는 commit 또는 rollback 을 수행해야만 close 됩니다.
이 상태의 트랜잭션은 언두 사용을 증가시키는 원인이 될 수 있습니다.
다음은 언두 영역을 사용하는 이중화 트랜잭션을 보여주는 결과입니다.
- CLIENT_IP 로 트랜잭션을 보낸 서버의 IP 를 확인할 수 있습니다.
- SESSION_ID 로 이중화 객체 이름을 알 수 있습니다.
- REP'S TX 라는 값은 로컬에서 확인할 수 없는 값을 의미합니다. (이중화 트랜잭션의 세션, SQL 정보는 로컬에서 확인 불가)
QUERY에 출력된 REMOTE_TX_ID로 원격 서버의 TX_ID 를 알 수 있습니다.
언두 테이블스페이스 사용량이 계속 증가할 경우 모니터링 쿼리
장시간 동작하는 트랜젝션이 조회되지 않고, 언두 테이블스페이스를 사용하는 트랜젝션이 조회되지 않는데 사용량이 계속 증가하는 경우
아래 모니터링 쿼리를 통해 언두 테이블스페이스 재활용 판단 기준인 SYS_MIN_DISK_VIEWSCN 값이 갱신되지 않고 유지되는 트랜젝션을 찾아 조치합니다.
해당 트랜잭션의 복구(롤백)의 경우 데이터 정합성을 보장하기 위해 복구데이터(트랜젝션 실행전의 데이터)를 언두 테이블스페이스에 저장하게 되고
SYS_MIN_DISK_VIEWSCN 이후에 변경된 모든 복구데이터를 지우지 못하고 공간을 추가로 사용하게 되므로 언두 테이블스페이스가 지속적으로 증가하게 됩니다.
쿼리 결과에서 아래와 같은 정보들을 확인할 수 있습니다.
- 언두 영역을 사용하는 트랜잭션 존재 여부
- 언두 테이블스페이스 사용량 증가를 유발하는 SESSION ID
- 언두 테이블스페이스 사용량 증가를 유발하는 Client Process ID
- 트랜잭션의 마지막 SQL 문장 및 수행 시각
SET VERTICAL ON; SELECT * FROM X$TRANSACTION_MANAGER;
출력 결과(시점에 따라 결과값 상이할 수 있음)
아래는 문제의 트랜젝션을 찾기 위한 참고값인 SYS_MIN_DISK_VIEWSCN 을 확인하는 쿼리 결과 입니다.
연속적으로 여러번 수행해도 해당 값이 변경되지 않을때 문제가 있다고 판단해야 합니다.
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') NOW,
a.ID SESSION_ID,
a.TRANS_ID,
a.COMM_NAME,
a.CLIENT_PID,
DECODE(a.IDLE_START_TIME, 0, '-', to_char(to_date('1970010109', 'yyyymmddhh') + a.IDLE_START_TIME/(24*60*60), 'mm/dd hh:mi:ss')) IDLE_START_TIME,
b.DISK_VIEW_SCN DISK_VIEW_SCN,
b.MIN_DISK_LOB_VIEW_SCN MIN_DISK_LOB_VIEW_SCN,
b.COMMIT_SCN COMMIT_SCN
FROM V$SESSION a,
V$TRANSACTION b
WHERE a.ID = b.SESSION_ID
AND b.MIN_DISK_LOB_VIEW_SCN LIKE '%12345678%'
AND (b.DISK_VIEW_SCN >= (SELECT SYS_MIN_DISK_VIEWSCN
FROM X$TRANSACTION_MANAGER)
OR b.MIN_DISK_LOB_VIEW_SCN >= (SELECT SYS_MIN_DISK_VIEWSCN
FROM X$TRANSACTION_MANAGER)
OR b.COMMIT_SCN >= (SELECT SYS_MIN_DISK_VIEWSCN
FROM X$TRANSACTION_MANAGER)) ;
출력 결과(시점에 따라 결과값 상이할 수 있음)
아래는 SYS_MIN_DISK_VIEWSCN 으로 문제의 트랜젝션을 확인하는 쿼리 결과 입니다.
언두 테이블스페이스 Free 영역을 확보하기 위해 결과로 나온 세션의 정보로 해당 세션을 강제 종료시켜야 합니다.
Altibase 5.1.5 이하 버전
트랜잭션 별 언두 테이블스페이스 사용량 모니터링 쿼리
아래 모니터링 쿼리를 통해 언두를 사용하고있거나 접근하고 있는 트랜잭션을 찾아 조치합니다.
쿼리 결과에서 아래와 같은 정보들을 확인할 수 있습니다.
- 언두 테이블스페이스를 사용하거나 접근하고 있는 세션의 정보. (Autocommit mode, Client IP 및 Process id, UTRANS_TIMEOUT 설정 값)
- 언두 영역을 사용하는 변경 트랜잭션 존재 여부
- 언두 영역에 접근하는 조회 트랜잭션 존재 여부
- 트랜잭션의 마지막 SQL 문장 및 수행 시각
- SQL 문장 수행 여부
SELECT RPAD(DECODE(TX.LOG_TYPE, 1, REP.REP_NAME, ST.SESSION_ID), 10) SESSION_ID -- 트랜잭션을 수행한 세션 ID.
, RPAD(TX.ID, 20) TX_ID -- 트랜잭션 ID
, RPAD(DECODE(ST.ID, NULL, 'REP''S TX', ST.ID), 20) STATEMENT_ID -- STATEMENT ID
, RPAD(DECODE(TX.TSS_RID, 0, 'SELECT', 'UPDATE'), 7) TX_TYPE -- 트랜잭션 타입. SELECT : 조회 문장만 있는 트랜잭션. UPDATE : DELETE, UPDATE 등 데이터를 변경한 트랜잭션
, RPAD(DECODE(TX.STATUS, 0, 'BEGIN', 1, 'PRECOMMIT', 2, 'COMMIT_IN_MEMORY', 3, 'COMMIT', 4, 'ABORT', 5, 'BLOCKED', 6, 'END'), 16) TX_STATUS -- 트랜잭션 상태
, RPAD(DECODE(ST.EXECUTE_FLAG, NULL, 'REP''S TX', 0, 'SQL_END', 1, 'SQL_ING'), 16) SQL_STATUS -- SQL문 상태
, RPAD(DECODE(TX.LOG_TYPE, 1, 'REP '||REP.PEER_IP||':'||REP.PEER_PORT, S.COMM_NAME||' PID:'||S.CLIENT_PID), 40) CLIENT_IP -- 클라이언트 IP와 프로세스 ID
, RPAD(DECODE(S.AUTOCOMMIT_FLAG, 1, 'ON', 0, 'OFF', NULL, 'REP''S TX'), 10) AUTOCOMMIT -- AUTOCOMMIT 모드
, RPAD(DECODE(TX.LOG_TYPE, 1, 'REP''S TX', S.UTRANS_TIME_LIMIT), 15) UTRANS_TIMEOUT -- 세션의 UTRANS_TIMEOUT 설정값
, TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') CURRENT_TIME -- 현재 시각
, DECODE(ST.LAST_QUERY_START_TIME, NULL, TO_CHAR(TO_DATE('1970010109','YYYYMMDDHH') + TX.FIRST_UPDATE_TIME / (60*60*24), 'YYYY-MM-DD HH:MI:SS'), ST.LAST_QUERY_START_TIME) LAST_QUERY_START_TIME -- SQL문 시작 시각
, DECODE(TX.LOG_TYPE, 1, 'REMOTE_TX_ID : '||REP_TX.REMOTE_TID, ST.QUERY) QUERY -- 언두를 사용하거나 접근한 트랜잭션에서 수행한 마지막 쿼리
FROM V$TRANSACTION TX LEFT OUTER JOIN (SELECT SESSION_ID , TX_ID , ID , TO_CHAR(TO_DATE('1970010109','YYYYMMDDHH') + (LAST_QUERY_START_TIME) / (60*60*24), 'YYYY-MM-DD HH:MI:SS') LAST_QUERY_START_TIME , UNDO_READ_PAGE , UNDO_GET_PAGE , EXECUTE_FLAG, SUBSTR(QUERY, 1, 60) QUERY
FROM V$STATEMENT
WHERE (SESSION_ID
, TX_ID
, LAST_QUERY_START_TIME) IN (SELECT SESSION_ID
, TX_ID
, MAX(LAST_QUERY_START_TIME) LAST_QUERY_START_TIME
FROM V$STATEMENT
GROUP BY SESSION_ID
, TX_ID)) ST ON TX.ID = ST.TX_ID LEFT OUTER JOIN V$SESSION S ON ST.SESSION_ID = S.ID LEFT OUTER JOIN V$REPRECEIVER_TRANSTBL REP_TX ON TX.ID = REP_TX.LOCAL_TID LEFT OUTER JOIN V$REPRECEIVER REP ON REP_TX.REP_NAME = REP.REP_NAME
WHERE 1=1
AND TX.STATUS <> 6
AND (TX.TSS_RID <> 0
OR ST.UNDO_READ_PAGE <> 0
OR ST.UNDO_GET_PAGE <> 0)
ORDER BY SESSION_ID
, TX_ID
, LAST_QUERY_START_TIME;
출력 결과
아래는 언두를 사용하는 변경 트랜잭션을 보여주는 출력 예입니다.
- TX_TYPE 이 UPDATE 인 경우 해당 트랜잭션에 데이터 변경 작업이 한 번이라도 발생했음을 의미합니다.
- SQL_STATUS 가 SQL_END 인 경우 트랜잭션에서 수행한 SQL 문의 수행이 종료하였으나 트랜잭션은 종료되지 않은 상태를 의미합니다. (아래 결과에서 4번 세션의 TX_ID 61397121)
- SQL_STATUS 가 SQL_ING 인 경우 트랜잭션에서 수행한 SQL 문장이 수행 중임을 의미합니다. (아래 결과에서 6번 세션의 TX_ID 61397121)
- LAST_QUERY_START_TIME 으로 트랜잭션에서 수행한 마지막 SQL문의 시작 시각을 알 수 있습니다. 현재 시각과 차이로 해당 트랜잭션이 얼마나 오래 수행 중인지 판단할 수 있습니다.
- UTRANS_TIMEOUT 은 변경 트랜잭션이 수행할 수 있는 최대 소요 시간(초 단위)을 의미합니다.
다음은 변경 트랜잭션에서 언두 영역에 생성한 변경 전 데이터를 바라보는 조회 트랜잭션을 보여주는 출력 결과입니다.
- TX_TYPE 이 SELECT 인 경우 변경 문장을 한 번도 수행하지 않은 트랜잭션을 의미합니다.
다음은 언두 영역을 사용하는 이중화 트랜잭션을 보여주는 결과입니다.
- CLIENT_IP 로 트랜잭션을 보낸 서버의 IP 를 확인할 수 있습니다.
- SESSION_ID 로 이중화 객체 이름을 알 수 있습니다.
- REP'S TX 라는 값은 로컬에서 확인할 수 없는 값을 의미합니다. (이중화 트랜잭션의 세션, SQL 정보는 로컬에서 확인 불가)
- QUERY에 출력된 REMOTE_TX_ID로 원격 서버의 TX_ID 를 알 수 있습니다.
조치 방법
언두 테이블스페이스 크기 증가
언두 테이블스페이스의 데이터 파일을 추가하거나 기존 데이터 파일의 크기를 확장해야 합니다.
언두 사용량이 증가하고 있을 때 조치 할 수 있는 방법 중 하나입니다.
데이터 파일 추가
기존 데이터 파일 이름 확인 후 기존 네이밍 룰에 맞춰 데이터 파일을 추가합니다.
SELECT RPAD(T.NAME, 20) SPACE_NAME
, RPAD(DECODE(D.AUTOEXTEND, 0, 'OFF', 1, 'ON'), 10) AS AUTOEXTEND
, DECODE(D.MAXSIZE, 0, ROUND((D.CURRSIZE*T.PAGE_SIZE)/1024/1024), ROUND((D.MAXSIZE*T.PAGE_SIZE)/1024/1024)) AS 'MAXSIZE(KB)'
, D.NAME DATAFILE
, DECODE(D.AUTOEXTEND, 0, 'OFF', 1, 'ON') 'AUTOEXTEND'
FROM V$TABLESPACES T, V$DATAFILES D
WHERE T.ID = D.SPACEID AND T.TYPE = 7
ORDER BY 1, 2 ;
-- 수행 결과 예
iSQL> /
SPACE_NAME AUTOEXTEND MAXSIZE(KB) DATAFILE AUTOEXTEND
------------------------------------------------------------------------------------------------------------------------------
SYS_TBS_DISK_UNDO ON 2048 /data/heejung.lee/63138/dbs/undo001.dbf ON
1 row selected.
-- 수행 예
ALTER TABLESPACE SYS_TBS_DISK_UNDO ADD DATAFILE 'undo002.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE 2G;
파란색으로 Italic 되어 있는 부분은 사용자 환경에 맞게 변경가능합니다. 구문 설명은https://manual.altibase.com/7.3/ref/sql/3.-Data-Definition-Language/ALTER-TABLESPACE/ 에서 SQL Reference 을 참고하세요.
기존 데이터 파일 크기 확장
기존 데이터 파일의 이름과 최대 크기를 확인 후 현재 값 보다 크게 최대 크기를 설정합니다.
데이터 파일 이름과 최대 크기는 위의 쿼리를 이용하여 확인하세요.
-- 수행 예
-- 수행 예
ALTER TABLESPACE SYS_TBS_DISK_UNDO ALTER DATAFILE 'undo001.dbf' SIZE 4G;
파란색으로 Italic 되어 있는 부분은 사용자 환경에 맞게 변경가능합니다. 구문 설명은 https://manual.altibase.com/7.3/ref/sql/3.-Data-Definition-Language/ALTER-TABLESPACE/ 에서 SQL Reference 을 참고하세요.
세션 강제 종료
언두 테이블스페이스를 장시간 사용하는 세션을 강제 종료합니다.
언두 사용량이 증가하고 있을 때 조치 할 수 있는 방법 중 하나입니다.
세션을 강제 종료하더라도 트랜잭션 종류에 따라 트랜잭션 종료 시점이 다를 수 있습니다.
- 조회 트랜잭션의 경우 세션 종료 즉시 트랜잭션이 종료됩니다.
- 변경 트랜잭션의 경우 rollback 수행 후 트랜잭션이 종료되므로 언두 사용량 증가 현상이 조치되기까지는 최소 트랜잭션이 진행된 만큼의 시간이 걸릴 수 있습니다.
세션 종료 방법
Altibase 에서 세션 강제 종료
SQL 구문iSQL> ALTER DATABASE database_name SESSION CLOSE session_id ;
session_id 는 '트랜잭션 별 언두 테이블스페이스 사용량 모니터링 쿼리' 수행 결과에서 SESSION_ID 값을 입력하고, database_name 은 아래 쿼리로 확인하세요.
SQL 구문iSQL> SELECT DB_NAME FROM V$DATABASE;
DB 세션을 잡고 있는 클라이언트 프로세스 종료
클라이언트 프로그램에서 제공하는 방법으로 정상 종료하거나 kill 명령어로 강제 종료합니다.$ kill -9 process_id
장시간 수행하는 트랜잭션 방지
장시간 수행되는 트랜잭션(bulk 트랜잭션)은 아래와 같은 문제들을 발생시킬 수 있습니다.
bulk 성 트랜잭션으로 인해 언두 테이블스페이스 사용량이 증가하는 현상을 피하기 위해 아래와 같은 사항들을 확인 후 권장 사항 참고하여 변경합니다.
1. 작은 단위의 트랜잭션으로 나누어 처리
많은 양의 데이터를 하나의 트랜잭션으로 처리하는 것보다 작은 단위로 나누어 처리하도록 합니다.
2. UTRANS_TIMEOUT 설정
UTRANS_TIMEOUT 을 0 이 아닌 값으로 설정하도록 합니다.
변경 연산(UPDATE, INSERT, DELETE)을 수행하는 트랜잭션의 수행 시간이 길어짐에 따라 발생할 수 있는 문제들을 막기 위해 이 값을 설정합니다.
수행 시간이 프로퍼티 값보다 커지면 세션이 강제 종료되고 트랜잭션이 롤백됩니다.
세션 단위 변경 방법
아래 구문을 이용하거나
세션 단위 변경 방법 , iSQL 예커넥션 스트링에 UTRANS_TIMEOUT 속성을 사용할 수 있습니다.
JDBCAPRE시스템 단위 변경 방법
데이터베이스 운용 중에 아래 문장을 수행하면 이후 접속하는 세션은 변경 값이 적용됩니다.
데이터베이스 운용 중 변경 방법ALTER SYSTEM 으로 변경한 값은 Altibase 서버를 재시작하면 altibase.properties 에 설정된 값으로 초기화됩니다. 영구적으로 적용을 원한다면 altibase.properties 파일도 수정해주어야 합니다.
ALTIBASE HDB 재시작 시 적용 방법
3. commit 수행 여부 확인
Non-autocommit 모드로 수행하는 트랜잭션은 반드시 commit 또는 rollback 을 수행해야만 트랜잭션이 종료됩니다.
어플리케이션에서 Non-autocommit 모드로 트랜잭션을 수행하고 commit 또는 rollback 을 수행하지 않는 부분이 있는 지 확인하여 잘못 처리하는 부분이 있다면 수정해야 합니다.