Oracle에서 꼭 지켜야 할 원칙이 몇 가지 있습니다. 그 중 아주 중요한 것은 파일에 I/O가 발생하고 있을 땐 절대로 이동하거나 복사, 복구 작업을 해서는 안된다는 것입니다. 그래서 장애가 발생할 경우 복구하기 위해 해당 파일을 I/O가 발생하지 않도록 만들어 놓고 복구 작업을 수행해야 합니다.
그래서 복구할 때 해당 Data File을 I/O가 일어나지 않게 만들 수 있느냐 없느냐에 따라 DB를 Open시킨 상태에서 복구할 수 있는지 없는지가 결정됩니다. 해당 Data File에 I/O가 일어나지 않게 하려면 Offline이나 shutdown을 시켜야 하는데 여기서는 우선 Offline 시켜서 복구하는 방법, 즉 DB를 종료하지 않고 Open한 상태에서 장애난 Tablespace만 복구하는 방법을 배워보도록 하겠습니다.
장애 상황 설명
DBA는 개발팀장에게서 현재 운영 DB에서 데이터가 입력되지 않는다는 연락을 받았습니다. 확인 결과 현재 운영 중인 DB에서 test01.dbf가 삭제된 것을 발견했습니다. 다행히 백업 파일은 존재합니다. 현재 DB는 Open 상태이며 DB 종료 없이 빨리 복구해야 합니다. 핵심은 offline이 되는 Tablespace를 어떻게 복구하느냐입니다.
Step 0) 장애 환경 세팅
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
SQL> archive log list;
SQL> alter database open;
SQL> alter tablespace test begin backup;
SQL> !cp /ORA19/app/oracle/oradata/ORACLE19/test01.dbf /data/backup/open/
SQL> alter tablespace test end backup;
SQL> !rm -rf /ORA19/app/oracle/oradata/ORACLE19/test01.dbf
SQL> create table abc (no number) tablespace test;
SQL> insert into abc values (1);
SQL> insert into abc values (2);
SQL> commit;
SQL> select * from abc;
위에서 마지막에 commit이 되는 이유는 Data File이 아닌 Redo Log File에 기록되기 때문입니다.
Step 1) 장애 발생 확인
SQL> alter tablespace test offline;
SQL> alter tablespace test online;
**Step 2) 백업 파일로부터 복구하기
SQL> !cp /data/backup/open/ test01.dbf /ORA19/app/oracle/oradata/ORACLE19/test01.dbf
SQL> recover tablespace test;
SQL> alter tablespace test online;
SQL> select * from abc;
여기서 핵심은 백업 Data File에는 abc 테이블에 대한 내용이 없습니다. 이 내용은 Redo Log File에 기록되어 있었기에 백업 Data File에 그 내용이 복구될 수 있었던 것입니다. 보시면 offline
만 이루어졌지 DB를 shutdown
하지 않고 진행했습니다.
system
, undo
테이블 스페이스에 장애가 발생했을 경우 사용하는 방법입니다. 이 경우 어쩔 수 없이 shutdown
한 후 복구해야 합니다.
Step 0) 장애 환경 세팅
-- system 파일 백업 받기
SQL> shutdown immediate;
SQL> !cp /ORA19/app/oracle/oradata/ORACLE19/system01.dbf /data/backup/close/
SQL> startup;
SQL> select status from v$instance;
-- 데이터 추가
SQL> create table test1
2 (no number)
3 tablespace system;
SQL> insert into values (1);
SQL> commit;
SQL> set line 200
SQL> col tablespace_name for a10
SQL> col file_name for a50
SQL> select tablespace_name, bytes/1024/1024 MB, file_name
2 from dba_data_files;
-- 장애 유발
SQL> !rm -rf /ORA19/app/oracle/oradata/ORACLE19/system01.dbf
Step 1) shutdown 후 mount 상태에서 Data File 복사 후 Recover
SQL> shutdown immediate;
SQL> startup mount;
-- 복구
SQL> !cp /data/backup/close/system01.dbf /ORA19/app/oracle/oradata/ORACLE19/system01.dbf
SQL> recover database;
SQL> alter database open;
SQL> select status from v$instance;
SQL> select * from test1;
장애 상황
DBA는 시스템 엔지니어에게서 서버의 파일을 정리하다가 파일을 잘못 지운 것 같다라는 연락을 받고 운영 중인 DB 서버를 긴급 점검했습니다. 그러던 중 khyup 테이블 스페이스의 데이터 파일이 삭제된 것을 발견했습니다. 문제는 khyup 테이블 스페이스의 백업 파일이 없다는 것입니다. 다행히 archive log file은 존재합니다.
Step 0) 장애 상황 세팅
SQL> create tablespace khyup
2 datafile '/ORA19/app/oracle/oradata/ORACLE19/khyup01.dbf' size 10M;
SQL> !rm -rf /ORA19/app/oracle/oradata/ORACLE19/khyup01.dbf
SQL> !ls -al /ORA19/app/oracle/oradata/ORACLE19/khyup01.dbf
-- 파일이 삭제된 후 Data File에 데이터 입력 발생
SQL> create table student
2 (no number,
3 name varchar2(20))
4 tablespace khyup;
SQL> insert into student values (1,'aaaa');
SQL> insert into student values (2,'bbbb');
SQL> commit;
SQL> select * from student;
Step 1) 장애 발생 확인
SQL> alter tablespace khyup offline;
SQL> alter tablespace khyup online;
Step 2) 데이터 파일 생성 후 복구
SQL> alter database
2 create datafile '/ORA19/app/oracle/oradata/ORACLE19/khyup01.dbf'
3 as '/data/temp/khyup01.dbf'
SQL> recover tablespace khyup;
SQL> alter tablespace khyup online;
SQL> select * from student;
SQL> select tablespace_name, bytes/1024/1024 MB, file_name
2 from dba_data_files;
이처럼 백업 파일이 없을 때 새로 데이터 파일을 생성하게 되면 새로 생성되는 파일의 checkpoint scn은 0번으로 초기화됩니다.
복구를 수행하게 되면 checkpoint scn 정보가 변경됩니다.
장애 상황 설명
이 디렉토리가 있는 하드디스크가 불량이 나서 장애가 발생했습니다. 다행히 redo log file과 archive log file은 다른 경로에 이상없이 있다고 합니다. 하드디스크를 사기 위해 연락했는데 4시간이나 소요된다고 해서 4시간 동안 DB를 중단시킬 수 없기에 /data/temp
라는 곳에 즉시 백업된 데이터 파일을 복원하고 복구 작업을 시작하여 DB를 운영하고 하드디스크가 도착하면 원래 경로로 데이터 파일을 이동시키려고 합니다. 백업 파일을 조사하던 중 test01.dbf
파일이 백업되지 않은 것도 발견했습니다.
Step 0) 장애 환경 세팅
-- 데이터 추가
SQL> create table test1
2 (no number)
3 tablespace system;
SQL> insert into values (1);
SQL> commit;
-- 데이터 파일 cold backup
SQL> shutdown immediate;
SQL> !cp /ORA19/app/oracle/oradata/ORACLE19/*.dbf /data/backup/close/
-- test01.dbf는 백업이 되지 않은 상태
SQL> !rm -rf /data/backup/close/test01.dbf
SQL> startup;
-- 하드디스크 장애
SQL> !rm -rf /ORA19/app/oracle/oradata/ORACLE19/*.dbf
SQL> shutdown abort;
Step 1) 임시 경로로 데이터 파일 복원
-- 에러 발생
SQL> startup;
SQL> select status from v$instance;
SQL> !mkdir /data/temp
SQL> !cp /data/backup/close/*.dbf /data/temp/
SQL> select name from v$datafile;
SQL> alter database rename
2 file '/ORA19/app/oracle/oradata/ORACLE19/system01.dbf'
3 to '/data/temp/system01.dbf';
SQL> alter database rename
2 file '/ORA19/app/oracle/oradata/ORACLE19/undotbs01.dbf'
3 to '/data/temp/undotbs01.dbf';
SQL> alter database rename
2 file '/ORA19/app/oracle/oradata/ORACLE19/sysaux01.dbf'
3 to '/data/temp/sysaux01.dbf';
SQL> alter database
2 create datafile '/ORA19/app/oracle/oradata/ORACLE19/test01.dbf'
3 as '/data/temp/test01.dbf';
SQL> select name from v$datafile;
SQL> recover database;
SQL> alter database open;
SQL> select * from test1;
참고
백업파일이 없는 경우, 복구방법에 대해서 질문이 있습니다.
alter database
create datafile '/ORA19/app/oracle/oradata/ORACLE19/khyup01.dbf'
as '/data/temp/khyup01.dbf'
쿼리에서
'/ORA19/app/oracle/oradata/ORACLE19/khyup01.dbf'파일이 기존에 존재했지만 삭제된 파일이고,
'/data/temp/khyup01.dbf'파일이 새로 생성할 데이터파일인데,
삭제된 파일을 이용해서 어떻게 새로 데이터 파일을 만들어 복구하는 건가요?