난이도: ★☆☆☆☆
문제 1: SPFILE을 RESTORE하라. (2분)
/* 서버 파라미터 파일 (SPFILE) 백업 리스트 확인 */
LIST BACKUP OF SPFILE;
/* 백업 파일로 저장된 SPFILE을 지정한 디렉토리에 Restore */
RESTORE SPFILE TO '/tmp/spfile.ora';
$ sqlplus / as sysdba
CREATE PFILE='/tmp/pfile.ora' FROM SPFILE='/tmp/spfile.ora'
shut immediate;
STARTUP NOMOUNT PFILE='/tmp/pfile.ora';
CREATE SPFILE FROM PFILE='/tmp/pfile.ora';
난이도: ★★★★☆
문제 2: Controlfile을 삭제하고, backup 파일로부터 Controlfile을 RESTORE하고 다시 데이터베이스를 오픈하여라. (8분)
/* Controlfile은 두 개 이상의 서로 다른 디렉토리로 복제되어 사용되며, 한 개의 파일이라도 장애가 발생하면, 데이터베이스에 정상적으로 접근할 수 없게 되니 실습 진행에 주의를 요함. */
/* Controlfile 중 한 개에만 장애가 발생하면, RMAN 백업본에서 정상적인 Controlfile을 복제하여 정상화할 수 있으나, 모든 Controlfile에 장애가 발생한다면 CREATE CONTROLFILE 커맨드를 이용하여 Controlfile을 아예 새로 생성하는 수밖에 없다. */
1. Controlfile 백업 리스트를 확인하고, Sql*Plus에서 Controlfiles가 저장된 위치를 확인한다.
LIST BACKUP OF CONTROLFILE;
$ sqlplus / as sysdba
SELECT *
FROM v$controlfile;
show parameter control_files;
2. Controlfile 중 하나를 삭제하고, 데이터베이스 실행에 오류가 발생하는 것을 확인한다.
$ rm -rf /u01/app/oracle/oradata/ORCL/controlfile/o1_mf_l12b41v3_.ctl
/* 오류가 발생하는 것을 확인한다. */
sqlplus / as sysdba
SHUT IMMEDIATE;
STARTUP FORCE;
3. 다른 Controlfile을 복제하여 데이터베이스가 정상적으로 open되는 것을 확인한다.
$ cp /u01/app/oracle/fast_recovery_area/ORCL/controlfile/o1_mf_l12b41xl_.ctl /u01/app/oracle/oradata/ORCL/controlfile/o1_mf_l12b41v3_.ctl
sqlplus / as sysdba
STARTUP FORCE;
4. 이번엔 모든 Controlfile을 없애버린 상태에서 복구작업을 실습하겠다. CREATE CONTROLFILE 커맨드를 이용할 것이다. 먼저 RMAN에서 Controlfile의 백업본이 있는지 확인하고, Controlfile 백업본을 TRACE 텍스트 파일로 생성한다.
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/tmp/control.txt';
$ more /tmp/control.txt
5. Controlfile 백업 리스트를 확인하고, Controlfile 두 개를 모두 삭제한다. 절대, 절대 4번 작업과 5번 작업의 순서를 혼동하지 말라. 데이터베이스 접속이 안 되는 것을 확인하고, 그리고 다시 Controlfile을 생성해서 데이터베이스에 접속하여라.
$ rm -rf /u01/app/oracle/oradata/ORCL/control01.ctl
$ rm -rf /u01/app/oracle/fast_recovery_area/ORCL/control02.ctl
$ sqlplus / as sysdba
shut abort;
startup;
/* 위에서 생성한 /tmp/control.txt 텍스트파일의 커맨드를 복사 붙여넣기해서 sql에서 실행 */
CREATE CONTROLFILE REUSE DATABASE 'ORCL' RESETLOGS ARCHIVELOG ~~~
ALTER DATABASE OPEN RESETLOGS;
난이도: ★★☆☆☆
문제 3: 특정한 테이블스페이스에 테이블을 생성하고, 데이터파일을 삭제한 후, 다시 Restore 및 Recover하고, 테이블을 체크하여라. (10분)
1. 특정한 테이블스페이스 (users)에 테이블을 생성하고, 데이터베이스를 한 번 전체 백업한다.
SELECT tablespace_name, file_name
FROM dba_data_files;
CREATE TABLE myt (id NUMBER) TABLESPACE users;
INSERT INTO myt VALUES (1);
COMMIT;
BACKUP DATABASE;
2. users 테이블스페이스의 데이터파일을 삭제하고, 버퍼 캐시 내용을 몽땅 삭제하면 방금 새로 만든 테이블에 연결할 수 없을 것이고, 데이터베이스 종료 후 재접속도 불가능하게 될 것이다.
$ rm -rf /u01/app/oracle/oradata/ORCL/users01.dbf
$ sqlplus / as sysdba
ALTER SYSTEM FLUSH BUFFER_CACHE;
shut abort;
startup;
3. 데이터파일을 Restore 및 Recover하면 정상적으로 데이터베이스에 접속할 수 있게 될 것이다.
RUN { RESTORE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf';
RECOVER DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf';
}
난이도: ★★☆☆☆
문제 4: 특정한 테이블스페이스에 테이블을 생성하고, 테이블스페이스를 삭제한 후, backup 파일없이 테이블스페이스를 다시 Restore 및 Recover하여라. (10분)
/* 테이블스페이스를 생성한 후에 모든 archived redo files를 가지고 있다면, RMAN 백업 없이도 archived redo log files을 이용하여 missing된 데이터파일을 recover할 수 있게 될 것이다. */
/* RMAN 백업 파일 대신 Archived redo log files을 이용하여 Restore 및 Recover하는 경우에도 사용하는 커맨드는 문제3과 똑같으니 문제4의 실습은 생략한다. */
난이도: ★★★☆☆
문제 5: SET NEWNAME 커맨드를 이용하여 데이터파일을 새로운 위치에 Restore하여라. 테이블스페이스와 데이터베이스를 새로운 위치에 Restore시켜라. (20분)
RUN {SET NEWNAME FOR DATAFILE 7 TO '/u01/app/oracle/oradata/ORCL/datafile7.dbf';
RESTORE DATAFILE 7; }
RUN {SET NEWNAME FOR TABLESPACE users TO '/u01/app/oracle/oradata/ORCL/tableusers%U';
RESTORE TABLESPACE USERS; }
RUN {SET NEWNAME FOR DATABASE TO '/u01/app/oracle/oradata/ORCL/alldb%U';
RESTORE DATABASE; }
난이도: ★★★☆☆
문제 6: Block Media Recovery를 수행하여라. (15분)
/* block corruption이 발생했을 때는 전체 데이터베이스 혹은 데이터파일을 restore 및 recover 할 필요가 없다. BLOCKRECOVER 커맨드를 사용하여, 백업 파일에서 corruption이 발생한 블록을 특정할 수 있다. */
1. 새 테이블스페이스를 만들고, 테이블을 생성한다. 그리고, 테이블스페이스의 블록 번호를 확인해 본다. 실습에서는 TBL_CORRUPTION 세그먼트의 header_block은 130번 블록이다.
$ sqlplus / as sysdba
CREATE TABLESPACE tbl_corruption DATAFILE '/u01/app/oracle/ORCL/datafile/tbs_corruption.dbf' SIZE 10M;
CREATE TABLE tbl_corruption (id NUMBER) TABLESPACE tbl_corruption;
INSERT INTO tbl_corruption VALUES (1);
COMMIT;
SELECT header_block
FROM dba_segments
WHERE segments_name = 'TBL_CORRUPTION';
2. TBS_CORRUPTION 테이블스페이스의 데이터파일 번호를 확인하고, 블록 번호 130번을 건너뛰고 출력한다.
SELECT file_name, file_id, tablespace_name
FROM dba_data_files;
$ dd of=/u01/app/oracle/oradata/ORCL/datafile/tbs_corruption.dbf bs=8192 conv=notrunc seek=130
3. corruption된 블록을 복구하기 위해서, RECOVER DATAFILE을 사용할 수도 있지만, BLOCKRECOVER CORRUPTION LIST 커맨드로 corruption된 블록 리스트 전체를 오라클이 한꺼번에 복구작업을 수행할 수 있다.
BLOCKRECOVER CORRUPTION LIST;
BLOCKRECOVER DATAFILE 13 BLOCK 130;
난이도: ★★★★☆
문제 7: 데이터베이스의 모든 물리 파일을 삭제하여라. 그리고 Disaster Recovery를 수행해라. (20분)
/* 데이터베이스 백업 후 데이터파일, Controlfile, 그리고 Spfile를 삭제할 것이다. 그리고 다시 이 파일들을 복구하는 방식으로 Disaster Recovery 실습을 진행할 것이다. */
난이도: ★★☆☆☆
문제 8: 데이터베이스를 백업하고, 테이블을 생성하고, SCN값을 확인하여라. 그리고 테이블을 Truncate하고, SCN, TIME, SEQUENCE 옵션을 이용하여 불완전 복구(Incomplete Recovery)을 진행하라. (15분)
/* 불완전 복구 (Incomplete Recovery)는 No Archive Mode에서도 사용할 수 있는 리커버리 방식으로, 인스턴스가 open되지 않은 상태에서 복구를 진행하고 open 시 corruption 직전 상태의 log를 읽는 것을 포기하겠다는 resetlog 옵션을 사용해야 한다. */
1. 전체 백업
rman target /
BACKUP DATABASE PLUS ARCHIVELOG;
2. 임의 테이블을 생성하고 그 시점의 SCN 및 TIME 확인
CREATE TABLE table2 AS SELECT * FROM dba_objects;
SELECT COUNT(1) FROM table2;
SELECT current_scn FROM v$database;
SELECT scn_to_timestamp(5711772) FROM dual;
3. 임의 테이블을 TRUNCATE하고 데이터베이스 SHUT 후 다시 MOUNT 방식으로 오픈, 그리고 RECOVER DATABASE
TRUNCATE TABLE table2;
SELECT COUNT(1) FROM table2;
SHUT IMMEDIATE;
STARTUP MOUNT;
RUN { SET UNTIL SCN 5711772;
RESTORE DATABASE;
RECOVER DATABASE; }
4. 불완전 리커버리 진행하기
ALTER DATABASE OPEN RESETLOGS;
SELECT COUNT(1) FROM table2;
난이도: ★★☆☆☆
문제 9: 이전에 수행한 불완전 복구를 재현하여라. Previous Incarnation 이전 버전으로 데이터베이스를 Recover하여라. (5분)
/* Database Incarnation이란 RESETLOGS로 인스턴스를 오픈했을 때(불완전 리커버리를 진행했을 때) 갱신되는 리스트이다. Incarnation 번호가 다른 SCN끼리는 호환이 되지 않는다. */
/* Incarnation 번호 확인하는 쿼리 */
SELECT incarnation#, resetlogs_change#, status
FROM v$database_incarnation;
이전 Incarnation 번호의 SCN으로 RECOVER하는 것은 불가능하다.
그럴 때는 RESET DATABASE 커맨드로 적용 Incarnation 번호를 옮길 수 있다. 단, 이 커맨드를 사용하기 위해서는 해당 Incarnation 번호일 때의 백업파일이 필요하다.
RESET DATABASE TO INCARNATION 2;
난이도: ★★★★☆
문제 10: 불완전 복구 시나리오의 Prerequisites를 점검하고, TSPIRT(TableSpace Point In Time Recovery)를 수행하여라. (15분)
/* 전체 데이터베이스를 Restore 및 Recover 하는 작업은 시간이 많이 걸릴 수 있는 작업이기 때문에, 특정 테이블스페이스만 특정한 포인트타임으로 옮길 수 있는 TSPIRT가 좋은 선택이 될 수 있다. */
/* TSPITR를 사용하기 전에, 해당 테이블스페이스의 오브젝트 안에 Dependencies가 있는지 확인해야 한다. 다른 테이블스페이스와 연관이 있으면 특정 테이블스페이스만 특정 포인트 타임으로 되돌리기가 무척 복잡해질 것이기 때문이다. 테이블스페이스 밖의 오브젝트와 관계가 있는지 체크하는 DBMS_TTS.TRANSPORT_SET_CHECK 프로시저는 TSPITR를 사용하기 전에 반드시 사용되어야 한다. */
1. 임의 테이블스페이스를 생성하고, 테이블을 생성한다. 그리고 일단 전체 백업을 진행한다.
CREATE TABLESPACE TBS_NEW DATAFILE '/u01/app/oracle/oradata/ORCL/tbs_new01.dbf' SIZE 10M
AUTOEXTEND NEXT ON 10M;
CREATE USER C##user IDENTIFIED BY asdf0930k;
GRANT DBA TO C##tst_user;
ALTER USER C##tst_user DEFAULT TABLESPACE tbs_new;
$ sqlplus C##tst_user/asdf0930k;
CREATE TABLE mytable AS SELECT * FROM dba_objects;
$ rman target /
BACKUP DATABASE PLUS ARCHIVELOG;
2. DBMS_TTS.TRANSPORT_SET_CHECK 프로시저를 적용하고, transport_set_violations 및 ts_pirt_objects_to_be_dropped 뷰를 이용하여 TSPITR를 적용하려는 테이블스페이스에 dependencies가 있는지 확인한다.
BEGIN
dbms_tts.transport_set_check('TBS_NEW',TRUE,TRUE);
END;
/
SELECT *
FROM transport_set_violations;
SELECT *
FROM ts_pitr_objects_to_be_dropped
WHERE tablespace_name IN ('TBS_NEW');
3. 보조 인스턴스가 사용할 디렉토리를 생성하고, TSPITR 커맨드를 작성한다.
SELECT current_scn FROM v$database;
TRUNCATE TABLE C##tst_user.mytable;
$ mkdir /tmp/aux
$ rman target /
RECOVER TABLESPACE tbs_new UNTIL SCN 5721731 AUXILIARY DESTINATION '/tmp/aux';
4. TSPITR를 적용한 테이블스페이스를 ONLINE 상태로 바꾸면 끝
ALTER TABLESPACE tbs_new ONLINE;
'Oracle > OCM Journey' 카테고리의 다른 글
3-6 Database Availability - Flashback Database (0) | 2023.03.28 |
---|---|
3-5 Database Availability - Checking RMAN Performances (0) | 2023.03.27 |
3-3 Database Availability - Using RMAN to perform database backups (0) | 2023.03.22 |
3-2 Database Availability - Configure Recovery Manager (RMAN) (1) | 2023.03.21 |
3-1 Database Availability - Maintain Recovery Catalogs (0) | 2023.03.19 |