No Archive Log vs Archive Log 복구 시 차이점

No Archive Log Mode는 복구에 필요한 Archive log 파일이 존재하지 않으면 복구 할 없다.

7.0 사전준비 작업(백업 및 장애상황 만들기)


SQL> startup mount
ORACLE instance started.

Total System Global Area  784998400 bytes
Fixed Size		    2217464 bytes
Variable Size		  482347528 bytes
Database Buffers	  297795584 bytes
Redo Buffers		    2637824 bytes
Database mounted.

SQL> archive log list;
Database log mode	       Archive Mode
Automatic archival	       Enabled
Archive destination	       /home/data/arc2
Oldest online log sequence     5
Next log sequence to archive   7
Current log sequence	       7

SQL> alter database noarchivelog;

Database altered.

SQL> alter database open;

Database altered.


SQL> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            /home/data/arc2
Oldest online log sequence     5
Current log sequence           7

SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;

TABLESPACE_NAME                        MB FILE_NAME
------------------------------ ---------- -------------------------------------- 
USERS                                   5 /app/oracle/oradata/jigi/users01.dbf
UNDOTBS1                              100 /app/oracle/oradata/jigi/undotbs01.dbf
SYSAUX                                520 /app/oracle/oradata/jigi/sysaux01.dbf
SYSTEM                                680 /app/oracle/oradata/jigi/system01.dbf
EXAMPLE                               100 /app/oracle/oradata/jigi/example01.dbf


SQL> create tablespace test
  2  datafile '/app/oracle/oradata/jigi/test01.dbf' size 5m;

Tablespace created.

SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;

TABLESPACE_NAME                        MB FILE_NAME
------------------------------ ---------- ---------------------------------------------
USERS                                   5 /app/oracle/oradata/jigi/users01.dbf
UNDOTBS1                              100 /app/oracle/oradata/jigi/undotbs01.dbf
SYSAUX                                520 /app/oracle/oradata/jigi/sysaux01.dbf
SYSTEM                                680 /app/oracle/oradata/jigi/system01.dbf
EXAMPLE                               100 /app/oracle/oradata/jigi/example01.dbf
TEST                                    5 /app/oracle/oradata/jigi/test01.dbf

6 rows selected.

SQL> save dd.sql
Created file dd.sql


SQL> select name from v$controlfile;

NAME
----------------------------------------------------------------------------------------------------
/app/oracle/oradata/jigi/control01.ctl
/app/oracle/oradata/jigi/control02.ctl


SQL> select member from v$logfile;

MEMBER
----------------------------------------------------------------------------------------------------
/app/oracle/oradata/jigi/redo03.log
/app/oracle/oradata/jigi/redo02.log
/app/oracle/oradata/jigi/redo01.log
/app/oracle/oradata/jigi/redo01_2.log
/app/oracle/oradata/jigi/redo02_2.log
/app/oracle/oradata/jigi/redo03_2.log

6 rows selected.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> !cp /app/oracle/oradata/jigi/* /home/data/backup/close/     ------->>>>>> close 백업

SQL> !ls /home/data/backup/close
control01.ctl  example01.dbf  redo01_2.log  redo02_2.log  redo03_2.log  system01.dbf  test01.dbf     users01.dbf
control02.ctl  redo01.log     redo02.log    redo03.log    sysaux01.dbf  temp01.dbf    undotbs01.dbf

SQL> startup
ORACLE instance started.

Total System Global Area  784998400 bytes
Fixed Size                  2217464 bytes
Variable Size             482347528 bytes
Database Buffers          297795584 bytes
Redo Buffers                2637824 bytes
Database mounted.
Database opened.

SQL> create table scott.tt700 (no number) tablespace test;

Table created.

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

1 row created.

SQL> commit;

Commit complete.

SQL> !rm /app/oracle/oradata/jigi/test01.dbf        --->>>> 데이터 파일 장애 발생

SQL> !ls /app/oracle/oradata/jigi/test01.dbf
ls: cannot access /app/oracle/oradata/jigi/test01.dbf: 그런 파일이나 디렉터리가 없습니다

SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /
alter system switch logfile
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 5709
Session ID: 1 Serial number: 5


SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

[oracle@myjigi ~]$ sqlplus

SQL*Plus: Release 11.2.0.1.0 Production on Wed Nov 11 00:44:11 2015

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

Enter user-name: /as sysdba
Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area  784998400 bytes
Fixed Size                  2217464 bytes
Variable Size             482347528 bytes
Database Buffers          297795584 bytes
Redo Buffers                2637824 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/app/oracle/oradata/jigi/test01.dbf'

7.1 No Archive log Mode일 경우의 복구

  • 전체 파일을 복원(restore)하는 방법
    • "/home/data/backup/close/" 에 백업해 놓은 파일을 그냥 덮어씌우고 DB를 startup(백업 이후의 데이터는 손실)
  • 장애 발생한 파일을 포기하고 복구

SQL> startup
ORACLE instance started.

Total System Global Area  784998400 bytes
Fixed Size                  2217464 bytes
Variable Size             482347528 bytes
Database Buffers          297795584 bytes
Redo Buffers                2637824 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/app/oracle/oradata/jigi/test01.dbf'

SQL> alter database datafile '/app/oracle/oradata/jigi/test01.dbf' offline drop;

Database altered.

SQL> alter database open;

Database altered.

SQL> select status from v$instance;

STATUS
------------
OPEN

SQL> select * from scott.tt700;
select * from scott.tt700
                    *
ERROR at line 1:
ORA-00376: file 6 cannot be read at this time
ORA-01110: data file 6: '/app/oracle/oradata/jigi/test01.dbf'


7.2 Archive LogMode일 경우의 복구

Archive Log 복구 시 주의할 점

장애가 발생하여 복구할 경우, 해당파일에 I/O가 발생하지 않도록 만들어 놓고 복구작업해야 한다.

  • DB 무정지 상태에서의 복구(offline되는 Tablespace 장애)
    • 시나리오 : 풀백업 -> 오프라인 가능한 테이블스페이스의 데이터 파일 손상 -> 운영상태에서 복구

SYS> shutdown immediate
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

SYS> startup mount
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  619360256 bytes
Fixed Size                  1338280 bytes
Variable Size             461374552 bytes
Database Buffers          150994944 bytes
Redo Buffers                5652480 bytes
데이터베이스가 마운트되었습니다.

SYS> alter database archivelog;

데이타베이스가 변경되었습니다.

SYS> alter database open;

데이타베이스가 변경되었습니다.

SYS> create tablespace test2
  2  datafile '/app/oracle/oradata/mydream/test02.dbf' size 5M;

테이블스페이스가 생성되었습니다.

SYS> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/app/oracle/oradata/mydream/system01.dbf
/app/oracle/oradata/mydream/sysaux01.dbf
/app/oracle/oradata/mydream/undotbs01.dbf
/app/oracle/oradata/mydream/users01.dbf
/app/oracle/oradata/mydream/example01.dbf
/app/oracle/oradata/mydream/test02.dbf
/app/oracle/oradata/mydream/dosirak_data01.dbf
/app/oracle/oradata/mydream/dosirak_index01.dbf
/app/oracle/oradata/mydream/genie_data_01
/app/oracle/oradata/mydream/genie_index_01
/app/oracle/oradata/mydream/toda_data_01.dbf

11 개의 행이 선택되었습니다.

SYS> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/app/oracle/oradata/mydream/redo03.log
/app/oracle/oradata/mydream/redo02.log
/app/oracle/oradata/mydream/redo01.log

SYS> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/app/oracle/oradata/mydream/control01.ctl

SYS> shutdown immediate
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

SYS> !cp /app/oracle/oradata/mydream/* /data/backup/close/         ------>>>>> close 백업

SYS> startup
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  619360256 bytes
Fixed Size                  1338280 bytes
Variable Size             461374552 bytes
Database Buffers          150994944 bytes
Redo Buffers                5652480 bytes
데이터베이스가 마운트되었습니다.
데이터베이스가 열렸습니다.

SYS> create table scott.tt750 (no number) tablespace test2;

테이블이 생성되었습니다.

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

1 개의 행이 만들어졌습니다.

SYS> commit;

커밋이 완료되었습니다.

SYS> select * from scott.tt750;

        NO
----------
         1

SYS> !rm /app/oracle/oradata/mydream/test02.dbf                ------->>>>> 데이터 파일 장애발생

SYS> !ls /app/oracle/oradata/mydream/test02.dbf
ls: /app/oracle/oradata/mydream/test02.dbf: 그런 파일이나 디렉토리가 없음

SYS> alter tablespace test2 offline;

테이블스페이스가 변경되었습니다.

SYS> alter tablespace test2 online;
alter tablespace test2 online
*
1행에 오류:
ORA-01157: 데이터 6 파일을 식별 또는 잠금 할 수 없습니다- DBWR 추적 파일을 보십시오
ORA-01110: 6 데이터 파일: '/app/oracle/oradata/mydream/test02.dbf'

SYS> !cp /data/backup/close/test02.dbf /app/oracle/oradata/mydream/       ----->>> 백업파일을 복원

SYS> alter tablespace test2 online;
alter tablespace test2 online
*
1행에 오류:
ORA-01113: 6 파일이 매체 복구되어야 합니다
ORA-01110: 6 데이터 파일: '/app/oracle/oradata/mydream/test02.dbf'

SYS> recover tablespace test2;	------->>> 데이터 복구
매체 복구가 완료되었습니다.

SYS> alter tablespace test2 online;

테이블스페이스가 변경되었습니다.

SYS> select * from scott.tt750;

        NO
----------
         1

  • DB정지하고 복구(offline 안되는 tablespace 장애)
    • 시나리오 : 풀백업 -> 오프라인 불가능한 테이블스페이스 데이터 파일 손상 -> shutdown 후 복구

SYS> create table scott.tt800 (no number) tablespace system;

테이블이 생성되었습니다.

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

1 개의 행이 만들어졌습니다.

SYS> commit;

커밋이 완료되었습니다.

SYS> select * from scott.tt800;

        NO
----------
         1

SYS> !rm /app/oracle/oradata/mydream/system01.dbf

SYS> !ls /app/oracle/oradata/mydream/system01.dbf          --->>> rm 만으로는 삭제 안됨
/app/oracle/oradata/mydream/system01.dbf

SYS> alter tablespace system offline;
alter tablespace system offline
*
1행에 오류:
ORA-01541: SYSTEM 테이블스페이스는 오프라인될 수 없습니다. 필요하면 종료하십시오.


SYS> shutdown immediate;
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

SYS> startup
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  619360256 bytes
Fixed Size                  1338280 bytes
Variable Size             461374552 bytes
Database Buffers          150994944 bytes
Redo Buffers                5652480 bytes
데이터베이스가 마운트되었습니다.
데이터베이스가 열렸습니다.

SYS> !rm /app/oracle/oradata/mydream/system01.dbf

SYS> !rm -f /app/oracle/oradata/mydream/system01.dbf    ----->>> -f 으로 파일삭제

SYS> !ls /app/oracle/oradata/mydream/system01.dbf
ls: /app/oracle/oradata/mydream/system01.dbf: 그런 파일이나 디렉토리가 없음

SYS> alter tablespace system offline;
alter tablespace system offline
*
1행에 오류:
ORA-01541: SYSTEM 테이블스페이스는 오프라인될 수 없습니다. 필요하면 종료하십시오.


SYS> shutdown immediate;
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

SYS> !cp /data/backup/close/system01.dbf  /app/oracle/oradata/mydream/       ---->>> 백업파일로부터 복원

SYS> !ls /app/oracle/oradata/mydream/system01.dbf
/app/oracle/oradata/mydream/system01.dbf

SYS> recover tablespace system;  ----->>> 데이터 복구
매체 복구가 완료되었습니다.

SYS> alter database open;

데이타베이스가 변경되었습니다.


SYS> select * from scott.tt800;

        NO
----------
         1

  • 백업파일이 없는 상태에서의 복구
    • 시나리오 : 백없이 없는 데이터 파일 손상 --> 테이블 생성 및 데이터 입력 -> 테이블스페이스 offline 됨 -> 데이터 파일 생성 --> 복구

백업파일이 없는 상태에서의 복구 시 유의점

이 방법으로는 systme01.dbf, sysaux01.dbf, untotb101, users01.dbf, example01.dbf 파일은 생성할 수 없다.


SYS> @dd

     FILE# NAME                                                       MB STATUS
---------- -------------------------------------------------- ---------- -------
         1 /app/oracle/oradata/mydream/system01.dbf                  710 SYSTEM
         2 /app/oracle/oradata/mydream/sysaux01.dbf                  540 ONLINE
         3 /app/oracle/oradata/mydream/undotbs01.dbf                  90 ONLINE
         4 /app/oracle/oradata/mydream/users01.dbf                     5 ONLINE
         5 /app/oracle/oradata/mydream/example01.dbf                 100 ONLINE
         6 /app/oracle/oradata/mydream/test02.dbf                      5 ONLINE
         9 /app/oracle/oradata/mydream/dosirak_data01.dbf            100 ONLINE
        10 /app/oracle/oradata/mydream/dosirak_index01.dbf           100 ONLINE
        11 /app/oracle/oradata/mydream/genie_data_01                 100 ONLINE
        12 /app/oracle/oradata/mydream/genie_index_01                100 ONLINE
        13 /app/oracle/oradata/mydream/toda_data_01.dbf              100 ONLINE

11 개의 행이 선택되었습니다.

SYS> !rm -f /app/oracle/oradata/mydream/test02.dbf

SYS> !ls  /app/oracle/oradata/mydream/test02.dbf
ls: /app/oracle/oradata/mydream/test02.dbf: 그런 파일이나 디렉토리가 없음

SYS> create table scott.tt810 (no number) tablespace test2;

테이블이 생성되었습니다.

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

1 개의 행이 만들어졌습니다.

SYS> commit;

커밋이 완료되었습니다.

SYS> select * from scott.tt810;

        NO
----------
         1

SYS> alter tablespace test2 offline;

테이블스페이스가 변경되었습니다.

SYS> alter tablespace test2 online;
alter tablespace test2 online
*
1행에 오류:
ORA-01157: 데이터 6 파일을 식별 또는 잠금 할 수 없습니다- DBWR 추적 파일을 보십시오
ORA-01110: 6 데이터 파일: '/app/oracle/oradata/mydream/test02.dbf'

SYS> select * from scott.tt810;
select * from scott.tt810
                    *
1행에 오류:
ORA-00376: 현재 파일 6를 읽을 수 없습니다
ORA-01110: 6 데이터 파일: '/app/oracle/oradata/mydream/test02.dbf'


SYS> @dd

     FILE# NAME                                                       MB STATUS
---------- -------------------------------------------------- ---------- -------
         1 /app/oracle/oradata/mydream/system01.dbf                  710 SYSTEM
         2 /app/oracle/oradata/mydream/sysaux01.dbf                  540 ONLINE
         3 /app/oracle/oradata/mydream/undotbs01.dbf                  90 ONLINE
         4 /app/oracle/oradata/mydream/users01.dbf                     5 ONLINE
         5 /app/oracle/oradata/mydream/example01.dbf                 100 ONLINE
         6 /app/oracle/oradata/mydream/test02.dbf                      0 OFFLINE
         9 /app/oracle/oradata/mydream/dosirak_data01.dbf            100 ONLINE
        10 /app/oracle/oradata/mydream/dosirak_index01.dbf           100 ONLINE
        11 /app/oracle/oradata/mydream/genie_data_01                 100 ONLINE
        12 /app/oracle/oradata/mydream/genie_index_01                100 ONLINE
        13 /app/oracle/oradata/mydream/toda_data_01.dbf              100 ONLINE

11 개의 행이 선택되었습니다.

SYS> alter database create datafile                       ----->> 손상된 파일을 새로운 이름으로 다시 생성
  2  '/app/oracle/oradata/mydream/test02.dbf'
  3  as '/app/oracle/oradata/mydream/test02_recv.dbf';

데이타베이스가 변경되었습니다.

SYS> recover tablespace test2;
매체 복구가 완료되었습니다.

SYS> alter tablespace test2 online;

테이블스페이스가 변경되었습니다.

SYS> select * from scott.tt810;

        NO
----------
         1

SYS> @dd

     FILE# NAME                                                       MB STATUS
---------- -------------------------------------------------- ---------- -------
         1 /app/oracle/oradata/mydream/system01.dbf                  710 SYSTEM
         2 /app/oracle/oradata/mydream/sysaux01.dbf                  540 ONLINE
         3 /app/oracle/oradata/mydream/undotbs01.dbf                  90 ONLINE
         4 /app/oracle/oradata/mydream/users01.dbf                     5 ONLINE
         5 /app/oracle/oradata/mydream/example01.dbf                 100 ONLINE
         6 /app/oracle/oradata/mydream/test02_recv.dbf                 5 ONLINE
         9 /app/oracle/oradata/mydream/dosirak_data01.dbf            100 ONLINE
        10 /app/oracle/oradata/mydream/dosirak_index01.dbf           100 ONLINE
        11 /app/oracle/oradata/mydream/genie_data_01                 100 ONLINE
        12 /app/oracle/oradata/mydream/genie_index_01                100 ONLINE
        13 /app/oracle/oradata/mydream/toda_data_01.dbf              100 ONLINE

11 개의 행이 선택되었습니다.

새로 생성된 data file의 내용

위 복구방법에서 생성된 파일의 checkpoint scn은 0번으로 초기화 되며, recover 명령어 이후 scn의 정보가 변경된다.

7.3 DML관련 장애복구

  • 잘못된 update 수행 후 commit 수행하여 장애 발생
    • 시나리오 : 풀백업 --> 업데이트 잘못함 --> DB내리고 임시경로에서 데이터 복구

SYS> @dd

TABLESPACE_NAME            MB STATUS     FILE_NAME
-------------------- -------- ---------- ----------------------------------------
EXAMPLE                   100 AVAILABLE  /app/oracle/oradata/jigi/example01.dbf
SYSAUX                    500 AVAILABLE  /app/oracle/oradata/jigi/sysaux01.dbf
SYSTEM                    680 AVAILABLE  /app/oracle/oradata/jigi/system01.dbf
UNDOTBS1                  100 AVAILABLE  /app/oracle/oradata/jigi/undotbs01.dbf
USERS                       5 AVAILABLE  /app/oracle/oradata/jigi/users01.dbf

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /app/oracle/oradata/jigi/redo01.log              50 INACTIVE   YES                 4
     2 /app/oracle/oradata/jigi/redo02.log              50 INACTIVE   YES                 5
     3 /app/oracle/oradata/jigi/redo03.log              50 CURRENT    NO                  6

SYS> @con

NAME
--------------------------------------------------
/app/oracle/oradata/jigi/control01.ctl
/app/oracle/oradata/jigi/control02.ctl

SYS> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SYS> !cp /app/oracle/oradata/jigi/* /home/data/backup/close/   ------>>> CLOSE 백업

SYS> startup
ORACLE instance started.

Total System Global Area  784998400 bytes
Fixed Size                  2217464 bytes
Variable Size             482347528 bytes
Database Buffers          297795584 bytes
Redo Buffers                2637824 bytes
Database mounted.
Database opened.
SYS>
SYS>
SYS> create table scott.tt820 ( no number, name varchar2(10)) tablespace users;

Table created.

SYS> insert into scott.tt820 values(1, 'aaa');

1 row created.

SYS>  insert into scott.tt820 values(2, 'bbb');

1 row created.

SYS>  insert into scott.tt820 values(3, 'ccc');

1 row created.

SYS> commit;

Commit complete.

SYS> select to_char(sysdate, 'YYYY-MM-DD:HH24:MI:SS') recover_date from dual;  ---->>>> 복원시점 파악

RECOVER_DATE
-------------------
2015-11-12:23:58:47


SYS> select * from scott.tt820;

        NO NAME
---------- --------------------------------------------------
         1 aaa
         2 bbb
         3 ccc

SYS> update scott.tt820 set name = 'DDD';           ----->>>> 잘못된 업데이트 발생

3 rows updated.

SYS> commit;

Commit complete.

SYS> select * from scott.tt820;

        NO NAME
---------- --------------------------------------------------
         1 DDD
         2 DDD
         3 DDD

SYS> rollback;

Rollback complete.

SYS> select * from scott.tt820;

        NO NAME
---------- --------------------------------------------------
         1 DDD
         2 DDD
         3 DDD


SYS> create pfile from spfile;   --> 작업의 편리성을 위해 pfile 사용

File created.

SYS> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SYS> !mkdir /home/data/temp              ---->>> 이 위치에서 임시 인스턴스를 올리기로 함(복원 디렉토리)

-- 백업파일에서 모든 파일을 복사하면 복구에 실패하니 주의해야 함
-- 예 : !cp /home/data/backup/close/* /home/data/temp/ 

[oracle@myjigi temp]$ cp /home/data/backup/close/*.dbf /home/data/temp/   -->  데이터파일만 백업파일을 사용
[oracle@myjigi temp]$ cp /app/oracle/oradata/jigi/*.log /home/data/temp/  --> 장애이후 로그파일
[oracle@myjigi temp]$ cp /app/oracle/oradata/jigi/*.ctl /home/data/temp/  --> 장애이후 컨트롤파일
[oracle@myjigi temp]$ mv /app/oracle/product/11g/dbs/spfilejigi.ora /app/oracle/product/11g/dbs/spfilejigi.ora.bak  --> pfile을 사용하도록 변경

-- 아래와 같이 pfile에서 컨트롤파일의 위치를 수정해 줌
#*.control_files='/app/oracle/oradata/jigi/control01.ctl','/app/oracle/oradata/jigi/control02.ctl'
*.control_files='/home/data/temp/control01.ctl'


SYS> startup mount
ORACLE instance started.

Total System Global Area  784998400 bytes
Fixed Size                  2217464 bytes
Variable Size             482347528 bytes
Database Buffers          297795584 bytes
Redo Buffers                2637824 bytes
Database mounted.


SYS> @con

NAME
--------------------------------------------------
/home/data/temp/control01.ctl

SYS> select name from v$datafile;

NAME
--------------------------------------------------
/app/oracle/oradata/jigi/system01.dbf
/app/oracle/oradata/jigi/sysaux01.dbf
/app/oracle/oradata/jigi/undotbs01.dbf
/app/oracle/oradata/jigi/users01.dbf
/app/oracle/oradata/jigi/example01.dbf

SYS> alter database rename file '/app/oracle/oradata/jigi/example01.dbf' to '/home/data/temp/example01.dbf';

Database altered.

SYS> alter database rename file '/app/oracle/oradata/jigi/sysaux01.dbf' to '/home/data/temp/sysaux01.dbf';

Database altered.

SYS> alter database rename file '/app/oracle/oradata/jigi/system01.dbf' to '/home/data/temp/system01.dbf';

Database altered.

SYS> alter database rename file '/app/oracle/oradata/jigi/undotbs01.dbf' to '/home/data/temp/undotbs01.dbf';

Database altered.

SYS> alter database rename file '/app/oracle/oradata/jigi/users01.dbf' to '/home/data/temp/users01.dbf';

Database altered.

SYS> select name from v$datafile;

NAME
--------------------------------------------------
/home/data/temp/system01.dbf
/home/data/temp/sysaux01.dbf
/home/data/temp/undotbs01.dbf
/home/data/temp/users01.dbf
/home/data/temp/example01.dbf

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /app/oracle/oradata/jigi/redo01.log              50 INACTIVE   YES                 4
     2 /app/oracle/oradata/jigi/redo02.log              50 INACTIVE   YES                 5
     3 /app/oracle/oradata/jigi/redo03.log              50 CURRENT    NO                  6

SYS> alter database rename file '/app/oracle/oradata/jigi/redo01.log' to '/home/data/temp/redo01.log';

Database altered.

SYS> alter database rename file '/app/oracle/oradata/jigi/redo02.log' to '/home/data/temp/redo02.log';

Database altered.

SYS> alter database rename file '/app/oracle/oradata/jigi/redo03.log' to '/home/data/temp/redo03.log';

Database altered.

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /home/data/temp/redo01.log                       50 INACTIVE   YES                 4
     2 /home/data/temp/redo02.log                       50 INACTIVE   YES                 5
     3 /home/data/temp/redo03.log                       50 CURRENT    NO                  6

SYS> recover database until time '2015-11-12:23:58:47';     ---->> 장애발생 이전 시점으로 복구(로그마이너를 통해서도 확인가능)
Media recovery complete.

SYS> alter database open;         -->>>> controlfile, redolog 파일은 장애 이후 시점, datafile은 장애이전 시점의 scn을 가지고 있으므로 서로 불일치함, 로그를 초기화 시켜줘야 함
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SYS> alter database open resetlogs;

Database altered.

SYS> select * from scott.tt820;

        NO NAME
---------- --------------------------------------------------
         1 aaa
         2 bbb
         3 ccc

  • 잘못된 delete 장애복구(필요한 파일만 복원 후 복구)
    • 시나리오 : 풀백업 -> 잘못된 업데이트 -> DB내리고 임시경로에 필요한 데이터 파일만 복구

--- pfile의 컨트롤파일 위치를 다시 수정하고, 원래경로에서 DB를 시작하였음

SYS> startup
ORACLE instance started.

Total System Global Area  784998400 bytes
Fixed Size                  2217464 bytes
Variable Size             482347528 bytes
Database Buffers          297795584 bytes
Redo Buffers                2637824 bytes
Database mounted.
Database opened.

SYS> @con

NAME
--------------------------------------------------
/app/oracle/oradata/jigi/control01.ctl
/app/oracle/oradata/jigi/control02.ctl

SYS> @dd

TABLESPACE_NAME            MB STATUS     FILE_NAME
-------------------- -------- ---------- ----------------------------------------
EXAMPLE                   100 AVAILABLE  /app/oracle/oradata/jigi/example01.dbf
SYSAUX                    500 AVAILABLE  /app/oracle/oradata/jigi/sysaux01.dbf
SYSTEM                    680 AVAILABLE  /app/oracle/oradata/jigi/system01.dbf
UNDOTBS1                  100 AVAILABLE  /app/oracle/oradata/jigi/undotbs01.dbf
USERS                       5 AVAILABLE  /app/oracle/oradata/jigi/users01.dbf

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /app/oracle/oradata/jigi/redo01.log              50 INACTIVE   YES                 4
     2 /app/oracle/oradata/jigi/redo02.log              50 INACTIVE   YES                 5
     3 /app/oracle/oradata/jigi/redo03.log              50 CURRENT    NO                  6


SYS> create table scott.tt830 (no number) tablespace users;

Table created.

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

1 row created.

SYS> commit;

Commit complete.

SYS> select to_char(sysdate, 'YYYY-MM-DD:HH24:MI:SS') recover_date from dual;    -->>> 복구시점 확인

RECOVER_DATE
-------------------
2015-11-13:00:42:58

SYS> delete from scott.tt830;             ------>>>> delete 잘못함

1 row deleted.

SYS> commit;

Commit complete.

SYS> select * from scott.tt830;

no rows selected

SYS> shutdown immediate;

-- pfile의 경로를 다시 수정한다. 여기서는 /home/data/temp2로 수정함
#*.control_files='/app/oracle/oradata/jigi/control01.ctl','/app/oracle/oradata/jigi/control02.ctl'
*.control_files='/home/data/temp2/control01.ctl'


SYS> !mkdir /home/data/temp2/

SYS> !cp /home/data/backup/close/system01.dbf /home/data/temp2/   --->>>> 필요한 파일들만 복원

SYS> !cp /home/data/backup/close/sysaux01.dbf /home/data/temp2/

SYS> !cp /home/data/backup/close/undotbs01.dbf /home/data/temp2/

SYS> !cp /home/data/backup/close/users01.dbf /home/data/temp2/

SYS> !cp /app/oracle/oradata/jigi/*.log /home/data/temp2/

SYS> !cp /app/oracle/oradata/jigi/*.ctl /home/data/temp2/


SYS> startup mount
ORACLE instance started.

Total System Global Area  784998400 bytes
Fixed Size                  2217464 bytes
Variable Size             482347528 bytes
Database Buffers          297795584 bytes
Redo Buffers                2637824 bytes
Database mounted.

SYS> @con

NAME
--------------------------------------------------
/home/data/temp2/control01.ctl

SYS> select name from v$datafile;

NAME
--------------------------------------------------
/app/oracle/oradata/jigi/system01.dbf
/app/oracle/oradata/jigi/sysaux01.dbf
/app/oracle/oradata/jigi/undotbs01.dbf
/app/oracle/oradata/jigi/users01.dbf
/app/oracle/oradata/jigi/example01.dbf

SYS> alter database rename file '/app/oracle/oradata/jigi/sysaux01.dbf' to '/home/data/temp2/sysaux01.dbf';

Database altered.

SYS> alter database rename file '/app/oracle/oradata/jigi/system01.dbf' to '/home/data/temp2/system01.dbf';

Database altered.

SYS> alter database rename file '/app/oracle/oradata/jigi/undotbs01.dbf' to '/home/data/temp2/undotbs01.dbf';

Database altered.

SYS> alter database rename file '/app/oracle/oradata/jigi/users01.dbf' to '/home/data/temp2/users01.dbf';

Database altered.

SYS> select name from v$datafile;

NAME
--------------------------------------------------
/home/data/temp2/system01.dbf
/home/data/temp2/sysaux01.dbf
/home/data/temp2/undotbs01.dbf
/home/data/temp2/users01.dbf
/app/oracle/oradata/jigi/example01.dbf

SYS> alter database datafile '/app/oracle/oradata/jigi/example01.dbf' offline drop;   ---->>> 불필요한 파일 offline drop처리

Database altered.

SYS> select name, status from v$datafile;

NAME                                               STATUS
-------------------------------------------------- ----------
/home/data/temp2/system01.dbf                      SYSTEM
/home/data/temp2/sysaux01.dbf                      ONLINE
/home/data/temp2/undotbs01.dbf                     ONLINE
/home/data/temp2/users01.dbf                       ONLINE
/app/oracle/oradata/jigi/example01.dbf             OFFLINE


SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /app/oracle/oradata/jigi/redo01.log              50 INACTIVE   YES                 4
     2 /app/oracle/oradata/jigi/redo02.log              50 INACTIVE   YES                 5
     3 /app/oracle/oradata/jigi/redo03.log              50 CURRENT    NO                  6

SYS> alter database rename file '/app/oracle/oradata/jigi/redo01.log' to '/home/data/temp2/redo01.log';

Database altered.

SYS> alter database rename file '/app/oracle/oradata/jigi/redo02.log' to '/home/data/temp2/redo02.log';

Database altered.

SYS> alter database rename file '/app/oracle/oradata/jigi/redo03.log' to '/home/data/temp2/redo03.log';

Database altered.

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /home/data/temp2/redo01.log                      50 INACTIVE   YES                 4
     2 /home/data/temp2/redo02.log                      50 INACTIVE   YES                 5
     3 /home/data/temp2/redo03.log                      50 CURRENT    NO                  6

SYS> recover database until time '2015-11-13:00:42:58';     --->>> 장애이전 시점으로 복구함
Media recovery complete.

SYS> alter database open resetlogs;

Database altered.

SYS> select * from scott.tt830;

        NO
----------
         1

7.4 DDL 관련 장애복구

  • 잘못된 drop table 장애 복구하기
    • 시나리오 : 풀백업 --> 잘못된 table drop --> db내리고 임시경로에서 복구

SYS> @con

NAME
--------------------------------------------------
/app/oracle/oradata/mydream/control01.ctl

SYS> @dd

TABLESPACE_NAME                 MB STATUS     FILE_NAME
------------------------- -------- ---------- --------------------------------------------------
EXAMPLE                        100 AVAILABLE  /app/oracle/oradata/mydream/example01.dbf
SYSAUX                         540 AVAILABLE  /app/oracle/oradata/mydream/sysaux01.dbf
SYSTEM                         710 AVAILABLE  /app/oracle/oradata/mydream/system01.dbf
TEST2                            5 AVAILABLE  /app/oracle/oradata/mydream/test02_recv.dbf
UNDOTBS1                        90 AVAILABLE  /app/oracle/oradata/mydream/undotbs01.dbf
USERS                            5 AVAILABLE  /app/oracle/oradata/mydream/users01.dbf

6 개의 행이 선택되었습니다.

SYS> @con

NAME
--------------------------------------------------
/app/oracle/oradata/mydream/control01.ctl

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /app/oracle/oradata/mydream/redo01.log           50 INACTIVE   YES                16
     2 /app/oracle/oradata/mydream/redo02.log           50 INACTIVE   YES                17
     3 /app/oracle/oradata/mydream/redo03.log           50 CURRENT    NO                 18

SYS> shutdown immediate;
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

SYS> !cp /app/oracle/oradata/mydream/* /data/backup/close/      ----->>>> Close Backup

SYS> startup
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  619360256 bytes
Fixed Size                  1338280 bytes
Variable Size             461374552 bytes
Database Buffers          150994944 bytes
Redo Buffers                5652480 bytes
데이터베이스가 마운트되었습니다.
데이터베이스가 열렸습니다.

SYS> create table scott.tt840 (no number) tablespace users;

테이블이 생성되었습니다.

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

1 개의 행이 만들어졌습니다.

SYS> commit;

커밋이 완료되었습니다.

SYS> select to_char(sysdate, 'YYYY-MM-DD:HH24:MI:SS') recover_date from dual;   --->>>> 복구시점 확인

RECOVER_DATE
-------------------
2014-12-31:14:36:30

SYS> select * from scott.tt840;

        NO
----------
         1

SYS> drop table scott.tt840 purge;          ----->>> 잘못된 table drop, 장애

테이블이 삭제되었습니다.

SYS> select * from scott.tt840;
select * from scott.tt840
                    *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다


SYS> shutdown immediate;
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

SYS> !mkdir /data/temp3                    ---->>>> 데이터 복원할 임시경로

SYS> !cp /data/backup/close/*.dbf /data/temp3/         ---->>> 장애이전 시점 데이터 파일
 
SYS> !cp /app/oracle/oradata/mydream/*.ctl /data/temp3/   ----->>> 장애이후 시점 컨트롤 파일

SYS> !cp /app/oracle/oradata/mydream/*.log /data/temp3/       ----->>> 장애이후 시점 리두로그 파일

-- 파라미터 파일에서 control file의 위치를 변경합니다.(여기서는 /data/temp3으로 변경)
SYS> !vi /app/oracle/product/11g/dbs/initmydream.ora

SYS> startup mount;
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  619360256 bytes
Fixed Size                  1338280 bytes
Variable Size             461374552 bytes
Database Buffers          150994944 bytes
Redo Buffers                5652480 bytes
데이터베이스가 마운트되었습니다.

SYS> @con

NAME
--------------------------------------------------
/data/temp3/control01.ctl

SYS> select name from v$datafile;

NAME
--------------------------------------------------
/app/oracle/oradata/mydream/system01.dbf
/app/oracle/oradata/mydream/sysaux01.dbf
/app/oracle/oradata/mydream/undotbs01.dbf
/app/oracle/oradata/mydream/users01.dbf
/app/oracle/oradata/mydream/example01.dbf
/app/oracle/oradata/mydream/test02_recv.dbf

6 개의 행이 선택되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/system01.dbf' to '/data/temp3/system01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/sysaux01.dbf' to '/data/temp3/sysaux01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/undotbs01.dbf' to '/data/temp3/undotbs01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/users01.dbf' to '/data/temp3/users01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/example01.dbf' to '/data/temp3/example01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/test02_recv.dbf' to '/data/temp3/test02_recv.dbf';

데이타베이스가 변경되었습니다.

SYS> select name from v$datafile;

NAME
--------------------------------------------------
/data/temp3/system01.dbf
/data/temp3/sysaux01.dbf
/data/temp3/undotbs01.dbf
/data/temp3/users01.dbf
/data/temp3/example01.dbf
/data/temp3/test02_recv.dbf

6 개의 행이 선택되었습니다.

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /app/oracle/oradata/mydream/redo01.log           50 INACTIVE   YES                16
     2 /app/oracle/oradata/mydream/redo02.log           50 INACTIVE   YES                17
     3 /app/oracle/oradata/mydream/redo03.log           50 CURRENT    NO                 18

SYS> alter database rename file '/app/oracle/oradata/mydream/redo01.log' to '/data/temp3/redo01.log';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/redo02.log' to '/data/temp3/redo02.log';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/redo03.log' to '/data/temp3/redo03.log';

데이타베이스가 변경되었습니다.

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /data/temp3/redo01.log                           50 INACTIVE   YES                16
     2 /data/temp3/redo02.log                           50 INACTIVE   YES                17
     3 /data/temp3/redo03.log                           50 CURRENT    NO                 18

SYS> recover database until time '2014-12-31:14:36:30';     ---->>>>> 장애이전 시점으로 복구
매체 복구가 완료되었습니다.

SYS> alter database open resetlogs;

데이타베이스가 변경되었습니다.

SYS> select * from scott.tt840;

        NO
----------
         1

  • 잘못된 drop tablespace 복구하기 - Backup File이 있을 경우
    • 시나리오 : 테이블스페이스 생성 --> 풀백업 --> 잘못된 drop tablespace --> db 내리고, 데이터 복구

SYS> create tablespace test datafile '/app/oracle/oradata/mydream/test01.dbf' size 10m;

테이블스페이스가 생성되었습니다.

SYS> @dd

TABLESPACE_NAME                 MB STATUS     FILE_NAME
------------------------- -------- ---------- --------------------------------------------------
EXAMPLE                        100 AVAILABLE  /app/oracle/oradata/mydream/example01.dbf
SYSAUX                         540 AVAILABLE  /app/oracle/oradata/mydream/sysaux01.dbf
SYSTEM                         710 AVAILABLE  /app/oracle/oradata/mydream/system01.dbf
TEST                            10 AVAILABLE  /app/oracle/oradata/mydream/test01.dbf
UNDOTBS1                        90 AVAILABLE  /app/oracle/oradata/mydream/undotbs01.dbf
USERS                            5 AVAILABLE  /app/oracle/oradata/mydream/users01.dbf

6 개의 행이 선택되었습니다.

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /app/oracle/oradata/mydream/redo01.log           50 INACTIVE   YES                16
     2 /app/oracle/oradata/mydream/redo02.log           50 INACTIVE   YES                17
     3 /app/oracle/oradata/mydream/redo03.log           50 CURRENT    NO                 18

SYS> @con

NAME
--------------------------------------------------
/app/oracle/oradata/mydream/control01.ctl



SYS> shutdown immediate;
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.
SYS>
SYS>
SYS> !cp  /app/oracle/oradata/mydream/* /data/backup/close/            ----->>> Close Backup


SYS> startup
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  619360256 bytes
Fixed Size                  1338280 bytes
Variable Size             461374552 bytes
Database Buffers          150994944 bytes
Redo Buffers                5652480 bytes
데이터베이스가 마운트되었습니다.
데이터베이스가 열렸습니다.

SYS> create table scott.tt850 (no number) tablespace test;

테이블이 생성되었습니다.

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

1 개의 행이 만들어졌습니다.

SYS> commit;

커밋이 완료되었습니다.

SYS> drop tablespace test including contents and datafiles;  ----->>> 잘못된 drop tablespace, 장애

테이블스페이스가 삭제되었습니다.

SYS> @dd

TABLESPACE_NAME                 MB STATUS     FILE_NAME
------------------------- -------- ---------- --------------------------------------------------
EXAMPLE                        100 AVAILABLE  /app/oracle/oradata/mydream/example01.dbf
SYSAUX                         540 AVAILABLE  /app/oracle/oradata/mydream/sysaux01.dbf
SYSTEM                         710 AVAILABLE  /app/oracle/oradata/mydream/system01.dbf
UNDOTBS1                        90 AVAILABLE  /app/oracle/oradata/mydream/undotbs01.dbf
USERS                            5 AVAILABLE  /app/oracle/oradata/mydream/users01.dbf

SYS> select * from scott.tt850;
select * from scott.tt850
                    *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

SYS> shutdown immediate;
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.
SYS>
SYS>
SYS> !mkdir /data/temp6

SYS> !cp /data/backup/close/*.dbf /data/temp6/

SYS> !cp /data/backup/close/*.ctl /data/temp6/  -->>>> 복사할 때 유의, 장애이전 controlfile을 복원함(테이블스페이스 정보가 존재함)

SYS> !cp /app/oracle/oradata/mydream/*.log /data/temp6/  --->>>> 장애이후 시점 리두로그 파일 복원

-- 파라미터 파일에서 control file의 위치를 변경합니다.(여기서는 /data/temp6으로 변경)
SYS> !vi /app/oracle/product/11g/dbs/initmydream.ora

SYS> startup mount;
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  619360256 bytes
Fixed Size                  1338280 bytes
Variable Size             461374552 bytes
Database Buffers          150994944 bytes
Redo Buffers                5652480 bytes
데이터베이스가 마운트되었습니다.

SYS>
SYS>
SYS> @con

NAME
--------------------------------------------------
/data/temp6/control01.ctl

SYS> select name from v$datafile;

NAME
--------------------------------------------------
/app/oracle/oradata/mydream/system01.dbf
/app/oracle/oradata/mydream/sysaux01.dbf
/app/oracle/oradata/mydream/undotbs01.dbf
/app/oracle/oradata/mydream/users01.dbf
/app/oracle/oradata/mydream/example01.dbf
/app/oracle/oradata/mydream/test01.dbf

6 개의 행이 선택되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/system01.dbf' to '/data/temp6/system01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/sysaux01.dbf' to '/data/temp6/sysaux01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/undotbs01.dbf' to '/data/temp6/undotbs01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/users01.dbf' to '/data/temp6/users01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/example01.dbf' to '/data/temp6/example01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/test01.dbf' to '/data/temp6/test01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/redo01.log' to '/data/temp6/redo01.log';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/redo02.log' to '/data/temp6/redo02.log';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/redo03.log' to '/data/temp6/redo03.log';

데이타베이스가 변경되었습니다.

SYS> select name from v$datafile;

NAME
--------------------------------------------------
/data/temp6/system01.dbf
/data/temp6/sysaux01.dbf
/data/temp6/undotbs01.dbf
/data/temp6/users01.dbf
/data/temp6/example01.dbf
/data/temp6/test01.dbf

6 개의 행이 선택되었습니다.

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /data/temp6/redo01.log                           50 INACTIVE   YES                16
     2 /data/temp6/redo02.log                           50 INACTIVE   YES                17
     3 /data/temp6/redo03.log                           50 CURRENT    NO                 18

-- alert log file을 확인하여 tablespace 삭제시점을 알아낸다.
-- 아래는 로그파일 내용
Wed Dec 31 14:56:57 2014
drop tablespace test2 including contents and datafiles
Deleted file /data/temp3/test02_recv.dbf
Completed: drop tablespace test2 including contents and datafiles


SYS> recover database until time '2014-12-31:14:56:55' using backup controlfile;  --->> 위에서 알아낸 장애시간 이전 시간으로 복구
ORA-00279: 변환 1154458가 (12/31/2014 16:44:13에서 생성된) 스레드 1에 필요합니다
ORA-00289: 제안 : /app/oracle/flash_recovery_area/MYDREAM/archivelog/2014_12_31/o1_mf_1_18_bb79vbpk_.arc
ORA-00280: 변환 1154458(스레드 1를 위한)가 시퀀스번호 18에 있습니다


로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}
/data/temp6/redo03.log                --->>>> 시퀀스번호 18이 3번 로그파일에 있으므로 해당 로그파일 입력
로그가 적용되었습니다.
매체 복구가 완료되었습니다.

SYS> alter database open resetlogs;

데이타베이스가 변경되었습니다.

SYS> select * from scott.tt850;

        NO
----------
         1

  • Drop tablespace 장애일 경우 - Backup File이 없을 경우
    • 시나리오 : 풀백업 --> 잘못된 drop tablespace --> DB내리고, 임시경로에 파일복원 -> 데이터 복구

SYS> @dd

TABLESPACE_NAME                 MB STATUS     FILE_NAME
------------------------- -------- ---------- --------------------------------------------------
EXAMPLE                        100 AVAILABLE  /app/oracle/oradata/mydream/example01.dbf
SYSAUX                         540 AVAILABLE  /app/oracle/oradata/mydream/sysaux01.dbf
SYSTEM                         710 AVAILABLE  /app/oracle/oradata/mydream/system01.dbf
UNDOTBS1                        90 AVAILABLE  /app/oracle/oradata/mydream/undotbs01.dbf
USERS                            5 AVAILABLE  /app/oracle/oradata/mydream/users01.dbf

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /app/oracle/oradata/mydream/redo01.log           50 INACTIVE   YES                16
     2 /app/oracle/oradata/mydream/redo02.log           50 INACTIVE   YES                17
     3 /app/oracle/oradata/mydream/redo03.log           50 CURRENT    NO                 18

SYS> @con

NAME
--------------------------------------------------
/app/oracle/oradata/mydream/control01.ctl

SYS> shutdown immediate
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

SYS> !cp  /app/oracle/oradata/mydream/* /data/backup/close/     ---->>>> Close Backup


SYS> startup
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  619360256 bytes
Fixed Size                  1338280 bytes
Variable Size             461374552 bytes
Database Buffers          150994944 bytes
Redo Buffers                5652480 bytes
데이터베이스가 마운트되었습니다.
데이터베이스가 열렸습니다.

SYS> create tablespace ts_new datafile '/app/oracle/oradata/mydream/ts_new01.dbf' size 10M;

테이블스페이스가 생성되었습니다.

SYS> create table scott.tt900 (no number) tablespace ts_new;

테이블이 생성되었습니다.

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

1 개의 행이 만들어졌습니다.

SYS> commit;

커밋이 완료되었습니다.

SYS> select * from scott.tt900;

        NO
----------
         1

SYS> select to_char(sysdate, 'YYYY-MM-DD:HH24:MI:SS') from dual;   ---->>>> 복구시점 확인(alert log 확인해도 됨)

TO_CHAR(SYSDATE,'YY
-------------------
2014-12-31:17:09:57

SYS>
SYS>
SYS> drop tablespace ts_new including contents and datafiles; ---->>> 잘못된 drop tablespace, 장애발생

테이블스페이스가 삭제되었습니다.

SYS> select * from scott.tt900;
select * from scott.tt900
                    *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

SYS> shutdown immediate;
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.

SYS> !mkdir /data/temp7

SYS> !cp /data/backup/close/*.dbf /data/temp7/   ---->>> 장애이전 시점 데이터 파일을 복원

SYS> !cp /data/backup/close/*.ctl /data/temp7/  ---->>>> 장애이전 시점 컨트롤파일을 복원

SYS> !cp /app/oracle/oradata/mydream/*.log /data/temp7/   --->>> 장이이후 시점 리두로그 파일을 복원

-- 파라미터 파일에서 control file의 위치를 변경합니다.(여기서는 /data/temp7으로 변경)
SYS> !vi /app/oracle/product/11g/dbs/initmydream.ora

SYS> startup mount;
ORACLE 인스턴스가 시작되었습니다.

Total System Global Area  619360256 bytes
Fixed Size                  1338280 bytes
Variable Size             461374552 bytes
Database Buffers          150994944 bytes
Redo Buffers                5652480 bytes
데이터베이스가 마운트되었습니다.
SYS> @con

NAME
--------------------------------------------------
/data/temp7/control01.ctl

SYS> select name from v$datafile;

NAME
--------------------------------------------------
/app/oracle/oradata/mydream/system01.dbf
/app/oracle/oradata/mydream/sysaux01.dbf
/app/oracle/oradata/mydream/undotbs01.dbf
/app/oracle/oradata/mydream/users01.dbf
/app/oracle/oradata/mydream/example01.dbf


SYS> alter database rename file '/app/oracle/oradata/mydream/system01.dbf' to '/data/temp7/system01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/sysaux01.dbf' to '/data/temp7/sysaux01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/undotbs01.dbf' to '/data/temp7/undotbs01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/users01.dbf' to '/data/temp7/users01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/example01.dbf' to '/data/temp7/example01.dbf';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/redo01.log' to '/data/temp7/redo01.log';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/redo02.log' to '/data/temp7/redo02.log';

데이타베이스가 변경되었습니다.

SYS> alter database rename file '/app/oracle/oradata/mydream/redo03.log' to '/data/temp7/redo03.log';

데이타베이스가 변경되었습니다.

SYS> select name from v$datafile;          --->>>> te_new Tablespace는 존재하지 않음

NAME
--------------------------------------------------
/data/temp7/system01.dbf
/data/temp7/sysaux01.dbf
/data/temp7/undotbs01.dbf
/data/temp7/users01.dbf
/data/temp7/example01.dbf

SYS> @log

GROUP# MEMBER                                           MB STATUS     ARCHIVED    SEQUENCE#
------ ---------------------------------------- ---------- ---------- ---------- ----------
     1 /data/temp7/redo01.log                           50 INACTIVE   YES                16
     2 /data/temp7/redo02.log                           50 INACTIVE   YES                17
     3 /data/temp7/redo03.log                           50 CURRENT    NO                 18


SYS> recover database until time '2014-12-31:17:09:57' using backup controlfile; ---->>> 복구시도
ORA-00279: 변환 1155665가 (12/31/2014 17:03:13에서 생성된) 스레드 1에 필요합니다
ORA-00289: 제안 : /app/oracle/flash_recovery_area/MYDREAM/archivelog/2014_12_31/o1_mf_1_18_bb79vbpk_.arc
ORA-00280: 변환 1155665(스레드 1를 위한)가 시퀀스번호 18에 있습니다


로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}
/data/temp7/redo03.log                                      ---->>> 3번 리두로그 파일명 입력
ORA-00283: 복구 세션이 오류로 인하여 취소되었습니다
ORA-01244: 매체 복구에서 이름이 지정되지 않은 데이터 파일을 제어 파일에 추가했습니다.
ORA-01110: 6 데이터 파일: '/app/oracle/oradata/mydream/ts_new01.dbf'


ORA-01112: 매체 복구가 시작되지 않았습니다.


SYS> select name from v$datafile;      ---->>> 이름없는 데이터 파일이 존재하는 것을 확인할 수 있음

NAME
--------------------------------------------------
/data/temp7/system01.dbf
/data/temp7/sysaux01.dbf
/data/temp7/undotbs01.dbf
/data/temp7/users01.dbf
/data/temp7/example01.dbf
/app/oracle/product/11g/dbs/UNNAMED00006         ---->>>> 아카이브 및 리두로그를 통해 복구하다가 생겨난 파일

6 개의 행이 선택되었습니다.

SYS> alter database create datafile '/app/oracle/product/11g/dbs/UNNAMED00006' 
as '/data/temp7/ts_new01.dbf';        --->>> control file에 등록하고, 데이터 파일을 생성

데이타베이스가 변경되었습니다.

SYS> select name from v$datafile;           

NAME
--------------------------------------------------
/data/temp7/system01.dbf
/data/temp7/sysaux01.dbf
/data/temp7/undotbs01.dbf
/data/temp7/users01.dbf
/data/temp7/example01.dbf
/data/temp7/ts_new01.dbf

6 개의 행이 선택되었습니다.

SYS> recover database until time '2014-12-31:17:09:57' using backup controlfile;   --->>> 다시 복구시도
ORA-00279: 변환 1155825가 (12/31/2014 17:07:59에서 생성된) 스레드 1에 필요합니다
ORA-00289: 제안 : /app/oracle/flash_recovery_area/MYDREAM/archivelog/2014_12_31/o1_mf_1_18_bb79vbpk_.arc
ORA-00280: 변환 1155825(스레드 1를 위한)가 시퀀스번호 18에 있습니다


로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}
/data/temp7/redo03.log                ---->> 시쿼스 번호에 맞는 리두로그 파일명 입력
로그가 적용되었습니다.
매체 복구가 완료되었습니다.
SYS> alter database open resetlogs;

데이타베이스가 변경되었습니다.

SYS> @dd

TABLESPACE_NAME                 MB STATUS     FILE_NAME
------------------------- -------- ---------- --------------------------------------------------
EXAMPLE                        100 AVAILABLE  /data/temp7/example01.dbf
SYSAUX                         540 AVAILABLE  /data/temp7/sysaux01.dbf
SYSTEM                         710 AVAILABLE  /data/temp7/system01.dbf
TS_NEW                          10 AVAILABLE  /data/temp7/ts_new01.dbf
UNDOTBS1                        90 AVAILABLE  /data/temp7/undotbs01.dbf
USERS                            5 AVAILABLE  /data/temp7/users01.dbf

6 개의 행이 선택되었습니다.

SYS> select * from scott.tt900;

        NO
----------
         1