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'를 입력하면 자동으로 아카이브 로그 파일들을 적용하여 복구작업을 실행합니다.. }}}