본문 바로가기
IT 개발/Oracle SQL

Oracle 17일차 (백업, 복구) (1)

by Love of fate 2019. 1. 29.
728x90
반응형

▶ 백업, 복구

  

백업 

1.close 백업 -- 가장완벽, 가장 안전, shutdown  백업.

2.open 백업 --> 아카이브 파일이 활성화 되어있어야 한다.

                     --> 로그파일에 있는게 다른 곳에 저장이 되어있어야하는데 그게 아카이브 파일

 

로그파일은 백업불가. 계속 기록을 해야하기 때문에!

*!cp  느낌표는 os 명령어를 edit안에서 실행시키는 명령어 

 

복구 ( 13가지)

1. noarchive mode--닫힌복구   - 편할라고 학원에서 사용

  다른위치에 복구(imsy)

 

1. archive mode

완전복구(4가지) - 실제로 회사에서 쓰는 방법

1) 닫힌 데이터베이스 복구(System tablespace 문제시-shutdown)

2) 열린 데이터베이스 복구(일반 tablespace 문제시-offline)

3) 다른위치에 datafile복구(imsy)

4) 백업하지 않은 datafile복구

 

불완전복구(3가지)

1) 시간기반 복구

2) 취소기반 복구(아카이브 로그의 손실발생)

3) 백업control파일을 이용한 복구(아카이브로그가 아닌 ctl파일에서복구)

 

log파일 복구(4가지)

1)대기 상태 그룹의 멤버문제

2)대기 상태 그룹의 문제(2가지: Open, Close복구)

3)Current 로그 장애(2가지: Open, Close복구)

4)전체삭제(2가지 : 모든 Redolog파일 삭제, 모든 Control파일 삭제)

 

2. 에러가 발생된 데이터 복구시키다 에러가 발생했을때

 

1) 에러 발생
2) 셧다운
3) 복구하다 에러 발생 --> 에러가 발생된 데이터베이스 백업  
     왜? ==> 복구에 실패했을때, 에러난 데이터 백업받은 걸 다시 복구하여 다시 복구 시도
4) 복구

 

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

*복구 실습을 위한 선행작업

 

*ARCHIVE LOG MODE가 실행중인지 확인 = ARCHIVE LOG가 활성화 되어있는지 확인

 

-- ARCHIVE LOG MODE 활성화 되어 있지 않지 않은 상태

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

SYS@TestDB> archive log list
데이터베이스 로그 모드              아카이브 모드가 아님
자동 아카이브             사용 안함으로 설정됨
아카이브 대상            USE_DB_RECOVERY_FILE_DEST
가장 오래된 온라인 로그 순서     33
현재 로그 순서           35

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

 

*log.sql 스크립트 실행 : 로그 그룹, 로그 멤버 상태에 대한 정보 확인

 

v$log : 로그 그룹에 대한 정보

v$logfile : 로그 멤버에 대한 정보.

 

-- log.sql 파일 내용 ↓↓↓↓↓

 

COL MEMBER FORMAT A29

 select a.group#,member,bytes,sequence#,b.status
 from v$logfile a,v$log b
 where a.group#=b.group#
 ORDER BY a.group#
/

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

SYS@TestDB> @log  <-- 스크립트 파일 형태로 사용할 때 (=@log.sql)

 

GROUP#   MEMBER                                                         BYTES      SEQUENCE#   STATUS
----------  -----------------------------                                   -----------   ---------       ---------------
         1   C:\APP\ITWILL\ORADATA\TESTDB\REDO01.LOG   52428800         34        INACTIVE
         

         2   C:\APP\ITWILL\ORADATA\TESTDB\REDO02.LOG   52428800         35        CURRENT


         3   C:\APP\ITWILL\ORADATA\TESTDB\REDO03.LOG   52428800         33        INACTIVE
------------------------------------------------------------------------------------------------------------------

 

*ARCHIVE LOG 활성화   <--  archive mode는  꼭  archive 파일 생성 후 archive mode로 변경 해야 한다.

 

  1. shutdown immediate

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

     SYS@TestDB> shutdown immediate


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

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

  2. C:\aDisk 경로에 arc1, arc2 두개의 파일 생성 -- 아카이브 파일 멀티 플렉싱!

  3. C:\app\itwill\product\11.2.0\dbhome_1\database에 있는  

      INITtestdb.ORA (파라미터 파일)에 아래 내용 추가 저장.

 

     -- log_archive_dest_1='location=c:\adisk\arc1'
     -- log_archive_dest_2='location=c:\adisk\arc2'
     -- log_archive_format=%s_%t_%r.arc

 

  4. startup mount (mount 상태)

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

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

      Total System Global Area 3390558208 bytes
      Fixed Size                  2180464 bytes
      Variable Size            1862273680 bytes
      Database Buffers         1509949440 bytes
      Redo Buffers               16154624 bytes
      데이터베이스가 마운트되었습니다.

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

 

  5. 데이터베이스를 ARCHIVE LOG 모드로 변경 

 

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

     SYS@TestDB> alter database archivelog;

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

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

 

   6. 데이터베이스 OPEN

 

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

     SYS@TestDB> alter database open;

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

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

 

*ARCHIVE LOG MODE가 실행중인지 확인

 

-- 아카이브 모드 실행됨.

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

SYS@TestDB> archive log list
데이터베이스 로그 모드              아카이브 모드 <-- (아카이브 모드가 아님 --> 아카이브모드로 변경 확인.)
자동 아카이브             사용으로 설정됨
아카이브 대상            c:\adisk\arc2
가장 오래된 온라인 로그 순서     33
아카이브할 다음 로그   35
현재 로그 순서           35

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

 

*switch.sql 스크립트 실행 : 사용할 로그 파일 변경, checkpoint 실행

 

-- switch.sql 파일 내용 ↓↓↓↓↓ 

ALTER SYSTEM SWITCH LOGFILE; -- 사용할 로그파일 변경
ALTER SYSTEM CHECKPOINT;      -- checkpoint 발생

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

SYS@TestDB> @switch

시스템이 변경되었습니다.

 

시스템이 변경되었습니다.

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

--> C:\aDisk\arc1, arc2 폴더에 아카이브 파일 생성 됨 

 

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

SYS@TestDB> @switch <- 한번 더 실행

시스템이 변경되었습니다.

 

시스템이 변경되었습니다.

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

 

*실습을 위해 에러를 발생시키기 전 정상 DB 백업


----------- 닫힌 백업 --------------------------------------------------------
1. DB 종료 (shutdown immediate)

2. D드라이브에 백업을 위한 폴더 생성 (폴더명 : 20190129archive)

3. D드라이브에 백업 진행

    -- oradata에 있는 파일 20190129archive 폴더에 복붙 
    -- database에 있는 INITtestdb.ORA, PWDTestDB.ora파일 20190129archive 폴더에 복붙 
4. startup.
--------------------------------------------------------------------------------

 

1. 완전복구

 

 1) 닫힌 데이터베이스 복구(System tablespace 문제시-shutdown)

 

    1. SYSTEM TABLESPACE 문제 발생 시키기

    

       *switch.sql 스크립트 실행

 

       *test.sql 스크립트 실행

      

       ---- 스크립트 내용 ----

       create table test
       (no number)
       tablespace system;

 

       insert into test values (10);
       commit;

       @switch

 

       insert into test values (20);
       commit;
       @switch

 

       insert into test values (30);
       commit;
       @switch

 

       insert into test values (40);
       commit;
       @switch

 

       insert into test values (50);
       commit;
       @switch

 

       insert into test values (60);
       commit;
       @switch

 

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

       SYS@TestDB> @test.sql

 

       테이블이 생성되었습니다.
       1 개의 행이 만들어졌습니다.
       커밋이 완료되었습니다.
       시스템이 변경되었습니다.
       시스템이 변경되었습니다.
       1 개의 행이 만들어졌습니다.
       커밋이 완료되었습니다.
       시스템이 변경되었습니다.
       시스템이 변경되었습니다.
       1 개의 행이 만들어졌습니다.
       커밋이 완료되었습니다.
       시스템이 변경되었습니다.
       --------------------------------------------

 

       *SYSTEM Tablespace에 Table 생성 확인 

 

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

       SYS@TestDB> select tablespace_name from dba_tables
       2  where table_name='TEST';
   
       TABLESPACE_NAME
       ------------------------------
       SYSTEM

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

 

       *SYSTEM Tablespace 삭제

 

      system 테이블 스페이스는 지우고 셧다운시켜야하나
      파일이 지워지지 않으므로 셧다운(shutdown immediate) 시키고 파일을 지움.

      --> 하드디스크가 망가진 상태와 같음

 

      *Startup --> 오류 발생 : SYSTEM Tablespace는 Oracle DB 그 자체라서 없으면 실행을 DB를 오픈 시킬 수 없다. 

      

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

      SYS@TestDB> startup


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

      Total System Global Area 3390558208 bytes
      Fixed Size                  2180464 bytes
      Variable Size            1862273680 bytes
      Database Buffers         1509949440 bytes
      Redo Buffers               16154624 bytes
      데이터베이스가 마운트되었습니다.
      ORA-01157: 데이터 1 파일을 식별 또는 잠금 할 수 없습니다- DBWR 추적 파일을
      보십시오
      ORA-01110: 1 데이터 파일: 'C:\APP\ITWILL\ORADATA\TESTDB\SYSTEM01.DBF'

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

 

      *에러가 발생한 Tablespace 및 에러 내용 확인 

      

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

      SYS@TestDB> select b.tablespace_name,a.name,b.error
      2  from v$datafile a, v$datafile_header b
      3  where a.file# = b.file#;

  

      SYS@TestDB> save error.sql;  -- 스크립트 파일로 저장.
      file error.sql(이)가 생성되었습니다


       TABLESPACE_NAME           NAME                                            ERROR
      ------------------------------ ------------------------------                  ---------------
                                          C:\APP\ITWILL\ORADATA\TESTDB\   FILE NOT FOUND --> 파일을 찾을 수 없음.
                                           SYSTEM01.DBF

      SYSAUX                          C:\APP\ITWILL\ORADATA\TESTDB\S
                                           YSAUX01.DBF

      UNDOTBS1                      C:\APP\ITWILL\ORADATA\TESTDB\U
                                           NDOTBS01.DBF

      USERS                            C:\APP\ITWILL\ORADATA\TESTDB\U
                                           SERS01.DBF

 

      TABLESPACE_NAME           NAME                                            ERROR
      ------------------------------ ------------------------------                  ---------------

      EXAMPLE                        C:\APP\ITWILL\ORADATA\TESTDB\E
                                           XAMPLE01.DBF

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

 

   2. 복구

 

      * 20190129archive 폴더에서 백업한 SYSTEM01.DBF 파일

        C:\app\itwill\oradata\TestDB 복붙

 

      * ARCHIVE LOG 파일로 데이터 복구

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

      SYS@TestDB> recover database;


      ORA-00279: 변환 1700581가 (01/29/2019 10:19:23에서 생성된) 스레드 1에
      필요합니다
      ORA-00289: 제안 : C:\ADISK\ARC2\37_1_996676866.ARC
      ORA-00280: 변환 1700581(스레드 1를 위한)가 시퀀스번호 37에 있습니다


      로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}

      ORA-00279: 변환 1702889가 (01/29/2019 10:43:59에서 생성된) 스레드 1에
      필요합니다
      ORA-00289: 제안 : C:\ADISK\ARC2\38_1_996676866.ARC
      ORA-00280: 변환 1702889(스레드 1를 위한)가 시퀀스번호 38에 있습니다


      로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}
      auto <--  자동으로 데이터 가져옴
      ORA-00279: 변환 1703268가 (01/29/2019 10:51:30에서 생성된) 스레드 1에
      필요합니다
      ORA-00289: 제안 : C:\ADISK\ARC2\39_1_996676866.ARC
      ORA-00280: 변환 1703268(스레드 1를 위한)가 시퀀스번호 39에 있습니다


      ORA-00279: 변환 1703274가 (01/29/2019 10:51:34에서 생성된) 스레드 1에
      필요합니다
      ORA-00289: 제안 : C:\ADISK\ARC2\40_1_996676866.ARC
      ORA-00280: 변환 1703274(스레드 1를 위한)가 시퀀스번호 40에 있습니다


      ORA-00279: 변환 1703282가 (01/29/2019 10:51:42에서 생성된) 스레드 1에
      필요합니다
      ORA-00289: 제안 : C:\ADISK\ARC2\41_1_996676866.ARC
      ORA-00280: 변환 1703282(스레드 1를 위한)가 시퀀스번호 41에 있습니다


      로그가 적용되었습니다.
      매체 복구가 완료되었습니다.

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

 

      * SYSTEM01.DBF 파일 복구되어 Database 오픈 가능

 

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

      SYS@TestDB> alter database open;

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

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

 

      * 복구가 정상적으로 이루어 졌는지 확인

       -- 에러 없음

 

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

      SYS@TestDB> @error


       TABLESPACE_NAME           NAME                                            ERROR
      ------------------------------ ------------------------------                  ---------------
      SYSTEM                          C:\APP\ITWILL\ORADATA\TESTDB\   
                                           SYSTEM01.DBF

      SYSAUX                          C:\APP\ITWILL\ORADATA\TESTDB\S
                                           YSAUX01.DBF

      UNDOTBS1                      C:\APP\ITWILL\ORADATA\TESTDB\U
                                           NDOTBS01.DBF

      USERS                            C:\APP\ITWILL\ORADATA\TESTDB\U
                                           SERS01.DBF

 

      TABLESPACE_NAME           NAME                                            ERROR
      ------------------------------ ------------------------------                  ---------------

      EXAMPLE                        C:\APP\ITWILL\ORADATA\TESTDB\E
                                           XAMPLE01.DBF

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

 

      *  test 테이블과 테이블 안의 데이터 복구 확인 -- 완료

 

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

      SYS@TestDB> select * from test;

             NO
      ----------
              10
              20
              30
              40
              50
              60

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

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

 

 2) 열린 데이터베이스 복구(일반 tablespace 문제시-offline) -- users01.dbf

 

    - DB Shutdown immedate 시킨 후 TESTDB폴더에 있는 파일 지움

    - 20190129archive 폴더에 있는 백업한 파일 중 INITtestdb.ORA, PWDTestDB.ora 제외하고 나머지 파일

      TESTDB 폴더에 복붙.

    - arc1, arc2 폴더에 있는 archive 파일 중 2개(실습을 위해 두번 실행했던 파일)만 남기고 삭제.

    - DB startup

 

    1. SYSTEM TABLESPACE 문제 발생 시키기

 

      * switch.sql 스크립트 파일 실행
 

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

      SYS@TestDB> @switch

 

      시스템이 변경되었습니다.


      시스템이 변경되었습니다.

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

 

      * ST 계정 생성 및 권한부여

 

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

      SYS@TestDB> create user st
        2  identified by st
        3  default tablespace users
        4  temporary tablespace temp
        5  quota unlimited on users;

      사용자가 생성되었습니다.

 

      SYS@TestDB> grant connect, resource to st;

      권한이 부여되었습니다.

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

 

      * ST 계정의 기본 테이블스페이스 확인

 

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

      SYS@TestDB> select username, default_tablespace from dba_users
        2  where username='ST';

 

      USERNAME                       DEFAULT_TABLESPACE
      ------------------------------ ------------------------------
      ST                                   USERS

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

 

 

      * test.sql 파일 수정

 

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

      create table st.test
      (no number)

      insert into st.test values (10);
      commit;
      @switch

      insert into st.test values (20);
      commit;
      @switch

      insert into st.test values (30);
      commit;
      @switch

      insert into st.test values (40);
      commit;
      @switch

      insert into st.test values (50);
      commit;
      @switch

      insert into st.test values (60);
      commit;
      @switch

 

      SYS@TestDB>@test <-- test.sql 스크립트 파일 실행

 

      SYS@TestDB> select * from st.test; <--  test.sql 정상으로 실행되어 테이블과 데이터가 잘 들어갔는지 확인

              NO
      ----------
              10
              20
              30      
              40
              50
              60

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

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

 

      * 원래는 파일 삭제 후 offline인데 삭제가 안되서 
      
usrs01.dbf 파일 offline 시키고 삭제

 

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

      SYS@TestDB> alter tablespace users offline;

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

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

      -- users01.dbf 파일 삭

     

      * hutdown immediate (셧다운)
      * startup 

 

2. 복구


* 백업파일에서 users01.dbf 파일만 가져옴
   -- 기존에 있던 파일들과 패밀리가 아닌상태

 

* 같은 패밀리로 복구

------------------------------------------------------------------------------------------
SYS@TestDB> @dt

TABLESPACE_NAME                STATUS    CONTENTS  EXTENT_MAN SEGMEN
------------------------------ --------- --------- ---------- ------
SYSTEM                         ONLINE    PERMANENT LOCAL      MANUAL
SYSAUX                         ONLINE    PERMANENT LOCAL      AUTO
UNDOTBS1                       ONLINE    UNDO      LOCAL      MANUAL
TEMP                           ONLINE    TEMPORARY LOCAL      MANUAL
USERS                          OFFLINE   PERMANENT LOCAL      AUTO
EXAMPLE                        ONLINE    PERMANENT LOCAL      AUTO

6 개의 행이 선택되었습니다.
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
SYS@TestDB> recover tablespace users;
ORA-00279: 변환 1700581가 (01/29/2019 10:19:23에서 생성된) 스레드 1에
필요합니다
ORA-00289: 제안 : C:\ADISK\ARC2\37_1_996676866.ARC
ORA-00280: 변환 1700581(스레드 1를 위한)가 시퀀스번호 37에 있습니다

로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}
auto
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
SYS@TestDB> alter tablespace users online;

테이블스페이스가 변경되었습니다.
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
SYS@TestDB> @dt

TABLESPACE_NAME                STATUS    CONTENTS  EXTENT_MAN SEGMEN
------------------------------ --------- --------- ---------- ------
SYSTEM                         ONLINE    PERMANENT LOCAL      MANUAL
SYSAUX                         ONLINE    PERMANENT LOCAL      AUTO
UNDOTBS1                       ONLINE    UNDO      LOCAL      MANUAL
TEMP                           ONLINE    TEMPORARY LOCAL      MANUAL
USERS                          ONLINE    PERMANENT LOCAL      AUTO
EXAMPLE                        ONLINE    PERMANENT LOCAL      AUTO

6 개의 행이 선택되었습니다.
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
SYS@TestDB> select * from st.test;

        NO
----------
        10
        20
        30
        40
        50
        60

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

 

 

 


      

728x90
반응형