개발은 너무해

오라클 10g 로그마이너 본문

Oracle/Oracle Recovery

오라클 10g 로그마이너

까칠 평생초보 2011.08.31 10:57
* 나는 핫백업이 끝나는 시점까지의 아카이브 파일들은 항상 백업을 해놓는다.
* 로그마이너를 사용하는데에 있어 내가 데이터를 삭제,수정한 시점을 대충이라도
   기억을 하면 좀 더 수월한 작업이 진행 되지 않을까 생각된다.

* 만약 오후 4시 10분 쯤에 DML 작업을 하였고, 그 이후에 잘못되었다는 것을 알았을 때
  archive 파일 쌓이는 곳을 확인하여 해당시간대에 쌓인 archive 파일을 dbms_logmnr 를 이용하여 복구 시킨다.


-rw-r----- 1 oracle dba 2769920 2011-08-30 16:07 1_17_760545262.dbf
-rw-r----- 1 oracle dba 2712064 2011-08-30 16:08 1_18_760545262.dbf
-rw-r----- 1 oracle dba 2759680 2011-08-30 16:09 1_19_760545262.dbf
-rw-r----- 1 oracle dba 1183232 2011-08-30 16:11 1_20_760545262.dbf
-rw-r----- 1 oracle dba 120832 2011-08-30 16:12 1_21_760545262.dbf
-rw-r----- 1 oracle dba 62976 2011-08-30 16:13 1_22_760545262.dbf
-rw-r----- 1 oracle dba 103424 2011-08-30 16:19 1_23_760545262.dbf
-rw-r----- 1 oracle dba 156160 2011-08-30 16:20 1_24_760545262.dbf
-rw-r----- 1 oracle oinstall 51224064 2011-08-30 17:04 1_25_760545262.dbf

* archive 파일이 /oracle/oradata/arch에 쌓이지만,
   arch_recovery라는 폴더를 생성하여 위 해당 파일들을 복사하였다.


cf. archive 파일 경로 확인 방법.
     show parameter log_archive_dest
     archive log list (sys계정에서만 가능)

* sys 접속
sqlplus "/as sysdba"

* archive 파일 등록
exec dbms_logmnr.add_logfile('/oracle/oradata/arch/arch_recovery/1_20_760545262.dbf');
exec dbms_logmnr.add_logfile('/oracle/oradata/arch/arch_recovery/1_21_760545262.dbf');
exec dbms_logmnr.add_logfile('/oracle/oradata/arch/arch_recovery/1_22_760545262.dbf');
exec dbms_logmnr.add_logfile('/oracle/oradata/arch/arch_recovery/1_23_760545262.dbf');
exec dbms_logmnr.add_logfile('/oracle/oradata/arch/arch_recovery/1_24_760545262.dbf');

* 등록된 archive 분석
exec dbms_logmnr.start_logmnr( options => dbms_logmnr.dict_from_online_catalog);

* 분석된 내용 조회
select * from v$logmnr_contents where operation = 'DELETE' and table_name = 'TEMP_DELETE_TABLE'; 

cf.  v$logmnr_contents : 활성화되지 않으면 조회할수 없다. 아래와 같은 에러 발생.
      ORA-01306: v$logmnr_contents에서 선택하기 전에 dbms_logmnr.start_logmnr()이 호출되어야 합니다

* 다른 계정으로 분석 데이터 복사.
create table scott.temp_logmnr_contents
select * from v$logmnr_contents where operation = 'UPDATE' and table_name='TEMP_DELETE_TABLE';

* dbms_logmnr 종료.
exec dbms_logmnr.end_logmnr;

* 데이터를 확인하여 보면 undo_sql과 redo_sql이 있다.
   로그파일 특성상 쿼리문이 저장되기 때문에 쿼리가 그대로 보여지게 된다.
0 Comments
댓글쓰기 폼