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 |
댓글