Oracle/백업&복구

2012.02.02 백업복구 4일차 (불완전복구) ; 주의사항, RESETLOGS하는 이유, RESETLOGS시 일어나는 일들, 불완전복구 데모시나리오(delete복구, tbs삭제 복구)

에몽이ㅋ 2012. 2. 3. 06:31
불완전복구 (Incomplete Revocery) :
  1. 장애가 난 시점까지가 아닌, 과거의 원하는 시점까지 데이터를 복구하는 것
  2. 데이터 복구 후 DB Open 시에는 resetlogs 옵션을 반드시 사용하여야 한다.
  3. 장애가 발생한 데이터파일만 과거시점으로 되돌리는 것이 아니라, 전체 데이터베이스를 과거 시점으로 되돌리는 작업이다.
  4. resetlogs 옵션 사용 시 redolog file은 재생성 되거나 초기화 된다.

주의사항
1. 불완전복구 후 DB를 open하기 위해서는 resetlogs를 사용해야하므로, 한번 open하게 되면, 이전의 Archive log file들을 이용할 수 없습니다.
   ---> 복구 시 한번에 자기가 딱 원하는 시점으로 되돌리려면, 신내림을 받아야 합니다. 자기가 원하는 시점을 모르는 경우가 대부분이기 때문에, 원본 DB에서 하게 되면 복구시도를 한번밖에 할 수 없습니다.
  --> 그래서 임시경로에 복사를 하고, DB셋팅을 다시 한 후(alter database rename), 원본파일들은 그대로 놔두고, 그 경로에서 복구를 시도합니다.

2. 불완전복구를 시도할 시 restore할 때, 예전 backup된 datafile과 현재 redolog file을 복사해서 사용해야합니다.

** ALTER DATABASE OPEN RESETLOGS; 를 실행하는 이유
; 복구시도 후 SCN#를 보게 되면, datafile의 SCN#와 redo log, control file SCN#가 다른 경우가 생깁니다.( 복구중에 SCN#를 고치지는 않으므로 restore할때, 어떤 파일들을 restore하느냐에 따라 다른 경우가 생김. )
 이 SCN#들을 통일하기 위하여, alter database open resetlogs; 으로 DB를 OPEN하게 됩니다.

** RESETLOGS 하게 되면 일어나는 일들
; 요약하면, control file, redo log file(Archive log file들도) 들이 영향을 받습니다.
1. CONTROL FILE 의 SCN#를 DATAFILE SCN#기준으로 변경합니다.
2. Redo log file이 존재하면, file들을 초기화합니다.(존재하지 않으면, 새로 만듭니다.)
(resetlogs 한 시점 이전의 archive log file, redo log file은 없어도 되는 자료가 되어버립니다.)

*** 위와같은 특징들 때문에 위에서 설명한 주의사항대로 임시경로를 사용해서 복구를 시도해야 여러번 복구를 시도할 수 있습니다.
 


불완전복구 명령어
SQL> alter database until time '2012-02-03:07:09:23';   <--- 시간기반 불완전 복구
SQL> alter database until cancel;   <--- CANCEL기반 불완전복구(using backup controlfile옵션과 자주 쓰입니다.)
** USING BACKUP CONTROLFILE참고 : http://gyh214.tistory.com/93

 
불완전복구 데모시나리오 1 : 잘못된 delete를 복구하기
시나리오 순서
1. 백업
2. 자료입력 후 commit한 후 시간확인
3. log switch 몇번 후 DELETE(delete후 commit하고 자료가 없는지 확인)
4. 현재 DB의 파일 경로들을 살펴보기
5. shutdown 한 후 필요한 자료들을 임시경로에 restore하기(백업된 데이터파일, 현재 redolog, 현재 controlfile)
6. parameter에서 controlfile의 경로를 새로 지정하고 mount단계로 가서 alter database rename하기(복사하지 않는 자료들은 offline drop)
7. 6번적용되었는지 확인하기
8. 복구시도 후 복구가 되었으면, open 후 자료가 살아났나확인하기
9. 원래 DB로 자료복구하기(export, import 이용, 파라미터파일도 변경)
 

1. 백업
SQL> !sh ~/main_backup.sh

set begin backup mode~~

real    0m1.863s
user    0m0.122s
sys     0m0.357s

end begin backup mode--

start file copy.…

real    1m7.170s
user    0m0.127s
sys     0m33.623s
end file copy~

set end backup mode~~

real    0m1.967s
user    0m0.030s
sys     0m0.063s
complete hot backup~!!

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

2. 자료입력 후 commit한 후 시간확인

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

Table created.

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

1 row created.

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

1 row created.

SQL> commit;

Commit complete.

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

SYSDATE
-------------------
2012-02-06:16:46:59

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

3. log switch 몇번 후 DELETE(delete후 commit하고 자료가 없는지 확인)

SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> //

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> select * from scott.t01;

        NO
----------
         1
         2

SQL> delete from scott.t01;

2 rows deleted.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> select * from scott.t01;

no rows selected       <---- 실수로 인한 삭제확인

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

4. 현재 DB의 파일 경로들을 살펴보기

SQL> select TABLE_NAME, TABLESPACE_NAME from dba_tables
  2  where table_name ='T01';       <---- 어떤 파일을 복구해야 되나 확인

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
T01                            USERS





  1  select a.TS#, b.NAME tbs_name, a.NAME file_name
  2  from v$datafile a, v$tablespace b
  3  where a.ts#=b.ts#
  4* order by 2,3

SQL> /

       TS# TBS_NAME                       FILE_NAME
---------- ------------------------------ ---------------------------------------------
         6 EXAMPLE                        /home/oracle/oradata/testdb/example01.dbf
         2 SYSAUX                         /home/oracle/oradata/testdb/sysaux01.dbf
         0 SYSTEM                         /home/oracle/oradata/testdb/system01.dbf
         1 UNDOTBS1                       /home/oracle/oradata/testdb/undotbs01.dbf
         4 USERS                          /home/oracle/oradata/testdb/users01.dbf



SQL> select member from v$logfile;

MEMBER
----------------------------------------------------------------
/home/oracle/oradata/testdb/redo03.log
/home/oracle/oradata/testdb/redo02.log
/home/oracle/oradata/testdb/redo01.log



SQL> select name from v$controlfile;

NAME
--------------------------------------------------
/home/oracle/oradata/testdb/control01.ctl



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

5. shutdown 한 후 필요한 자료들을 임시경로에 restore하기(백업된 데이터파일, 현재 redolog, 현재 controlfile)
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> !mkdir ~/temp

SQL> !ls /backup/open/2012-02-06-16-22-04
2012-02-06-16-22-04.ctl  example01.dbf  sysaux01.dbf  system01.dbf  undotbs01.dbf  users01.dbf

SQL> !cp -av /backup/open/2012-02-06-16-22-04/sys* ~/temp/
`/backup/open/2012-02-06-16-22-04/sysaux01.dbf' -> `/home/oracle/temp/sysaux01.dbf'
`/backup/open/2012-02-06-16-22-04/system01.dbf' -> `/home/oracle/temp/system01.dbf'

SQL> !cp -av /backup/open/2012-02-06-16-22-04/undo*  ~/temp/
`/backup/open/2012-02-06-16-22-04/undotbs01.dbf' -> `/home/oracle/temp/undotbs01.dbf'

SQL> !cp -av /backup/open/2012-02-06-16-22-04/users*  ~/temp/
`/backup/open/2012-02-06-16-22-04/users01.dbf' -> `/home/oracle/temp/users01.dbf'

SQL> !cp -av ~/oradata/testdb/control*  ~/temp/
`/home/oracle/oradata/testdb/control01.ctl' -> `/home/oracle/temp/control01.ctl'

SQL> !cp -av ~/oradata/testdb/*.log   ~/temp/
`/home/oracle/oradata/testdb/redo01.log' -> `/home/oracle/temp/redo01.log'
`/home/oracle/oradata/testdb/redo02.log' -> `/home/oracle/temp/redo02.log'
`/home/oracle/oradata/testdb/redo03.log' -> `/home/oracle/temp/redo03.log'

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

6. parameter에서 controlfile의 경로를 새로 지정하고
mount단계로 가서 alter database rename하기(복사하지 않는 자료들은 offline drop)

SQL> !vi $ORACLE_HOME/dbs/inittestdb.ora
*.control_files='/home/oracle/temp/control01.ctl'


SQL> startup mount
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  1272600 bytes
Variable Size              96470248 bytes
Database Buffers           67108864 bytes
Redo Buffers                2920448 bytes
Database mounted.

SQL> alter database rename file '/home/oracle/oradata/testdb/system01.dbf' to '/home/oracle/temp/system01.dbf';
SQL> alter database rename file '/home/oracle/oradata/testdb/sysaux01.dbf' to '/home/oracle/temp/sysaux01.dbf';
SQL> alter database rename file '/home/oracle/oradata/testdb/undotbs01.dbf' to '/home/oracle/temp/undotbs01.dbf';
SQL> alter database rename file '/home/oracle/oradata/testdb/users01.dbf' to '/home/oracle/temp/users01.dbf';

Database altered.

SQL> alter database datafile '/home/oracle/oradata/testdb/example01.dbf' offline drop;

Database altered.

(복사하지 않은 데이터파일 사용안함 으로 바꿔주기, 실제 DB는 너무 방대하므로 전체 DB를 다 복사하지 못하고,
필요한 파일만 복사하기 때문에 위와 같은 방법을 사용합니다.)

SQL> alter database rename file '/home/oracle/oradata/testdb/redo01.log' to '/home/oracle/temp/redo01.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo01.log' to '/home/oracle/temp/redo02.log';
SQL> alter database rename file '/home/oracle/oradata/testdb/redo01.log' to '/home/oracle/temp/redo03.log';

Database altered.

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

7. 6번적용되었는지 확인하기
SQL> select name from v$controlfile;

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

SQL> select member from v$logfile;

MEMBER
-----------------------------------------------------
/home/oracle/temp/redo03.log
/home/oracle/temp/redo02.log
/home/oracle/temp/redo01.log

SQL> l
  1* select name, status from v$datafile
SQL> /

NAME                                          STATUS
--------------------------------------------- -------
/home/oracle/temp/system01.dbf                SYSTEM
/home/oracle/temp/undotbs01.dbf               ONLINE
/home/oracle/temp/sysaux01.dbf                ONLINE
/home/oracle/temp/users01.dbf                 ONLINE
/home/oracle/oradata/testdb/example01.dbf     OFFLINE  <-- 필요없는 파일(복사하지 않은 파일)

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

8. 복구시도 후 복구가 되었으면, open 후 자료가 살아났나확인하기

SQL> recover database until time '2012-02-06:16:46:59';
ORA-00279: change 739128 generated at 02/06/2012 16:22:02 needed for thread 1
ORA-00289: suggestion : /backup/arc/1_1_774410678.dbf
ORA-00280: change 739128 for thread 1 is in sequence #1


Specify log: {=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Media recovery complete.
SQL> alter database open resetlogs;

Database altered.

SQL> select * from scott.t01;

        NO
----------
         1
         2

******* 임시경로에 자료복구확인 ********

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

9. 원래 DB로 자료복구하기(export, import 이용, http://gyh214.tistory.com/92 참조)
(파라미터파일을 원래 controlfile이 있는 곳으로 지정)

SQL>  !exp scott/tiger file='/home/oracle/temp/t01_table.dmp' tables=T01;

Export: Release 10.2.0.5.0 - Production on Mon Feb 6 17:21:40 2012

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


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set

About to export specified tables via Conventional Path ...
. . exporting table                            T01          2 rows exported
Export terminated successfully without warnings.
(EXPORT 완료)

SQL> shutdown abort;
ORACLE instance shut down.  (이제는 더이상 필요가 없으므로, 어떤 방법으로들 shutdown하면 됩니다.)


SQL> !vi $ORACLE_HOME/dbs/inittestdb.ora
*.control_files='/home/oracle/oradata/testdb/control01.ctl'

SQL> startup
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  1272600 bytes
Variable Size              96470248 bytes
Database Buffers           67108864 bytes
Redo Buffers                2920448 bytes
Database mounted.
Database opened.
SQL> select name from v$controlfile;

NAME
---------------------------------------------
/home/oracle/oradata/testdb/control01.ctl

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/home/oracle/oradata/testdb/system01.dbf
/home/oracle/oradata/testdb/undotbs01.dbf
/home/oracle/oradata/testdb/sysaux01.dbf
/home/oracle/oradata/testdb/users01.dbf
/home/oracle/oradata/testdb/example01.dbf
(원래 DB임을 확인)


SQL> select * from scott.t01;

no rows selected

SQL> !imp scott/tiger file=/home/oracle/temp/t01_table.dmp ignore=y full=y;

Import: Release 10.2.0.5.0 - Production on Mon Feb 6 17:30:54 2012

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


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options


Export file created by EXPORT:V10.02.01 via conventional path
import done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set
. importing SCOTT's objects into SCOTT
. importing SCOTT's objects into SCOTT
. . importing table                          "T01"          2 rows imported
Import terminated successfully with warnings.

SQL> select * from scott.t01;

        NO
----------
         1
         2
******* 원래 DB에 자료복구확인 ********
(ignore=y : 이미 존재하는 테이블인 경우에도 에러무시하고 자료들을 다 넣어줌)

불완전복구 데모시나리오 2 : 잘못된 tbs삭제를 복구하기
너무 길어서 새로 포스팅합니다. : 
http://gyh214.tistory.com/94