본문 바로가기
STUDY/ORACLE

Oracle 16일차 -복구(Archive mode):완전복구, 불완전복구

by Anne of Green Galbes 2019. 1. 29.

16일차


백업 

1.close 백업

2.open 백업


복구

1. noarchive mode--닫힌복구

                  다른위치에 복구(imsy)


2. archive mode-완전복구(4가지)

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

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

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

4) 백업하지 않은 datafile복구


불완전복구(3가지)

1) 시간기반 복구

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

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

        17일차


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


log파일 복구(4가지)

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

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

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

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


백업

Close 백업 : 가장 안전하면서 가장 완벽한 복구


Open 백업

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';

▶ control file은 1개만 백업해도 괜찮음

▶ log file은 백업 불가 : 백업하는 과정도 log에 기록

▶!cp : OS의 명령을 editplus에서 실행



복구


Noarchive Mode(닫힌복구)

다른위치에 복구(imsy)



Archive Mode

[사전작업 : archive 모드로 변경]

1. 아카이브 모드인지 아닌지 확인

ARCHIVE LOG LIST



2. 아카이브로그로 활성화

① SHUTDOWN IMMEDIATE


② 파라메타파일 수정

log_archive_dest_1='location=C:\ADISK\ARC1'

log_archive_dest_2='location=C:\ADISK\ARC2'

log_archive_format=%s_%t_%r.arc


③ MOUNT상태까지 STARTUP

STARTUP MOUNT


④ 데이터베이스를 ARCHIVELOG상태로 변경

ALTER DATABASE ARCHIVELOG;


⑤ 데이터베이스 OPEN

ALTER DATABASE OPEN;


현재 CURRENT인 37번을 백업


3. ARCHIVELOG상태 백업(닫힌 백업실행)


4.@SWITCH 후 생성된 아카이브로그 파일 확인



[복구]


1. 완전복구(4가지)


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

① 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


② TEST.SQL 실행


③ _USER'@'_CONNECT_IDENTIFIER> SHOW USER


④ System Tablespace에 문제 발생

SHTUDOWN → SYSTEM01.DBF 삭제


⑤ ERROR 확인

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

FROM V$DATAFILE A, V$DATAFILE_HEADER B

WHERE A.FILE#=B.FILE#


⑥ 현재 위치 확인

SELECT STATUS FROM V@INSTANCE;



⑦ 백업받아 놓은 파일에서 SYSTEM01.DBF파일 복사후 이동


⑧ 데이터베이스 복구

RECOVER DATABASE;

AUTO




⑨ 복구 & 데이터 확인

ALTER DATABASE OPEN;

@ERROR

SELECT * FROM TEST;





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

① 새로운 생성자 생성 & 권한 부여

CREATE USER ST

IDENTIFIED BY ST

DEFAULT TABLESPACE USERS

TEMPORARY TABLESPACE TEMP

QUOTA UNLIMITED ON USERS;


GRANT CONNECT, RESOURCE TO ST;


SELECT USERNAME,DEFAULT_TABLESPACE FROM DBA_USERS

WHERE USERNAME='ST';



② 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


③ TEST.SQL 실행


④ ST.TEST 테이블 확인

SELECT * FROM ST.TEST;



⑤ USER에 에러 발생

USERS OFFLINE → USER01.DBF 삭제

ALTER TABLESPACE USERS OFFLINE;



⑥ 에러 확인

SHUTDOWN IMMEDIATE → STARUP → OFF라인 확인


⑦ 백업받아 놓은 파일에서 USERS01.DBF파일 복사후 이동


⑧ USERS 복구

RECOVER TABLESPACE USERS;

AUTO



⑨ USERS ONLINE으로 변경 & 확인

ALTER TABLESPACE USERS ONLINE;


@DT



⑩ 데이터복구 확인

SELECT * FROM ST.TEST;




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

현재 디스크가 아닌 다른 디스크에 복구


① 새로운 사용자 생성 및 권한 부여

CREATE USER ST

IDENTIFIED BY ST

DEFAULT TABLESPACE USERS

TEMPORARY TABLESPACE TEMP

QUOTA 1M ON USERS;


GRANT CONNECT, RESOURCE TO ST;


SELECT USERNAME,DEFAULT_TABLESPACE FROM DBA_USERS

WHERE USERNAME='ST';



② TEST.SQL 실행


③ ST.TEST 테이블 확인

SELECT * FROM ST.TEST;



④ USER에 에러 발생

USERS OFFLINE → USER01.DBF 삭제


ALTER TABLESPACE USERS OFFLINE;



⑤ 에러 확인

SHUTDOWN IMMEDIATE → STARUP → OFF라인 확인


⑥ 백업받아 놓은 파일에서 USERS01.DBF파일을 ADISK\DISK1에 복사


⑦ 오라클에서 USERS의 위치를 변경

ALTER TABLESPACE USERS RENAME

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

TO 'C:\ADISK\DISK1\USERS01.DBF';




⑧ USERS 복구

RECOVER TABLESPACE USERS;

AUTO



⑨ USERS ONLINE으로 변경 & 확인

ALTER TABLESPACE USERS ONLINE;




4) 백업하지 않은 datafile복구

① TEST 테이블 스페이스 생성

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.SQL 실행


④ 조회

SELECT TABLE_NAME, TABLESPACE_NAME FROM DBA_TABLES

WHERE OWNER='ST';



⑤ TEST에 에러 발생

TEST OFFLINE → TEST01.DBF삭제


⑥ 복구할 파일 유무 확인

SELECT * FROM V$RECOVER_FILE;


우리가 만든 파일중 6번째에 문제가 생겼다


⑦ TEST01.DBF 빈 껍데기 생성

ALTER DATABASE CREATE

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

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




⑧ 데이터 복구

RECOVER TABLESPACE TEST

AUTO



⑨ TEST ONLINE으로 변경 & 데이터 확인

ALTER TABLESPACE TEST ONLINE;

SELECT * FROM ST.TEST;

SELECT * FROM V$RECOVER_FILE;



▶ 복구할 데이터확인



2. 불완전복구(3가지)


1) 시간기반 복구

데이터를 INSERT시키던중 잘못된 데이터가 아닌 테이블을 삭제. 그리고 시간이 지난 후 테이블을 삭제한 것을 알게되어,

그 후 입력한 데이터는 무시하고 테이블 삭제전까지만 의도적으로 복구


① KIM에서 INSA1 테이블 생성

CREATE TABLE INSA1

(ID NUMBER(3),

NAME VARCHAR2(10),

HDATE DATE)


② 데이터 입력

입력 → 5초 정도 후 COMMIT → 입력 → 5초 정도 후 COMMIT → 데이터 입력 → COMMIT

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;


SELECT ID,NAME,TO_CHAR(HDATE,'YYYY-MM-DD:HH24:MI:SS')

FROM INSA1;



③ INSA1테이블 삭제

○ ID=30번부터 잘못된 데이터 → 데이터가 아닌 테이블을 잘못 삭제

DROP TABLE INSA1;



④ SYS에서 데이터베이스 SHUTDOWN

SHUTDOWN IMMEDIATE



⑤ MOUNT상태까지 시작

STARTUP MOUNT



⑥ 백업받은 파일에서 DBF파일만 ORADATA에 복사


⑦ 데이터 복구 : 30번 데이터 입력 전까지

SET AUTORECOVERY ON

RECOVER DATABASE UNTIL TIME ‘2019-01-29:15:10:35’



30번 데이터 입력 전까지 복구


⑧로그 초기화

복구전까지 만들어진 로그파일은 미래이기 때문에 불안정

ALTER DATABASE OPEN RESETLOGS;


RESETLOGS : 아카이브 LOG가 1번부터 시작


⑨ KIM에서 데이터 복구 확인

SELECT * FROM INSA1;



SYS에서 @SWITCH 후 새로 생성된 아카이브로그 확인



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

시간기반과 똑같음

시간기반 : 과거시점의 어디까지 복구해

취소기반 : 아카이브 로그 손상 전까지만 복구??

                 1번 복구할래? YES

                 2번 복구할래? YES

     3번 복구할래? NO! 그만할래


① 현재 아카이브 로그 파일


② KIM에 INSA1 테이블 생성

CREATE TABLE INSA1

(ID NUMBER,

NAME VARCHAR2(10),

HDATE DATE);


③ INSA1에 데이터 입력 및 @SWITCH

KIM : 입력 → 5초 정도 후 COMMIT

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

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

COMMIT;


SYS : @SWITCH


KIM : 입력 → 5초 정도 후 COMMIT

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

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

COMMIT;


SYS : @SWITCH


KIM : 입력 → 5초 정도 후 COMMIT

입력 → 5초 정도 후 COMMIT

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

COMMIT;


SYS : @SWITCH


④ 현재 아카이브 로그

마지막 번호 기억


⑤  KIM : INSA1에 데이터 입력

입력 → 5초 정도 후 COMMIT

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

INSERT INTO INSA1 VALUES (70, ‘SEVEN’, SYSDATE);

COMMIT;


⑥ SYS에서 @SWITCH 4번 실행


⑦ KIM에서 실수로 INSA1테이블 삭제

DROP TABLE INSA1;



⑧ SYS에서 LOG파일 확인 & 아카이브 로그 삭제(손상)

SELECT SEQUENCE#,

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

FROM V$LOG_HISTORY;



47, 48번 아카이브파일 삭제


⑨ 데이터 복구

SHOUTDOWN → DBF파일만 ORADATA에 복사 START MOUNT


⑩ SYS에서 복구

REECOVER DATABASE UNTIL CANCEL;


47번부터는 아카이브파일이 없음 → 복구할 필요 X

CANCEL전까지 복구


⑪ 데이터 베이스 오픈 & KIM에서 데이터 복구 확인

ALTER DATABASE OPEN RESETLOGS;



SELECT * FROM INSA1;




'STUDY > ORACLE' 카테고리의 다른 글

Oracle 17일차(2) - 자바 & 오라클 연동  (1) 2019.01.30
Oracle 17일차(1) - 복구  (0) 2019.01.30
Oracle 15일차  (0) 2019.01.28
Oracle 14일차(2)-Store user data, partition  (0) 2019.01.25
Oracle 14일차(1)-Segment and space management  (0) 2019.01.25

댓글