-- 디폴트 : NO
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEME
--------
NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
*
1행에 오류:
ORA-28365: 전자 지갑이 열려 있지 않습니다.
SQL> alter system set encryption key identified by foobar;
시스템이 변경되었습니다.
SQL> -- DATABASE LEVAL
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
데이타베이스가 변경되었습니다.
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEME
--------
YES
SQL> ALTER DATABASE DROP SUPPLEMENTAL LOG DATA;
데이타베이스가 변경되었습니다.
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEME
--------
NO
SQL> -- TABLE LEVEL
SQL> ALTER TABLE SCOTT.EMP ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
테이블이 변경되었습니다.
SQL>
SQL> @LOG
GROUP# MEMBER MB SEQ ARC STATUS FIRST_CHANGE#
---------- ---------------------------------------- ---------- ---------- --- ---------------- -------------
1 D:\APP\LG\ORADATA\JHLEE68\REDO01.LOG 51200 256 NO INACTIVE 7814798
2 D:\APP\LG\ORADATA\JHLEE68\REDO02.LOG 51200 257 NO INACTIVE 7848117
3 D:\APP\LG\ORADATA\JHLEE68\REDO03.LOG 51200 258 NO CURRENT 7849319
SQL>
SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEME
--------
YES
SQL>
SQL> CREATE TABLE SCOTT.TEST1 ( NO NUMBER );
테이블이 생성되었습니다.
SQL> INSERT INTO SCOTT.TEST1 VALUES( 1 );
1 개의 행이 만들어졌습니다.
SQL>
SQL> COMMIT;
커밋이 완료되었습니다.
SQL> DROP TABLE SCOTT.TEST1 PURGE;
테이블이 삭제되었습니다.
SQL> @LOG
GROUP# MEMBER MB SEQ ARC STATUS FIRST_CHANGE#
---------- ---------------------------------------- ---------- ---------- --- ---------------- -------------
1 D:\APP\LG\ORADATA\JHLEE68\REDO01.LOG 51200 256 NO INACTIVE 7814798
2 D:\APP\LG\ORADATA\JHLEE68\REDO02.LOG 51200 257 NO INACTIVE 7848117
3 D:\APP\LG\ORADATA\JHLEE68\REDO03.LOG 51200 258 NO CURRENT 7849319 <--
SQL>
-- dictionary file ( 존재시 )
INSERT INTO EMP ( NAME, SALARY ) VALUES( 'John Doe', 50000 );
-- dictionary file ( 미 존재시 )
INSERT INTO Object#2581 ( col#1, col#2 ) VALUES( hextoraw( '4a6f686e20446f65'), hextoraw('c306' ) );
1) DB 전체를 종료한 후 parameter file 에 딕셔너리 파일의 위치를 아래와 같이 지정합니다. |
---|
{code:sql} SQL> show parameter pfile; |
NAME TYPE VALUE
시스템이 변경되었습니다.
SQL>
SQL> show parameter utl_file_dir;
NAME TYPE VALUE
SQL>
{code} | 2) DB를 시작합니다. |
---|---|
{code:sql} SQL> startup force; ORACLE 인스턴스가 시작되었습니다. |
Total System Global Area 2522038272 bytes
Fixed Size 2283864 bytes
Variable Size 620758696 bytes
Database Buffers 1879048192 bytes
Redo Buffers 19947520 bytes
데이터베이스가 마운트되었습니다.
ORA-28365: 전자 지갑이 열려 있지 않습니다.
SQL> show parameter utl
NAME TYPE VALUE
SQL>
SQL> alter system set encryption wallet open identified by foobar;
시스템이 변경되었습니다.
SQL> alter database open;
데이타베이스가 변경되었습니다.
{code} | 3) 아래와 같이 딕셔너리를 생성합니다. |
---|---|
{code:sql} |
CREATE TABLE SCOTT.TEST1 ( NO NUMBER );
INSERT INTO SCOTT.TEST1 VALUES( 1 );
COMMIT;
SQL> -- 딕셔너리 생성
SQL> exec dbms_logmnr_d.build( dictionary_filename => 'dict.dat', dictionary_location => 'D:\APP\LG\ORADATA\JHLEE68');
PL/SQL 처리가 정상적으로 완료되었습니다.
{code} | 4) Log Miner에 분석할 로그를 추가합니다. |
---|---|
{code:sql} |
SQL> -- 1 : 신규등록, 2 : 삭제, 3 : 추가등록
SQL> exec dbms_logmnr.add_logfile( 'D:\APP\LG\ORADATA\JHLEE68\REDO01.LOG', 1 );
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> exec dbms_logmnr.add_logfile( 'D:\APP\LG\ORADATA\JHLEE68\REDO02.LOG', 3 );
PL/SQL 처리가 정상적으로 완료되었습니다.
SQL> exec dbms_logmnr.add_logfile( 'D:\APP\LG\ORADATA\JHLEE68\REDO03.LOG', 3 );
PL/SQL 처리가 정상적으로 완료되었습니다.
{code} | 5) Log Miner를 시작해서 log를 분석한후 결과를 조회합니다. |
---|---|
{code:sql} |
SQL> col username for a10
SQL> col operation for a10
SQL> col sql_redo for a50
SQL> alter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS';
세션이 변경되었습니다.
SQL> SELECT TIMESTAMP, USERNAME, OPERATION, SEG_OWNER --, SQL_REDO
2 FROM V$LOGMNR_CONTENTS
3 WHERE 1 =1
4 AND SEG_NAME='TEST1'
5 --AND SEG_OWNER='SCOTT';
선택된 레코드가 없습니다.
SQL>
|| 6) 데이타가 없어서 전체 재실행||
|{code:sql}
20:03:46 SQL> @log
GROUP# MEMBER MB SEQ ARC STATUS FIRST_CHANGE#
---------- ---------------------------------------- ---------- ---------- --- ---------------- -------------
1 D:\APP\LG\ORADATA\JHLEE68\REDO01.LOG 51200 271 NO CURRENT 8035468
2 D:\APP\LG\ORADATA\JHLEE68\REDO02.LOG 51200 269 NO INACTIVE 8010248
3 D:\APP\LG\ORADATA\JHLEE68\REDO03.LOG 51200 270 NO INACTIVE 8012422
20:03:48 SQL>
20:03:49 SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEME
--------
YES
20:03:52 SQL> CREATE TABLE SCOTT.TEST1 ( NO NUMBER );
테이블이 생성되었습니다.
20:04:06 SQL>
20:04:06 SQL> INSERT INTO SCOTT.TEST1 VALUES( 1 );
1 개의 행이 만들어졌습니다.
20:04:07 SQL>
20:04:07 SQL> COMMIT;
커밋이 완료되었습니다.
20:04:08 SQL> DROP TABLE SCOTT.TEST1 PURGE;
테이블이 삭제되었습니다.
20:04:15 SQL>
20:04:31 SQL> exec dbms_logmnr_d.build( dictionary_filename => 'dict.dat', dictionary_location => 'D:\APP\LG\ORADATA\JHLEE68');
PL/SQL 처리가 정상적으로 완료되었습니다.
20:05:09 SQL>
20:05:09 SQL> exec dbms_logmnr.add_logfile( 'D:\APP\LG\ORADATA\JHLEE68\REDO01.LOG', 1 );
PL/SQL 처리가 정상적으로 완료되었습니다.
20:05:09 SQL>
20:05:09 SQL> exec dbms_logmnr.add_logfile( 'D:\APP\LG\ORADATA\JHLEE68\REDO02.LOG', 3 );
PL/SQL 처리가 정상적으로 완료되었습니다.
20:05:09 SQL>
20:05:09 SQL>
20:05:09 SQL> exec dbms_logmnr.add_logfile( 'D:\APP\LG\ORADATA\JHLEE68\REDO03.LOG', 3 );
PL/SQL 처리가 정상적으로 완료되었습니다.
20:05:09 SQL> begin
20:05:14 2 dbms_logmnr.start_logmnr( dictfilename => 'D:\APP\LG\ORADATA\JHLEE68\dict.dat'
20:05:14 3 , options => dbms_logmnr.ddl_dict_tracking + dbms_logmnr.committed_data_only
20:05:14 4 );
20:05:14 5 end;
20:05:15 6 /
PL/SQL 처리가 정상적으로 완료되었습니다.
20:06:32 SQL> SELECT TIMESTAMP, USERNAME, OPERATION, SEG_OWNER --, SQL_REDO
20:06:56 2 FROM V$LOGMNR_CONTENTS
20:06:56 3 WHERE 1 =1
20:06:56 4 AND SEG_NAME='TEST1';
선택된 레코드가 없습니다.
20:06:59 SQL> SELECT TIMESTAMP, USERNAME, OPERATION, SEG_OWNER --, SQL_REDO
20:07:28 2 FROM V$LOGMNR_CONTENTS
20:07:28 3 WHERE 1 =1
20:07:28 4 --AND SEG_NAME='TEST1'
20:07:28 5 AND SEG_OWNER='SCOTT'
20:07:28 6 ;
선택된 레코드가 없습니다.
20:07:30 SQL> @LOG
GROUP# MEMBER MB SEQ ARC STATUS FIRST_CHANGE#
---------- ---------------------------------------- ---------- ---------- --- ---------------- -------------
1 D:\APP\LG\ORADATA\JHLEE68\REDO01.LOG 51200 274 NO CURRENT 8061772
2 D:\APP\LG\ORADATA\JHLEE68\REDO02.LOG 51200 272 NO ACTIVE 8058290
3 D:\APP\LG\ORADATA\JHLEE68\REDO03.LOG 51200 273 NO ACTIVE 8060270
20:07:38 SQL>
1. 현재 상태 조회하기 |
---|
{code:sql} |
20:12:01 SQL> @log
GROUP# MEMBER MB SEQ ARC STATUS FIRST_CHANGE#
20:12:08 SQL>
20:12:18 SQL> SELECT SUPPLEMENTAL_LOG_DATA_MIN FROM V$DATABASE;
SUPPLEME
20:12:19 SQL>
{code} | 2. 신규 테이블 생성 후 데이터 입력하고 update 합니다. |
---|---|
{code:sql} |
20:18:55 SQL> CREATE TABLE SCOTT.TEST2 ( NO NUMBER, NAME VARCHAR2(10) );
테이블이 생성되었습니다.
20:18:56 SQL>
20:18:56 SQL> INSERT INTO SCOTT.TEST2 VALUES( 1, 'AAA' );
1 개의 행이 만들어졌습니다.
20:18:56 SQL>
20:18:56 SQL> INSERT INTO SCOTT.TEST2 VALUES( 2, 'BBB' );
1 개의 행이 만들어졌습니다.
20:18:56 SQL>
20:18:56 SQL> INSERT INTO SCOTT.TEST2 VALUES( 3, 'CCC' );
1 개의 행이 만들어졌습니다.
20:18:57 SQL>
20:20:00 SQL> SELECT * FROM SCOTT.TEST2;
NO NAME
20:20:01 SQL> UPDATE SCOTT.TEST2 SET NAME ='DDD';
3 행이 갱신되었습니다.
20:20:34 SQL>
20:20:39 SQL> SELECT * FROM SCOTT.TEST2;
NO NAME
20:20:39 SQL> COMMIT;
커밋이 완료되었습니다.
20:20:42 SQL>
20:20:51 SQL> SHOW PARAMETER UTL
NAME TYPE VALUE
PL/SQL 처리가 정상적으로 완료되었습니다.
20:23:37 SQL> @LOG
GROUP# MEMBER MB SEQ ARC STATUS FIRST_CHANGE#
20:24:23 SQL> exec dbms_logmnr.add_logfile( 'D:\APP\LG\ORADATA\JHLEE68\REDO01.LOG', 1 );
PL/SQL 처리가 정상적으로 완료되었습니다.
20:24:34 SQL>
20:24:34 SQL> exec dbms_logmnr.add_logfile( 'D:\APP\LG\ORADATA\JHLEE68\REDO02.LOG', 3 );
PL/SQL 처리가 정상적으로 완료되었습니다.
20:24:34 SQL>
20:24:34 SQL>
20:24:34 SQL> exec dbms_logmnr.add_logfile( 'D:\APP\LG\ORADATA\JHLEE68\REDO03.LOG', 3 );
PL/SQL 처리가 정상적으로 완료되었습니다.
20:24:36 SQL> begin
20:25:23 2 dbms_logmnr.start_logmnr( dictfilename => 'D:\APP\LG\ORADATA\JHLEE68\dict2.dat'
20:25:23 3 );
20:25:23 4 end;
20:25:23 5 /
PL/SQL 처리가 정상적으로 완료되었습니다.
20:25:32 SQL> SELECT TIMESTAMP, USERNAME, OPERATION, SEG_OWNER --, SQL_REDO
20:26:36 2 FROM V$LOGMNR_CONTENTS
20:26:36 3 WHERE 1 =1
20:26:36 4 AND SEG_NAME='TEST2'
20:26:36 5 -- AND SEG_OWNER='SCOTT'
20:26:36 6 ;
TIMESTAM USERNAME OPERATI SEG_OWN SQL_REDO
15/11/05 SYS UPDATE SCOTT update "SCOTT"."TEST2" set "NAME" = 'DDD' where "NAME" = 'BBB' and ROW
ID = 'AAAVfkAAEAAAAKkAAB';
15/11/05 SYS UPDATE SCOTT update "SCOTT"."TEST2" set "NAME" = 'DDD' where "NAME" = 'CCC' and ROW
ID = 'AAAVfkAAEAAAAKkAAC';
{code} |