강좌
클라우드/리눅스에 관한 강좌입니다.
데이터베이스 분류

테이블스페이스 백업/복구(hot backup 시나리오 실습)

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

테이블스페이스 백업/복구(hot backup 시나리오 실습)

 

t.gif
t.gif
Microsoft Windows 2000 [Version 5.00.2195]
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
작성자: 강명규

간단히 아카이브로그에서 테이블스페이스 복구 시나리오의 예를 들겠다.

시나리오
DBMS는 아카이브로그 상태에 있다.
USERS라는 데이터 테이블스페이스를 분실했다.
완전복구를 통해 모든 데이터를 복구한다.

손상된 테이블스페이스를 제외한 모든 테이블스페이스는 가용상태로 두어 downtime을 최소화할 것이다.
괜한 말로써 설명은 헷갈리기만 한다. 바로 예를 보자.


우선 데이터베이스가 아카이브로그 모드여야 한다.
여기서는 no archive log mode에 있다고 가정하고, 이를 archive log mode로 변경하겠다.

초기화패러미터파일을 보면 아래의 내용이 주석처리되어 있을 것이다. 아래와 같이 주석을 제거해준다.

log_archive_start = true
log_archive_dest_1 = "location=C:oracleoradatadbarchive"
log_archive_format = %%ORACLE_SID%%T%TS%S.ARC


DB를 mount모드를 열어 DB를 archive log mode로 변경한다.
(DB가 online상태라면 우선 shutdown부터 한다.)

D:>set NLS_LANG=AMERICAN_AMERICA.KO16KSC5601

D:>sqlplus /nolog

SQL*Plus: Release 8.1.7.0.0 - Production on Mon Apr 28 15:20:13 2003

(c) Copyright 2000 Oracle Corporation.  All rights reserved.

SQL> connect internal
Connected to an idle instance.
SQL> startup mount
ORACLE instance started.

Total System Global Area  189102108 bytes
Fixed Size                    75804 bytes
Variable Size              89006080 bytes
Database Buffers           99942400 bytes
Redo Buffers                  77824 bytes
Database mounted.
SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> conn kang/kang
Connected.
SQL> select * from test;

ID         NAME
---------- ----------
maddog     강명규
dbakorea   강명규
xman       엑스맨

SQL>


kang유저는 test라는 테이블을 가지고 있고, 이 테이블에는 3개의 로우가 존재한다.
이 상황에서 테이블스페이스백업(온라인백업)을 하고 난뒤, 1개의 로우를 추가하겠다.
나중에 알겠지만, 백업후에 추가한 1개의 로우도 리두로그가 적용되어 복구될 것이다.
(이는 DB를 아카이브로그 모드상태로 변경했기 때문에 가능한 일이다.)
우리가 recover ... 명령을 내리면 오라클은 archive_log_dest(or archive_log_dest_n : n은 1~5까지 지정가능)
에서 아카이브로그를 찾아 해당되는 리두로그를 적용하고, 온라인리두로그파일을 이용해 최근의 변경사항까지 적용시킨다.
여기에 관해 자세히 적으면 길어지므로 나중에 기회가 되면 언급하겠다. 진짜냐? 흠.. -.-;


users테이블스페이스에 test테이블이 있다.
users테이블스페이스는 1개의 데이터파일을 가지고 있는데, 복구테스트를 위해 이 테이블스페이스에 속한 데이터파일을 백업후, OS에서 삭제할 것이다. 그리고 당연히 다시 복구할 것이다.

SQL> select tablespace_name from user_tables where table_name='TEST';

TABLESPACE_NAME
------------------------------
USERS

SQL> connect internal
Connected.

USERS라는 테이블스페이스는 아래와 같이 C:ORACLEORADATADBUSERS01.DBF 데이터파일 1개만 가지고 있음을 알 수 있다.
SQL> select b.name from v$tablespace a, v$datafile b
  2  where a.ts# = b.ts# and a.name='USERS';

NAME
--------------------------------------------------------------------------------
C:ORACLEORADATADBUSERS01.DBF


USERS테이블스페이스를  C:ORACLEBACKUP에 백업하자.

SQL> alter tablespace users begin backup;

Tablespace altered.

SQL> host copy C:ORACLEORADATADBUSERS01.DBF C:ORACLEBACKUPDBUSERS01.DBF
        1개 파일이 복사되었습니다.

SQL> alter tablespace users end backup;

Tablespace altered.

SQL>

완전복구(complete recovery)가 제대로 되는지 확인하기 위해, kang.test에 1개의 데이터를 추가적으로 insert하자.

SQL> connect kang/kang
Connected.
SQL> insert into test values('backuptest', '백업테스트');

1 row created.

SQL> commit;

Commit complete.

SQL> connect internal
Connected.
SQL> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>


테스트를 위해, users테이블스페이스에 속한 데이터파일을 삭제하고, 이를 복구하는 과정을 보겠다.

SQL> host del C:ORACLEORADATADBUSERS01.DBF

당연히 파일을 삭제했으므로 에러가 나면서, mount까지만 진행되었다.
SQL> startup
ORACLE instance started.

Total System Global Area  189102108 bytes
Fixed Size                    75804 bytes
Variable Size              89006080 bytes
Database Buffers           99942400 bytes
Redo Buffers                  77824 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: 'C:ORACLEORADATADBUSERS01.DBF'

v$recover_file을 보면, 복구가 필요한 파일을 정확히 파악할 수 있다.
SQL> select * from v$recover_file;

     FILE# ONLINE
---------- -------
ERROR                                                                CHANGE#
----------------------------------------------------------------- ----------
TIME
---------
         3 ONLINE
FILE NOT FOUND                                                             0


이제 데이터파일을 offline후, DB를 OPEN하고, 이를 복구하겠다.
users테이블스페이스에 대한 질의를 제외한 모든 질의는 가능한 상태가 된다. 확인해볼까나..

SQL> alter database datafile 'C:ORACLEORADATADBUSERS01.DBF' offline;

Database altered.

SQL> alter database open;

Database altered.

당연히 질의 못하지.
SQL> select * from kang.test;
select * from kang.test
                   *
ERROR at line 1:
ORA-00376: file 3 cannot be read at this time
ORA-01110: data file 3: 'C:ORACLEORADATADBUSERS01.DBF'

users테이블스페이스를 제외하고는 되지.
아래의 예가 좀 적당치 못한 것 같지만...
SQL> select * from all_users;

USERNAME                          USER_ID CREATED
------------------------------ ---------- ---------
SYS                                     0 25-APR-03
SYSTEM                                  5 25-APR-03
OUTLN                                  11 25-APR-03
DBSNMP                                 16 25-APR-03
AURORA$JIS$UTILITY$                    25 25-APR-03
OSE$HTTP$ADMIN                         26 25-APR-03
AURORA$ORB$UNAUTHENTICATED             27 25-APR-03
ORDSYS                                 28 25-APR-03
ORDPLUGINS                             29 25-APR-03
MDSYS                                  30 25-APR-03
CTXSYS                                 33 25-APR-03
KANG                                   35 25-APR-03

12 rows selected.


백업해둔 데이터파일을 restore한뒤, recover한다.
백업한 뒤에 insert한 '백업테스트'라는 데이터도 복구되었음을 알 수 있다.

SQL> host copy C:ORACLEBACKUPDBUSERS01.DBF C:ORACLEORADATADBUSERS01.DBF
        1개 파일이 복사되었습니다.

SQL> recover datafile 'C:ORACLEORADATADBUSERS01.DBF';
Media recovery complete.
SQL> alter database datafile 'C:ORACLEORADATADBUSERS01.DBF' online;

Database altered.

SQL> conn kang/kang
Connected.
SQL> select * from kang.test;

ID         NAME
---------- ----------
maddog     강명규
dbakorea   강명규
xman       엑스맨
backuptest 백업테스트

SQL>


간단한 예제인데 너무 길게 쓴 것같아 헷갈리지는 않을지 걱정스럽다.
위에서는, 짧은 시간에 테스트한 것이라 아카이브로그에 대해서 충분한 예를 들지 못한것 같다.
암튼간에, 백업이 한달전에 이루어졌고, 디스크절약정신에 의거해서, 테이프등으로 백업해 뒀다면,
백업이후의 아카이브로그가 적용되어야 하므로, archive_log_dest의 위치에 복사하고 난뒤, 복구를
해야 함을 잊지 말도록 하자.

This article comes from dbakorea.pe.kr (Leave this line as is)

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,042 명
  • 현재 강좌수 :  35,846 개
  • 현재 접속자 :  111 명