01. Tablespace의 조작


[b]1. 새로운 Tablespace Create[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> startup
SVRMGR> create tablespace test
     2  datafile '$HOME/DATA/DISK5/test_01.dbf'
     3  size 10k ;
SVRMGR> select tablespace_name, bytes, file_name from dba_data_files ;

[b]2. Table Create 후 table 에 row들을 insert[/b]

$ sqlplus scott/tiger
SQL> create table test
  2  (name varchar2(10))
  3  storage (initial 4k)
  4  tablespace test ;
SQL> insert into test values ('TEST') ;
SQL> insert into test select * from test ;
SQL> /   <-- 아래의 error 메세지가 나올 때까지 여러번 반복한다.
ORA-01653: unable to extend table SCOTT.TEST by 5 in tablespace TEST

[b]3. Tablespace를 늘린다.[/b]

SQL> connect system/manager
SQL> alter tablespace test add datafile '$HOME/DATA/DISK6/test02_dbf' size 30k ;
SQL> select tablespace_name, bytes, file_name from dba_data_files ;
SQL> connect scott/tiger
SQL> insert into test select * form test ;

또는 다음의 방법으로 datafile을 resize한다.
SQL> connect system/manager
SQL> alter database datafile '$HOME/DATA/DISK5/test_01.dbf' resize 50k ;
SQL> select tablespace_name, bytes, file_name from dba_data_files ;
SQL> !ls -la $HOME/DATA/DISK5
SQL> connect scott/tiger
SQL> insert into test select * from test ;
SQL> commit ;

[b]4. 테스트가 끝나면 Drop[/b]

SQL> connect system/manager
SQL> drop tablespace test including contents ;
SQL> select tablespace_name, bytes, file_name from dba_data_files ;
SQL> !ls -la $HOME/DATA/DISK5
SQL> !ls -la $HOME/DATA/DISK6
     --> datafile이 그대로 존재한다. (reuse하기 위해서--다시 datafile을 만들때 속도가 빠르다.)
     
[b]5. Datafile도 삭제[/b]

SQL> !rm $HOME/DATA/DISK5/test_01.dbf
SQL> !rm $HOME/DATA/DISK6/test_02.dbf
SQL> !ls -la $HOME/DATA/DISK5
SQL> !ls -la $HOME/DATA/DISK6
$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> shutdown immediate
SVRMGR> exit

02. Recovery-Temporary Tablespace의 유실


 
[b]1. Database를 기동[/b]

$svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> startup
SVRMGR> select tablespace_name, file_name from dba_datafiles ;
        --> Temporary Tablespace의 Data File 경로명을 확인
SVRMGR> !ls -la $HOME/DATA/DISK3/temp01.dbf
        --> 크기 확인
        
[b]2. Failure를 만든다.[/b]

SVRMGR> shutdown abort
        --> Failure를 상상
SVRMGR> ! mv $HOME/DATA/DISK3/temp01.dbf $HOME/DATA/DISK3/temp01.org
SVRMGR> startup
ORA-01157: cannot identify data file 4 - file not found
ORA-01110: data file 4:'/home/disk1/userDBA205/DATA/DISK3/temp01.dbf'

[b]3. Recovery 수행[/b]
   --> Temporary Tablespace 이므로  Drop하고 새로 만들면 됨
   
SVRMGR> alter database datafile '$HOME/DATA/DISk3/temp01.dbf' offline drop ;
SVRMGR> alter database open ;
Statement processed.
SVRMGR> select * from dba_tablespaces ;
        --> "Temp_data" Tablespace는 그래도 존재함
        --> "Temp_data" Tablespace의 구성 File 중 하나를 Drop 한 것 뿐이니까.(여기선 우연히 하나였다.)
SVRMGR> drop tablespace temp_data including contents ;
SVRMGR> create tablespace temp_data
     2  datafile '$HOME/DATA/DISK3/temp01.dbf' size 1M ;
        --> 앞에서 확인한 크기로 다시 생성
SVRMGR> shutdown immediate
        --> Shutdown 과 Startup을 해봐서 잘 되는지 확인
SVRMGR> startup
SVRMGR> shutdown immediate
SVRMGR> !rm $HOME/DATA/DISK3/temp01.org
        --> 필요 없는 file을 삭제
SVRMGR> exit

03. 데이터베이스 모드의 변환


[b][color=BLUE]DB mode의 변환[/color][/b]
 
[b]1. database를 기동 시킨 후 database의 mode 를 확인[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> startup
SVRMGR> archive log list
SVRMGR> select name, log_mode from v$database ;

[b]2. archive와 관련된 parameter값 확인[/b]

SVRMGR> show parameter archive

[b]3. database의 mode를 archivelog mode로 전환[/b]

SVRMGR> shutdown immediate
$vi $ORACLE_HOME/dbs/initSID.ora

    LOG_ARCHIVE_START=TRUE
    LOG_ARCHIVE_DEST=$HOME/ARCHIVE/
    LOG_ARCHIVE_FORMAT=arch_%s.arc
    
SVRMGR> startup mount
SVRMGR> alter database archivelog ;
SVRMGR> alter database open ;
SVRMGR> alter system switch logfile ;
SVRMGR> show parameter archive
SVRMGR> !ls -al $HOME/ARCHIVE


[b][color=BLUE]Advanced Practice[/color][/b]

[b]1. automatic archiving 을 중단하고, log switch를 발생[/b]

SVRMGR> alter system archive log stop ;
SVRMGR> alter system switch logfile ;
SVRMGR> alter system switch logfile ;
SVRMGR> alter system switch logfile ;

어떤 현상이 발생하는가? database가 운용되지 않고 hang되는 현상이 발생!!!
왜 그런 현상이 발생했을까?

[b]2. Server manager session을 하나 더 열어서 automatic archiving을 활성화하라.[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> alter system archive log start ;

04. Closed Database Backup 수행


[b]1. 현재 사용중인 database를 구성하고 있는 files(즉 backup의 대상이 되는 files)을 확인[/b]

- Control File의 정보를 확인(V$CONTROLFILE, V$PARAMETER, init.ora, SHOW PARAMETER command)
  SVRMGR> select name from v$controlfile ;
  
- Log File 정보를 확인(V$LOGFILE)
  SVRMGR> select member from v$logfile ;
  
- Data File 정보를 확인(DBA_DATA_FIlES, V$DATAFILE)
  SVRMGR> select name from v$datafile ;
  
[b]2. database를 shutdown 시킨 후 backup을 수행(만일의 경우를 대비하여 DONTOUCH와 BACKUP 디렉토리에 각각 copy)[/b]

SVRMGR> shutdown immediate
$ cp -rp $HOME/DATA/* $HOME/DONTOUCH
$ cp $ORACLE_HOME/dbs/orapwSID $HOME/DONTOUCH
$ cp $ORACLE_HOME/dbs/initSID.ora $HOME/DONTOUCH
$ cp -rp $HOME/DATA/* $HOME/BACKUP
$ cp $ORACLE_HOME/dbs/orapwSID $HOME/BACKUP
$ cp $ORACLE_HOME/dbs/initSID.ora $HOME/BACKUP

[b]3. Instance를 기동 후, system을 정상적으로 운용[/b]

SVRMGR> startup
$ sqlplus scott/tiger
SQL> @ empdata.sql
SQL> @ deptdata.sql

[b]4. USER_DATA tablespace의 open backup 수행[/b]

SQL> connect system/manager
SQL> alter tablespace user_data begin backup ;
SQL> ! cp $HOME/DATA/DISK2/user01.dbf $HOME/BACKUP/user01.bkp
SQL> alter tablespace user_data end backup ;

[b]5. controlfile의 backup 수행[/b]

SQL> alter database backup controlfile to trace ;
SQL> @ spid.sql  --> process의 번호를 확인
SQL> !
$ cp $HOME/TRACE
$ cp dba???_ora_xxxx.trc $HOME/BACKUP/cntrl1.trc
$ vi $HOME/BACKUP/cntrl1.trc
  -- comment line을 모두 delete 한다.
$ exit
SQL> alter database backup controlfile to '$HOME/BACKUP/cntrl1.bkp' ;

05. Norachivelog mode에서의 Complete Database Recovery 수행


[b]1. Database 를 Noarchivelog mode로 전환하고, ARCH process를 비활성하자.[/b]

$ svrmgrl
SVRMGR> connect internal
SVRMGR> shutdown immediate
SVRMGR> ! vi $HOME/dbs/initSID.ora
        --> log_archive_start를 comment 처리 또는 false로 setting
SVRMGR> startup mount
SVRMGR> alter database noarchivelog ;
SVRMGR> alter database open ;
SVRMGR> archive log list 

[b]2. Full Closed Database Backup 수행( 이번에는 $HOME/BACKUP directory에만 copy)[/b]

SVRMGR> shutdown immediate ;
SVRMGR> host
$ cp -r $HOME/DATA/* $HOME/BACKUP
$ exit
SVRMGR> startup

[b]3. sqlplus에 scott/tiger로 login해서 다음을 수행[/b]

$ sqlplus scott/tiger
SQL> @ newemp.sql
SQL> connect system/manager
SQL> select f.file_name from dba_tables t, dba_data_files f
  2  where table_name='NEWEMP'
  3  and t.tablespace_name = f.tablespace_name ;
     --> newemp table이 어떤 datafile에 들어 있는지를 확인
     --> $HOME/DATA/DISK2/user01.dbf에 newemp table이 속해 있음.
     
[b]4. failure를 발생시키고, database startup 수행[/b]

SQL> show user
     --> sys 또는 system user인지 확인한다. 만일 아니라면...
         connect system/manager를 수행
SQL> @ breakdb.sql
$ svrmgrl
SVRMGR> connect internal ;
SVRMGR> startup
     --> $HOME/DATA/DISK2/user01.dbf file이 없으므로 open을 할 수 없고, database는 mount 상태임
     
[b]5. Recovery 수행 후, database 기동[/b]

SVRMGR> connect / as sysdba
SVRMGR> shutdown abort ;
SVRMGR> ! cp -r $HOME/BACKUP/D* $HOME/DATA
SVRMGR> startup

[b]6. sqlplus에 scott/tiger로 login 해서 newemp table을 query 해 보라.[/b]

$ sqlplus scott/tiger
SQL> select * from newemp ;
     --> 어떤 결과가 나타나는가? 또, 그 이유는?
SVRMGR> shutdown immediate ;

06. Noarchive Log Mode Recovery - Disk의 유실


1. failure가 발생되서 모든 file들을 Restore하려는 데, user01.dbf를 원래 위치에 Restore 할 수가 없다. 따라서, 할 수 없이 $HOME/DATA/DISK6에 Restore 한다.


$ cd $HOME/DATA/DISK2

$ ls

$ rm user01.dbf --> failure 발생!!!

$ svrmgrl

SVRMGR> connect / as sysdba

SVRMGR> startup --> 실패!!!

SVRMGR> shutdown abort

SVRMGR> ! cp -r $HOME/BACKUP/D* $HOME/DATA --> 원래 위치로 Restore

SVRMGR> ! mv $HOME/DATA/DISK2/user01.dbf $HOME/DATA/DISK6

SVRMGR> startup --> 역시 실패!!!

SVRMGR> select name from v$datafile ;

--> Oracle Server는 File이 다른 곳($HOME/DATA/DISK6)에 있다는 것을 인지하지 못함.


2. Oracle Server가 인지할 수 있도록 정보를 수정


SVRMGR> alter database rename file '$HOME/DATA/DISK2/user01.dbf'

2 to '$HOME/DATA/DISK6/user01.dbf' ;


3. 다시 open 시도


SVRMGR> alter database open

--> 성공 !!!

SVRMGR> shutdown immediate

SVRMGR> startup


4. 원래 형태로 만들자.


SVRMGR> shutdown immediate

SVRMGR> ! cp -r $HOME/BACKUP/D* $HOME/DATA

SVRMGR> startup

SVRMGR> shutdown

SVRMGR> exit

[/pre]


07. Archivelog moe에서의 Complete Database Recovery 수행


 
[b]1. database의 mode를 확인 후, automatic archiving이 가능하도록 setting 하라.[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> startup
SVRMGR> select name, log_mode from v$database ;
SVRMGR> archive log list
SVRMGR> shutdown immediate
        --> log_archive_start=TRUE로 setting
SVRMGR> startup mount
SVRMGR> alter database archivelog ;
SVRMGR> alter database open ;
SVRMGR> archive log list
SVRMGR> show parameter archive

[b]2. $HOME/BACKUP 디렉토리에 closed database backup 수행[/b]

SVRMGR> shutdown immediate
SVRMGR> ! cp -rp $HOME/DATA/* $HOME/BACKUP
SVRMGR> startup

[b]3. sqlplus에 scott/tiger로 login해서 다음을 수행[/b]

$ sqlplus scott/tiger
SQL> @ newemp.sql
SQL> connect system/manager
SQL> select tablespace_name from dba_tables
  2  where table_name='NEWEMP' ;
     --> newemp table이 어떤 datafile에 들어 있는지를 확인
SQL> select file_name from dba_data_files
  2  where tablespace_name='USER_DATA' ;
     --> USER_DATA tablespace를 구성하고 있는 datafile을 확인
     
[b]4. failure를 발생시키고, database startup 수행[/b]

SQL> @ breakdb.sql
$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> startup
     --> $HOME/DATA/DISK2/user01.dbf file이 없으므로 open을 할 수 없고, database는 mount 상태임
     
[b]5. Recovery 수행 후, database open[/b]

SVRMGR> ! cp $HOME/BACKUP/DISK2/user01.dbf $HOME/DATA/DISK2
SVRMGR> recover automatic database ;
SVRMGR> alter database open ;
SVRMGR> select tablespace_name, status from dba_tablespaces
     2  where tablespace_name='USER_DATA' ;

[b]6. sqlplus에 scott/tiger로 login 해서 newemp table을 query 해 보라.[/b]

$ sqlplus scott/tiger
SQL> select count(*) from newemp ;
     --> 어떤 결과가 나타나는가? Practice 6-1 6의 결과와 비교해 보라.

08. downtime을 줄이기 위한 tablespace online recovery 수행


 
[b]1. failure 발생 후 database restart 수행[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> shutdown immediate
SVRMGR> startup
SVRMGR> @ breakdb.sql
SVRMGR> connect / as sysdba
SVRMGR> startup

[b]2. downtime을 최소화 하기 위해 일단 손상된 datafile을 무시한 채, database를 open[/b]

SVRMGR> alter database datafile '$HOME/DATA/DISK2/user01.dbf' offline ;
SVRMGR> alter database open ;

[b]3. 해당 datafile을 포함한 tablespace의 online recovery 수행[/b]

SVRMGR> alter tablespace USER_DATA offline immediate ;
SVRMGR> ! cp $HOME/BACKUP/DISK2/user01.dbf $HOME/DATA/DISK2
SVRMGR> recover automatic tablespace USER_DATA ;
    --> 개별 tablespace의 recovery 수행
SVRMGR> alter tablespace USER_DATA online ;

[b]4. sqlplus에 scott/tiger로 login 해서 newemp table을 query 해 보라.[/b]

$ sqlplus scott/tiger
SQL> select count(*) from newemp ;

09. downtime을 줄이기 위한 datafile online recovery 수행


[b]1. failure 발생 후 database restart 수행[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> shutdown immediate
SVRMGR> startup
SVRMGR> @ breakdb.sql
SVRMGR> connect / as sysdba
SVRMGR> startup

[b]2 downtime을 최소화 하기 위해 일단 손상된 datafile을 무시한 채, database를 open[/b]

SVRMGR> alter database datafile '$HOME/DATA/DISK2/user01.dbf' offline ;
SVRMGR> alter database open ;

[b]3. 해당 datafile의 online recovery 수행[/b]

SVRMGR> ! cp $HOME/BACKUP/DISK2/user01.dbf $HOME/DATA/DISK2
SVRMGR> recover automatic databfile '$HOME/DATA/DISK2/user01.dbf'
   -- 개별 datafile의 recovery 수행
SVRMGR> alter database datafile '$HOME/DATA/DISK2/user01.dbf' online ;

[b]4. sqlplus에 scott/tiger로 login해서 newemp table을 query해 보라.[/b]

$ sqlplus scott/tiger
SQL> select count(*) from newemp ;

10.loss of datafile with no backup의 경우 complete recovery


[b]1. 새로운 tablespace 생성[/b]

$svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> create tablespace test_data
     2  datafile '$HOME/DATA/DISK5/test01.dbf' size 20k ;
SVRMGR> archive log list ;
SVRMGR> connect scott/tiger
SVRMGR> create table test
     2  tablespace test_data
     3  as select * from dept ;
SVRMGR> select count(*) from test ;
SVRMGR> connect internal ;
SVRMGR> alter system switch logfile ;
SVRMGR> alter system switch logfile ;

[b]2. Failure 발생[/b]

SVRMGR> shutdown abort
SVRMGR> ! rm $HOME/DATA/DISK5/test01.dbf

[b]3. startup 도중 test01.dbf의 유실로 open이 불가능[/b]
   --> 하지만 backup이 없음.
   
SVRMGR> startup
ORA-01157: cannot identify data file 6 - file not found

SVRMGR> alter database
     2  create datafile '$HOME/DATA/DISK5/test01.dbf' as '$HOME/DATA/DISK5/test02.dbf' ;
SVRMGR> recover datafile '$HOME/DATA/DISK5/test02.dbf'
   --> auto 입력
   
SVRMGR> alter database open ;

[b]4. 확인 후 원래 상태로.[/b]

SVRMGR> select count(*) from scott.test ;
SVRMGR> drop tablespace test_data including contents ;
SVRMGR> ! rm $HOME/DATA/DISK5/test02.dbf
SVRMGR> shutdown immediate ;
SVRMGR> startup
SVRMGR> exit

11. online backup 도중에 정전


[b]1. Online Backup 수행 도중 갑자기 정전[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> alter tablespace rollback_data begin backup ;
SVRMGR> ! cp $HOME/DATA/DISK3/rbs01.dbf $HOME/BACKUP/rbs01.bkp
SVRMGR> shutdown abort   --> 정전 사태 발생!!!
SVRMGR> exit

[b]2. 다시 전원이 들어와서 startup을 시도[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> startup     --> file의 sync 정보가 서로 일치하지 않으므로 실패!!!
ORA-01113: file 2 needs media recovery

[b]3. 복구[/b]

SVRMGR> select * from v$backup ;   <-- status가 ACTIVE 상태이면, backup mode에 걸려 있다.
SVRMGR> select * from v$datafile_header ;
SVRMGR> alter database datafile
     2  '$HOME/DATA/DISK3/rbs01.dbf' end backup ;
SVRMGR> alter database open ;
SVRMGR> select * from v$backup ;
SVRMGR> --> 이 상태에서 Online Backup을 다시 받으면 된다.
SVRMGR> shutdown immediate
SVRMGR> startup  --> DB가 정상적으로 운용됨
SVRMGR> exit

12. Archivelog mode에서의 Time-based Incomplete Database Recovery 수행


[b]1. sqlplus scott/tiger로 login 하여 드음을 수행[/b]

$ sqlplus scott/tiger
SQL> insert into newemp select * from newemp ;
SQL> select count(*) from newemp ;
     --> 이때의 건수를 잘 기억해 두자. 나중에 제대로 복구되었는지 확인하기 위해서...
SQL> commit ;
SQL> ! date
     --> time-based recovery를 하기 위해 시간을 확인.
SQL> drop table newemp ;
     --> 사용자의 실수로 table이 drop됨
     
[b]2. time-based incomplete recovery[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> shutdown immediate
SVRMGR> ! $HOME/LABS/cpdbfile.sh
    --> 모든 datafile을 restore 한다.
SVRMGR> startup
SVRMGR> set autorecovery on
SVRMGR> recover database until time '1999-03-22:14:44:47'
    --> 앞에서 기억한 시간이어야 함
SVRMGR> alter database open resetlogs ;
    --> incomplete recovery 이니까 "resetlogs"로 open
SVRMGR> archive log list
    --> log sequence 번호가 reset 되었음.
SVRMGR> select count(*) from scott.newemp ;
    --> "newemp" table의 건수 확인
SVRMGR> shutdown immediate
SVRMGR> exit

[b]3. Log Sequence 번호가 Reset 되었으니까 Full closed database backup 수행하고, 필요 없는 file들을 삭제[/b]

$ cp -rp $HOME/DATA/* $HOME/BACKUP
$ rm ARCHIVE/*.arc
$ ls ARCHIVE

13. Inactive Online Redo Log Group의 유실


 
[b]1. 정상적인 업무를 수행[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> startup
SVRMGR> @ moreemp.sql
SVRMGR> exit

[b]2. Inactive Online Redo Log Group을 유실  -->   Failure 발생!!![/b]

$ sqlplus system/manager
SQL> select * from v$log ;    --> inactive redolog group이 archive가 되었는지 확인
SQL> wksh01.sql
$ chmod 777 wksh01.sh

$ rm $ORACLE_HOME/DATA/DISK1/log1a.rdo                                     
$ rm $ORACLE_HOME/DATA/DISK2/log1b.rdo                                     
   --> inactive redolog group의 유실

[b]3. Database가 비정상적으로 수행됨을 확인[/b]

$svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> @ moreemp.sql     --> online redo log file의 유실로 인해 Error 발생!!!
SVRMGR> shutdown immediate  --> shutdown 실패 (Server Process가 죽었다)
SVRMGR> exit    --> exit 했다가 다시 들어가자.

[b]4. Recovery 시작[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> shutdown abort
SVRMGR> startup           --> mount까지만 수행됨
SVRMGR> alter database backup controlfile to trace ;   --> 만일의 경우 대비
SVRMGR> alter database drop logfile group ? ;    --> log file의 유실을 반영 : error 발생
SVRMGR> alter database clear logfile group ? ;
SVRMGR> alter database open ;
SVRMGR> ! ls $HOME/DATA/DISK1

[b]5. System이 정상적으로 운용되는지 확인[/b]

SVRMGR> @ moreemp.sql
SVRMGR> select * from v$logfile ;
SVRMGR> shutdown immediate
SVRMGR> statup
SVRMGR> shutdown immediate
SVRMGR> exit

14. Current Online Redo Log Group 의 유실


[b] 정상적인 업무를 수행[/b]

$ svrmgrl
SVRMGR> connect / as sysdba ;
SVRMGR> startup
SVRMGR> @ moreemp.sql
SVRMGR> ! ls -la ARCHIVE
SVRMGR> exit

[b]2. current online redo log group을 유실  --> Failure 발생[/b]

$ sqlplus system/manager
SQL> select * from v$log ;
SQL> @ wksh02.sql
$ chmod 777 wksh02.sh
$ wksh02.sh     --> current redolog group의 유실

[b]3. Database가 비정상적으로 수행됨을 확인[/b]

$ svrmgrl
SVRMGR> connect / as sysdba ;
SVRMGR> @ moreemp   --> Online Redo Log file의 유실로 인해 failure 발생
                    --> 무한정 대기하게 된다. 왜? "Ctrl+C"를 두번 눌러서 강제 종료
SVRMGR> shutdown immediate

[b]4. Recovery 시작[/b]
   --> 유실된 Redo Log Group을 제거하고 재생성함으로써 해결할려고 시도
   
SVRMGR> startup  --> Redo Log Group이 유실 되었음을 알리며 Error 발생, Mount까지만 수행된다.
                 --> Log Group 번호 확인할 것
SVRMGR> alter database clear logfile group ? ;
        --> 유실된 Redo Log Group을 clear 시도
        --> Archive 되지 않은 Current Log 이므로 Error와 함께 실패!!!
SVRMGR> shutdown immediate
SVRMGR> exit

[b]5. Alert File, Trace File 확인[/b]

$ cd $HOME/TRACE
$ vi alert_SID.log    --> Archivign을 실패한 기록과 Sequence 번호 확인
$ more arch_번호.trc  --> 기록되지 않은 Log File의 Sequence 번호 확인
  --> (예)ORA-00255: error archiving log 1 of thread 1, sequence # 14
  --> 예를들어, sequence # 14 번이라면, Incomplete Recovery 시 14번 에서 "Cancel"을 입력
  
[b]6. cancel-based incomplete recovery 수행[/b]

$ svrmgrl
SVRMGR> connect / as sysdba ;
SVRMGR> ! $HOME/LABS/cpdbfile.sh
   --> 모든 datafile을 restore 한다.
SVRMGR> startup mount
SVRMGR> recover database until cancel
"cancel" 입력   --> 계속 "Enter"를 누르다가 앞에서 확인한 번호에서 "Cancel"을 입력
                --> 이때, 유실된 Log File이 자동으로 만들어 진다.
SVRMGR> alter database open resetlogs ;
SVRMGR> archive log list
SVRMGR> shutdown immediate
SVRMGR> exit

[b]7. Log Sequence 번호가 Reset 되었으니까 full closed database backup 수행[/b]

$ cp -rp $HOME/DATA/*  $HOME/BACKUP
$ cd ARCHIVE
$ rm *.arc     --> Archived Redo Log File들을 삭제한다.

15. backup controlfile을 이용한 복구


[b]1. 정상적인 업무를 수행[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> startup
SVRMGR> @ moreemp.sql
SVRMGR> ! ls -al ARCHIVE

[b]2. emp table을 포함한 tablespace를 drop[/b]

SVRMGR> alter database backup controlfile to '$HOME/BACKUP/control.ctl' ;
  --> 현재의 controlfile을 backup
SVRMGR> drop tablespace user_data including contents ;
SVRMGR> select * from scott.emp
  --> error 발생
SVRMGR> alter system switch logfile ;
SVRMGR> alter system switch logfile ;
SVRMGR> alter system switch logfile ;
SVRMGR> shutdown immediate
SVRMGR> exit

[b]3. drop 된 tablespace에는 중요한 table들이 있었으므로 tablespace가 drop 되기 직전으로 복구하려고 하지만,현재의 controlfile에는 그 tablespace에 대한 정보가 이미 사라지고 없다. Backup controlfile을 이용하여 time-based incomplete recovery를 수행[/b]

$ cd TRACE
$ vi alert_SID.log  --> tablespace가 drop된 시점을 확인

$ cp $HOME/BACKUP/control.ctl $HOME/DATA/DISK1/cntrl???_1.ctl
$ cp $HOME/BACKUP/control.ctl $HOME/DATA/DISK2/cntrl???_2.ctl
    --> backup controlfile을 restore
$ $HOME/LABS/cpdbfile.sh
$ svrmgrl
SVRMGR> connect / as sysdba ;
SVRMGR> startup mount ;
SVRMGR> startup mount
SVRMGR> set autorecovery on
SVRMGR> recover database until time 'YYYY-MM-DD':HH:MI:SS'
     2  using backup controlfile ;
     
[b]4. database를 resetlogs로 open 한 후, full closed database backup 수[/b]

SVRMGR> alter database open resetlogs ;
SVRMGR> shutdown immediate
SVRMGR> exit
$ cp -rp $HOME/DATA/* $HOME/BACKUP
$ cd ARCHIVE
$ rm *.arc    --> Archived Redo Log File들 삭제

16. Oracle Export and Import utilities 사용


[b]1. DB를 기동한 후 data의 변경이 많은 scott schema의 emp, dept table을 export 한다.[/b]

$ svrmgrl
SVRMGR> connect / as sysdba ;
SVRMGR> startup
SVRMGR> host
$ exp scott/tiger file=$HOME/empdept.dmp tables=emp,dept

[b]2. scott가 작업 도중 실수로 emp 와 dept를 DROP.[/b]

$ sqlplus scott/tiger
SQL> select count(*) from emp ;   --> 건수 확인
SQL> select count(*) from dept ;  --> 건수 확인
SQL> drop table emp ;
SQL> drop table dept ;
SQL> host

[b]3. Import utility를 이용하여 emp와 dept를 restore 해보자.[/b]

$ imp scott/tiger file=$HOME/empdetpt.dmp full=y

[b]4. emp와 dept 테이블의 내용을 확인한다.[/b]

$ sqlplus scott/tiger
SQL> select count(*) from emp ;
SQL> select count(*) from dept ;

17. Incremental export를 이용한 recovery


[b]1. scott schema의 emp table의 건수를 확인 후, 다음을 수행[/b]

$ sqlplus scott/tiger
SQL> select count(*) from emp ;
SQL> exit

$ exp userid=sys/change_on_install full=y file=comp001.dmp inctype=complete

$ sqlplus system/manager
SQL> @ moreemp
SQL> exit
$ exp userid=sys/change_on_install full=y file=inc002.dmp inctype=incremental

$ sqlplus system/manager
SQL> @ moreemp
SQL> exit
$ exp userid=sys/change_on_install full=y file=inc003.dmp inctype=incremental 

$ sqlplus system/manager
SQL> @ moreemp
SQL> exit
$ exp userid=sys/change_on_install full=y file=cum004.dmp inctype=cumulative

$ sqlplus system/manager
SQL> @ moreemp
SQL> exit
$ exp userid=sys/change_on_install full=y file=inc005.dmp inctype=incremental

$ sqlplus scott/tiger
SQL> select count(*) from emp ;
SQL> drop table emp ;

[b]2. import를 이용하여 recovery 수행[/b]

$ imp userid=sys/change_on_install full=y file=comp001.dmp ignore=y
$ imp userid=sys/change_on_install full=y file=cum004.dmp ignore=y
$ imp userid=sys/change_on_install full=y file=inc005.dmp ignore=y 

$ sqlplus scott/tiger
SQL> select count(*) from emp ;

18. RMAN : Overview


[b]1. RMAN 사용의 장점[/b]

   - backup하는 동안 currupted block을 보호한다.
   - Oracle Parallel Server를 지원한다.
   - Automatic parallelization, Less redo generated, Restricted I/O for backups, Tape streaming
     등을 통해 performance를 증가 시킨다.

[b]2. Recovery Catalog에 대하여[/b]
   1) recovery catalog 란?
      - Datafile and archive log backup sets
      - Datafile copies
      - Archived redo logs
      - The physical structure of the target database
      - Stored job scripts

   2) recovery catalog 사용의 장점
      - Backup information retained
      - Enough resources for a separate database
      - Stored  scripts required
      - Tablespace Point-in-time recovery or incremental block level backups are desired
      - Recommended by Oracle

[b]3. recovery catalog를 생성하는 script는?[/b]

   $ORACLE_HOME/rdbms/admin/catrman.sql

[b]4. recovery catalog 없이 RMAN을 사용하여 target DB에 connect 해보자[/b]

$ rman target sys/change_on_install nocatalog

Recovery Manager: Release 8.0.5.0.0 - Production

RMAN-06009: using target database controlfile instead of recovery catalog
RMAN-06005: connected to target database: DBA420

RMAN> exit

[b]5. recovery catalog를 구성해 보자.[/b]

Catalog database는 rcvcat alias를 사용하고, user는 rman01 이라면...
$ sqlplus rman01/rman01@rcvcat
SQL> select * from session_roles ;   --> recovery_catalog_owner role을 확인
SQL> select * from user_users ;
SQL> @ $ORACLE_HOME/rdbms/admin/catrman
SQL> select distinct object_type, count(*)
  2  from user_objects
  3  group by object_type ;
SQL> select object_name from user_objects when object_type='VIEW' ;

[b]6. 이번에는 recovery catalog를 이용해 보자[/b]

$ rman target sys/change_on_install rcvcat rman01/rman01@rcvcat

Recovery Manager: Release 8.0.5.0.0 - Production

RMAN-06005: connected to target database: 
RMAN-06008: connected to recovery catalog database

RMAN> exit

19. Recovery catalog Maintenance


[b]1. recovery catalog에 script를 생성[/b]

$ rman target sys/change_on_install rcvcat rman01/rman01@rcvcat

RMAN> create script NightlyBackup {
   2  allocate channel c1 type DISK ;
   3  backup
   4  incremental level = 0
   5  format '$HOME/df_%d_%s_%p.bus'
   6  tag=NIGHTLY
   7  filesperset=5
   8  (database include current controlfile) ;
   9  release channel c1 ;
  10  sql 'alter system archive log current' ; )
  
RMAN> exit

[b]2. sqlplus에서 script가 제대로 저장되었는지 확인[/b]

$ sqlplus rman01/rman01@rcvcat
SQL> select * from rc_stored_script ;

20. Backup using RMAN scenario


[b]1. v$log를 조회하여 current redolog를 확인 후, current redolog를 archive 시킨다.[/b]

$ sqlplus system/manager
SQL> select * from v$log ;   --> current redolog 번호 확인
SQL> alter system archive log current ;

[b]2. lab111.rmn 파일을 다음과 같이 편집하자[/b]

$ cp lab11_1.rmn lab111.rmn
$ vi lab111.rmn

  create script lab11_rman
   { allocate channel c1 type disk ;
     copy
     datafile '$HOME/DATA/DISK/system01.dbf'
           to '$HOME/BACKUP/system01.dbf'
          tag = SYSTEM01,
     archivelog '$HOME/BACKUP/arch_XXX.arc'
           to '$HOME/ARCHIVE/arch_XXX.arc',     --> 앞에서 확인한 current redo log
     current controlfile to '$HOME/BACKUP/control1.bak' ;
     release channel c1 ; }

[b]3. rman에 접속하여 script를 저장하고, 저장된 script를 수행.[/b]

$ rman target sys/change_on_install rcvcat rman01/rman01@rcvcat

RMAN> @ lab111.rmn
...
RMAN> **end-of-file**

RMAN> run { execute script lab111_rman ; }

RMAN> exit

[b]4. 작업 도중 corrupt block 이 발견 되었는지 확인하고, v$datafile_copy를 이용하여 controlfile에 반영 되었는지 확인[/b]

$ sqlplus system/manager
SQL> select * from v$copy_corruption ;
SQL> select name, tag from v$datafile_copy ;    --> 여러 개
SQL> connect rman01/rman01@rcvcat
SQL> select * from rc_copy_corrution ;
SQL> select * from rc_datafile_copy ;           --> 2 개

 
[b]5. lab11_2.rmn 파일을 다음과 같이 편집하자[/b]

$ cp lab11_2.rmn lab112.rmn
$ vi lab112.rmn

  create script lab112_rman
   { allocate channel c1 type disk ;
     allocate channel c2 type disk ;
     backup incremental level = 0
     format '$HOME/BACKUP/INC0/df_%d_%s_%p.bus'
     tag=BACKUP01
     filesperset = 4
     (database include current controlfile) ;
     release channel c1 ;
     release channel c2 ; }

[b]6. rman에 접속하여 script를 저장하고, 저장된 script를 수행.[/b]

$ rman target sys/change_on_install rcvcat rman01/rman01@rcvcat

RMAN> @ lab123.rmn
...
RMAN> **end-of-file**

RMAN> run { execute script lab112_rman ; }

RMAN> exit ;

[b]7. 작업 도중 corrupt block이 발견 되었는지 확인하고, v$backup_set을 이용하여 controlfile에 반영 되었는지 확인[/b]

$ sqlplus system/manager
SQL> select * from v$copy_corruption ;
SQL> select * from v$backup_set ;
SQL> connect rman01/rman01@rcvcat
SQL> select * from rc_copy_corrution ;
SQL> select * from rc_backup_set ;

[b]4. database를 정상적으로 운용[/b]

SQL> @ moreemp.sql

 
[b]8. lab11_3.rmn을 다음과 같이 편집하자.[/b]

$ cp lab11_3.rmn lab113.rmn
$ vi lab113.rmn

  create script lab113_rman
   { allocate channel c1 type disk ;
     allocate channel c2 type disk ;
     backup incremental level=2
       format '$HOME/BACKUP/INCR2/dv_%d_%s_%p.bus'
       tag=BACKUP02
       filesperset=4
       (database include current controlfile) ;
     release channel c1 ;
     release channel c2 ;
   }

[b]9. rman에 접속하여 script를 저장하고, 저장된 script를 수행.[/b]

$ rman target sys/change_on_install rcvcat rman01/rman01@rcvcat

RMAN> @ lab113.rmn
...
RMAN> **end-of-file**

RMAN> run { execute script lab113_rman ; }

RMAN> exit

[b]10. OS에 backup set file이 제대로 생성되었는지 확인[/b]

$ ls -l $HOME/BACKUP/INC0
$ ls -l $HOME/BACKUP/INC2

21. Restore and Recover using RMAN


 
[b]1. database 가 정상적으로 운용되는지 확인[/b]

$ svrmgrl
SVRMGR> connect / as sysdba
SVRMGR> startup
SVRMGR> shutdown immediate

[b]2. datafile을 유실하여 failure 발생[/b]

SVRMGR> ! rm $HOME/DATA/DISK2/user01.dbf
SVRMGR> startup
SVRMGR> exit

[b]3. RMAN을 이용하여 복구해 보자[/b]

$ rman target sys/change_on_install rcvcat rman01/rman01@rcvcat

RMAN> create script recover_df
   2    { allocate channel c1 type disk ;
   3      restore datafile '$HOME/DATA/DISK2/user01.dbf' ;
   4      recover datafile '$HOME/DATA/DISK2/user01.dbf' ;
   5      release channel c1 ; }

RMAN> run { execute script recover_df ; }

RMAN> run { sql "alter database open" ; }

RMAN> exit

[b]4. database가 정상적으로 open 되었는지, 정상적으로 복구 되었는지 확인[/b]

$ svrmgrl
SVRMGR> select count(*) from scott.emp ;
SVRMGR> shutdown immediate
SVRMGR> startup
SVRMGR> shutdown immediate

[출처] Oracle 8 - Situation|작성자 에러

'IT > Oracle' 카테고리의 다른 글

컨트롤 파일의 재생성(DB명 변경)  (0) 2008.09.17
Oracle admin tip  (0) 2008.07.25
Export / Import  (0) 2008.07.23
Export & Import  (0) 2008.07.23
Export & Import  (0) 2008.06.23

+ Recent posts