_대문 | 방명록 | 최근글 | 홈피소개 | 주인놈
FrontPage › 백업과복구
Describe 백업과복구 here

복구....

백업은 언급햇듯이 데이타베이스 환경의 오류나 문제점 발견시 기존의 정상적인 시스템으로 
유지하기 위한 최후의 수단입니다..
백업은 복구를 위한 것입니다...
그렇다면 복구하는 방법을 알아야겠지여..
복구의 종류는 여러가지가 있는데.. 그 종류는 다음과 같습니다..

완전복구
   - 전체 복구
   - 테이블스페이스 복구
   - 데이타 파일 복구
불완전 복구
   - 시간기반 복구
   - 취소기반 복구
   - 변경기반 복구   

또한 오라클에서는 백업/복구 유틸리티인 복구매니저라는 것을 제공하고 있습니다...
순서대로 알아보겠습니다..

=====================
완전복구 -전체 복구-
=====================

완전복구는 데이타베이스에서 문제가 발생했던 시점까지 복구되는 것을 말합니다..
그중에 전체 복구는 말그대로 데이타베이스의 전체 복구를 의미합니다..
전체복구의 순서는 다음과 같습니다..

   1. 데이타베이스 셧다운
   2. 홀백업에 의해 백업되었던 모든 파일 또는 오픈 백업에 의해서 백업된 파일들을 해당 경로에 다시 위치 시킨다
   3. 데이타베이스 마운트
   4. RECOVER DATABASE문장 실행
   5. 데이타베이스 오픈

SQL> connect scott/tiger
연결되었습니다.
SQL> delete from emp
  2  where empno = 7934;

1 행이 삭제되었습니다.

SQL> select * from emp
  2  where empno = 7934;

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

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

SQL> !cp $ORACLE_HOME/backup/*.ctl $ORACLE_HOME/oradata/ORCL/.

SQL> !cp $ORACLE_HOME/backup/*.log $ORACLE_HOME/oradata/ORCL/.

SQL> !cp $ORACLE_HOME/backup/*.ora $ORACLE_HOME/oradata/ORCL/.

SQL> !cp $ORACLE_HOME/backup/*.dbf $ORACLE_HOME/oradata/ORCL/.

SQL> set autorecovery on
SQL> recover database;
ORA-00283: ?? ??? ??? ??? ???????      <------------ 에러가 났는데....쩝....기냥 복구가 됬네여..헐헐~
ORA-00264: ??? ???? ????


SQL> alter database open;

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

SQL> select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
      7788 SCOTT      ANALYST         7566 87/04/19       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30
      7876 ADAMS      CLERK           7788 87/05/23       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7934 MILLER     CLERK           7782 82/01/23       1300                    10

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

암튼...전체백업을 하면 언제 몇시에 백업을 했느냐를 기록해 두고...
각각의 관련 파일을 모조리 한 시점에서 복사해놔야 합니다.....


===================
테이블스페이스 복구
===================

SQL> !ls $ORACLE_HOME/oradata
ORCL                   data1.dbf              data2_a.dbf            scott.dmp
archive                data1_1.dbf            local_manage_data.dbf  temp_data.dbf

SQL> alter tablespace data2 begin backup;

테이블 영역이 변경되었습니다.

SQL> !cp $ORACLE_HOME/oradata/data2_a.dbf $ORACLE_HOME/data2_a.dbf

SQL> alter tablespace data2 end backup;

테이블 영역이 변경되었습니다.

SQL> shutdown
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.
SQL> !cp $ORACLE_HOME/data2_a.dbf $ORACLE_HOME/oradata/data2_a.dbf

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

Total System Global Area   87818400 bytes
Fixed Size                    73888 bytes
Variable Size              70795264 bytes
Database Buffers           16777216 bytes
Redo Buffers                 172032 bytes
데이터베이스가 마운트되었습니다.
SQL> alter database datafile '$ORACLE_HOME/oradata/data2_a.dbf' offline;

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

SQL> alter database open;

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

SQL> select tablespace_name, status from dba_tablespaces;

TABLESPACE_NAME                STATUS
------------------------------ ---------
SYSTEM                         ONLINE
TOOLS                          ONLINE
RBS                            ONLINE
TEMP                           ONLINE
USERS                          ONLINE
INDX                           ONLINE
DRSYS                          ONLINE
DATA1                          ONLINE
DATA2                          OFFLINE           <------------- 테이블스페이스가 오프라인이다..
TEMP_DATA                      ONLINE
LOCAL_MANAGE_TS                ONLINE

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

SQL> recover tablespace data2;                <------------- 테이블스페이스 복구 명령
매체 복구가 완료되었습니다.
SQL> alter tablespace data2 online;

테이블 영역이 변경되었습니다.                 <------------- 이제 사용이 가능합니다..

SQL> select tablespace_name, status from dba_tablespaces;

TABLESPACE_NAME                STATUS
------------------------------ ---------
SYSTEM                         ONLINE
TOOLS                          ONLINE
RBS                            ONLINE
TEMP                           ONLINE
USERS                          ONLINE
INDX                           ONLINE
DRSYS                          ONLINE
DATA1                          ONLINE
DATA2                          ONLINE
TEMP_DATA                      ONLINE
LOCAL_MANAGE_TS                ONLINE

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

=================
데이타파일의 복구
=================

역쉬..방법은 비스무리합니다..


SQL> shutdown
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.
SQL> !cp $ORACLE_HOME/data2_a.dbf $ORACLE_HOME/oradata/data2_a.dbf          <------- 문제의 데이타파일을 백업한 데이타파일로 교체한다..

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

Total System Global Area   87818400 bytes
Fixed Size                    73888 bytes
Variable Size              70795264 bytes
Database Buffers           16777216 bytes
Redo Buffers                 172032 bytes
데이터베이스가 마운트되었습니다.
SQL> alter database datafile '$ORACLE_HOME/oradata/data2_a.dbf' offline;        <------- 데이타 파일을 오프라인으로 설정

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

SQL> alter database open;

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

SQL> recover datafile '$ORACLE_HOME/oradata/data2_a.dbf';           <------- 해당 데이타파일을 복구하면 사용가능한 상태가 된다..
매체 복구가 완료되었습니다.
SQL>


복구는 생각보다 간단합니다...헐헐~
그러면 불완전 복구에 대해서 살펴보겠습니다...

===============
시간기반이 복구
===============

시간기반의 복구에 대해서 살펴보겠습니다..
예를 들면, 어떤 사용자가 실수로 테이블의 모든 행을 삭제했다고 가정하면...
이런경우 완전복구는 불가능합니다.... 그러나 테이블의 행을 삭제했던 모든 작업의 내용은 아카이브로그 파일에 존재합니다..
그러므로 아카이브 로그파일을 이용해서 간단히 복구할 수 있습니다..
만약 2001년 12월 14일 오후 5시 30분에 전체 백업을 받았는데... 다음날 어떤 사용자가 실수로 어떤 테이블의 데이타를
모두 삭제했다고 하면...시간을 기준으로 2001년 12월 14일 오후 5시 30분으로 다시 돌릴수가 있습니다..
물론 백업된 관련 파일이 있다면요...

먼저 삭제 이전의 상태로 되돌릴수 없을 경우를 대비해서 먼제 전체 백업을 받아두어야 안전합니다..

비슷한 예를 해보겠습니다..

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

yasicom% /export/home/oracle/8i/dbs/whole_backup.sql
yasicom% cat /export/home/oracle/8i/dbs/whole_backup.sql
cp $ORACLE_HOME/oradata/ORCL/*.dbf $ORACLE_HOME/backup
cp $ORACLE_HOME/oradata/ORCL/*.ctl $ORACLE_HOME/backup
cp $ORACLE_HOME/oradata/ORCL/*.log $ORACLE_HOME/backup
cp $ORACLE_HOME/oradata/ORCL/*.ora $ORACLE_HOME/backup


SQL> !date                                        <---------------- 데이타베이스 새로 시작후...
2001년 12월 17일 월요일 오전 08시 05분 15초

SQL> connect scott/tiger
연결되었습니다.
SQL> delete from emp;

14 행이 삭제되었습니다.

SQL> !date
2001년 12월 17일 월요일 오전 08시 06분 16초

SQL> connect sys/change_on_install as sysdba
연결되었습니다.
SQL> shutdown
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.
SQL> !cat $ORACLE_HOME/dbs/recovery.sql
cat: /export/home/oracle/8i/dbs/recovery.sql을(를) 열 수 없습니다

SQL> !ls $ORACLE_HOME/dbs
backup_history    init.ora          initdw.ora        orapwORCL         shutdown
core              initORCL.ora      lkORCL            recover.sql       whole_backup.sql

SQL> !cat $ORACLE_HOME/dbs/recover.sql                      <---------------------------------- 백업했던 파일을 파일을 설치
cp $ORACLE_HOME/backup/*.ctl $ORACLE_HOME/oradata/ORCL/.
cp $ORACLE_HOME/backup/*.log $ORACLE_HOME/oradata/ORCL/.
cp $ORACLE_HOME/backup/*.ora $ORACLE_HOME/oradata/ORCL/.
cp $ORACLE_HOME/backup/*.dbf $ORACLE_HOME/oradata/ORCL/.

SQL> !$ORACLE_HOME/dbs/recover.sql

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

Total System Global Area   84218016 bytes
Fixed Size                    73888 bytes
Variable Size              55955456 bytes
Database Buffers           28016640 bytes
Redo Buffers                 172032 bytes
데이터베이스가 마운트되었습니다.
SQL> recover database until time '2001-12-17:08:05:15';
매체 복구가 완료되었습니다.
SQL> alter database open resetlogs;

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

SQL> connect scott/tiger
연결되었습니다.
SQL> set linesize 200
SQL> set pagesize 200
SQL> select * from emp;                                                            <-------------- 복구가 되었슴다..

     EMPNO ENAME      JOB              MGR HIREDATE        SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
      7788 SCOTT      ANALYST         7566 87/04/19       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30
      7876 ADAMS      CLERK           7788 87/05/23       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7934 MILLER     CLERK           7782 82/01/23       1300                    10

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


================
취소 기반의 복구
================

취소기반의 복구는 디스크가 깨진다거나 또는 아카이브 파일을 삭제한다거나 할때...
복구작업시 아카이브 로그 파일을 사용하여 전체 복구를 하지 못합니다....
이때...취소기반의 복구 방법을 사용하여...아카이브 로그 파일이 존재하는 부분만 사용해서 복구를 할 수 있습니다...
역쉬....방법은 간단합니다...
시간기반의 복구 방법의 데이타베이스 마운트하는 부분까지는 똑같습니다..
마운트 뒷부분은 다음과 같습니다..

SQL> recover database until cancel;
매체 복구가 완료되었습니다.

SQL> alter database open resetlogs;

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

===============
변경기반의 복구
===============

변경기반의 복구는 데이타베이스에서 일어나는 특별한 변화를 근거로 데이타베이스를 복구하는 방법입니다..
이 방법은 아카이로그가 중간에 빠지거나 하나라도 없을때 사용될 수 있습니다...
이 방법은 SCN정보를 이용하거나 아카이브 로그 파일을 이용해서 데이타베이스를 복구합니다..

SQL> desc v$log_history;
 이름
 -----------------------------------------

 RECID
 STAMP
 THREAD#
 SEQUENCE#
 FIRST_CHANGE#
 FIRST_TIME
 NEXT_CHANGE#

SQL> recover database until change low_change                   <-------------- change 번호를 입력합니다...

이 문장이 실행될 때 요구되는 아카이브 로그 파일을 아카이브 디렉토리내에 존재하는 지를 자동으로 확인
하기 위해 오라클이 첫 번째 아카이브 로그 파일에 대한 이름을 요구할때 'auto'를 입력하면 자동으로
아카이브 로그 파일들을 적용하여 복구작업을 실행합니다..




댓글 남기기..
이름: : 오른쪽의 새로고침을 클릭해 주세요. 새로고침
EditText : Print : Mobile : FindPage : DeletePage : LikePages : Powered by MoniWiki : Last modified 2018-04-13 23:12:53

두려움과 진정으로 맞서 싸울 때 당신은 힘과 경험과 자신감을 얻는다. 당신은 당신이 할 수 없다고 생각하는 일을 해야만 한다. (엘리노어 루즈벨트)