가. 물리적 장애 : Disk fail, file error 등
나. 논리적 장애 : 사용자의 DML, DDL 실수 등
2. NOARCHIVELOG Mode 와 Archivelog Mode에서의 복구
가. NOARCHIVELOG MODE
- 특정 datafile에 장애 발생 시 해당 파일만 offline drop 처리하여 open하거나, 마지막으로 cold 백업했던 데이터파일을 모두 restore 하여 오픈한다. 단, offline drop 처리한 경우 해당 데이터파일만 손실되지만, cold 백업했던 순간으로 모든 데이터파일을 restore 한다면 그 시점부터의 데이터는 모두 손실된다.
- 만일 장애 시점에 필요한 데이터가 redolog 파일에 저장되어 있던 상태라면 데이터의 손실없이 복구도 가능하지만 그 가능성은 희박하다.
나. ARCHIVELOG MODE
- 완전복구 : 장애 난 시점까지의 모든 데이터를 복구
- 불완전 복구 : 백업데이터와 장애발생 사이의 시점으로 데이터를 복구
3. 예제
가. NO ArchiveLog에서 장애해결
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 |
-- NO ArchiveLog 모드인지 확인 ARCHIVE LOG list; CREATE TABLESPACE test DATAFILE '/home/oracle/oradata/testdb/test01.dbf' SIZE 1M; -- cold 백업 수행 shutdown IMMEDIATE !cp /home/oracle/oradata/testdb/*.dbf /data/backup/ !cp /home/oracle/oradata/testdb/*.ctl /data/backup/ !cp /home/oracle/oradata/testdb/*.log /data/backup/ startup -- 장애발생 : 데이터파일 손실 !rm -rf /home/oracle/oradata/testdb/test01.dbf ALTER SYSTEM SWITCH logfile; / / shutdown ABORT -- 인스턴스가 내려간 이후 재시작 시도 -- 장애가 발생하여 mount 단계까지만 올라옴 startup -- restore 수행 !cp /data/backup/test01.dbf /home/oracle/oradata/testdb/ -- 복구를 시도하나 archivelog 파일이 존재하지 않아 복구에 실패함. -- 아래 명령어도 가능함 -- recover tablespace test; -- recover datafile '/home/oracle/oradata/testdb/test01.dbf'; RECOVER database ; -- 데이터베이스 open에 실패함 ALTER DATABASE OPEN ; -- 해당 데이터파일을 offline 처리하여 데이터베이스를 open하기로 함 ALTER DATABASE DATAFILE '/home/oracle/oradata/testdb/test01.dbf' OFFLINE DROP ; -- open 시도 ALTER DATABASE open ; -- 상태확인 SELECT status FROM v$instance; |
나. ArchiveLog에서 장애해결
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 |
-- ArchiveLog 모드인지 확인 ARCHIVE LOG list; CREATE TABLESPACE test DATAFILE '/home/oracle/oradata/testdb/test01.dbf' SIZE 1M; -- test 테이블스페이스 hot 백업 ALTER TABLESPACE test BEGIN backup; !cp /home/oracle/oradata/testdb/test01.dbf /data/backup/ ALTER TABLESPACE test END backup; -- 장애 발생 !rm -f /home/oracle/oradata/testdb/test01.dbf CREATE TABLE abc ( no number) TABLESPACE test; INSERT INTO abc VALUES (111); INSERT INTO abc VALUES (222); commit ; SELECT * FROM abc; -- 장애발생 확인 ALTER TABLESPACE test offline; ALTER TABLESPACE test online; -- restore 후에 복구 시도 !cp /data/backup/test01.dbf /home/oracle/oradata/testdb/ RECOVER TABLESPACE test; -- 아래명령어도 동일한 복구 가능 -- recover datafile '/home/oracle/oradata/testdb/test01.dbf'; ALTER TABLESPACE test online; -- 데이터 복구 확인 SELECT * FROM abc; |
참고 : 백업된 데이터 파일이 없을 경우 복구하는 방법
redolog 및 ARCHIVELOG 파일을 토대로 복구하는 것이므로 ARCHIVELOG 모드일 때 가능하다. 만일 redolog 파일에 복구에 필요한 모든 정보가 저장되어 있다면 NOARCHIVELOG 모드에서도 가능할 수 있으나 가능성이 매우 희박하다.
1
2 |
ALTER DATABASE CREATE DATAFILE '/home/oracle/oradata/testdb/test01.dbf' AS '/home/oracle/temp/test01.dbf' ; |