Skip to end of metadata
Go to start of metadata

 

 

 

 

 

개요


언두 테이블스페이스 사용량이 지속적으로 증가할 경우 모니터링 방법에 대해 설명합니다.

 

 

 

모니터링 항목


언두 테이블스페이스의 사용량이 증가한다면 다음 두 가지 경우를 확인해야 합니다.

  • 디스크 테이블의 데이터를 변경하는 변경 트랜잭션이 존재하는지
  • 변경 트랜잭션에서 생성한 old image 를 바라보는 조회 트랜잭션이 존재하는지

 

 

 

버전 별 모니터링 방법


ALTIBASE HDB 5.3.3, 5.5.1, 6.1.1, 6.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 61397121)
  • 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 를 알 수 있습니다.  

 

 

 

 

ALTIBASE HDB 4.3.9, 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.
데이터 파일 추가 방법 : AUTOEXTEND 가 ON 인 경우
ALTER TABLESPACE SYS_TBS_DISK_UNDO ADD DATAFILE 'datafile_name' AUTOEXTEND ON NEXT 1M MAXSIZE 2G;

-- 수행 예
ALTER TABLESPACE SYS_TBS_DISK_UNDO ADD DATAFILE 'undo002.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE 2G;
데이터 파일 추가 방법 : 데이터 파일 추가 방법 : AUTOEXTEND 가 OFF 인 경우
ALTER TABLESPACE SYS_TBS_DISK_UNDO ADD DATAFILE 'datafile_name' SIZE 2G ;

-- 수행 예

iSQL> ALTER TABLESPACE SYS_TBS_DISK_UNDO ADD DATAFILE 'undo002.dbf' SIZE 2G;
Alter success.

파란색으로 Italic 되어 있는 부분은 사용자 환경에 맞게 변경가능합니다.  구문 설명은 http://support.altibase.com/kr/manual 에서 SQL Reference 을 참고하세요.



기존 데이터 파일 크기 확장

기존 데이터 파일의 이름과 최대 크기를 확인 후  현재 값 보다 크게 최대 크기를 설정합니다.

데이터 파일 이름과 최대 크기는 위의 쿼리를 이용하여 확인하세요.

데이터 파일 추가 방법 : AUTOEXTEND 가 ON 인 경우
ALTER TABLESPACE SYS_TBS_DISK_UNDO ALTER DATAFILE 'datafile_name'  AUTOEXTEND OFF;
ALTER TABLESPACE SYS_TBS_DISK_UNDO ALTER DATAFILE 'datafile_name'  AUTOEXTEND ON NEXT 1M MAXSIZE 4G;

-- 수행 예
ALTER TABLESPACE SYS_TBS_DISK_UNDO ALTER DATAFILE 'undo001.dbf'  AUTOEXTEND OFF;
ALTER TABLESPACE SYS_TBS_DISK_UNDO ALTER DATAFILE 'undo001.dbf'  AUTOEXTEND ON NEXT 1M MAXSIZE 4G;
 
데이터 파일 추가 방법 : 데이터 파일 추가 방법 : AUTOEXTEND 가 OFF 인 경우
ALTER TABLESPACE SYS_TBS_DISK_UNDO ALTER DATAFILE 'datafile_name'  SIZE 4G;

-- 수행 예
ALTER TABLESPACE SYS_TBS_DISK_UNDO ALTER DATAFILE 'undo001.dbf' SIZE 4G;

파란색으로 Italic 되어 있는 부분은 사용자 환경에 맞게 변경가능합니다.  구문 설명은 http://support.altibase.com/kr/manual 에서 SQL Reference 을 참고하세요.

 

 

 

세션 강제 종료


언두 테이블스페이스를 장시간 사용하는 세션을 강제 종료합니다.

언두 사용량이 증가하고 있을 때 조치 할 수 있는 방법 중 하나입니다.

세션을 강제 종료하더라도 트랜잭션 종류에 트랜잭션 종료 시점이 다를 수 있습니다. 

  • 조회 트랜잭션의 경우 세션 종료 즉시 트랜잭션이 종료됩니다.
  • 변경 트랜잭션의 경우 rollback 수행 후 트랜잭션이 종료되므로 언두 사용량 증가 현상이 조치되기까지는 최소 트랜잭션이 진행된 만큼의 시간이 걸릴 수 있습니다.

 

세션 종료 방법

  • ALTIBASE HDB 에서 세션 강제 종료

    SQL 구문

    iSQL> connect as sysdba
    Write UserID : sys
    Write Password :
    Connect success.
    iSQL(sysdba)>
    iSQL(sysdba)> ALTER DATABASE database_name SESSION CLOSE session_id ;

    위 문장은 sysdba 사용자만 수행할 수 있습니다.

    session_id 는 '트랜잭션 별 언두 테이블스페이스 사용량 모니터링 쿼리'  수행 결과에서 SESSION_ID 값을 입력하고,  database_name 은 아래 쿼리로 확인하세요. 

  • 클라이언트 프로세스 종료
    클라이언트 프로그램에서 제공하는 방법으로 정상 종료하거나  kill 명령어로 강제 종료합니다.

    $ kill -9 process_id



 

장시간 수행하는 트랜잭션 방지


장시간 수행되는 트랜잭션(bulk 트랜잭션)은 아래와 같은 문제들을 발생시킬 수 있습니다.

bulk 트랜잭션으로 인해 발생할 수 있는 문제

Icon

bulk 트랜잭션(장시간 수행하는 트랜잭션)은 아래와 같은 문제를 야기할 수 있으므로 가능한 피해야 합니다.

  • 리두 로그 증가로 파일 시스템 풀
  • 메모리 사용량 증가 (메모리 테이블의 경우)
  • CPU 부하 증가
  • 대기 트랜잭션 발생
  • 언두 테이블스페이스 사용량 증가

bulk 성 트랜잭션으로 인해 언두 테이블스페이스 사용량이 증가하는 현상을 피하기 위해 아래와 같은 사항들을 확인 후 권장 사항 참고하여 변경합니다.

 

 

1. 작은 단위의 트랜잭션으로 나누어 처리

많은 양의 데이터를 하나의 트랜잭션으로 처리하는 것보다 작은 단위로 나누어 처리하도록 합니다.

올바르지 않은 방법
권장 방법

 

2. UTRANS_TIMEOUT 설정

UTRANS_TIMEOUT 을 0 이 아닌 값으로 설정하도록 합니다.
변경 연산(UPDATE, INSERT, DELETE)을 수행하는 트랜잭션의 수행 시간이 길어짐에 따라 발생할 수 있는 문제들을 막기 위해 이 값을 설정합니다.
수행 시간이 프로퍼티 값보다 커지면 세션을 강제 종료되고 트랜잭션을 롤백됩니다.

 

  • 세션 단위 변경 방법

    아래 구문을 이용하거나

    세션 단위 변경 방법 , iSQL 예

    커넥션 스트링에 UTRANS_TIMEOUT 속성을 사용할 수 있습니다.

    JDBC
    APRE
  • 시스템  단위 변경 방법

    데이터베이스 운용 중에 아래 문장을 수행하면 이후 접속하는 세션은 변경 값이 적용됩니다.

    데이터베이스 운용 중 변경 방법

    ALTER SYSTEM 으로 변경한 값은 ALTIBASE HDB  서버슬 재시작하면 altibase.properties 에 설정된 값으로 초기화됩니다. 영구적으로 적용을 원한다면 altibase.properties 파일도 수정해주어야 합니다.

    ALTIBASE HDB 재시작 시 적용 방법

 

3. commit 수행 여부 확인

Non-autocommit 모드로 수행하는 트랜잭션은 반드시 commit 또는 rollback 을 수행해야만 트랜잭션이 종료됩니다.

어플리케이션에서 Non-autocommit 모드로 트랜잭션을 수행하고 commit 또는 rollback 을 수행하지 않는 부분이 있는 지 확인하여 잘못 처리하는 부분이 있다면 수정해야 합니다.

 

 

 

  • No labels