RDB/Oracle

[오라클] 완전복구, 불완전복구-시간기반,취소기반

창문닦이 2019. 1. 29. 17:25

[복구와 백업]

[백업]
1.close 백업
2.open 백업

[복구]
1. no-archive mode-닫힌복구, 다른위치에 복구(imsy)
2. 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파일 삭제)

Database가 열려있는 상태에서 백업을 받으면 완전하게 백업을 받은 게 아님.

데이터베이스가 살아있으니까 다른 사용자가 데이터를 입력할 수 있기 때문. 로그파일에 기록을 해서 복구 작업 진행.

실제로 복구할 땐 ARCHIVE MODE 를 대부분 사용한다. 총 ARCHIVE MODE 복구 방법은 11가지.

[명령어]

alter tablespace system begin backup;
!cp /home/oracle/oradata/testdb/system01.dbf /data/backup/open/
alter tablespace system end backup;


alter tablespace undo begin backup;
!cp /home/oracle/oradata/testdb/undo01.dbf /data/backup/open/
alter tablespace undo end backup;

alter tablespace users begin backup;
!cp /home/oracle/oradata/testdb/users01.dbf /data/backup/open/
alter tablespace users end backup;

alter tablespace sysaux begin backup;
!cp /home/oracle/oradata/testdb/sysaux01.dbf /data/backup/open/
alter tablespace sysaux end backup;

alter tablespace example begin backup;
!cp /home/oracle/oradata/testdb/example01.dbf /data/backup/open/
alter tablespace example end backup;

alter database backup controlfile to '/data/backup/open/control.ctl';


!cp : 복사 명령어를 OS에서 실행시켜라 (즉, 느낌표는  OS의 명령어를 해당 에디터안에서 실행시킴)
컨트롤 파일은 쌍둥이 개념이므로 하나만 백업하더라도 문제 없다
로그파일은 백업받을 수 없다. db가 열려있는 상태에서 복구하는 작업도 아카이브 로그에 기록을 해야하기 때문이다.
일반적으로 리눅스에서는 스크립트로 만들어 두고 줄줄이 복구작업 진행되도록 만들어둔다.

 

-데이터베이스 로그 모드 조회

ARCHIVE LOG LIST

 

기본 디폴트가 아카이브 모드가 아닌 것을 볼 수 있음. 저장된 위치는 USE_DB_RECOVERY_FILE_DEST.

 

1. 아카이브 로그 파일도 중요한 파일이므로 멀티플렉싱하여 저장하는 것이 일반적.

별도의 하드디스크에 저장해야 하지만 실습관계상 폴더로 구분.

 

2. 파라미터 파일 수정.

아카이브파일의 저장위치와 저장포맷 설정

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

 

 

 

3. MOUNT상태로 STARTUP

데이터베이스를 아카이브로그 상태로 옵션을 변경

ALTER DATABASE ARCHIVELOG

;

 

데이터베이스 오픈

ALTER DATABASE OPEN;

 

 

4. 아카이브로그 리스트 확인

현재 CURRENT 로그 파일 37번을 아카이브 로그로 백업 받음

 

@log

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#

 

@switch

ALTER SYSTEM SWITCH LOGFILE;

ALTER SYSTEM CHECKPOINT;

 

 

5. 아카이브폴더에 arc 파일 저장되었는 지 확인( CURRENT이전의 로그파일이 아카이브 파일로 저장)

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

[완전복구 - 1. 닫힌 데이터베이스 복구] 

DB를 close시킨 후 진행, 시스템 테이블스페이스가 문제 생겼을 경우 사용한다.

 

① 백업 시점 이후 테이블 생성, 데이터의 입력/수정/삭제가 일어난 후 시스템에러가 발생했다는 가정사항으로 진행

(TEST.SQL 파일 생성)

 

- SYSTEM TABLESPACE에 TEST테이블이 입력된 것을 조회할 수 있음

 

② 에러 발생

오류 발생을 위해 SHUTDOWN IMMEDIATE 후  SYSTEM01.DBF 파일삭제 함(DB의 HDD가 망가졌다는 가정)

STARTUP을 할 경우 해당 오류가 발생한다

 

③ 어느 테이블 스페이스에서 오류나는지 조회하는 쿼리

@error.sql

SELECT B.TABLESPACE_NAME, A.NAME, B.ERROR

FROM V$DATAFILE A, V$DATAFILE_HEADER B

WHERE A.FILE#= B.FILE#

 

 

③ 데이터베이스 복구 시작

RECOVER DATABASE;

AUTO : 로그파일을 하나하나 설정할 것 인지 (자동으로 진행)

 

 

④ ALTER DATABASE OPEN 후 에러를 조회하면 에러메세지 사라진 것을 볼 수 있음

 

⑤ 복구 완료뒤 전체 파일 CLOSE백업 진행

 

※실무에서는 무엇때문에 에러가 발생한 것인지 모르기때문에 에러 발생시 백업을 시켜두고 여러가지 방법으로 복구 작업을 계속 진행해야 한다.  

(① 에러 - ② SHUTDOWN - ③ 백업 - ④ 복구) 복구작업이 제대로 안 이뤄질 경우 ①~③ 반복진행

 


 

[완전복구 - 2. 열린 데이터베이스 복구]

-일반 tablespace 문제 발생 시 사용한다. 해당 테이블스페이스를 offline 후 처리 진행.

 

① 예제 진행을 위해 사용자 생성, 권한 부여, 사용자 테이블 스페이스 조회

 

② 테이블 생성 - test.sql 파일 실행 시 commit과 log switch가 진행되도록 작성.

따라서, 아카이브 로그 파일도 여러 개 생성 되어진다.

 

- st의 test테이블 조회. insert가 잘 되어진 걸 볼 수 있음

 

③ users01.dbf 파일에서 에러 발생

 

④ OFFLINE 으로 변경

 

⑤ 테이블스페이스가 OFFLINE 상태임 확인

@DT

SELECT TABLESPACE_NAME, STATUS, CONTENTS,

EXTENT_MANAGEMENT,SEGMENT_SPACE_MANAGEMENT

FROM DBA_TABLESPACES

 

 

⑥ 복구 진행

RECOVER TABLESPACE USERS;

 

 

⑤ ONLINE으로 일반 테이블스페이스 상태 변경 후 조회

ALTER TABLESPACE USERS ONLINE;

 

 

복구 완료뒤 전체 파일 CLOSE백업 진행

 


 

[완전복구 - 3. 다른위치에 datafile복구(임시 디스크)]

현재 사용하는 HDD가 고장으로, DBF 복구시 기존 위치가 아닌 다른 임시 디스크에 복구 작업을 하는 경우 사용한다.

 

① 사용자 생성 - 권한 부여 - 디폴트 테이블스페이스 조회

 

② ST.TEST 테이블 생성 - 데이터 삽입 - 커밋 - 로그 스위치

@TEST 실행. 데이터 입력 잘 되어진 걸 볼 수 있음

 

③ 오류 발생!

USERS01.DBF 파일 존재하지 않음 (실습 진행을 위해 OFFLINE 후 삭제함)

 

파일 조회

 

④ 오라클에서 기억하는 물리적 파일의 경로를 수정 후 조회

ALTER TABLESPACE USERS RENAME
DATAFILE 'C:\APP\ITWILL\ORADATA\TESTDB\USERS01.DBF'
TO 'C:\aDisk\DISK1\USERS01.DBF';

 

 

⑤ 복구

RECOVER TABLESPACE USERS;

 

 

⑥ ONLINE으로 변경. 원하는 위치에 DBF가 백업된 것을 확인

ALTER TABLESPACE USERS ONLINE;

 

 

⑦ 원하는 위치로 테이블스페이스 재변경

ALTER TABLESPACE USERS OFFLINE;
ALTER TABLESPACE USERS RENAMEDATAFILE '기존경로\파일명.DBF'TO '변경경로\파일명.DBF';

 

ALTER TABLESPACE USERS ONLINE;

 

파일위치조회

 

 


[ 완전복구 - 4. 백업하지 않은 datafile복구 ]

① 테이블 스페이스 생성

CREATE TABLESPACE TEST

DATAFILE ‘C:\app\itwill\oradata\TestDB\TEST01.DBF’ SIZE 10M;

 

② 사용자 생성

CREATE USER ST

IDENTIFIED BY ST

DEFAULT TABLESPACE TEST

TEMPORARY TABLESPACE TEMP

QUOTA 1M ON TEST;

 

③ 테이블 생성

@TEST

 

④ 사용자가 ST인 테이블스페이스와 테이블명 조회

SELECT TABLE_NAME, TABLESPACE_NAME FROM DBA_TABLES

WHERE OWNER='ST';

 

 

⑤ 테이블 스페이스 상태 OFFLINE 변경 후 OS상에서 TEST01.DBF 파일 삭제 (DATAFILE이 없다는 문제상황 만들기 위해 삭제)

ALTER TABLESPACE TEST OFFLINE;

 

⑥ 복구해야되는 파일의 명세 조회

우리가 생성한 파일중 6번째 파일이 오류가 발생했다는 의미

SELECT * FROM V$RECOVER_FILE;

 

 

⑦ 백업할 파일 자체가 유실되었음. 빈껍데기를 생성진행 해줘야 함

ALTER DATABASE CREATE

DATAFILE 'C:\APP\ITWILL\ORADATA\TESTDB\TEST01.DBF'

AS 'C:\APP\ITWILL\ORADATA\TESTDB\TEST01.DBF';

 

 

⑧ 복구

RECOVER TABLESPACE TEST;

 

 

⑨ 테이블스페이스 ONLINE으로 변경

ALTER TABLESPACE TEST ONLINE;

 

 

⑩ 문제있는 테이블 스페이스가 있는지 (복구시켜야할 테이블스페이스가 있는지) 재확인

SELECT * FROM V$RECOVER_FILE;

 

 


[불완전복구 - 1. 시간기반 복구]

데이터를 INSERT시키다가 이 데이터가 잘못된 데이터라는 것을 앎.

해당 데이터 삭제 진행을 해야하는데 데이터가 아닌 테이블을 삭제해버리는 문제 발생.

그리고 시간이 지난 뒤 테이블을 삭제한 것을 앎. 이런 경우에 시간기반 복구를 진행해야 한다.

 

① 테이블 생성, 데이터 삽입 & COMMIT

CREATE TABLE INSA1

(ID NUMBER(3),

NAME VARCHAR2(10),

HDATE DATE)

 

INSERT INTO INSA1 VALUES (10,'ONE',SYSDATE);

INSERT INTO INSA1 VALUES (20,'TWO',SYSDATE);

COMMIT;

INSERT INTO INSA1 VALUES (30,'THREE',SYSDATE);

INSERT INTO INSA1 VALUES (40,'FOUR',SYSDATE);

COMMIT;

INSERT INTO INSA1 VALUES (50,'FIVE',SYSDATE);

COMMIT;

 

 

② ID = 30인 데이터부터 잘못된 데이터가 입력됨(가정사항). DELETE문을 작성해야 하는데 DROP을 진행함

 

③ DBA는 DB SHUTDOWN 진행

 

④ 현재 상태의 백업 진행 - (복구 방법이 어느 것으로 진행될지 모를 때 재진행 해야하므로 별도 저장)

 

⑤ 기존 CLOSE백업된 파일 중 DBF 파일만 덮어씌움

 

⑥ 복구 진행하되 특정 시각 기준으로 진행.

SET AUTORECOVERY ON --복구할때 확인하는 메세지 자동 AUTO 설정

RECOVER DATABASE UNTIL TIME '2019-01-29:15:10:50'; --해당시점으로 복구

 

 

⑦ 우리가 미래에 2019-01-29:15:10:50 시점 이후의 데이터를 사용하지 않을 것이라면 이후 로그기록은 더이상 필요없음.

ALTER DATABASE OPEN RESETLOGS;

 

⑧ 다시 해당 사용자로 로그인해서 테이블 조회시 원하는 시점으로 복구됨을 확인할 수 있다.

 

※ 로그 리셋을 진행하였기 때문에 로그스위치 진행시 아카이브로그파일 1번부터 시작함


 

 

 

[불완전복구 - 2. 취소기반 복구(아카이브 로그의 손실 발생시)]

- 복구를 진행하다가 아카이브 로그파일이 없는 경우 그 시점에서 CANCEL명령 내림

 

① 테이블 생성 & 데이터 삽입 & COMMIT & 로그 스위치

CREATE TABLE INSA1

(ID NUMBER,

NAME VARCHAR2(10),

HDATE DATE);

 

INSERT INTO INSA1 VALUES (10,'ONE',SYSDATE);

INSERT INTO INSA1 VALUES (20,'TWO',SYSDATE);

COMMIT;

@SWITCH <- 로그스위치는 자동으로 진행되겠지만 예제를 위해 SYS에서 실행시킨 것

 

INSERT INTO INSA1 VALUES (30,'THREE',SYSDATE);

INSERT INTO INSA1 VALUES (40,'FOUR',SYSDATE);

COMMIT;

@SWITCH

 

INSERT INTO INSA1 VALUES (50,'FIVE',SYSDATE);

COMMIT;

@SWITCH : 현재 아카이브 로그파일 48번 (해당 시점)

 

INSERT INTO INSA1 VALUES (60,'SIX',SYSDATE);

INSERT INTO INSA1 VALUES (70,'SEVEN',SYSDATE);

COMMIT;

@SWITCH

@SWITCH

 

 

 

② 테이블을 잘못 삭제함

 

③ 일렬번호 조회. 로그의 히스토리를 조회할 수 있다.

SELECT SEQUENCE#,

TO_CHAR(FIRST_TIME,'YYYY-MM-DDHH24:MI:SS')

FROM V$LOG_HISTORY

 

 

④ 그런데 아카이브로그파일이 손상/삭제되는 문제 발생!

`

 

⑤ SHUTDOWN IMMEDIATE & STARTUP MOUNT

 

⑥ DBF 파일만 복사해서 덮어씌움

⑦ 복구 진행 (CANCEL 처리할때까지 복구 하겠다.)

RECOVER DATABASE UNTIL CANCEL;

 

 

⑧ 로그리셋

ALTER DATABASE OPEN RESETLOGS;

 

⑨ SHUTDOWN IMMEDIATE 후 전체 파일 백업