ORA-02049 : 시간초과 : 분산 트랜잭션이 잠금으로 대기중입니다.

위와 같은 메시지가 뜬다면 테이블이 락이 걸려서 TOAD의 사용이 막힌 경우 테이블의 락을 풀어줘야 하는데, 보통은 SYSTEM 계정으로 접근하여 문제가 있는 트랜잭션을 찾는다.

--Transaction 찾는 쿼리
SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME
FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C
WHERE A.SID=B.SID
AND B.ID1=C.OBJECT_ID
AND B.TYPE='TM'
--AND C.OBJECT_NAME IN ('IFRS_VAL_ACCT') --특정 테이블에서 tx 찾을때 사용
;

찾은후 해당 SID와 SERIAL# 값으로 아래를 실행하여 아래와 같은 쿼리를 실행하면
테이블의 락이 해제된다.

--session kill하는 쿼리  
--alter system kill session 'SID, SERIAL#'
alter system kill session '365,41540';

하지만, 테이블 락을 해제 쿼리를 입력하여도 ORA-00031 : session marked for kill 의 메시지가 나오는 경우가 있다. 직접적으로 아래의 쿼리를 이용하여 oracle 계정으로 시스템에 접근하여 프로세스를 kill 하는 방법이 있다.
( 어떤 세션이 매우 긴 트랜잭션을 수행하다가 강제로 kill이 되게 되면, 우선은 해당 트랜잭션이 사용하던 rollback segment가 회수되게 됩니다. 이때, 그 사이즈가 크면 클 수록 롤백되는 시간이 길어지는데요. 그 동안은 어쨋든 세션은 유지되어야 하는거죠.kill marking만 되구요. 이 때에도 해당 롤백세그먼트는 사용될 수 있습니다. )

SELECT VS.SID, VS.USERNAME, VS.OSUSER,
            VS.PROCESS FG_PID,VP.SPID BG_PID
FROM V$SESSION VS, V$PROCESS VP
WHERE VS.PADDR = VP.ADDR;

위의 쿼리를 실행하여, PID(ProcessID)를 확인후 오라클 계정으로 시스템에 접근하여, kill 명령어를 이용하여 해당 프로세스를 종료한다.

$ kill -9 pid

물론 앞서 메시지가 나오고 방금 kill 이 안되는 경우에도 어느정도 시간을 갖고 기다리면 rollback segment의 수치가 점점 작아져 결국 테이블 락이 해제가 된다.

다음의 내용들은 개인적인 권장하는 사항들이다.
오라클 10g의 경우 엔진 설치를 위한 디렉토리 공간을 20GB 이상 주는 것을 권장한다.
오라클의 adump, bdump, udump, 리스너 로그, 아카이브 로그 등을 백업할 수 있으면 백업하는 것을 권장한다.
하지만 대부분의 경우 백업의 필요성이 절실하지 않기 때문에
삭제한다.

각종 로그의 자동관리를 위하여 첨부한 파일과 같이 CRONTAB에 등록하여 관리하면 편리하다.
각각의 로그관리에 대한 정책이 필요하다.

정책 예시)

1. alert 로그       : 월별로 로그를 관리. 영구 보관하는 것이 좋다. compress 명령으로 압축하여 보관.
2. adump audit 파일 : 180일 정도 유지, 매일 180일이 지난 trc파일을 삭제
3. bdump trace 파일 : 90일 정도 유지, 매일 90일이 지난 trc파일을 삭제
4. udump trace 파일 : 90일 정도 유지, 매일 90일이 지난 trc파일을 삭제
5. 리스너 로그      : 리스너를 로깅하도록 설정했을 경우 월별로 로그를 관리. 180일이 지난 파일은 삭제. compress 명령으로 압축하여 보관.
6. 아카이브로그 파일 : 기본적으로 1주일에 1번 이상 FULL BACKUP을 받을 경우
   백업 툴에서 아카이브로그를 관리해 주지 않을 경우 등록하여 사용 7일전 아카이브로그 파일 삭제.

쉘 예시)
쉘 스크립트 작성 시 오타에 주의할 것. 반드시 테스트 후 적용할 것
#######################################################
#### alert.log                                     ####
#### (매월 1일 실행할 수 있도록 cron job 등록 )    ####
#######################################################

nDate=`date +%Y%m%d`
cp $ORACLE_BASE/admin/TESTDB/bdump/alert_TESTDB.log $ORACLE_BASE/TESTDB/bdump/alert_TESTDB.log.$nDate
cat /dev/null > $ORACLE_BASE/admin/TESTDB/bdump/alert_TESTDB.log
compress -vf $ORACLE_BASE/TESTDB/bdump/alert_TESTDB.log.$nDate

#######################################################

#### listener.log                                  ####
#### (매월 1일 실행할 수 있도록 cron job 등록 )    ####
#######################################################

nDate=`date +%Y%m%d`
cp $ORACLE_HOME/network/admin/listener.log $ORACLE_HOME/network/admin/listener.log.$nDate
cat /dev/null > $ORACLE_HOME/network/admin/listener.log
compress -vf $ORACLE_HOME/network/admin/listener.log.$nDate

#######################################################

#### audit                                         ####

#######################################################
# 180일이 지난 *.aud를 찾아 삭제
find $ORACLE_BASE/admin/TESTDB/adump \( -ctime +180 -name '*.aud' \) -exec rm -f {} \;

#######################################################

#### .trc                                          ####
# 90일이 지난 *.trc를 찾아 삭제                    ####
#######################################################
find $ORACLE_BASE/admin/TESTDB/bdump \( -ctime +90 -name '*.trc' \) -exec rm -f {} \;
find $ORACLE_BASE/admin/TESTDB/udump \( -ctime +90 -name '*.trc' \) -exec rm -f {} \;

#######################################################

#### archive log                                   ####
#######################################################
# 7일이 지난 *.arc를 찾아 삭제
find /archive_log \( -ctime +7 -name '*.arc' \) -exec rm -f {} \;

오라클에 접속하는 최대 세션의 개수는 늘리는 방법은 오라클 세션관련 파라미터중 processes를 수정하면 된다.

최대 접속세션의 수는 다음과 같은 공식으로 이루어진다.
SESSIONS = (PROCESSES * 1.1) + 5

1. 오라클에 접속하여 원하는 값을 확인한다.
sql> show parameter processes;

2. PFILE을 수정하여 파라미터를 원하는 값으로 설정한다.
processes를 수정!

3. 오라클을 재기동한다.
sql> shutdown immediate
sql> startup

4. 세션개수가 늘어났는지 확인한다.
sql> show parameter processes
sql> show parameter sessions

** process 파라미터는 동적으로 변경할 수 없다.
때문에 sql> 에서
alter session set processes=300
등으로 변경할 수 없다.

Oracle Database Vault

Oracle Database Vault는 다음과 같은 기능을 통해 오늘날 기업이 공통적으로 당면한 컴플라이언스 요구 사항을 해결하고 내부자 위협으로 인한 리스크를 경감할 수 있게 합니다:

  • 강력한 권한을 가진 사용자(예: DBA)라 하더라도 애플리케이션 데이터에 접근할 수 없도록 통제
  • 역할 분리(separation of duty) 지원
  • 누가, 언제, 어디서, 어떻게 애플리케이션, 데이터베이스, 데이터에 접근할 수 있는지에 대한 컨트롤 구현

PCI(Payment Card Industry), 사베인즈-옥슬리 (SOX), EU 개인정보보호법, HIPAA(Privacy Directive and the Healthcare Insurance Portability and Accountability Act) 등 내부자의 기밀 정보 접근, 조작, 유출로 인한 사기, 신분 도용, 재무 정보 조작, 금융 손실 등의 피해를 방지하기 위한 내부 컨트롤의 강화를 요구하는 새로운 법안들이 연이어 제정되고 있습니다.

고객은 기존의 애플리케이션 코드를 전혀 수정하지 않고도 Oracle Database Vault Realms, Command Rules, Factors, Separation of Duty 등을 애플리케이션 환경에 추가할 수 있습니다. Oracle Database Vault는 최근 PeopleSoft 애플리케이션에 인증을 마쳤으며, Oracle E-business Suite, Siebel 애플리케이션에 대한 인증 작업이 현재 진행 중입니다. Oracle Database Vault는 Oracle Database 10g Release 2와 Oracle Database 9i Release 2를 지원합니다.


+ Recent posts