<Lock걸린 부분이 있는지 확인>

SELECT C.OBJECT_NAME
     , B.SID
     , B.SERIAL#
     , 'ALTER SYSTEM KILL SESSION '''||B.SID||','||B.SERIAL#||''';'
FROM   V$LOCKED_OBJECT A
JOIN   V$SESSION B ON ( A.SESSION_ID = B.SID )
JOIN   DBA_OBJECTS C ON ( A.OBJECT_ID = C.OBJECT_ID );

위 쿼리로 세션을 Kill

 

 

<만약 Lock 내역이 보이지 않는다면>

SELECT A.LOCK_ID1
     , A.SESSION_ID
     , 'ALTER SYSTEM KILL SESSION '''||B.SID||','||B.SERIAL#||''';'
FROM   DBA_LOCK_INTERNAL A
JOIN   V$SESSION B ON ( A.SESSION_ID = B.SID )
WHERE  LOCK_ID1 LIKE '%object_name%';  --> Object Name 입력

- Lock이 걸린 것으로 의심되는 object의 이름을 넣어 위 쿼리로 확인

- 내역이 보이면 세션을 Kill 시킨다.

 

 

<하지만 여전히 세션 내역에 존재하고>

SELECT STATUS
FROM   V$SESSION
WHERE  SID = 'session_id';  --> Session ID 입력

위 쿼리의 결과(STATUS)가 'Killed'라고 나온다면

 

 

<서버에서 돌고있는 Lock 관련 프로세스 확인>

SELECT B.SPID
     , 'KILL -9 ' || B.SPID
FROM   V$SESSION A
JOIN   V$PROCESS B ON ( A.PADDR = B.ADDR )
WHERE  A.SID = 'session_id';  --> Session ID 입력

 

 

<프로세스 ID가 실제 존재하는지 서버에서 확인>

ps -ef | grep 프로세스ID

 

 

<서버 프로세스 kill>

#DB서버
kill -9 프로세스ID

 

Kill 후 쿼리로 세션 존재여부 확인

 

끝.

블로그 이미지

2010년1월어느날..

,

※ A, B, C, D컬럼에 각각 4, 2, 1, 3이라는 값이 들어 있을경우 두번째로 큰값을 가지고 오는 방법


SELECT LEAST( GREATEST(A, B, C) 
            , GREATEST(A, B, D)
            , GREATEST(A, C, D) 
            , GREATEST(B, C, D) ) AS "두번째로 큰값"
FROM   ( SELECT 4 AS A
              , 2 AS B
              , 1 AS C
              , 3 AS D 
         FROM   DUAL );

* 의외로 유용하게 쓰일듯


블로그 이미지

2010년1월어느날..

,

정부 정책상 비밀번호는 복호화가 안되어야 한다고 한다. 다행히도 오라클에서 단방향 암호화 패키지가 존재한다.

DBMS_CRYPTO.HASH    :   10g부터 지원한다고 함.


사용법은 굉장히 간단하다.

SELECT RAWTOHEX(DBMS_CRYPTO.HASH(TO_CLOB(TO_CHAR('암호화할 내용')), 파라미터)
FROM DUAL;


파라미터에 들어가는 내용은 암호화 하는 알고리즘을 정하는것이다.

MD4 : 1

MD5 : 2

SH1 : 3


단, DBMS_CRYPTO 패키지 사용권한이 필요하다. SYSDBA계정으로 들어가 사용하고자 하는 계정으로 GRANT를 먼저 날려줘야 한다.

블로그 이미지

2010년1월어느날..

,
ALTER, DROP 아무리해도 
ORA-00069: 잠금 획득 불가 -- 계정명.테이블명에 대해 테이블 잠금이 사용 안함으로 설정됨
 이 메시지만 죽어라 나옴.

V$LOCK을 암만 뒤져도 락이 걸리진 않았음.

구글링을 해도 별 뾰족한 방법을 제시하지 않음.
한글은 검색이 안되고 그나마 검색되는것도 온통 영어임.

 2시간 삽질끝에
ALTER TABLE 계정명.테이블명 ENABLE TABLE LOCK;
 이 명령을 실행해서 테이블에 걸려있는 락을 풀어야 된다는걸 알게 됨.

ENABLE 대신 DISABLE을 사용하면 테이블에 락이 걸려서 ALTER, DROP뿐만 아니라 UPDATE, INSERT도 되지 않는다.
 
블로그 이미지

2010년1월어느날..

,
예를 들어 $.getJSON을 이용하여 학생명단을 반환하는 함수 A()가 있을경우, A함수를 호출하게 되면 A에서는 Null값을 반환하게 된다.

이유는 $.getJSON을 이용하여 학생명단을 가지고 오는동안 프로그램이 멈춰있는것이 아니라 $.getJSON을 실행만 시켜놓고 다음 명령어를 계속 진행하게 된다. 따라서 이를 기다리게 하는 방법을 찾아야 한다.

$.getJSON() 은 기본적으로 $.ajax설정에서 'async'가 true값으로 되어 있다. 따라서 이를 false로 바꿔주면 위의 문제는 해결된다.

$.ajaxSetup({
        async: false
});

* 아래는 ajaxSetup에서의 async 설명원문(http://api.jquery.com/jQuery.ajax/)
asyncBoolean
Default: true

By default, all requests are sent asynchronous (i.e. this is set to true by default). If you need synchronous requests, set this option to false. Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation. Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active.


블로그 이미지

2010년1월어느날..

,