2014. 11. 5. 11:54

 supplemental 기능의 활성화 여부 확인

SYS>select supplemental_log_data_min from v$database;

비활성화 상태

SUPPLEME

--------

NO


활성화상태로 변경


SYS>alter database add supplemental log data;


Database altered.


SYS>select supplemental_log_data_min from v$database;


SUPPLEME

--------

YES


활성화->비활성화로 변경


SYS>alter database drop supplemental log data;


Database altered.



SYS>select supplemental_log_data_min from v$database;


SUPPLEME

--------

NO


이 기능은 DB 전체를 대상으로 적용할 수 있고,혹은 특정테이블만 적용가능

특정테이블만 적용하기

SYS>alter table scott.emp add supplemental log data (all) columns;

Table altered.
 
이 기능을 사용할 경우 리두로그 생성양이 많아지므로 아카이브 로그 모드를 사용할 때는
아카이브 용량을 충분하게 주고 사용해야 함 

log miner 활용하기
- drop table 정보 찾기

SYS>@log

GROUP# MEMBER                                          MB SEQ# STATUS   ARC
------ --------------------------------------------- ---- ---- -------- -----
     1 /data/temp7/redo01_a.log                         5    3 CURRENT  NO
     1 /data/temp7/redo01_b.log                         5    3 CURRENT  NO
     2 /data/temp7/redo02_a.log                         5    2 INACTIVE YES
     2 /data/temp7/redo02_b.log                         5    2 INACTIVE YES

SYS>select supplemental_log_data_min from v$database;


SUPPLEME

--------

NO



SYS>alter database add supplemental log data;


Database altered.


활성화 상태에서 실습
SYS>select supplemental_log_data_min from v$database;

SUPPLEME
--------
YES

새로운 테이블 생성 후 데이터 입력, 삭제하기
SYS>create table scott.test1 (no number);

Table created.

SYS>insert into scott.test1 values(1);

1 row created.


SYS>commit;

Commit complete.

SYS>drop table scott.test1 purge;

Table dropped.

SYS>@log

GROUP# MEMBER                                          MB SEQ# STATUS   ARC
------ --------------------------------------------- ---- ---- -------- -----
     1 /data/temp7/redo01_a.log                         5    3 CURRENT  NO
     1 /data/temp7/redo01_b.log                         5    3 CURRENT  NO
     2 /data/temp7/redo02_a.log                         5    2 INACTIVE YES
     2 /data/temp7/redo02_b.log                         5    2 INACTIVE YES

테이블이 생성되고 데이터 입력, 삭제 된 내용이 1번 그룹에 들어가 있음을 current 로 확인할 수 있음

로그 딕셔너리 생성
방법
1 online  
2
3

db 종료 후 파라미터 파일의 딕셔너리 파일 경로 지정
SYS>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

[oracle@localhost ~]$ mkdir /data/logminer
파일에 아래 내용 추가
[oracle@localhost ~]$ vi $ORACLE_HOME/dbs/inittestdb.ora
utl_file_dir=/data/logminer 

db시작

SYS>startup
ORACLE instance started.

Total System Global Area  422670336 bytes
Fixed Size                  1344616 bytes
Variable Size             293604248 bytes
Database Buffers          121634816 bytes
Redo Buffers                6086656 bytes
Database mounted.
Database opened.

딕셔너리 생성
SYS>exec dbms_logmnr_d.build(dictionary_filename=>'dict.dbt',-
> dictionary_location=>'/app/oracle/logminer');
log miner에 분석할 로그를 추가

딕셔너리 생성시 경로를 변경하고 싶으면 위와 같은 명령어를 그대로 치고, 
경로만 바꾸어 주면 됨
SYS>exec dbms_logmnr_d.build(dictionary_filename=>'dict.dat', dictionary_location=>'/data/logminer');
PL/SQL procedure successfully completed.



PL/SQL procedure successfully completed.


SYS>exec dbms_logmnr.add_logfile('/data/temp7/redo01_a.log',1); 

PL/SQL procedure successfully completed.

분석시 add_logfilelsl('분석할 리두 경로',숫자옵션)
1 신규생성
2 파일삭제
3 추가등록

2번 그룹에 로그파일을 추가로 등록함

SYS>exec dbms_logmnr.add_logfile('/data/temp7/redo01_a.log',1);

PL/SQL procedure successfully completed.

SYS>exec dbms_logmnr.add_logfile('/data/temp7/redo02_a.log',3);

PL/SQL procedure successfully completed.


등록한 리두로그마이너 삭제할 때

SYS>exec dbms_logmnr.add_logfile('/data/temp7/redo02_b.log',2);

PL/SQL procedure successfully completed.


그룹이 있으면 그 그룹 중에 멤버 하나만 등록하면 리두마이너가 등록이 된다.
한 그룹에 어차피 여러 멤버가 있어서 등록하려고 하면 복사본이라고 에러뜸
그룹당 하나만 리두로그마이너 등록할 수 있음
 
ERROR at line 1:
ORA-01289: cannot add duplicate logfile /data/temp7/redo01_b.log
ORA-06512: at "SYS.DBMS_LOGMNR", line 68
ORA-06512: at line 1


확인

SYS>set line 200
SYS>col db_name for a15
SYS>col filename for a50
SYS>select db_name, filename from v$logmnr_logs;

DB_NAME         FILENAME
--------------- --------------------------------------------------
TESTDB          /data/temp7/redo01_a.log
TESTDB          /data/temp7/redo02_a.log

*대량의 아카이브 리두 로그파일을 분석해야 할 경우 일일이 수동으로 등록하기에 시간이 오래 걸리므로
아래와 같이 스크립트를 생생해서 등록 작업 설정을 쉽게 할 수 있음
[oracle@localhost ~]$ vi ar.sh
for
for i in $(ls /data/arc2);
for i in $(ls 아카이브가 있는 현재경로);
 do echo "exec dbms_logmnr.add_logfile('아카이브 파일이 있는 현재경로/$i',3);" >> /home/oracle/arch.sql;
done;

wq!

[oracle@localhost ~]$ sh ar.sh
파일을 열어보면 명령어가 생성된 것을 확인 할 수 있음 
[oracle@localhost ~]$ vi /home/oracle/arch.sql
exec dbms_logmnr.add_logfile('/app/oracle/fast_recovery_area/TESTDB/archivelog/2014_11_05/o1_mf_1_10_b5ldx374_.arc',3);
exec dbms_logmnr.add_logfile('/app/oracle/fast_recovery_area/TESTDB/archivelog/2014_11_05/o1_mf_1_1_b5lgngbh_.arc',3);
exec dbms_logmnr.add_logfile('/app/oracle/fast_recovery_area/TESTDB/archivelog/2014_11_05/o1_mf_1_29_b5l414vm_.arc',3);
exec dbms_logmnr.add_logfile('/app/oracle/fast_recovery_area/TESTDB/archivelog/2014_11_05/o1_mf_1_2_b5mxx2on_.arc',3);
exec dbms_logmnr.add_logfile('/app/oracle/fast_recovery_area/TESTDB/archivelog/2014_11_05/o1_mf_1_3_b5n7wdy1_.arc',3);
exec dbms_logmnr.add_logfile('/app/oracle/fast_recovery_area/TESTDB/archivelog/2014_11_05/o1_mf_1_6_b5l00zkp_.arc',3);
exec dbms_logmnr.add_logfile('/app/oracle/fast_recovery_area/TESTDB/archivelog/2014_11_05/o1_mf_1_7_b5l0373g_.arc',3);
exec dbms_logmnr.add_logfile('/app/oracle/fast_recovery_area/TESTDB/archivelog/2014_11_05/o1_mf_1_8_b5l03lhl_.arc',3);
exec dbms_logmnr.add_logfile('/app/oracle/fast_recovery_area/TESTDB/archivelog/2014_11_05/o1_mf_1_8_b5lboj3h_.arc',3);
exec dbms_logmnr.add_logfile('/app/oracle/fast_recovery_area/TESTDB/archivelog/2014_11_05/o1_mf_1_9_b5lboo35_.arc',3);
~
~
~
"~/arch.sql" 10L, 1192C                                       1,1           All


주의!!! 테스트 환경을 만들때, 오라클 설치 파일경로인 /app/oracle 에 남은 용량이 많이 없어서 위와 같이 

작업을 하게 되면 나중에 리두로그마이너가 많이 생겨서 용량이 부족하다는 에러가 생길수도 있음. 

그래서 나는 아카이브 경로를 용량이 많은 다른 경로로 이동해 주겠다.

pfile을 사용하는 경우


[oracle@localhost ~]$ vi $ORACLE_HOME/dbs/inittestdb.ora


#아카이브 로그 파일 저장경로와 이름 지정

log_archive_dest_1='location=/data/arc1'

log_archive_dest_2='location=/data/arc2'

log_archive_format=%s_%t_%r.arc #아카이브 로그파일 이름지정#

:wq!

11g 환경에서 오라클은 기본으로 4G의 용량을 주고 아카이브 파일을 저장한다
하지만 내가 파일을 만들어서 주는 것은 내 마음대로 용량을 줄 수 있음
두 개의 파일은 다중화가 되서 아카이브 파일이 같이 들어감

확인방법

SYS>startup

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size                  1344616 bytes

Variable Size             293604248 bytes

Database Buffers          121634816 bytes

Redo Buffers                6086656 bytes

Database mounted.

Database opened.

SYS>alter system switch logfile;


System altered.


SYS>alter system switch logfile;


System altered.


[oracle@localhost arc1]$ ls

4_1_862809266.arc  5_1_862809266.arc

[oracle@localhost arc2]$ ls

4_1_862809266.arc  5_1_862809266.arc


위 파일의 명령을 실행시켜주면 됨

SYS>@/app/oracle/arch.sql 




[oracle@localhost ~]$ vi ar.sh

for i in $(ls /data/arc1);

 do echo "exec dbms_logmnr.add_logfile('/data/arc1/$i',3);" >> /home/oracle/arch.sql;

done;

wq!

[oracle@localhost ~]$ sh ar.sh

[oracle@localhost ~]$ vi /home/oracle/arch.sql

exec dbms_logmnr.add_logfile('/data/arc1/4_1_862809266.arc',3);

exec dbms_logmnr.add_logfile('/data/arc1/5_1_862809266.arc',3);


SYS>@/home/oracle/arch.sql

PL/SQL procedure successfully completed.


PL/SQL procedure successfully completed.

로그마이너를 시작해서 log를 분석한 후 결과 조회



---------------------

157


SYS>select supplemental_log_data_min from v$database;


SUPPLEME

--------

YES


SYS>create table scott.test2(no number, name varchar2(10));


Table created.


SYS>insert into scott.test2 values(1,'AAA');


1 row created.


SYS>insert into scott.test2 values(2,'BBB');


1 row created.


SYS>insert into scott.test2 values(3,'CCC');


1 row created.


SYS>commit;


Commit complete.


SYS>select * from scott.test2;


        NO NAME

---------- --------------------------------------------------

         1 AAA

         2 BBB

         3 CCC


SYS>update scott.test2 set name='DDD';


3 rows updated.


SYS>select * from scott.test2;


        NO NAME

---------- --------------------------------------------------

         1 DDD

         2 DDD

         3 DDD


SYS>commit;


Commit complete.


SYS>show parameter utl


NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

create_stored_outlines               string

utl_file_dir                         string      /data/logminer

SYS>exec dbms_logmnr_d.build(dictionary_filename=>'/dict2.dat',dictionary_location=>'/data/logminer');


PL/SQL procedure successfully completed.




SYS>exec dbms_logmnr.start_logmnr(dictfilename=>'/data/logminer/dict2.dat');


PL/SQL procedure successfully completed.


SYS>col username for a10

SYS>col operation for a10

SYS>col sql_redo for a70

SYS>set pagesize 50

SYS>alter session set nls_date_format='yyyy-mm-dd:hh24:mi:ss';


Session altered.


SYS>select timestamp, username, operation, sql_redo

  2  from v$logmnr_contents

  3  where seg_name='TEST2';


TIMESTAMP           USERNAME   OPERATION  SQL_REDO

------------------- ---------- ---------- ----------------------------------------------------------------------

2014-11-06:02:19:14 SYS        DDL        create table scott.test2(no number, name varchar2(10));

2014-11-06:02:19:47 SYS        INSERT     insert into "SCOTT"."TEST2"("NO","NAME") values ('1','AAA');

2014-11-06:02:20:08 SYS        INSERT     insert into "SCOTT"."TEST2"("NO","NAME") values ('2','BBB');

2014-11-06:02:21:23 SYS        INSERT     insert into "SCOTT"."TEST2"("NO","NAME") values ('3','CCC');

2014-11-06:02:21:44 SYS        UPDATE     update "SCOTT"."TEST2" set "NAME" = 'DDD' where "NAME" = 'AAA' and ROW

                                          ID = 'AAASm+AAEAAAAMnAAA';


2014-11-06:02:21:44 SYS        UPDATE     update "SCOTT"."TEST2" set "NAME" = 'DDD' where "NAME" = 'BBB' and ROW

                                          ID = 'AAASm+AAEAAAAMnAAB';


2014-11-06:02:21:44 SYS        UPDATE     update "SCOTT"."TEST2" set "NAME" = 'DDD' where "NAME" = 'CCC' and ROW

                                          ID = 'AAASm+AAEAAAAMnAAC';



7 rows selected.



리두로그 마이너는 세션별로 볼 수 있다. 
세션창을 끄고 나오거나 셧다운 다른 창에서는 그 해당하는 리두로그 마이너의 결과를 볼 수 없다. 
심지어... 창을 끄고 다시 접속하면 로그파일도 다 등록해줘야함..;;


'DB > oralce' 카테고리의 다른 글

리두로그 장애2  (0) 2014.11.06
리두로그 장애1  (0) 2014.11.05
컨트롤 파일복구 3-1  (0) 2014.11.04
컨트롤 파일 복구 3  (0) 2014.11.04
컨트롤 파일복구 2  (0) 2014.11.04
Posted by 성장하는yw