반응형

TTS Migration

 

서로 다른 DB간 Tablespace단위로 Datafile을 migration 할 수 있는 기능

 

TTS 제약사항

 - 10g 이전 버전에서는 원본과 대상이 동일 platform일 경우 migration 가능

 - 동일 블록 사이즈 사용

 - system, undo, sysaux, temp tablespace 는 지원 불가능

 - asm 사용시 rman을 사용해 변환 작업을 거쳐야 함

 - standard edition 에서는 지원안됨

 

 

 

Oracle 8i 

Oracle 9i 

Oracle 10g 

blcok size 

동일 

달라도 됨 

달라도 됨 

platform (os) 

동일 

동일 

달라도 됨 

character set 

동일 

동일 

동일 

 

- character set, block size, platform 정보 확인 후 migration

 

character set 확인

select * from nls_database_parameters where parameter='NLS_CHARACTERSET';

 

-character set 다를 경우 변경 방법-      ex) KO16KSC601 로 변경

sql> shutdown immediate;

sql> startup mount;

sql> alter system enable restricted session;

sql> alter system set job_queue_processes=0;

sql> alter system set aq_tm_processes=0;

sql> alter database open;

sql> alter database character set internal_use KO16KSC5601;

sql> shutdown immediate

sql> startup

 

block size 확인

sql> show parameter block_size;

 

원본과 대상의 초기 parameter COMPATIBLE_VERSION 이 10.0 이상이어야 함.

(compatible_version 과 oracle version은 다른 것임)

sql> show parameter compatible

 

platform 확인

sql> select d.dbid,d.name,tp.platform_id, tp.platform_name,tp.endian_format

from v$transportable_platform tp, v$database d where tp.platform_name = d.platform_name;

 

platform 의 endian_format(os 속성) 이 동일해야 함. 다를 경우 rman 의 convert 명령어 이용

sql> select PLATFROM_ID, PLATFORM_NAME, ENDIAN_FORMAT from v$transportable_platform ;    

 

ex) HP UX ENDIAN_FORMAT=big => Microsoft Windows ENDIAN_FORMAT=little

$rman target=/

RMAN> convert tablespace 'TEST' to platform='Microsoft Windows IA (32-bit)' db_file_name_convert='/home/oracle/oradat/testdb/test01.dbf', '/home/oracle/test01_win.dbf';

 

-------------------------------------------------------------------------------------------준비 단계

 

 

실습.

 

Windows 7 oracle 11g -> RHEL 5.3 oracle 11g

 

Windows = source

RHEL = target

 

 

SOURCE

sql> conn / as sysdba

 

Test 용 tablespace, table 생성

sql> create tablespace test datafile 'c:\app\vmware\oradata\orcl\test_01.dbf' size 30m;

 

sql> create user test

default tablespace test

quota unlimited on test

identified by test;

 

sql> grant connect, resource to test;

 

sql> conn test/test

 

sql> create table test100(no number, name varchar2(10));

sql> create table test101(no number, name varchar2(10));

 

sql> insert into test100 values(1,'apple');

sql> insert into test100 values(2,'orange');

 

sql> insert into test101 values(1,'car');

sql> insert into test101 values(2,'ship');

 

sql> select segment_name, tablespace_name from user_segments;

 

SEGMENT_NAME      TABLESPACE_NAME

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

TEST100                    TEST

TEST101                    TEST

 

sql> select * from test.test100;           <--  insert 한 결과 잘 나오나 확인

sql> select * from test.test101;           <--  insert 한 결과 잘 나오나 확인

 

이동하려는 tablespace test 가 이동 가능한지 확인

sql> conn / as sysdba

 

sql> exec DBMS_TTS.transport_set_check('TEST',true) ;

pl/sql 처리가 정상적으로 완료되었습니다.

 

sql> select * from transport_set_violations ;

선택된 레코드가 없습니다.

 

test tablespace 를 read only 모드로 변경 (exp, imp하기위해서)

sql> alter tablespace test read only ; 

 

datapump 하기 위해 directory 생성, 권한부여

sql> create or replace directory dump as 'c:\app\vmware\dump' ;

sql> grant read, write on directory dump to system ;

 

$ expdp system/oracle dumpfile=dump:test.dmp transport_tablespaces=test

 

ftp 이용해서 test.dmp , test_01.dbf 파일을 target db 로 이동

-binary 모드로 변경 후 파일 이동-

 

 

TARGET

datapump 경로 설정

 

sql> create or replace directory dump as '/app/datapump';

sql> grant read, write on directory dump to system;

 

user 생성 (source db 에서 test user로 했기 때문에 target 도 test의 user가 있어야 함)

sql> create user test identified by test

* Source DB 에서 Target DB 로 옮기려고 하는 tablespace 중 target db에 동일한 이름의 tablespace 가 있으면 안됨.

 

impdp system/oracle dumpfile=test.dmp directory=dump transport_datafiles=/app/oracle/oradata/testdb/test_01/dbf

 

 

반응형

'오라클 > 백업/복구' 카테고리의 다른 글

RMAN+Clone DB 사용해서 복구  (0) 2014.11.17
RMAN 복구하기  (0) 2014.11.14
RMAN  (0) 2014.11.13
Flashback  (0) 2014.11.12
Clone DB  (0) 2014.11.10
sql loader  (0) 2014.11.10
데이터 이동하기  (0) 2014.11.06
반응형

11g는 Targetless Duplicate 기능으로 target DB에 접속하지 않고 Backpset 과 Archive log 파일만을 이용해 CloneDB구성이 가능


1. RMAN 으로 전체 데이터베이스 백업

[oracle@localhost~] $ rman target /

RMAN> backup as compressed backupset format '/data/rman/%U_%T' database ;


2. test 테이블 생성 및 drop

[oracle@localhost~] $ sqlplus / as sysdba

SYS> create table scott.test

  2    (no number,

  3    name varchar2(10)) ;


SYS> insert into scott.test values(1, '김효섭') ;


SYS> insert into scott.test values(2, '홍길동') ;


SYS> commit ;


SYS> select * from scott.test ;


NO    NAME

---------

1       김효섭

2       홍길동


SYS> alter system switch logfile ;


SYS> /


SYS> /


SYS> /


SYS> select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') from dual ;


TO_CHAR(SYSDATE,'Y

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

2014-11-17:04:00:00


SYS> drop table scott.test purge ;


3. Clone DB 용 Parameter File 생성 및 수정

--spfile 일 경우 : 

SYS> create pfile='/app/oracle/product/11g/dbs/initclone.ora' from spfile ;


--pfile 일 경우 : 

SYS> !cp /app/oracle/product/11g/dbs/inittestdb.ora /app/oracle/product/11g/dbs/initclone.ora


SYS> ! vi /app/oracle/product/11g/dbs/initclone.ora


수정

db_name='clone'

control_files='/data/db/clone/control01.ctl'

#memory_target=823132160  주석처리

추가

db_file_name_convert=('/data/temp4/','/data/db/clone')           /data/temp4 는 현재 운영중인 데이터파일 경로

log_file_name_convert=('/data/temp4/','/data/db/clone')          /data/temp4 는 현재 운영중인 로그 파일 경로


4. Clone DB 구성용 디렉토리 생성

[oracle@localhost~] $ mkdir -p /data/db/clone

[oracle@localhost~] $ mkdir -p /app/oracle/admin/clone

[oracle@localhost~] $ mkdir -p /app/oracle/admin/clone/adump

[oracle@localhost~] $ mkdir -p /app/oracle/admin/clone/dpdump


5. Archive log 파일을 backupset 이 있는 경로에 복사

[oracle@localhost~] $ cp /data/arc1/* /data/rman/


6. RMAN 의 Targetless DUPLICATE 를 이용하여 시간기반 무정지 복구

[oracle@localhost~] $ export ORACLE_SID=clone

[oracle@localhost~] $ export NLS_DATE_FORMAT='YYYY-MM-DD:HH24:MI:SS'

[oracle@localhost~] $ sqlplus / as sysdba

SYS> startup nomount       <-- 파라미터파일 밖에 없어서 노마운트까지만 오픈 

SYS> exit


[oracle@localhost~] $ rman auxiliary /

RMAN > duplicate database to 'clone'

   2     pfile='/app/oracle/product/11g/dbs/initclone.ora'

   3     nofilenamecheck

   4     backup location '/data/rman'

   5     until time '2014-11-17:04:00:00' ;


----------복구중----------


RMAN> exit


SYS> select * from scott.test ;


NO    NAME

---------

1       김효섭

2       홍길동


복구 끝!


7. exp/imp로 복구한 테이블을 운영 DB에 입력

[oracle@localhost~] $ exp scott/tiger file=/home/oracle/test.dmp tables=test


[oracle@localhost~] $ export ORACLE_SID=testdb


[oracle@localhost~] $ imp scott/tiger file=/home/oracle/test.dmp ignore=y


[oracle@localhost~] $ sqlplus / as sysdba


SYS> select * from scott.test ;


NO    NAME

---------

1       김효섭

2       홍길동


반응형

'오라클 > 백업/복구' 카테고리의 다른 글

TTS(Transportable Tablespace) Migration  (1) 2015.07.24
RMAN 복구하기  (0) 2014.11.14
RMAN  (0) 2014.11.13
Flashback  (0) 2014.11.12
Clone DB  (0) 2014.11.10
sql loader  (0) 2014.11.10
데이터 이동하기  (0) 2014.11.06
반응형

삭제된 파일 복구 방법. ( offline 되는 데이터 파일 삭제된 경우 ) - DB 종료없이 복구


1. 전체 full 백업

2. 파일 삭제

3. 복구

RMAN> sql 'alter tablespace test offline immediate' ;           <-- 해당 데이터파일이 속한 테이블 스페이스 offline 


RMAN> restore tablespace test ;         <-- 백업파일에서 복원 해옴


RMAN> recover tablespace test ;         <-- 복구


RMAN> sql 'alter tablespace test online' ;   <-- 복구완료후 다시 online


삭제된 파일 복구 방법. ( offline 안되는 데이터 파일 삭제된 경우 ) - DB 종료 후 복구


1. 전체 full 백업

2. 파일 삭제

3. 복구

RMAN> shutdown abort ;


RMAN> restore tablespace system ;


RMAN> recover tablespace database ;        <-- 비정상 종료했기때문에 전체 데이터베이스 복구


RMAN> alter database open ;


임시 경로에서 복구하기    - 기존 경로가 아닌 다른 위치로 복구


1. 전체 full 백업

2. 파일 삭제

3. 임시경로로 복원후 복구

RMAN> run {

2> sql 'alter tablespace test offline immediate' ;            

3> set newname for datafile '/app/oracle/oradata/testdb/test01.dbf'

4> to '/data/temp/test01.dbf' ;

5> restore tablespace test ;

6> switch datafile 6 ;           <-- 이 파일번호는 report schema 에서 확인 할 수 있음   ( 컨트롤파일의 내용변경 )

7> recover tablespace test ;

8> sql 'alter tablespace test online' ;

9> }


3,4 번 줄에서 복원하기전 미리 경로를 지정한 후 5번 줄에서 백업파일을 새로운 경로로 복원, 6번 줄에서 control file 에 있는 경로를 새로운 경로로 변경.


임시 경로에 필요한 데이터 파일만 복원 후 복구하기


1. 전체 full 백업

2. 파일 삭제

3. 임시경로로 복원 후 복구  ( 데이터파일=백업파일, 컨트롤,리두는 현재사용중인 파일 복사)


파라미터 파일의 컨트롤파일 경로 변경


RMAN> run{

startup mount;


sql "alter database rename file ''/data/temp7/redo01_a.log''          <-- 리두 경로 부터 변경

to ''/data/temp/redo01_a.log''";

sql "alter database rename file ''/data/temp7/redo01_b.log''

to ''/data/temp/redo01_b.log''";

sql "alter database rename file ''/data/temp7/redo02_a.log''

to ''/data/temp/redo02_a.log''";

sql "alter database rename file ''/data/temp7/redo02_b.log''

to ''/data/temp/redo02_b.log''";

sql "alter database rename file ''/data/temp7/redo03_a.log''

to ''/data/temp/redo03_a.log''";

sql "alter database rename file ''/data/temp7/redo03_b.log''

to ''/data/temp/redo03_b.log''";


set newname for datafile 1 to '/data/temp/system01.dbf';          <-- 데이터파일중 필요한 파일만 임시 경로로 변경

set newname for datafile 2 to '/data/temp/sysaux01.dbf';

set newname for datafile 3 to '/data/temp/undotbs01.dbf';


sql "alter database datafile ''/data/temp7/users01.dbf'' offline drop" ;        <-- 필요없는 파일은 offline drop

sql "alter database datafile ''/data/temp7/example01.dbf'' offline drop" ;


sql "alter database create datafile ''/data/temp7/test01.dbf''          <-- 백업이 없는 삭제된 파일을 신규로 생성

as ''/data/temp/test01.dbf''";


restore tablespace system;                         <-- 필요한 테이블 스페이스만 복원

restore tablespace sysaux;

restore tablespace undotbs1;


switch datafile all;                                 <-- 파일 위치 변경내용을 control file 에 반영


recover tablespace system;                    <-- 필요한 테이블스페이스만 복구

recover tablespace sysaux;

recover tablespace undotbs1;

recover tablespace test;


alter database open;


sql "alter database test online";

}


여기 까지 완전 복구 방법


다음부터 불완전 복구


Drop table 후 복구하기 - 임시경로 사용


1. 전체 full 백업

2. drop table 장애 발생

3. DB 종료 후 임시경로에서 복구

->

파라미터 파일의 컨트롤 파일 경로 변경


RMAN> run {

2> startup mount;


3> sql "alter database rename file ''/data/temp7/redo01_a.log''

4> to ''/data/temp/redo01_a.log''";

5> sql "alter database rename file ''/data/temp7/redo01_b.log''

6> to ''/data/temp/redo01_b.log''";

7> sql "alter database rename file ''/data/temp7/redo02_a.log''

8> to ''/data/temp/redo02_a.log''";

9> sql "alter database rename file ''/data/temp7/redo02_b.log''

10> to ''/data/temp/redo02_b.log''";

11> sql "alter database rename file ''/data/temp7/redo03_a.log''

12> to ''/data/temp/redo03_a.log''";

13> sql "alter database rename file ''/data/temp7/redo03_b.log''

14> to ''/data/temp/redo03_b.log''";


15> set newname for datafile 1 to '/data/temp/system01.dbf';

16> set newname for datafile 2 to '/data/temp/sysaux01.dbf';

17> set newname for datafile 3 to '/data/temp/undotbs01.dbf';

18> set newname for datafile 4 to '/data/temp/users01.dbf';

19> set newname for datafile 5 to '/data/temp/example01.dbf';


20> restore database;

21> switch datafile all;


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

23> set until time='2014-11-12:07:41:41';


24> recover database;


25> alter database open resetlogs;

26> }


Drop tablespace 복구하기 - 백업 파일이 있을 경우


테스트용 Tablespace 생성 -> 전체 Full backup -> 예제 데이터 입력후 Tablespace drop 장애 발생 -> 임시 경로로 복구에 필요한 파일 복원 후 복구


Full 백업중 알아둘것!

piece handle = /data/backup/rman/03pndnfs_1_1_full_20141112 tag=TAG20141112T115300  <- 복구에 사용될 백업셋이름


piece handle = /data/backup/rman/04pndnir_1_1_full_20141112 tag=TAG20141112T115300  <- 복구에 사용될 controlfile이름


임시경로로 복구에 필요한 파일 복원 후 복구 ( 파라미터 파일의 controlfile 위치 바꾸고, 현재 사용중인 로그파일만 이동 )


RMAN> run {

startup nomount;


restore controlfile from '/data/backup/rman/07pne4hj_1_1_20141112';


alter database mount;


sql "alter database rename file ''/data/temp3/redo01_a.log''

to ''/data/temp4/redo01_a.log''";

sql "alter database rename file ''/data/temp3/redo01_b.log''

to ''/data/temp4/redo01_b.log''";

sql "alter database rename file ''/data/temp3/redo02_a.log''

to ''/data/temp4/redo02_a.log''";

sql "alter database rename file ''/data/temp3/redo02_b.log''

to ''/data/temp4/redo02_b.log''";

sql "alter database rename file ''/data/temp3/redo03_a.log''

to ''/data/temp4/redo03_a.log''";

sql "alter database rename file ''/data/temp3/redo03_b.log''

to ''/data/temp4/redo03_b.log''";


set newname for datafile 1 to '/data/temp4/system01.dbf';

set newname for datafile 2 to '/data/temp4/sysaux01.dbf';

set newname for datafile 3 to '/data/temp4/undotbs01.dbf';

set newname for datafile 4 to '/data/temp4/users01.dbf';

set newname for datafile 5 to '/data/temp4/example01.dbf';

set newname for datafile 7 to '/data/temp4/rtest04.dbf';


sql 'alter session set nls_date_format="yyyy-mm-dd:hh24:mi:ss"';

set until time='2014-11-12:12:52:34';


restore database from tag 'TAG20141112T124903';

switch datafile all;


recover database ;

alter database open resetlogs;

}


Drop tablespace 복구하기 - 백업 파일이 없을 경우


DB 전체 Full backup -> 신규 Tablespace 생성후 데이터 생성 -> Drop Tablespace 삭제/ 백업파일 없음 -> Tablespace 복구


1. Full 백업중 

piece handle = /data/backup/rman/03pndnfs_1_1_full_20141112 tag=TAG20141112T115300  <- 복구에 사용될 백업셋이름


piece handle = /data/backup/rman/04pndnir_1_1_full_20141112 tag=TAG20141112T115300  <- 복구에 사용될 controlfile이름


2. 신규 테이블스페이스 생성 후 테스트용 테이블 생성하고 시간확인

3. Drop tablespace 수행해서 장애 발생

4. DB 종료 후 임시경로로 필요한 파일 이동 후 복구    ( 현재 사용중인 로그파일만 복사 )


파라미터 파일의 컨트롤 파일 경로 변경


RMAN 에 접속하여 Control File 복원한 후 MOUNT 상태로 변경하여 파일위치 변경 하고 복원


RMAN> run {

2> startup nomount;


3> restore controlfile from '/data/backup/rman/04pndnir_1_1_full_20141112';      <-- 컨트롤파일 복원


4> alter database mount;


5> sql "alter database rename file ''/data/temp/redo01_a.log''

6> to ''/data/temp3/redo01_a.log''";

7> sql "alter database rename file ''/data/temp/redo01_b.log''

8> to ''/data/temp3/redo01_b.log''";

9> sql "alter database rename file ''/data/temp/redo02_a.log''

10> to ''/data/temp3/redo02_a.log''";

11> sql "alter database rename file ''/data/temp/redo02_b.log''

12> to ''/data/temp3/redo02_b.log''";

13> sql "alter database rename file ''/data/temp/redo03_a.log''

14> to ''/data/temp3/redo03_a.log''";

15> sql "alter database rename file ''/data/temp/redo03_b.log''

16> to ''/data/temp3/redo03_b.log''";


17> set newname for datafile 1 to '/data/temp3/system01.dbf';

18> set newname for datafile 2 to '/data/temp3/sysaux01.dbf';

19> set newname for datafile 3 to '/data/temp3/undotbs01.dbf';

20> set newname for datafile 4 to '/data/temp3/users01.dbf';

21> set newname for datafile 5 to '/data/temp3/example01.dbf';


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

23> set until time='2014-11-12:09:12:19';


24> restore database from tag 'TAG20141112T090811';

25> switch datafile all;

26> }


복원 완료 -> 복구 시작


RMAN> run {

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

3> set until time='2014-11-12:09:12:19';

4> recover database;

5> }


관리자가 직접 복구할때는 삭제된 데이터파일을 수동으로 생성해 준 후 복구 시도 했지만 RMAN 으로 복구 할때는 자동으로 생성해서 복구 됨


반응형

'오라클 > 백업/복구' 카테고리의 다른 글

TTS(Transportable Tablespace) Migration  (1) 2015.07.24
RMAN+Clone DB 사용해서 복구  (0) 2014.11.17
RMAN  (0) 2014.11.13
Flashback  (0) 2014.11.12
Clone DB  (0) 2014.11.10
sql loader  (0) 2014.11.10
데이터 이동하기  (0) 2014.11.06
반응형

RMAN ( Recovery Manager ) : 백업과 복구를 위한 전용 유틸리티

- 관리자가 RMAN 에게 명령하면 RMAN 이 알아서 백업/복구 실행



RMAN 의 주요특징


- 자주 실행하는 작업을 스크립트로 저장 : RMAN Recover Catalog Server를 사용할 경우 자주 사용하는 백업 명령어들을 스크립트로 저장한 후 불러서 사용할 수 있음


- 증분 블록 레벨 백업 기능 지원 : 과거 백업 받은 내역을 조사해서 그 기준 백업 이후에 변경된 블록만 찾아서 백업 수행 가능

 예 ) 기존 100M 파일에서 10M 만 변경되도 100M 를 백업받아야 하지만 RMAN 은 변경된 10M 만 백업 가능


- 사용되지 않은 블록 건너뛰고 백업 수행 : 총 100M 을 백업 받는다고 사용안한 블록은 건너뛰고 현재 사용중인 블록만 찾아서 백업

 

- 백업 수행 중 훼손된 블록 감지 : 백업 수행중 훼손된 블록을 감지해서 마킹해두고 계속 백업 수행


- ASM 기반 유일한 백업 도구 : ASM 기반으로 Storage 를 관리하는 경우는 RMAN외 백업할수 있는 방법이 없음


- 백업 수행시 압축 지원 : RMAN으로 백업을 진행하면서 동시에 압축까지 가능, 이때 압축으로 인한 자원 손실등이 거의 없음


- RMAN 구성도 -


RMAN 이용 백업 / 복구 순서

1. 관리자가 RMAN 유틸리티에게 백업 / 복구 명령

2. RMAN 은 관리자를 대신해 대상 서버(target database) 에 접속하여 백업 / 복구를 수행

3. Recover Catalog Server 가 있으면 백업 관련 정보를 Catalog Database 에 기록, 없다면 Target Database 의 Controlfile 에기록


RMAN 은 기본적으로 PGA 사용, PGA 공간이 부족할 경우 SGA를 사용하여 백업을 수행


채널 설정하기

Channel = 백업/복구 하는 경로 백업시 반드시 channel 을 할당 해주어야 한다.


1. 자동 Channel 설정

[oracle@localhost~]$ rman target / catalog rcuser/rcuser@rcserver  ( 복구 카탈로그 서버 사용시 )

or

[oracle@localhost~]$ rman target sys/oracle ( 복구 카탈로그 서버 사용 안할 경우 )


RMAN> configure default device type to disk ;     <-- 자동 채널 설정 명령어

-> 이렇게 하면 default device 가 파라미터 파일의 db_recovery_file_dest 파라미터 경로로 설정 됨

or

RMAN> configure channel device type disk

   2    format '/data/backup/rman/%U_%T' ;                <-- /data/backup/rman 디렉토리에 백업파일이 생성됨



2. 수동 Channel 설정

백업을 수행할 때 백업 받을 경로를 직접 지정


RMAN> backup tablespace example format '/data/backup/open/%U_%T' ; 



RMAN 백업 종류


1. backupset 으로 백업 수행 ( default )

Backupset = RMAN이 백업파일을 만들 때 RMAN 만이 알 수 있는 형태로 백업파일을 생성하는데 이것을 backupset 이라함

Backuppiece = backupset 의 크기가 너무 클 경우 분할해서 여러 개의 파일로 나누어 백업 받는데 분할되는 하나의 백업파일을 backuppiece 라 한다.


2. Image copy로 백업 수행 ( begin backup 과 비슷한 개념, 백업보다 카피에 많이 사용 )

RMAN> copy

    2    datafile '/app/oracle/oradata/testdb/example01.dbf'

    3    to '/data/backup/rman/example01.dbf.bak' ;



RMAN 백업시 주의사항

- open 상태에서 백업을 받으려면 DB가 archive log mode 로 운영되어야 한다.

- DB가 마운트 또는 오픈상태여야 한다.

- 운영중인 온라인 리두로그 파일은 백업이 불가

- 노 아카이브모드에서는 Clean 백업만 사용가능

- Clean 백업이란 오프라인 테이블스페이스나 읽기전용 테이블스페이스 백업을 의미

- RMAN 으로 백업을 수행하는 것은 Begin backup시의 조건들과 동일해야 함


RMAN 명령어 종류

1. 독립형 명령 - RMAN> prompt 에 1개의 명령어만 들어가는 방식


RMAN> backup tablespace example ;  


2. 작업형 명령 - 프로그램의 스크립트처럼 여러 개의 명령어를 한꺼번에 사용할 수 있는 방법


RMAN> run {

   2    allocate channel ch1 type disk maxpiecesize 10m ;

   3    allocate channel ch2 type disk maxpiecesize 50m ;

   4    backup

   5    tablespace users channel ch1

   6    format '/data/backup/close/%T_users.bak' ;

   7    tablespace example channel ch2

   8    format '/data/backup/close/%T_example.bak' ;

   9    }


증분 백업 - 이전에 백업받았던 백업파일과 비교해서 변경된 부분만 골라서 백업을 수행

차등 증분 백업 : 백업 받을 때 설정했던 숫자가 자기보다 작거나 같으면 그시점부터 지금까지 모든 데이터를 백업

누적 증분 백업 : 백업 받을 때 설정했던 숫자가 자기보다 작을경우 그 시점부터 지금까지 모든 데이터를 백업


RMAN> run {

   2    allocate channel c1 type disk ;

   3    backup

   4    incremental level 0       <-- 차등 증분 백업을 의미

   5    database

   6    format '/data/backup/rman/%U_%T' ;

   7    }


RMAN> run {

   2    allocate channel c2 type disk ;

   3    backup

   4    incremental level 3 cumulative       <-- 누적 증분 백업을 의미

   5    tablespace example ;

   6    }


Block change tracking : 데이터 블록들의 변경된 블록만 추적하는 기능




압축하면서 백업 수행

RMAN> backup as compressed backupset database

   2    format '/data/backup/rman/%T_%U' ;


압축하면서 전체 archive log file 백업 

RMAN> backup s compressed backupset archivelog all

   2    format '/data/backup/rman/%U_%T' ;

RMAN-06059, ORA-19625 - RMAN 백업시 archivelog 경로가 변경 되었을 경우

오라클의 fast recovery area를 disable 하고 archive log 모드에서 기본 경로가 아닌 다른 directory에 archive log를 저장할 경우 RMAN을 이용한 백업 시 archive log 파일을 못찾는 에러가 발생함.

1. 에러 예제

RMAN> backup archivelog all ;

Starting backup at 14-OCT-14
current log archived
using channel ORA_DISK_1

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 10/14/2014 01:12:43
RMAN-06059: expected archived log not found, loss of archived log compromises recoverability
ORA-19625: error identifying file /u01/oracle/product/flash_recovery_area/INNIDB/archivelog/2014_10_01/o1_mf_1_21_b2qyqgpg_.arc
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3


2. 해결 방법

RMAN> change archivelog all crosscheck ;


** 주의

위와 같은 방법으로 설정을 한다면 백업 시 backupset이 저장되는 디렉토리는 $ORACLE_HOME/dbs에 저장



MultiSection Backup

하나의 파일이 아주 클 경우 여러 개의 프로세스가 동시에 다른 백업 셋을 생성해서 백업을 받을 수 있음


RMAN> backup as compressed backupset

   2    section size 100m

   3    format '/data/backup/rman/%U_%T'

   4    datafile 1 ;


이외 옵션들


keep - backup 수행시 backupset 보존기간 설정

RMAN> backup as compressed backupset tablespace example

   2    format '/data/backup/rman/%U_%T'

   3    keep until time 'sysdate +90' ;         <-- 보존기간을 90일로


Not backed up - 백업 안 된 데이터파일만 골라서 백업하기 

- 기준일을 주고 싶으면 since time=sysdate -5  이런식으로 오늘 기준으로 최근 5일이내 추가된 파일을 백업




RMAN 백업 진행사항 확인하기


SYS> SELECT SID,SERIAL#,CONTEXT,SOFAR,TOTALWORK,

  2    ROUND(SOFAR/TOTALWORK*100,2)"%COMPLETE"

  3    FROM V$SESSION_LONGOPS 

  4    WHERE OPNAME LIKE 'RMAN%'

  5    AND OPNAME NOT LIKE '%aggregate%'

  6    AND TOTALWORK!=0

  7    AND SOFAR<>TOTALWORK ;



주요 백업 예제


예제 1. 전체 데이터 베이스를 백업

독립형

RMAN> backup as compressed backupset database

   2    format '/data/backup/rman/%U_%T' ;


작업형

RMAN> run {

   2    allocate channel ch1 device type disk 

   3    format '/data/backup/rman/%U_%T' ;

   4    backup as compressed backupset database ;

   5    }

예제 2. Channel 3개를 할당해서 example, users, system, control file 을 백업


RMAN> run {

   2    allocate channel ch1 device type disk ;

   3    allocate channel ch2 device type disk ;

   4    allocate channel ch3 device type disk ;

   5    backup as compressed backupset

   6    tablespace example, users, system ;

   7    include current controlfile ;

   8    }


예제 3. 전체 데이터 파일의 위치를 확인 한 후 파일 번호로 백업수행


RMAN> report schema ;


Report of database schema for database with db_unique_name TESTDB


List of Permanent Datafiles

===========================

File Size(MB) Tablespace           RB segs Datafile Name

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

1    760      SYSTEM               ***     /data/temp7/system01.dbf

2    560      SYSAUX               ***     /data/temp7/sysaux01.dbf

3    2865     UNDOTBS1             ***     /data/temp7/undotbs01.dbf

4    201      USERS                ***     /data/temp7/users01.dbf

5    345      EXAMPLE              ***     /data/temp7/example01.dbf

6    5        TS_FDA01             ***     /data/temp7/ts_fda01.dbf

7    0        UNDO_FDA             ***     /data/temp7/undo_fda01.dbf


List of Temporary Files

=======================

File Size(MB) Tablespace           Maxsize(MB) Tempfile Name

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

1    400      TEMP01               32767       /data/temp7/temp01.dbf


RMAN> run {

   2    allocate channel c1 type disk ;

   3    backup as compressed backupset datafile 1,2 ;         <-- SYSTEM, SYSAUX 가 백업됨

   4    }


예제 4. 현재 사용 중인 Control file 만 백업


RMAN> run {

   2    allocate channel c1 type disk ;

   3    backup current controlfile ; }


예제 5. 아래 조건으로 RMAN  백업


* RMAN 을 사용하여 sysaux, example, users 테이블 스페이스를 백업

* 백업경로 sysaux -> /data/backup/open/

                example -> /data/backup/rman/

                users -> /data/backup/close/

* 작업형 명령어 사용

* channel 은 3개로 병렬작업

* 각 channel 하나당 크기가 최대 10m 이넘지 않도록 설정


RMAN> run {

allocate channel ch1 type disk maxpicesize 10m;

allocate channel ch2 type disk maxpicesize 10m;

allocate channel ch3 type disk maxpicesize 10m;

backup compressed backupset 

tablespace sysaux channel ch1

format '/data/backup/open/%U_%T' ;

tablespace example channel ch2

format '/data/backup/rman/%U_%T' ;

tablespace users channel ch3

format '/data/backup/close/%U_%T' ;

}


예제 6. 차등 증분 백업 실습

level 0 으로 데이터베이스 전체 백업받기

RMAN> run {

   2    allocate channel c1 type disk ;

   3    backup

   4    incremental level 0       

   5    database

   6    format '/data/backup/rman/%U_%T' ;

   7    }


level 3 으로 users tablespace 만 차등 증분 백업 받기

RMAN> run {

   2    allocate channel c2 type disk ;

   3    backup as compressed backupset

   4    incremental level 3       

   5    tablespace users ;

   6    }


예제 7. 누적 증분 백업하기


RMAN> run {

   2    allocate channel c2 type disk ;

   3    backup as compressed backupset

   4    incremental level 3 cumulative    

   5    tablespace example ;

   6    }


예제 8. 전체 데이터베이스를 백업하면서 Archive log file 함께 백업하기


RMAN> backup as compressed backupset database plus archivelog 

   2    format '/data/backup/rman/%U_%T' ;


예제 9. Archive log file 만 백업하기

RMAN> backup as compressed backupset archivelog all ;



반응형

'오라클 > 백업/복구' 카테고리의 다른 글

TTS(Transportable Tablespace) Migration  (1) 2015.07.24
RMAN+Clone DB 사용해서 복구  (0) 2014.11.17
RMAN 복구하기  (0) 2014.11.14
Flashback  (0) 2014.11.12
Clone DB  (0) 2014.11.10
sql loader  (0) 2014.11.10
데이터 이동하기  (0) 2014.11.06
반응형

Flashback 기능은 사용자의 논리적인 오류를 아주 빠르게 복구할 수 있는 방법


Flashback 명령어 3가지 (LEVEL) 방법

1. Row Level Flashback

2. Table Level Flashback

3. Database Level Flashback


 오라클버젼 

 Flashback 종류 

 원리

 9i

 Flashback Query 

 Undo data 사용 

 10g

 Flashback Version Query

 Flashback Transanction Query

 Flashback Table

 Flashback Database 

 Undo data 사용

 Undo data 사용

 Undo data 사용 / recyclebin 사용

 Undo data 사용 / Redo log 사용

 11g

 10g 와 동일 

 10g와 동일 / Flashback Data Archive 추가됨 


1. Row Level Flashback

특정 테이블의 특정 Row 만 Flashback 해주는 기능 ( Flashback 기능은 commit 된 데이터만 복구 가능 )


실습 1. Row Level Flashback 을 사용하여 특정 행 복구


실습전에 DB의 Supplemental Logging 을 Enable 로 변경 후 작업

SYS> select supplemenatl_log_data_min from v$database ;


SUPPLEME

---------

NO


-> SYS> alter database add supplemental log data ;


SYS> select supplemenatl_log_data_min from v$database ;


SUPPLEME

---------

YES


SYS> create table scott.fmem

   2    ( name varchar2(10),

   3    addr varchar2(10),

   4    tel varchar2(10)) ;


SYS> insert into scott.fmem values ( '박동주','부천','111') ;

SYS> insert into scott.fmem values ( '서진수','강남','222') ;

SYS> insert into scott.fmem values ( '김효섭','구리','333') ;

SYS> commit ;


SYS> select * from scott.fmem ;


NAME    ADDR    TEL

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

박동주    부천        111  

서진수    강남        222

김효섭    구리        333


SYS> update scott.fmem

  2    set name='안지혜'

  3    where tel=111 ;


SYS> commit ;


SYS> update scott.fmem

  2    set name='김세실'

  3    where tel=222 ;

SYS> commit ;


SYS> select * from scott.fmem ;


NAME    ADDR    TEL

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

안지혜    부천        111  

김세실    강남        222

김효섭    구리        333


안지혜를 다시 박동주로 돌리자

- 해당 데이터의 과거 변경 이력을 전부 찾아 주는 쿼리 : Flashback Version Query 

9i 는 Flashback Query 가 지원되었는데 특정 시점의 변경 내역만 알수 있어서 좋지 않음.

변경 사항을 취소시켜 이전 값으로 돌려주는 쿼리를 Flashback Transaction Query 라고 한다.


변경 이력을 찾는 Flashback Version Query 수행


SYS> select versions_startscn st_scn,versions_endscn endscn,

  2    versions_xid txid,versions_operation opt,name

  3    from scott.fmem versions between scn minvalue and maxvalue

  4    where tel=111 ;


ST_SCN        ENDSCN        TXID                        O        NAME

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

2046479                        070004006904000         U       안지혜

2046412       2046479     010007004004000         I        박동주


scn_to_timestamp( ) 라는 함수를 사용하여 변경사항이 발생한 시간을 추적할 수 있음


SYS> select scn_to_timestamp(2046479) from dual ;


SCN_TO_TIMESTAMP(2046479)

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

12-NOV-14 12.12.12.0000000000AM


Flashback Transaction Query 사용 과정이 복잡해 일반적으로 DBA가 직접 update 작업을 수행함


SYS> update scott.fmem set name='박동주' where tel=111 ; 


SYS> commit ;


2. Table Level Flashback

특정 테이블 안에 있는 데이터를 전부 한 번에 특정 시점으로 복구 할 수 있는 방법

Table의 칼럼이 삭제된 후 undo segment 내역을 못찾는 경우 flashback으로 복구할 수 없다.

실습 2. SCN을 조회하여 DML 에러 복구하기 - Undo data 사용


SYS> create table scott.fruits (

  2    no number,

  3    name varchar2(10),

  4    price number) ;


SYS> insert into scott.fruits values (1,'apple',1000) ; 

SYS> insert into scott.fruits values (2,'grape',1500) ;

SYS> insert into scott.fruits values (3,'peach',800) ;

SYS> commit ;


SYS> select * from scott.fruits ;


NO    NAME    PRICE

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

1        apple    1000

2        grape    1500

3        peach    800


SYS> select current_scn from v$database ;


CURRENT_SCN

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

2058671


SYS> update scott.fruits

  2    set prifce = 2000

  3    where no=2 ;


SYS> commit ;


SYS> select * from scott.fruits ;


NO    NAME    PRICE

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

1        apple    1000

2        grape    2000

3        peach    800


SYS> select current_scn from v$database ;


CURRENT_SCN

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

2058724            <-- grape 가격이 2000으로 변경된 scn


grape 가격이 1500원인 때로 돌아가고 싶다는 요청이 들어오면 그 시점의 scn으로 flashback 하면 됨


SYS> flashback table scott.fruits to scn '2058724' ;


ERROR at line 1 :

ORA-08189 : cannot flashback the table because row movement is not enabled 

위와같이 row movement 속성이 not enable 되어서 에러 발생, 이 기능을 활성화 시킨 후 다시 실행


SYS> alter table scott.fruits enable row movement ;


SYS> flashback table scott.fruits to scn '2058724' ;


SYS> select * from scott.fruits ;

NO    NAME    PRICE

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

1        apple    1000

2        grape    1500             <-- 원래값으로 돌아옴

3        peach    800


실시간으로 장애를 복구 하려면 


SYS> flashback table scott.fruits

  2    to timestamp(systimestamp - interval '5' minute) ;                <--5분전 상황으로 flashback 하겠다는 의미


실습 3. Drop table 복구하기 - Recyclebin 이용

recyclebin - 윈도우의 휴지통과 같은 기능, drop table하면 recyclebin 으로 보관하다가 복구 가능


step1. 새로운 사용자 생성 및 테이블 생성


SYS> create user test identified by test

  2    default tablespace users

  3    temporary tablespace temp ;


SYS> grant connect, resource to test ;


SYS> conn test/test


TEST> create table test1(no number) ;


TEST> insert into test1 values(1) ;


TEST> commit ;


TEST> select * from tab ;


TNAME        TABTYPE CLUSTERID

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

TEST1            TABLE


stpe2. 테이블을 삭제 후 휴지통을 확인


TEST> drop table test1 ;


TEST> select * from tab ;


TNAME                                                TABTYPE    CLUSTERID

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

BIN$5AVBt_oQMSfgQAB/AQBnzQ==$0     TABLE        


TEST> show recyclebin ;


ORIGINALNAME    RECYCLEBINNAME                                OBJECTTYPE        DROPTIME

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

TEST1                 BIN$5AVBt_oQMSfgQAB/AQBnzQ==$0       TABLE                2014-11-12:15:15:15


TEST> select * from "BIN$5AVBt_oQMSfgQAB/AQBnzQ==$0" ;


NO

---

 1


원래 TEST 였던 TABLE 이 Drop 되면서 BIN$ 로 이름이 변경되었고, show parameter 로 조회하니 삭제 정보를 알 수 있음


복구 방법 -> 

TEST> flashback table test1 to before drop       <-- drop 전으로 flashback


TEST> select * from tab ; 


 TNAME        TABTYPE CLUSTERID

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

TEST1            TABLE                             <-- 쉽게 복구 완료


TEST> show recyclebin        <-- recyclebin 없어서 결과가 안나옴


실습4. Recyclebin 관리하기


Recyclebin 의 위치는 원래 테이블이 있던 Tablespace에 그대로 있고, drop 되면 이름을 Bin$... 로 변경하고 딕셔너리에서만 삭제

만약 다른테이블이 먼저 지워졌던 테이블이 있는 공간을 사용하려는 상황이 되면 그때 데이터를 지우고 신규테이블에게 공간을 할당

Recyclebin 에 넣지않고 완전 삭제하려면 purge 옵션 사용


Recyclebin 을 사용하지 않으려면 alter session set recyclebin=off 로 해당 세션에서 사용안하게 해주거나

parameter file 에 recyclebin=off 를 등록해주고 디비 재시작. 다시 on 으로 바꾸려면 parameter file 에서 지워주면 됨


recyclebin 상태 확인

select a.ksppinm, b.ksppstvl, b.ksppstdf

from x$ksppi a, x$ksppcv b

where a.indx = b.indx

and a.ksppinm like '%recyclebin%'

order by a.ksppinm ; 


KSPPINM    KSPPSTVL    KSPPSTDF

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

recyclebin    on                TRUE                


실습5. 테이블 관련 다른 object 확인하기


flashback 으로 테이블을 삭제하게 되면 해당 테이블과 관련된 모든 object ( index, constraint 등) 들도 함께 삭제됨

flashback 으로 테이블을 복구하면 다른 object 들도 테이블과 함께 복구 됨.


flashback 으로 복구하게 되면 view 의 상태는 INVALID 로 사용불가 상태가 되고 index BIN$ .. 로 이름이 변경되어 조회되지않음

@stats로 확인, index 의 이름을 alter index "BIN$...." rename to 원래인덱스명 ; 으로 바꿔주고 사용해야함

view 는 사용불가 상태라서 삭제 후 다시 생성해야 함.

@cons 제약조건 확인     제약조건 역시 BIN$... 로 제대로 이르 변경이 안됬지만 작동은 하므로 이름만 변경해주면 됨

alter table 테이블명 rename constraint "BIN$...." to "제약조건명" ;


table 이 flashback 으로 복구 되더라도 다른 object 는 관리자가 추가로 작업해줘야 함

만약 recyclebin 에 같은이름의 테이블이 여러개 삭제되어 있었을 경우 가장 최근에 지워진 것부터 복구 되며, flashback table 은 table 과 같이 지워진 index복구 되지만 index만 따로 지워진 경우는 복구 안됨


3. Database Level Flashback 

database 전체를 과거의 특정시점으로 돌리는 불완전복구와 비슷한 개념을 갖고있다. 그러나 불완전 복구보다 빠르고 간단함


- 불완전 복구 : 장애시 백업된 데이터파일을 복원해 리두로그와 아카이브 로그를 적용시켜 복구

- flashback database : 장애가 발생한 데이터파일에 flashback log 와 리두로그, 아카이브로그를 바로 적용시켜 복구


flashback database 명령어를 사용하기위해 준비할 것

- db 아카이브 모드 , flashback database mode


환경설정 : inittestdb.ora 파일 설정

db_recovery_file_dest : /app/oracle/fast_recovery_area   <--11g 일경우  

db_recovery_file_dest_size : 4196401152                       <--11g 일경우 4G 기본값

db_flashback_retention_target=30                                 <-- 별도로 추가해줘야함


MOUNT 모드로 STARTUP 해서 alter database archivelog ,  alter database flashback on  설정



fast_recovery_area 에 저장되는 파일들

1. flashback log file

2. archive redo log file

3. RMAN backup file 등


기본 크기가 부족할 수 있기 때문에 위에서 언급한 3종류의 파일을 다른 경로로 설정해서 관리해주는게 hang에 안걸리기 좋음


Flashback database 명령어로 복구해야만 하는 대표적인 장애 : drop user 와 truncate table 장애

실습6. Drop User 장애 복구 ( Flashback database 사용 )


step1. 테스트용 계정과 테스트용 테이블을 생성


SYS> create user tuser

  2    identified by abc123

  3    default tablespace users

  4    temporary tablespace temp ;


SYS> grant connect, resource to tuser ;


SYS> conn tuser/abc123


TUSER> create table test1 (no number) ;


TUSER> create table test2 (no number) ;


TUSER> insert into test1 values(1) ;


TUSER> insert into test1 values(2) ;


TUSER> insert into test2 values(3) ;


TUSER> insert into test2 values(4) ;


TUSER> commit ;


step2. 테스트용 계정 tuser 를 삭제한 후 데이터를 확인


TUSER> conn sys/oracle as sysdba ;


SYS> drop user tuser cascade ;


step3. Flashback 명령어로 복구


SYS> flashback database to timestamp (systimestamp - interval '5' minute) ;


ERROR at line 1:

ORA-38757 : Database must be mounted and not open to FLASHBACK      <-- MOUNT 단계에서 복구하라고 에러남


SYS> shut immediate ;


SYS> startup mount


SYS> flashback database to timestamp (systimestamp - interval '5' minute) ;


SYS> alter database open


ERROR at line 1:

ORA-01589 : must use RESETLOGS or NORESETLOGS option for database open <-- 과거로 돌아갔기때매 resetlogs로 open


SYS> alter database open resetlogs 


이러고 데이터 복구된지 확인, 만약 안되었으면 계속 shutdown 한후 mount에서 flashback 명령을 수행하면 됨.


Flashback Data Archive

Row Level Flashback 과 Table Level Flashback중 DML 장애를 처리하는것은 undo data를 활용하며 만약 다른 누군가가 undo segment 를 재활용하면 해당 flashback 기능을 사용할 수 없다.


11g 부터는 Online Redo log 를 Archive 하듯이 undo segment 에 있는 commit 된 내용을 특정 테이블 스페이스에 archive 하여 영구적으로 저장하는 기능을 제공, 그것을 Flashback Data Archive(FBDA)라고 한다.


Flashback Data Archive 원리

FBDA 백그라운드 프로세스가 비 정기적으로 undo segment 의 내용을 파일에 archive 해서 flashback data archive 기능을 구현


Flashback Data Archive 의 특징

1. FBDA 가 Undo segment 의 내용을 모두 기록하기 전에 해당 undo segment 는 재활용 되지 않음

2. 대량의 DML 이 발생할 경우 병목현상이 생길 우려가 있어 최대 10개 까지의 FBDA백그라운드 프로세스가 동시 작업가능

3. FBDA 프로세스는 평소 Sleep상태로 있다가 특정 시간이 되면 자동으로 활성화 되어 undo segment 내용을 저장

 ( undo 량이 많이 발생할 경우 자주 내려쓰며, 기본값은 5분으로 설정되어 있음)

4. 해당 데이터는 자동으로 파티셔닝 되어 저장되며 관리자라도 그 내요을 변경할 수 없음

5. Retention time 을 설정하여 데이터를 관리하며, retention time 이 지난 데이터는 자동삭제

6. insert 되는 데이터는 이기능을 사용하지 않음


Flashback Database Archive 활성화 하기

<작업순서>

1. Flashback history table 을 저장할 테이블 스페이스를 생성

2. Flashback data archive 를 관리할 관리자 계정을 생성

3. 관리자 계정에 권한을 할당

4. 관리자 계정으로 로그인한 후 flashback history table 을 생성


1.

SQL> create tablespace ts_fda01

  2    datafile '/app/oracle/oradata/testdb/ts_fda01.dbf' size 5m ;


2.

SQL> create user fbadmin identified by fbpwd

  2    default tablespace ts_fda01 ;


3.

SQL> grant resource, connect to fbadmin ;


SQL> grant flashback archive adminster to fbadmin ;  


flashback archive adminster 권한

- flashback data archive 를 관리하기 위한 특별한 시스템 권한

- flashback history table 을 생성하고 관리할 수 있음

- 테이블 스페이스를 추가하거나 삭제할 수 있음

- flashback history table retention time 을 관리할 수 있음


4.

SQL> create flashback archive fda01 tablespace ts_fda01         

  2    retention 30 day ;     -- history table에 저장되는 undo data의 보존기간을 의미, 30일 지나면 자동으로 삭제함


SQL> conn fbadmin/fbpwd ;


flashback history table 조회

select owner_name,flashback_archive_name,retention_in_days,status from dba_flashback_archive ;


OWNER_NAME    FLASHBACK_        RETENTION_IN_DAYS    STATUS

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

FBADMIN            FDA01                    30




Flashback Database Archive 실습

실습을 하기전 용량이 작은 undo tablespace 를 생성해서 기존에 사용하던 undo tablespace 를 변경하고 시작


SQL> show paramert undo ;

NAME                                 TYPE        VALUE

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

undo_management               string      AUTO

undo_retention                     integer     900

undo_tablespace                  string      UNDOTBS1


SQL> create undo tablespace undo_fda

  2    datafile '/app/oracle/oradata/testdb/undo_fda01.dbf' size 256k ;


SQL> alter system set undo_tablespace=undo_fda ;


SQL> alter system set undo_retention=3 ;


SQL> show parameter undo ;

NAME                                 TYPE        VALUE

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

undo_management               string      AUTO

undo_retention                     integer     3

undo_tablespace                  string      UNDO_FDA


SQL> conn scott/tiger


SCOTT> create table test01(no number, name varchar2(10) ;


SCOTT> insert into test01 values(1,'AAA') ;

SCOTT> insert into test01 values(2,'BBB') ;

SCOTT> insert into test01 values(3,'CCC) ;

SCOTT> commit ;


SQL> select * from test01 ;

NO    NAME

-----------

1        AAA

2        BBB    

3        CCC



SCOTT> update test01 set name='DDD' 


SCOTT> select * from test01 ;

NO    NAME

-----------

1        DDD

2        DDD   

3        DDD


다른 세션에서 로그인해 현재 잘못된 update 를 수행한 트랜잭션이 사용중인 undo segment 를 확인


SCOTT> conn sys/oracle as sysdba ;


SYS> select segment_name,owner,tablespace_name,status from dba_rollback_segs ;

SEGMENT_NAME                       OWNER    TABLESPACE_NAME          STATUS

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

SYSTEM                                     SYS         SYSTEM                           ONLINE

_SYSSMU10_2606106477$          PUBLIC     UNDOTBS1                       OFFLINE

_SYSSMU9_3975004876$           PUBLIC     UNDOTBS1                       OFFLINE

_SYSSMU8_286634474$            PUBLIC     UNDOTBS1                        OFFLINE

_SYSSMU7_574775315$            PUBLIC     UNDOTBS1                        OFFLINE

_SYSSMU6_3013749843$           PUBLIC     UNDOTBS1                       OFFLINE

_SYSSMU5_3147209834$           PUBLIC     UNDOTBS1                       OFFLINE

_SYSSMU4_562970181$            PUBLIC     UNDOTBS1                        OFFLINE

_SYSSMU3_1483640053$           PUBLIC     UNDOTBS1                       OFFLINE

_SYSSMU2_3037561007$           PUBLIC     UNDOTBS1                       OFFLINE

_SYSSMU1_2081786551$           PUBLIC     UNDOTBS1                       OFFLINE

_SYSSMU11_1522516751$          PUBLIC     UNDO_FDA                       ONLINE

                                                                     

SYS> select s.sid, s.serial#, s.username, r.name "ROLLBACK SEG"

  2    from v$session s, v$transaction t, v$rollname r

  3    where s.taddr=t.addr and t.xidusn=r.usn ;


SID        SERIAL#        USERNAME        ROLLBACK SEG

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

 1            17                SCOTT             _SYSSMU11_1522516751$    <-- SCOTT 사용자가 사용하는 Undo segment


SCOTT> commit ; 


이제 다른 사용자 (userb) 를 생성한 후 로그인해서 대량의 DML 을 발생시켜 위 undo segment 를 재활용하도록 만듬


SYS> create user userb identified by userb

  2    default tablespace example ;

SYS> grant connect, resource to userb ;


SYS> conn userb/userb ;


USERB> create table test02 ( no number , name varchar2(20)) ;


USERB> begin

2    for i in 1..1000 loop

3    insert into test02 values(i,'overwrite!') ;

4    end loop ;

5    end ;

6    /


USERB> select count(*) from test02 ;


COUNT(*)

--------

   1000


다른 터미널에서 sys로 로그인해서 undo segment 의사용내역을 조회
























반응형

'오라클 > 백업/복구' 카테고리의 다른 글

RMAN+Clone DB 사용해서 복구  (0) 2014.11.17
RMAN 복구하기  (0) 2014.11.14
RMAN  (0) 2014.11.13
Clone DB  (0) 2014.11.10
sql loader  (0) 2014.11.10
데이터 이동하기  (0) 2014.11.06
Redo log flle 장애 처리방법  (0) 2014.11.05
반응형

운영중인 DB를 복사해서 복구용 DB를 추가 생성해 즉시 복구 하는 방법


전제조건을 아래와 같이 하고 실습 시작  ( 경로나 이름은 자기 마음대로 지정해줘도 됨 )

- 백업 파일 경로 : /data/backup/close

- 운영 DB SID : testdb

- clone DB SID : clonedb (복구용 db)

- clone DB 파일경로 : /data/clone


Clone DB 생성 개념

파라미터 파일 : 기존 파라미터 파일을 복사해서 내용 수정

컨트롤 파일 : 컨트롤파일 재생성 스크립트 만들어서 재생성

데이터 파일 : 백업파일 복사

리두 로그 파일 : 로그스위치 일으켜서 아카이브파일로 만들어서 데이터는 아카이브에서 가져옴, 리두파일은 리셋로그즈로 재생성



복구 순서 요약


운영중이던 DB에서 할일 : 컨트롤 파일 재생성 스크립트만 만들어주고 나머지는 cloneDB에서 실행, 리두 파일에 있던 데이터 로그 스위치 일으켜서 아카이브에 저장 시키기


1. clone DB 생성할 디렉토리 생성  -> mkdir -p /data/clone   

2. parameter file 복사     ->    cp $ORACLE_HOME/dbs/inittestdb.ora initclonedb.ora

3. parameter file 수정     ->    vi initclonedb.ora          -> 컨트롤파일경로 클론디비 경로로 변경, 디비명 clonedb명으로 변경

                                                                                    11g 부터는 memory_target 주석처리


4. data file 복사          -> cp /data/backup/close/*.dbf /data/clone

5. 운영중인 DB에서 컨트롤 파일 재생성 스크립트 실행    -> alter database backup controlfile to trace as '/app/oracle/re.sql' ;

6. 스크립트 수정      -> vi /app/oracle/re.sql        -> reset logs 모드, reuse 를 set 으로 변경, DB명 변경, 파일들 경로 변경 


7. Clone DB 로 시작하기위해 export ORACLE_SID=clonedb 로 변경

8. sqlplus / as sysdba 접속

9. 컨트롤파일 재생성 스크립트 실행      -> @/app/oracle/re.sql

10. mount 모드까지 올림        -> startup mount 

11-1.(백업파일 있을때) 파일 복구 : recover database until time '2014-11-10:12:00:00' using backup controlfile ;   

                                                                     컨트롤 파일을 재생성했기 때문에 using backup controlfile 해주는 것


11-2. (백업파일 없을때) 파일 복구 : recover database until time '2014-11-10:12:00:00' using backup controlfile ; 

-> 에러생기면서 복구안됨, 데이터파일내용 수정 select name from v$datafile ;    


NAME

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

/data/clone/system01.dbf

/data/clone/sysaux01.dbf

/data/clone/undotbs01.dbf

/data/clone/users01.dbf

/data/clone/example01.dbf

/app/oracle/product/11g/dbs/UNNAMED00006          <-- 요런게 생김


-> 데이터 파일 재생성 alter database create datafile '/app/oracle/product/11g/dbs/UNNAMED00006' as '/data/clone/test.dbf'

-> 다시 복구 recover database until time '2014-11-10:12:00:00' using backup controlfile ; 


12. resertlogs 모드로 open : alter database open resetlogs 

13. 데이터 복구 확인

14. clone DB 에서 운영 DB로 복구파일 복사 : export ORACLE_SID=clonedb       exp scott/tiger file='test.dmp' tables=test

export ORACLE_SID=testdb     imp scott/tiger file='test.dmp' ignore=y

15. 운영 DB에서 데이터 복구 확인 

16. Clonedb 종료 : export ORACLE_SID=clonedb       ->     shutdown immediate 





반응형

'오라클 > 백업/복구' 카테고리의 다른 글

RMAN 복구하기  (0) 2014.11.14
RMAN  (0) 2014.11.13
Flashback  (0) 2014.11.12
sql loader  (0) 2014.11.10
데이터 이동하기  (0) 2014.11.06
Redo log flle 장애 처리방법  (0) 2014.11.05
Log Miner 활용하기  (0) 2014.11.05
반응형

Sql * Loader 로 외부 데이터 입력하기 : Direct Path방법을 이용하여 대량의 데이터를 빠른속도로 입력할 수 있는 유틸리티

Direct path 를 다른말로 Bulk Load 방식이라고도 함


입력원리

Conventional Path 방법은 HWM ( High Water Mark ) 왼쪽에 있는 빈 Free block 에 데이터를 입력


데이터 입력시 HWM 왼쪽부터 입력하는데 만약 HWM 왼쪽 블록을 다 사용하게 되면 입력작업을 일시 중지하고 HWM를 오른쪽으로 

이동하여 빈 블록들을 확보 한 후 데이터를 입력, 이러한 과정을 HWM Bump Up 이라고 함


Direct Path 방법은 처음부터 HWM 오른쪽에 있는 비어 있는 블록에 한꺼번에 데이터를 입력하고 commit을 한번만 하는 방식

중간에 장애가 생길 경우 처음부터 다시 입력해야 하는 단점이 있음


Direct Path 방법

1. 정렬할 때 (Temp segment 에 읽고 쓰기 한다.)

2. 병렬 작업 떄 ( Parallel, Append 옵션을 사용할 때 )

3. Direct 옵션 사용시 (export, datapump 등 )


SQL * Loader 구조



SQL * Loader 구성하는 주요 파일


위 Control file 은 oracle 운영용 control file 이 아니라 SQL * Loader 를 사용하기 위한 정보를 가진 control file이므로 서로다름


Bad file = 입력 거부된 목록을 저장할 파일, 입력 형태가 틀리거나 제약조건 위배시 이 파일에 기록됨. 수정해서 다시 입력가능



반응형

'오라클 > 백업/복구' 카테고리의 다른 글

RMAN  (0) 2014.11.13
Flashback  (0) 2014.11.12
Clone DB  (0) 2014.11.10
데이터 이동하기  (0) 2014.11.06
Redo log flle 장애 처리방법  (0) 2014.11.05
Log Miner 활용하기  (0) 2014.11.05
control file, data file 연습문제  (0) 2014.11.04
반응형


데이터 이동 방법


옛날 DB 에서 Export 를 사용해 데이터를 복사해서 dmp file 로 저장 -> Import 유틸리티가 dmp file 을 읽어서 다시 최신 DB 에 저장 해 주는 과정을 데이터 이동이라고 함


데이터 이동시에 DB는 OPEN 상태여야 함.


Conventional Path export & Direct Path export


Conventional Path export : 명령어가 수행되면 export 프로그램이 메모리에 evaluation buffer 라는 곳을 만들어 db buffer cache 에 있는 데이터를 가져와서 이곳이 다 차면 다시 디스크에 파일을 저장.


Direct path export : db buffer cache 에서 바로 dmp file 로 저장


direct path export 는 export 작업중 사용자가 buffer cache 에서 작업을 하게되면 속도저하가 일어나고 hang 이걸려서 db 가 꺼질수 있음

conventional path export 는 evaluation buffer 로 데이터를 복사해서 dmp file 로 저장하기 때문에 direct path export 에서 일어나는 문제를 해결 할 수 있다.



Datapump

Oracle 10g 부터 등장한 export/import 의 향상된 유틸리티. export/import 의 여러 문제점을 해결


1. Datapump 의 장점

1) 작업 관리의 편의성 - exp/imp 의 방법은 작업이 시작되면 끝날 때 까지 제어를 할 수 없었지만 Datapump 는 job의 제어가 가능함.


2) 필요 디스크 공간의 예측 - exp/imp 작업은 작업중 디스크 공간의 부족으로 몇 시간동안 했던 작업을 취소하고 디스크를 추가 or 파일삭제의 방법으로 공간을 확보하고 다시 작업을 수행하던데 비해 datapump 는 ESTIMATE 파라미터를 사용해 해당 작업시 필요 디스크 공간을 미리 알 수 있음


3) 원격지 DB에 작업 수행 가능 - DB Link 라는 기능을 통해 원격지에 있는 db에 expdp / impdp 작업 가능


4) remapping 기능 지원 - 스키마 변경이나 테이블스페이스 변경, 데이터파일 변경이 가능


5) dump 작업을 하면서 압축을 동싱에 진행 - 용량이 큰 데이터의 경우 압축을 동시에 진행해 dump file의 용량을 획기적으로 줄일 수 있음


6) 향상된 작업 속도 - 서버 환경에 따라 다르지만 일반적으로 exp/imp 보다 평균 20배 이상 성능이 향상되었음



2. 사용 전 환경 설정

datapump 는 exp/imp 와 다르게 유틸리티가 직접 OS 파일에 I/O 할 수 없고 오라클에 directory 라는 객체를 통해 간접적으로 접근이 가능. 그래서 datapump 를 사용하려면 미리 directory 를 만들고 directory 접근권한이 있어야 함.


datapump 사용전 디렉토리 생성 후 권한설정하기

[oracle@localhost~]$ mkdir / data/dp

[oracle@localhost~]$ sqlplus / as sysdba


SQL> create or replace directory datapump as '/data/dp';

SQL> grant read, write on directory datapump to scott ;

SQL> grant create any directory to scott ;


3. expdp 실행 모드

1) full 모드 - full 파라미터를 사용해 DB 전체를 export 받을 수 있음. dba권한이나 export_full_database 권한 있어야함


2) schema 모드 - schemas 파라미터를 사용해 특정 스키마의 전체를 export 받을 수 있음


3) tablespace 모드 - tablespace 파라미터를 사용해 해당 테이블스페이스에 속한 모든 테이블을 받을 수 있음

만약 transport_tablespace 파라미터를 사용하면 테이블과 테이블스페이스의 메타 데이터까지 export받게 되어 다른 서버로 테이블스페이스 전체를 이동시킬 때 유용함. 단, 양쪽 db의 os가 같아야 하고 block size 와 characterset 도 같아야함


4) table 모드 - tables 파라미터를 사용, 여러 개의 테이블을 export받으려면 , (콤마) 로 구분


datapump 를 사용하려면 temporary tablespace 설정이 올바르게 되어 있어야 한다.

temporary tablespace 가 없거나 작으면 temporary tablespace is empty 라는 경고가 나옴.

경고가 나올 경우 즉시 temporary tablespace를 크게 만든후 해당 사용자가 사용하게 해주면 됨


SQL> create temporary tablespace temp100

  2    tempfile '/app/oracle/oradata/testdb/temp100.dbf' size 100m ;


SQL> alter user scott temporary tablespace temp100 ;          <-- 해당 사용자만 사용하게

or

SQL> alter database default temporary tablespace temp100 ;    <-- temp100 을 default 로


EXPORT 실습


실습 1. conventional path 로 full export 받기 ( 기본 모드 )


[oracle@localhost~]$ exp system/oracle full=y file=/data/exp/full01.dmp log=/data/exp/full_log01.log


실습 2. direct path 로 full export 받기


[oracle@localhost~]$ exp system/oracle full=y file=/data/exp/full02.dmp log=/data/exp/full_log02.log direct=y


실습 3. export를 저장하는 파일을 분할해서 받기


[oracle@localhost~]$ exp system/oracle full=y file=/data/exp/full03_1.dmp, \

      full03_2.dmp, \

      full03_3.dmp file size=100m


만약 용량 산정을 잘못하여 파일 개수를 부족하게 지정할 경우 파일을 추가하도록 프롬포트가 나옴, 그럼 그때 등록하면 됨


....

....

Export file : expdat.dmp > /data/exp/full04_4.dmp        <-- 이런식으로 추가해주면 됨


실습 4. 특정 tablespace 만 export 하기


[oracle@localhost~]$ exp system/oracle file=/data/exp/ex_user.dmp tablespaces=example,users


실습 5. 특정 table 만 exp 하기


[oracle@localhost~]$ exp scott/tiger tables=emp,dept file=emp_dept.dmp


실습 6. 여러 사용자를 동시에 exp 하기


[oracle@localhost~]$ exp system/oracle file=/data/exp/scott_hr.dmp owner=scott,hr


실습 7. evaluation buffer 값이 크면 대체로 export 값이 빠른데 크다고 무조건 빨라지는 것은 아님

temporary tablespace 의 크기 또한 exmp/imp 에 영향을 많이 주니 작업전에 큰 temporary tablespace를 확보


실습 8. parameter file을 이용한 export 수행


[oracle@localhost~]$ vi full.dat

file=/data/exp/full.dmp

full=y

direct=y

~

:wq!

[oracle@localhost~]$ exp system/oracle parfile=full.dat


실습 9. 특정 조건만 export 받기 - query 옵션 사용


step 1. emp 테이블에서 이름 첫 글자가 F 인 사람만 export 받기

( os 에서 사용하는 ' , " , < 등의 문자를 쓸 경우 \ 꼭 써야함 )


[oracle@localhost~]$ exp scott/tiger query= \ " where ename like \ ' F% ' \ ' \ " tables=emp \

> file=/data/exp/test06.dmp


step 2. emp 테이블에서 job 이 CLERK 이고 급여가 1000이상인 사람만 export 받기


[oracle@localhost~]$ exp scott/tiger query= \ "where job= \ 'CLERK\ ' and sal= \ >1000\ " \

> file=/data/exp/scott2.dmp tables=emp


step 3. parameter file 에서 query 옵션 사용하기 - escape 문자 안써도 됨


[oracle@localhost~]$ vi par2.dat

tables=emp query= "where job='CLERK' and sal > 1000 "

file = /data/exp/scott3.dmp

:wq!


[oracle@localhost~]$ exp scott/tiger parfile=par2.dat




IMPORT 실습


import 작업은 DDL과 DML 을 수행하는 것이므로 Redo log 와 Undo Segment 를 사용

대량의 데이터를 import 할 경우 충분한 용량의 Undo tablespace 를 준비해놓고 작업해야 함.

만약 import 중 Undo tablespace의 용량이 부족할 경우 마지막에 에러나면서 전부 rollback 될수도 있다.

이러한 위험을 줄이기 위해 import 할때 commit=y 옵션을 사용하면 array 단위로 commit 하기에 전체가 rollback 되는걸 방지한다.


실습 11. 전체 데이터 import 수행


[oracle@localhost~]$ imp system/oracle file=/data/exp/full01.dmp ignore=y full=y


전체 데이터를 import 할때 A 서버에서 B 서버로 이동시킬 때 B서버에 같은 테이블이나 데이터가 존재하면 추가해줌

만약 B서버에 제약조건이나 index 가 존재하면 unique index 나 primary key 등이 존재할 경우 데이터 추가 안되고 에러 발생


실습 12. 특정 사용자의 데이터만 import 하기


[oracle@localhost~]$ imp system/oracle file=/data/exp/full01.dmp ignore=y fromuser=scott tables=test01


실습 13. scott 사용자의 test02 테이블을 hr 사용자 소유로 변경


테스트 테이블 생성후 export

SCOTT> create table test02 (no numberm addr varchar2(10)) ;


SCOTT> begin

2    for i in 1..1000 loop

3      insert into test02 values (i,dbms_random.string('a',10)) ;

4    end loop ;

5    commit ;

6    end ;

7    /


SCOTT> select count(*) from test02 ;


COUNT(*)

--------

1000


[oracle@localhost~]$ exp scott/tiger file=/data/exp/test02.dmp tables=test02


import


[oracle@localhost~]$ imp system/oracle file=/data/exp/test02.dmp fromuser=scott touser=hr ignore=y


실습 14. 실제 데이터는 import 하지 않고 DDL 문장만 추출


두가지 방법이 있는데 한가지는 show=y 옵션, 다른 한가지는 indexfile 옵션 사용


show=y 옵션 : export 파일의 모든 내용들이 보여지는데 log 옵션을 주면 그 내용들이 전부 로그 파일에 저장됨, 그후 로그파일 편집


[oracle@localhost~]$ imp scott/tiger file=/data/exp/test02.dmp show=y log=test02.log


[oracle@localhost~]$ vi test02.log     <-- 로그파일 열어서 편집





반응형

'오라클 > 백업/복구' 카테고리의 다른 글

Flashback  (0) 2014.11.12
Clone DB  (0) 2014.11.10
sql loader  (0) 2014.11.10
Redo log flle 장애 처리방법  (0) 2014.11.05
Log Miner 활용하기  (0) 2014.11.05
control file, data file 연습문제  (0) 2014.11.04
Control file 복구  (0) 2014.11.04
반응형

< Redo Log File 장애 처리 순서도 >




Case 1. 1개의 member 가 삭제되는 장애가 발생하는 경우

(에러코드 : ORA-00313: open failed for members of log group....)


SQL> !rm -f /data/temp3/redo01.log               <-- 멤버 삭제


SQL> !ls /data/temp3/redo01.log

ls: /data/temp3/redo01.log: 그런 파일이나 디렉토리가 없음


SQL> alter system switch logfile;                      <-- 로그스위치를 일으켜도 이상 없음

 

System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO             <-- 파일을 삭제했는데 조회가능

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES

     3 /data/temp3/redo03_b.log                         5         24 INACTIVE YES


6 rows selected.


장애 내역을 보려면 alert log file 을 봐야 확인 할 수 있음


SQL> !

v[oracle@localhost ~]$ vi /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log


Errors in file /app/oracle/diag/rdbms/testdb/testdb/trace/testdb_arc3_1063.trc:

ORA-00313: open failed for members of log group 1 of thread 1

ORA-00312: online log 1 thread 1: '/data/temp3/redo01.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory


멤버 하나가 지워져도 운영에는 문제가 없어서 alert log 파일에만 장애를 기록하고 운영중인 DB는 정상작동 됨

장애가 확인된 멤버는 삭제 한 후 다시 생성해주면 잘 돌아감


[oracle@localhost ~]$ exit

exit


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES

     3 /data/temp3/redo03_b.log                         5         24 INACTIVE YES


6 rows selected.


SQL> alter database drop logfile member

  2  '/data/temp3/redo03_b.log';


Database altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES


SQL> alter database add logfile member

  2  '/data/temp3/redo03_b.log' t group 3;

'/data/temp3/redo03_b.log' t group 3

                           *

ERROR at line 2:

ORA-00946: missing TO keyword



SQL> ed

Wrote file afiedt.buf


  1  alter database add logfile member

  2* '/data/temp3/redo03_b.log' to group 3

SQL> /

alter database add logfile member

*

ERROR at line 1:

ORA-00301: error in adding log file '/data/temp3/redo03_b.log' - file cannot be created

ORA-27038: created file already exists

Additional information: 1



SQL> ed

Wrote file afiedt.buf


  1  alter database add logfile member

  2* '/data/temp3/redo03_b.log' to group 3

SQL> alter database add logfile member

  2  '/data/temp3/redo03_b.log' to group 3;

alter database add logfile member

*

ERROR at line 1:

ORA-00301: error in adding log file '/data/temp3/redo03_b.log' - file cannot be created

ORA-27038: created file already exists

Additional information: 1



SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES


삭제된 member 를 생성해주기 전에 해당 디렉토리가서 파일 지워야 함


SQL> !rm /data/temp3/redo03_b.log


SQL> alter database add logfile member '/data/temp3/redo03_b.log'to group 3;


Database altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES

     3 /data/temp3/redo03_b.log                         5         24 INACTIVE YES


6 rows selected.


Case 2. archive 완료된 그룹이 지워진 후 DB Close 상태

( 에러코드 : ORA-00313: open failed for members of log group....)


current가 아닌 하나의 그룹이 삭제된 후 DB가 종료된 경우

DB를 시작하면 지워진 Redo Log 그룹 때문에 에러가 발생하며 DB가 켜지지 않음

그룹이 삭제전 Archive 에 데이터를 복사해 놓았다면 별 문제 없이 해당 그룹을 삭제하고 재생성 하는것으로 해결가능



step1. 현재 상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES

     3 /data/temp3/redo03_b.log                         5         24 INACTIVE YES


6 rows selected.


step2. redo log file 삭제 후 장애 확인


SQL> !rm /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: 그런 파일이나 디렉토리가 없음


SQL> shut immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> 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.

ORA-03113: end-of-file on communication channel     <-- 강제로 종료되었다는 뜻

Process ID: 1762

Session ID: 1 Serial number: 5



SQL> !

[oracle@localhost ~]$ vi /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log

alert log 파일에서 redo03 장애 부분 확인


[oracle@localhost ~]$ exit

exit


step3. 복구 후 OPEN


[oracle@localhost ~]$ sqlplus / as sysdba


SQL*Plus: Release 11.2.0.2.0 Production on Fri Oct 17 16:53:53 2014


Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to an idle instance.


SQL> startup mount

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.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                           5         24 INACTIVE YES

     3 /data/temp3/redo03_c.log                         5         24 INACTIVE YES


6 rows selected.


삭제된 그룹3 이 archive 의 상태가 YES 이므로 데이터가 들어갔음. 이럴 경우는 해당 그룹삭제후 OPEN 하면됨


SQL> alter database drop logfile group 3;


Database altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES


SQL> alter database open;


Database altered.           <-- 제대로 OPEN 됬음


SQL> alter database add logfile group 3(

  2  '/data/temp3/redo03.log',

  3  '/data/temp3/redo03_b.log') size 50m;


Database altered.            <-- 다시 그룹3 생성해줌 (MOUNT 에서 만들고 OPEN 해도 됨)


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         25 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         25 CURRENT  NO

     2 /data/temp3/redo02.log                           5         23 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         23 INACTIVE YES

     3 /data/temp3/redo03.log                          50          0 UNUSED   YES

     3 /data/temp3/redo03_b.log                        50          0 UNUSED   YES


6 rows selected.


Case 3. current 아닌 그룹 중 archive 안 된 그룹이 삭제되고 DB가 OPEN 상태일 경우

(에러코드 : ORA-00313: open failed for members of log group ....)


삭제된 그룹이 archive 되지 않은 경우.

서버 운영중 특정 그룹이 지워진 후 계속 log switch 가 발생하게 되면 DB가 archive hang 현상이 발생해 비정상 종료됨


step1. 현재상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         25 INACTIVE YES

     1 /data/temp3/redo01_b.log                         5         25 INACTIVE YES

     2 /data/temp3/redo02.log                           5         27 CURRENT  NO

     2 /data/temp3/redo02_b.log                         5         27 CURRENT  NO

     3 /data/temp3/redo03.log                          50         26 INACTIVE YES

     3 /data/temp3/redo03_b.log                        50         26 INACTIVE YES


6 rows selected.


step2. 그룹 삭제 ( archive 완료된 그룹 3 을 삭제 )


SQL> !rm -f /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: 그런 파일이나 디렉토리가 없음


SQL> alter system switch logfile;      <-- 로그스위치를 계속 발생시켜 hang 상태를 유발


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> /                       <-- hang 발생해서 대기상태 됨. ctrl + c  키로 작업 취소시킴

alter system switch logfile

*

ERROR at line 1:

ORA-01013: user requested cancel of current operation


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         31 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         31 CURRENT  NO

     2 /data/temp3/redo02.log                           5         30 INACTIVE NO

     2 /data/temp3/redo02_b.log                         5         30 INACTIVE NO

     3 /data/temp3/redo03.log                          50         29 INACTIVE NO

     3 /data/temp3/redo03_b.log                        50         29 INACTIVE NO


6 rows selected.


위에서 arc 부분을 보면 전부 NO 상태임을 확인할 수 있다.

3번이 장애가 일어나서 차례로 아카이빙이 되지않았기 때문에 hang 이 일어난것


SQL> !

[oracle@localhost ~]$ vi /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log


Fri Oct 17 17:14:20 2014

Errors in file /app/oracle/diag/rdbms/testdb/testdb/trace/testdb_arc3_1979.trc:

ORA-00313: open failed for members of log group 3 of thread 1

ORA-00312: online log 3 thread 1: '/data/temp3/redo03_b.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

ORA-00312: online log 3 thread 1: '/data/temp3/redo03.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3


위 에러처럼 그룹 3이 장애가 난것을 확인할 수 있음

[oracle@localhost ~]$ exit
exit

SQL> alter database clear unarchived logfile group 3;   

Database altered.
위 명령어는 redo log file 을 drop 하고 신규로 add 해주는 역할.
위처럼 운영중 redo log file 이 장애가 발생했을 경우 redo log file 을 초기화시켜 DB 중단없이 사용할 수 있도록 하는 기능
이 명령어로 redo log file 을 재생성하게 되면 반드시 DB 전체를 backup 해줘야 한다. 
향후 장애가 생겼을 경우 archive log file 이 중간에 비어있어서 복구가 안됨

SQL> @log
  6  ;

GROUP# MEMBER                                          MB        seq STATUS   arc
------ --------------------------------------------- ---- ---------- -------- -----
     1 /data/temp3/redo01.log                           5         31 CURRENT  NO
     1 /data/temp3/redo01_b.log                         5         31 CURRENT  NO
     2 /data/temp3/redo02.log                           5         30 INACTIVE YES
     2 /data/temp3/redo02_b.log                         5         30 INACTIVE YES
     3 /data/temp3/redo03.log                          50          0 UNUSED   YES
     3 /data/temp3/redo03_b.log                        50          0 UNUSED   YES

6 rows selected.


Case 4. Current 아닌 그룹 중 archive 안 된 그룹이 지워지고 DB Close 상태인 경우

[관련 에러코드]

ORA-00257 : archiver error. Connect internal only, until freed.

ORA-00313 : open failed for members of log group 2 of thread 1

ORA-00350 : log 2 of instance testdb (thread 1 ) needs to be archived 


step1. 상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         34 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5         34 CURRENT  NO

     2 /data/temp3/redo02.log                           5         33 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         33 INACTIVE YES

     3 /data/temp3/redo03.log                          50         32 INACTIVE YES

     3 /data/temp3/redo03_b.log                        50         32 INACTIVE YES


6 rows selected.


step2. 장애 발생시킴


SQL> !rm -f /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: 그런 파일이나 디렉토리가 없음


SQL> alter system switch logfile;


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL>/                  <-- hang 발생



[oracle@localhost ~]$ sqlplus scott/tiger            <-- hang 상태로 다른 터미널 열어서 테스트


SQL*Plus: Release 11.2.0.2.0 Production on Fri Oct 17 17:33:32 2014


Copyright (c) 1982, 2010, Oracle.  All rights reserved.


ERROR:

ORA-00257: archiver error. Connect internal only, until freed.   <-- 접속이 안됨



Enter user-name: sys/oracle as sysdba         <-- 관리자 계정으로는 접속이 가능


Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production

With the Partitioning option


SQL> 


관리자 계정으로 에러를 해결해야 하기 때문에 다른 계정은 접속이 안됨


SQL> shutdown abort;

ORACLE instance shut down.


step3. 재시작 시키면 에러 발생하며 중단 됨


SQL> 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.

ORA-03113: end-of-file on communication channel         <-- redo 문제로 강제 종료됨

Process ID: 2763

Session ID: 1 Serial number: 5


step4. 장애 확인후 복구


SQL> !

[oracle@localhost ~]$ vi /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log    <--alert log 열어서 장애확인

[oracle@localhost ~]$ sqlplus sys/oracle as sysdba


SQL*Plus: Release 11.2.0.2.0 Production on Fri Oct 17 17:35:53 2014


Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to an idle instance.


SQL> startup mount

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.


SQL> alter database drop logfile group 3;              

alter database drop logfile group 3

*

ERROR at line 1:

ORA-00350: log 3 of instance testdb (thread 1) needs to be archived    <-- 아카이브 안된 그룹은 삭제 할 수 없다함

ORA-00312: online log 3 thread 1: '/data/temp3/redo03.log'

ORA-00312: online log 3 thread 1: '/data/temp3/redo03_b.log'



SQL> alter database clear unarchived logfile group 3;           <-- redo log file 을 drop 하고 재생성


Database altered.


SQL> alter database open;


Database altered.


SQL> !ls /data/temp3/redo03*

/data/temp3/redo03_b.log  /data/temp3/redo03.log


SQL> @log;

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         37 INACTIVE YES

     1 /data/temp3/redo01_b.log                         5         37 INACTIVE YES

     2 /data/temp3/redo02.log                           5         36 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         36 INACTIVE YES

     3 /data/temp3/redo03.log                          50         38 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50         38 CURRENT  NO


6 rows selected.


SQL>


Case 5. current 그룹이 삭제된 후 DB Open 상태

이 경우는 위에서 살펴본 case 3 과 같은 경우


Case 6. Current 그룹이 삭제된 경우 - Shut immediate 로 종료

[관련 에러 코드]

ORA-00313 : open failed for members of log group .....

ORA-03113 : end-of-file on communication channel.


Current 그룹이 삭제된 후 DB가 종료되었다면 정상 종료인지 비정상 종료인지에 따라 향후 재시작 할 때 문제가  될 수 있음


step1. 현재상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         37 INACTIVE YES

     1 /data/temp3/redo01_b.log                         5         37 INACTIVE YES

     2 /data/temp3/redo02.log                           5         36 INACTIVE YES

     2 /data/temp3/redo02_b.log                         5         36 INACTIVE YES

     3 /data/temp3/redo03.log                          50         38 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50         38 CURRENT  NO


6 rows selected.


step2. 데이터 입력 후 장애 발생


SQL> create table scott.tt200 (no number) tablespace users;


Table created.


SQL> insert into scott.tt200 values(1);


1 row created.


SQL> commit;


Commit complete.


테스트용 테이블 scott.tt200 을 생성한 후 1을 입력한 내용이 3번 그룹에 저장됨


step3. current 상태인 3번 그룹을 os 명령어로 삭제 한 후 재부팅


SQL> !rm -f /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: No such file or directory


SQL> shut immediate;           <-- 정상 종료시킴

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> 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.

ORA-03113: end-of-file on communication channel         <-- 강제로 종료 됨

Process ID: 3300

Session ID: 1 Serial number: 5


step4. alert log로 에러 메시지 확인

SQL> !vi $ORACLE_BASE/diag/rdbms/testdb/testdb/trace/alert_testdb.log


step5. 복구후 open


current 상태의 redo log group 이 삭제된 후 DB가 shutdown immediate로 종료 된 것입니다.

scott.tt200 을 생성후 1을 입력 후 commit 했기 때문에 shutdown immediate 했으면 해당 내용은 데이터 파일로 저장된 상태

그렇기 때문에 데이터는 복구 할 필요가 없고 redo log file 이 없어서 open 안되는 문제만 해결하면 됨

redo log 를 재생성 하는 resetlogs 옵션을 사용하기 위해 불완전 복구를 해야함

그래서 지금과 같은 상황에 불완전 복구 하기 위해 until cancel 옵션을 사용


SQL> startup mount

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.


SQL> recover database until cancel;

Media recovery complete.


SQL> alter database open resetlogs;


Database altered.


SQL> select * from scott.tt200;


        NO

----------

         1


Case 7. Current 그룹이 삭제된 후 shutdown abort 로 종료 (backup file 이 존재할 경우)

[관련 에러 코드]

ORA-00326: log begins at change ....

ORA-00283: recovery session canceled due to errors


step0. DB 종료후 전체 데이터베이스 백업


step1. Open 후 현재 상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          4 INACTIVE YES

     1 /data/temp3/redo01_b.log                         5          4 INACTIVE YES

     2 /data/temp3/redo02.log                           5          5 CURRENT  NO

     2 /data/temp3/redo02_b.log                         5          5 CURRENT  NO

     3 /data/temp3/redo03.log                          50          3 INACTIVE YES

     3 /data/temp3/redo03_b.log                        50          3 INACTIVE YES


6 rows selected.


2번 그룹에 scott.tt600 테이블을 생성해서 데이터 1건을 입력

SQL> create table scott.tt600 (no number);


Table created.


SQL> insert into scott.tt600 values(1);


1 row created.


SQL> commit;


Commit complete.       <-- 여기까지 2번 그룹에 저장


SQL> alter system switch logfile;       <-- 로그 스위치 일으켜서 current 가 3번 그룹으로 바뀜


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          4 INACTIVE YES

     1 /data/temp3/redo01_b.log                         5          4 INACTIVE YES

     2 /data/temp3/redo02.log                           5          5 ACTIVE   YES

     2 /data/temp3/redo02_b.log                         5          5 ACTIVE   YES

     3 /data/temp3/redo03.log                          50          6 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          6 CURRENT  NO


6 rows selected.


3번 그룹에 데이터 입력

SQL> insert into scott.tt600 values(2);


1 row created.


SQL> commit;


Commit complete.      <-- 여기까지 3번 그룹에 저장


SQL> alter system switch logfile;        <-- 로그스위치 일으켜서 1번 그룹이 current


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          7 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          7 CURRENT  NO

     2 /data/temp3/redo02.log                           5          5 ACTIVE   YES

     2 /data/temp3/redo02_b.log                         5          5 ACTIVE   YES

     3 /data/temp3/redo03.log                          50          6 ACTIVE   YES

     3 /data/temp3/redo03_b.log                        50          6 ACTIVE   YES


6 rows selected.


SQL> insert into scott.tt600 values(3);


1 row created.


SQL> commit;


Commit complete.  <-- 1번 그룹에 저장


SQL> select * from scott.tt600;


        NO

----------

         1        <-- 2번 그룹에 저장됨

         2        <-- 3번 그룹에 저장됨

         3        <-- 1번 그룹에 저장됨


현재 current 상태인 1번 그룹 삭제하는 장애 만듬

SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          7 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          7 CURRENT  NO

     2 /data/temp3/redo02.log                           5          5 ACTIVE   YES

     2 /data/temp3/redo02_b.log                         5          5 ACTIVE   YES

     3 /data/temp3/redo03.log                          50          6 ACTIVE   YES

     3 /data/temp3/redo03_b.log                        50          6 ACTIVE   YES


6 rows selected.


SQL> !rm -f /data/temp3/redo01*


SQL> !ls /data/temp3/redo01*

ls: /data/temp3/redo01*: No such file or directory


SQL> shut abort;

ORACLE instance shut down.

SQL> !cp /data/backup/close/*.dbf /data/temp3/


step3.  복구하기


SQL> startup mount

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.


SQL> recover database until cancel;


ORA-00279: change 1428687 generated at 10/17/2014 18:26:38 needed for thread 1

ORA-00289: suggestion : /data/arc2/1_1_861213720.arc

ORA-00280: change 1428687 for thread 1 is in sequence #1



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429110 generated at 10/17/2014 18:45:57 needed for thread 1

ORA-00289: suggestion : /data/arc2/2_1_861213720.arc

ORA-00280: change 1429110 for thread 1 is in sequence #2

ORA-00278: log file '/data/arc2/1_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429113 generated at 10/17/2014 18:45:57 needed for thread 1

ORA-00289: suggestion : /data/arc2/3_1_861213720.arc

ORA-00280: change 1429113 for thread 1 is in sequence #3

ORA-00278: log file '/data/arc2/2_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429117 generated at 10/17/2014 18:46:00 needed for thread 1

ORA-00289: suggestion : /data/arc2/4_1_861213720.arc

ORA-00280: change 1429117 for thread 1 is in sequence #4

ORA-00278: log file '/data/arc2/3_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429120 generated at 10/17/2014 18:46:00 needed for thread 1

ORA-00289: suggestion : /data/arc2/5_1_861213720.arc

ORA-00280: change 1429120 for thread 1 is in sequence #5

ORA-00278: log file '/data/arc2/4_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429213 generated at 10/17/2014 18:46:51 needed for thread 1

ORA-00289: suggestion : /data/arc2/6_1_861213720.arc

ORA-00280: change 1429213 for thread 1 is in sequence #6

ORA-00278: log file '/data/arc2/5_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00279: change 1429232 generated at 10/17/2014 18:47:37 needed for thread 1

ORA-00289: suggestion : /data/arc2/7_1_861213720.arc

ORA-00280: change 1429232 for thread 1 is in sequence #7

ORA-00278: log file '/data/arc2/6_1_861213720.arc' no longer needed for this recovery



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00308: cannot open archived log '/data/arc2/7_1_861213720.arc'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3


SQL> alter database open resetlogs;


Database altered.


SQL> select * from scott.tt600

  2  ;


        NO

----------

         1

         2         

                           <-- 3번그룹은 데이터가 복구 안되었음


Case 8. - Current 그룹이 삭제되고 Shutdown abort 로 종료됨 (backup file 이나 archive log file 이 없을 경우)

[관련 에러 코드]

ORA-01547 : warning:RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-00308 : cannot open archived log ...

ORA-01194 : file 1 needs more recovery to be consistent


상황 1. 데이터를 모두 복구해내는 경우


step 1. no archive log mode 로 변경하기


SQL> shut immediate


SQL> startup mount


SQL> archive log list            <-- archive 모드 확인하고 archive log mode일경우 noarchive log mode 로 변경 


SQL> alter database noarchivelog ;


SQL> alter database open ;


step 2. 데이터 입력


SQL>@log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          4 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          4 CURRENT  NO

     2 /data/temp3/redo02.log                           5          2 INACTIVE NO

     2 /data/temp3/redo02_b.log                         5          2 INACTIVE NO

     3 /data/temp3/redo03.log                          50          3 INACTIVE NO

     3 /data/temp3/redo03_b.log                        50          3 INACTIVE NO


6 rows selected.


SQL> create table scott.tt650 ( no number ) ;


Table created.


SQL> insert into scott.tt650 values(1);


1 row created.


SQL> commit;


Commit complete.    <--여기까지 1번 그룹에 저장


SQL> alter system switch logfile;


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          4 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          4 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          5 CURRENT  NO

     2 /data/temp3/redo02_b.log                         5          5 CURRENT  NO

     3 /data/temp3/redo03.log                          50          3 INACTIVE NO

     3 /data/temp3/redo03_b.log                        50          3 INACTIVE NO


6 rows selected.


SQL> insert into scott.tt650 values(2);


1 row created.


SQL> commit;


Commit complete.    <--여기까지 2번 그룹에 저장


SQL> alter system switch logfile;


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          4 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          4 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          5 ACTIVE   NO

     2 /data/temp3/redo02_b.log                         5          5 ACTIVE   NO

     3 /data/temp3/redo03.log                          50          6 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          6 CURRENT  NO


6 rows selected.


SQL> insert into scott.tt650 values(3);


1 row created.


SQL> commit;


Commit complete.    <--여기까지 3번 그룹에 저장


SQL> select * from scott.tt650;


        NO

----------

         1    <-- 1번 그룹에 저장

         2    <-- 2번 그룹에 저장

         3    <-- 3번 그룹에 저장


step 3. current 그룹이 삭제되는 장애 발생 후 강제 종료


SQL> alter system switch logfile;


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          7 INACTIVE NO

     1 /data/temp3/redo01_b.log                         5          7 INACTIVE NO

     2 /data/temp3/redo02.log                           5          8 INACTIVE NO

     2 /data/temp3/redo02_b.log                         5          8 INACTIVE NO

     3 /data/temp3/redo03.log                          50          9 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          9 CURRENT  NO


6 rows selected.


위에서 3번 그룹이 current 임이 확인 됨


SQL> !rm -f data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

/data/temp3/redo03_b.log  /data/temp3/redo03.log


SQL> !rm -f /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: No such file or directory


SQL> shut abort

ORACLE instance shut down.


step 4. 복구


SQL> !vi $ORACLE_HOME/dbs/inittestdb.ora 

기존 파라 미터 파일에 다음과 같은 파라미터 추가   : _allow_resetlogs_corruption=true   


SQL> 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.

ORA-00313: open failed for members of log group 3 of thread 1

ORA-00312: online log 3 thread 1: '/data/temp3/redo03_b.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

ORA-00312: online log 3 thread 1: '/data/temp3/redo03.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3


위와 같이 3번 그룹이 없어서 에러가 발생


SQL> recover database until cancel;            

ORA-00279: change 1430366 generated at 10/17/2014 19:05:37 needed for thread 1

ORA-00289: suggestion : /data/arc2/9_1_861216772.arc

ORA-00280: change 1430366 for thread 1 is in sequence #9



Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


ORA-00308: cannot open archived log '/data/arc2/9_1_861216772.arc'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3



ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below

ORA-01194: file 1 needs more recovery to be consistent

ORA-01110: data file 1: '/data/temp3/system01.dbf'



SQL> alter database open resetlogs;


Database altered.


SQL> select * from scott.tt650;


        NO

----------

         1

         2

         3


복구가 된 이유는 로그스위치가 수차례 일어나면서 데이터가 데이터파일에 모두 저장이되어서 완전 복구 된 것


상황 2. current 에 저장된 데이터는 복구 못하는 경우


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          1 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          1 CURRENT  NO

     2 /data/temp3/redo02.log                           5          0 UNUSED   YES

     2 /data/temp3/redo02_b.log                         5          0 UNUSED   YES

     3 /data/temp3/redo03.log                          50          0 UNUSED   YES

     3 /data/temp3/redo03_b.log                        50          0 UNUSED   YES


6 rows selected.


SQL> create table scott.tt660 ( no number );


Table created.


SQL> insert into scott.tt660 values(1);


1 row created.


SQL> commit;       <-- 여기까지 1번 그룹에 저장


Commit complete.


SQL> alter system switch logfile;


System altered.


SQL> insert into scott.tt660 values(2);


1 row created.


SQL> commit;


Commit complete.       <-- 여기까지 2번 그룹에 저장


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          1 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          1 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          2 CURRENT  NO

     2 /data/temp3/redo02_b.log                         5          2 CURRENT  NO

     3 /data/temp3/redo03.log                          50          0 UNUSED   YES

     3 /data/temp3/redo03_b.log                        50          0 UNUSED   YES


6 rows selected.


SQL> alter system switch logfile;


System altered.


SQL> insert into scott.tt660 values(3);


1 row created.


SQL> commit;


Commit complete.       <-- 여기까지 3번 그룹에 저장


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          1 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          1 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          2 ACTIVE   NO

     2 /data/temp3/redo02_b.log                         5          2 ACTIVE   NO

     3 /data/temp3/redo03.log                          50          3 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          3 CURRENT  NO


6 rows selected.


SQL> !rm /data/temp3/redo03*


SQL> !ls /data/temp3/redo03*

ls: /data/temp3/redo03*: No such file or directory


SQL> shut abort

ORACLE instance shut down.


SQL>! vi $ORACLE_HOME/dbs/inittestdb.ora

__allow_resetlogs_corruption=true         파라미터 추가


SQL> startup mount

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.


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          1 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          1 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          2 ACTIVE   NO

     2 /data/temp3/redo02_b.log                         5          2 ACTIVE   NO

     3 /data/temp3/redo03.log                          50          3 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          3 CURRENT  NO


6 rows selected.


1,2 번 그룹은 active 상태이므로 해당 로그 내용은 데이터파일에 저장 안되었음을 알 수 있다.

SQL> recover database until cancel;
ORA-00279: change 1430370 generated at 10/17/2014 19:07:48 needed for thread 1
ORA-00289: suggestion : /data/arc2/1_1_861217667.arc
ORA-00280: change 1430370 for thread 1 is in sequence #1

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/data/temp3/redo01.log                         <-- sequence 1 에 해당하는 로그파일 입력

ORA-00279: change 1430933 generated at 10/17/2014 19:16:41 needed for thread 1
ORA-00289: suggestion : /data/arc2/2_1_861217667.arc
ORA-00280: change 1430933 for thread 1 is in sequence #2
ORA-00278: log file '/data/temp3/redo01.log' no longer needed for this recovery

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/data/temp3/redo02.log                         <-- sequence 2 에 해당하는 로그파일 입력

ORA-00279: change 1430944 generated at 10/17/2014 19:17:05 needed for thread 1
ORA-00289: suggestion : /data/arc2/3_1_861217667.arc
ORA-00280: change 1430944 for thread 1 is in sequence #3
ORA-00278: log file '/data/temp3/redo02.log' no longer needed for this recovery

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel                         <-- sequence 3 에 해당하는 로그파일 삭제되어 cancel 입력

ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/data/temp3/system01.dbf'


ORA-01112: media recovery not started           <-- 리두로그파일3이 없어 제대로 복구되지않아 이렇게 뜸


SQL> alter database open resetlogs;             <-- reset logs 옵션으로 오픈

Database altered.

SQL> select * from scott.tt660;

        NO
----------
         1
         2
resetlogs 와 _allow_resetlogs_corruption

DB가 OPEN 되기 위해서는 운영중인 Data file, Redo Log File , Controlfile 의 체크포인트 정보가 모두 동일해야 한다.
그러나 불완전 복구를 하게되면 3개의 파일의 체크포인트 정보가 달라지게 된다.
resetlogs 옵션은datafile끼리의 체크포인트 정보는 같지만 redo log file 과 controlfile 과의 체크포인트 정보가 다를 경우 사용
데이터 파일들 끼리 체크포인트 정보가 다를경우 사용하는 옵션이 _allow_resetlogs_corruption=true 사용.


Case 9. 전체 Redo log file이 삭제된 경우 DB OPEN 상태 (archive log mode 에서 작업)


step1. 현재 상태 확인


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          1 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          1 CURRENT  NO

     2 /data/temp3/redo02.log                           5          0 UNUSED   YES

     2 /data/temp3/redo02_b.log                         5          0 UNUSED   YES

     3 /data/temp3/redo03.log                          50          0 UNUSED   YES

     3 /data/temp3/redo03_b.log                        50          0 UNUSED   YES


6 rows selected.


SQL> !rm -f /data/temp3/*.log


SQL> alter system switch logfile;


System altered.


SQL> /


System altered.


SQL> /        <-- hang 발생 ctrl+c 눌러 취소

alter system switch logfile

*

ERROR at line 1:

ORA-01013: user requested cancel of current operation


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          1 INACTIVE NO

     1 /data/temp3/redo01_b.log                         5          1 INACTIVE NO

     2 /data/temp3/redo02.log                           5          2 INACTIVE NO

     2 /data/temp3/redo02_b.log                         5          2 INACTIVE NO

     3 /data/temp3/redo03.log                          50          3 CURRENT  NO

     3 /data/temp3/redo03_b.log                        50          3 CURRENT  NO


6 rows selected.


1번 그룹이 seq 가 가장낮아서 1번 그룹 때문에 이후 모든 로그파일이 아카이빙 안되고 있어서 clear 해줌


SQL> alter database clear unarchived logfile group 1;


Database altered.


SQL> alter system switch logfile;


System altered.


SQL> /        <-- hang 발생 ctrl+c 눌러 취소

alter system switch logfile

*

ERROR at line 1:

ORA-01013: user requested cancel of current operation


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          4 CURRENT  NO

     1 /data/temp3/redo01_b.log                         5          4 CURRENT  NO

     2 /data/temp3/redo02.log                           5          2 INACTIVE NO

     2 /data/temp3/redo02_b.log                         5          2 INACTIVE NO

     3 /data/temp3/redo03.log                          50          3 ACTIVE   NO

     3 /data/temp3/redo03_b.log                        50          3 ACTIVE   NO


6 rows selected.


2번 그룹이 seq 가 가장낮아서 1번 그룹 때문에 이후 모든 로그파일이 아카이빙 안되고 있어서 clear 해줌

SQL> alter database clear unarchived logfile group 2;


Database altered.


SQL> alter system switch logfile;


System altered.


SQL> /        <-- hang 발생 ctrl+c 눌러 취소

alter system switch logfile

*

ERROR at line 1:

ORA-01013: user requested cancel of current operation


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5          4 ACTIVE   NO

     1 /data/temp3/redo01_b.log                         5          4 ACTIVE   NO

     2 /data/temp3/redo02.log                           5          5 CURRENT  NO

     2 /data/temp3/redo02_b.log                         5          5 CURRENT  NO

     3 /data/temp3/redo03.log                          50          3 INACTIVE NO

     3 /data/temp3/redo03_b.log                        50          3 INACTIVE NO


6 rows selected.

3번 그룹이 seq 가 가장낮아서 1번 그룹 때문에 이후 모든 로그파일이 아카이빙 안되고 있어서 clear 해줌

SQL> alter database clear unarchived logfile group 3;


Database altered.


SQL> alter system switch logfile;


System altered.


SQL> /


System altered.


SQL> /


System altered.


SQL> /


System altered.


아무 이상없이 작동 잘됨.


Case 10. 전체 Redo log file 이 삭제된 경우 DB Close 상태 - 백업 있는 상태

DB가 shut immediate 상태로 종료되었을 경우 앞에서 확인한 Case 6 번의 경우와 동일하게 해결하면 된다.

그러나 shut abort 상태로 비정상 종료되었을 경우는 Case 7 번의 경우와 동일하게 복구하면 된다.


Case 11. 전체 Redo log file 이 삭제된 경우 DB Close 상태 - 백업 없는 상태

Case 8 방법과 복구방법이 동일



반응형

'오라클 > 백업/복구' 카테고리의 다른 글

Clone DB  (0) 2014.11.10
sql loader  (0) 2014.11.10
데이터 이동하기  (0) 2014.11.06
Log Miner 활용하기  (0) 2014.11.05
control file, data file 연습문제  (0) 2014.11.04
Control file 복구  (0) 2014.11.04
Data file Recovery (불완전 복구)  (0) 2014.11.04
반응형

Log miner

 -> redo log file 의 내용을 sql 문장으로 변환해 사용자가 sql 문장으로 조회해서 원하는 내용을 확인하는 것


log miner 조회 순서

 -> 1. log miner 전용 Dictionary 생성

      2. log miner 로 분석할 로그 보냄 (redo log buffer, archive log) = 등록

      3. log miner 에서 분석

      4. sql 로 분석 결과 조회


supplemental logging 기능

 -> 데이터에 DML이 발생할 경우 redo log 에 추가적인 내용을 기록 ( 기본값 보다 자세한 내용 기록 )


 - 최소 기록 (disable)  : 기본 모드       

 - 자세히 기록 (enable)                     


supplemental logging 활성화 여부 조회

SYS> select supplemental_log_data_min from v$database ;


SUPPLEMENTAL_LOG

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

NO              <- 기본값 


활성화 시키기

SYS> alter database add supplemental log data ;


SYS> select supplemental_log_data_min from v$database ;


SUPPLEMENTAL_LOG

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

YES


비활성화 시키기

SYS> alter database drop supplemental log data ;


SYS> select supplemental_log_data_min from v$database ;


SUPPLEMENTAL_LOG

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

NO


특정 테이블만 supplemental log 적용

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



Log Miner 실습하기 1. - drop table 정보 찾기

step 1. 현재 상태 확인


SYS> @log


GROUP#  MEMBER                                            MB        seq  STATUS   arc

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

     1       /data/temp3/redo01.log                           5          1 CURRENT  NO

     2       /data/temp3/redo02.log                           5          0 UNUSED   YES

     3       /data/temp3/redo03.log                           5          0 UNUSED   YES


SYS> select supplemental_log_data_min from v$database ;


SUPPLEMENTAL_LOG

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

YES                        <-- 활성화 시키고 실습 시작


step 2. 새로운 테이블 생성 후 데이터 입력하고 삭제


SQL> create table scott.test1 (no number);


Table created.


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


1 row created.


SQL> commit;


Commit complete.


SQL> drop table scott.test1 purge;


Table dropped.


SQL> @log

  6  ;


GROUP#  MEMBER                                            MB        seq  STATUS   arc

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

     1       /data/temp3/redo01.log                           5          1 CURRENT  NO     <-- 1번 그룹에서 진행 중

     2       /data/temp3/redo02.log                           5          0 UNUSED   YES

     3       /data/temp3/redo03.log                           5          0 UNUSED   YES


step 3. Log Miner 딕셔너리를 생성

 -> log miner 가 redo log file 을 분석해 그 안에 있는 테이블 이름이나 컬럼 이름들이 있는 부분을 딕셔너리를 확인해서 사용자가 볼 수 있도록 변환해줌

 ( 여기서 딕셔너리는 SQL Parse 단계에서 사용하는 딕셔너리가 아니라 Log Miner 가 사용하는 별도의 딕셔너리를 말함 )


딕셔너리 생성방법 3가지

1. Online Catalog 사용

2. Redo Log File 자체에 저장하는 방법

3. Flat file 에 저장하는 방법

※ 1,2 의 방법은 잘 사용 안함


1) DB 전체를 종료한 후 Parameter file 에 딕셔너리 파일의 위치를 아래와 같이 지정


SQL> shut immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.


SQL> !

[oracle@localhost ~]$ vi /app/oracle/product/11g/dbs/inittestdb.ora

utl_file_dir=/app/oracle/logminer 

2) DB 시작


[oracle@localhost ~]$ exit

exit


SQL> 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.


3) 아래와 같이 딕셔너리 생성


SQL> exec dbms_logmnr_d.build(dictionary_filename=>'dict.dat',-

> dictionary_location=>'/app/oracle/logminer');


PL/SQL procedure successfully completed.


4) Log Miner 에 분석할 로그 추가


SQL> exec dbms_logmnr.add_logfile('/data/temp3/redo01.log',1);      

 -- 위 명령어 마지막 숫자의 의미는 1= 신규등록    2= 파일삭제   3= 추가등록

PL/SQL procedure successfully completed.


2,3 번 그룹을 추가 등록

SQL> exec dbms_logmnr.add_logfile('/data/temp3/redo02.log',3);

PL/SQL procedure successfully completed.

SQL> exec dbms_logmnr.add_logfile('/data/temp3/redo03.log',3);
BEGIN dbms_logmnr.add_logfile('/data/temp3/redo03.log',3); END;

*
ERROR at line 1:
ORA-01289: cannot add duplicate logfile /data/temp3/redo03.log
ORA-06512: at "SYS.DBMS_LOGMNR", line 68
ORA-06512: at line 1

3번 그룹을 추가할 때 위와 같은 에러가 나면 로그파일이 UNUSED 상태라서 그럼
alter system switch logfile 과 alter system checkpoint 를 실행시켜 Inactive 와 current 상태로 만들어주자

SQL> alter system switch logfile ;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> alter system checkpoint;

System altered.

SQL> @log
  6  ;

GROUP# MEMBER                                          MB        seq STATUS   arc
------ --------------------------------------------- ---- -----
     1 /data/temp3/redo01.log                           5          4 CURRENT  NO
     2 /data/temp3/redo02.log                           5          2 INACTIVE YES
     3 /data/temp3/redo03.log                           5          3 INACTIVE YES



위의 에러를 해결하고 redo log file 을 다시 등록해주고 log miner 에 등록된 log file을 확인

SQL> select db_name,filename from v$logmnr_logs;

DB_NAME         FILENAME
--------------- --------------------
TESTDB          /data/temp3/redo01.log
TESTDB          /data/temp3/redo02.log
TESTDB          /data/temp3/redo03.log

5) Log Miner 를 시작해서 log 를 분석한 후 결과를 조회

SQL> exec dbms_logmnr.start_logmnr (dictfilename=>'/app/oracle/logminer/dict.dat',-
> options=>dbms_logmnr.ddl_dict_tracking+dbms_logmnr.committed_data_only);

PL/SQL procedure successfully completed.

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' ;
Session altered.





Log Miner 실습하기 2 - Update table 시간 확인하기


step1. 현재 상태 조회하기

SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         19 INACTIVE YES

     2 /data/temp3/redo02.log                           5         20 INACTIVE YES

     3 /data/temp3/redo03.log                           5         21 CURRENT  NO          <-- redo03 에서 작업


SQL> select supplemental_log_data_min from v$database;


SUPPLEME

--------

YES


step2. 신규 테이블 생성 후 데이터 입력하고 update


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


Table created.


SQL> insert into scott.test2 values(1,'aaa');


1 row created.


SQL> insert into scott.test2 values(2,'bbb');


1 row created.


SQL> insert into scott.test2 values(3,'ccc');


1 row created.


SQL> commit;


Commit complete.


SQL> select * from scott.test2;


        NO NAME

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

         1 aaa

         2 bbb

         3 ccc


SQL> update scott.test2 set name='ddd';


3 rows updated.


SQL> select * from scott.test2;


        NO NAME

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

         1 ddd

         2 ddd

         3 ddd


SQL> commit;


Commit complete.


step3. Log Miner 딕셔너리를 생성


SQL> show parameter utl


NAME                               TYPE        VALUE

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

create_stored_outlines        string

utl_file_dir                         string      /app/oracle/logminer


SQL> exec dbms_logmnr_d.build(dictionary_filename =>'dict2.dat',-

> dictionary_location=>'/app/oracle/logminer');


PL/SQL procedure successfully completed.


step4. 분석을 해야 할 Redo Log File 을 등록한 후 분석


SQL> @log

  6  ;


GROUP# MEMBER                                          MB        seq STATUS   arc

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

     1 /data/temp3/redo01.log                           5         19 INACTIVE YES

     2 /data/temp3/redo02.log                           5         20 INACTIVE YES

     3 /data/temp3/redo03.log                           5         21 CURRENT  NO          


SQL> select db_name,filename from v$logmnr_logs;             <--3번이 current 이기에 3번 등록


DB_NAME         FILENAME

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

TESTDB          /data/temp3/redo03.log


SQL> exec dbms_logmnr.start_logmnr(dictfilename=>'/app/oracle/logminer/dict2.dat')


PL/SQL procedure successfully completed.


step5. 분석결과 조회


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


Session altered.


SQL> select timestamp,username,operation,sql_redo

  2  from v$logmnr_contents

  3  where seg_name='TEST2'

  4  ;












반응형

'오라클 > 백업/복구' 카테고리의 다른 글

sql loader  (0) 2014.11.10
데이터 이동하기  (0) 2014.11.06
Redo log flle 장애 처리방법  (0) 2014.11.05
control file, data file 연습문제  (0) 2014.11.04
Control file 복구  (0) 2014.11.04
Data file Recovery (불완전 복구)  (0) 2014.11.04
Data File Recovery  (0) 2014.10.30

+ Recent posts