본문 바로가기
TechNical/Oracle

쿼리 에디터 툴이 날려먹은 쿼리 복구하기

by 강멍멍이 2008. 9. 25.
반응형

먼저.. 오라클에 해당하는 내용이다.

쿼리문을 커맨드창이나 메모장에서 작성하기는.... 흠좀무 다..
그래서 쿼리 에디터 툴을 쓰기 마련이다.
오라클에서 제공하는 SQL Developer나 두꺼비를 쓰던지 귤을 쓰던지 쿼리를 작성을 하게 된다.
그러다가 느닷없이 재앙은 다가온다.. 어플리케이션이 갑자기 죽어 버린다. 저장도 안 했는데...
다행스럽게도 재 시작하면 이전 쿼리를 복구 시켜 준다거나 쿼리 히스토리가 기록되어 있어서
복구 시키면 된다.
하지만.. 때때로 이 놈이 복구가 안 되는 수가 있다. 이럴땐 진짜 의욕상실이다.
해서 에디터 프로그램에서 날려먹은 쿼리를 DB에서 찾아 오는 방법도 알아 둘 필요가 있다고 느꼈다.
어제 그랬으니까 -_-

실행환경은 ORACLE 10g 다.
v$sqlareav$sqltext는 퍼포먼스 확인이나 lock 걸린 쿼리 잡아내는 용도로 쓰이지만 복구용으로 써 보자.

0. 최대한 빨리 실행해야 한다. 이유는 묻지 말자.

1. v$sqlarea 테이블에서 기억나는 쿼리 구문으로 찾는다.     

  select *
     from v$sqlarea
    where sql_text like '%emp%'

   시간을 기억하고 있다면 조건절에 first_load_time 를 거는 것은 좋은 생각.
   조회하는 시간 포맷은 아래와 같다. 

  select sql_text,sql_id,first_load_time
     from v$sqlarea
  where sql_text like '%emp%'
     and first_load_time > '2008-09-24/20:00:00'


2. 쿼리가 1000byte미만이라면 모든 쿼리가 나오겠지만 1000바이트 이상이라면
   쿼리의 뒷부분이 날아가 있다. 나머지 쿼리도 모두 복구해 보자.
   쿼리를 찾았다면 해당 row의 SQL_ID 를 복사해 둔다.
   예를 들어서 SQL_ID가 '53dchps3sn7p2' 라고 하자.

3. v$sqltext 테이블에서 조각을 끼워 맞춘다.
   출력은 text output 으로 하는 것이 좋다. 긁어서 에디터에 붙여야 하므로..  

    select *
     from v$sqltext
    where sql_id = '53dchps3sn7p2'
    order by piece

 
   결과값으로 나온 쿼리는 일정한 바이트에 따라서 잘려져 있으므로
   에디터에서 정상적인 쿼리가 되도록 수정해야 한다. 캡숑 삽질이다.

반응형

댓글