Tablespace Point-in-Time Recovery (TSPITR) 방법으로 삭제된 테이블스페이스 복구를 시도해보았습니다. (thanks to durecat)
1. 일단 테스트를 위해 테이블스페이스생성, 테이블생성, 데이터입력
SQL> create tablespace TS_BACKUP_TEST datafile size 10m; SQL> create table system.BACKUP_TEST_1 (no number, name varchar2(10)) tablespace TS_BACKUP_TEST; SQL> insert into system.BACKUP_TEST_1 values (1,'AAA'); SQL> insert into system.BACKUP_TEST_1 values (2,'BBB'); SQL> commit;
2. 백업수행
RMAN> backup tablespace 'TS_BACKUP_TEST'; Starting backup at 20-JUL-16 using channel ORA_DISK_1 channel ORA_DISK_1: starting full datafile backup set channel ORA_DISK_1: specifying datafile(s) in backup set input datafile file number=00012 name=+DATA/ORCL12/DATAFILE/ts_backup_test.413.917692055 channel ORA_DISK_1: starting piece 1 at 20-JUL-16 channel ORA_DISK_1: finished piece 1 at 20-JUL-16 piece handle=/backup/ARC/ORCL12/backupset/2016_07_20/o1_mf_nnndf_TAG20160720T103250_crxo62v6_.bkp tag=TAG20160720T103250 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01 Finished backup at 20-JUL-16
3. 테이블스페이스 백업이 정상적으로 잘 되었는지 확인해봅니다.
RMAN> list backup of tablespace TS_BACKUP_TEST; List of Backup Sets =================== BS Key Type LV Size Device Type Elapsed Time Completion Time ------- ---- -- ---------- ----------- ------------ --------------- 74 Full 1.10M DISK 00:00:00 20-JUL-16 BP Key: 74 Status: AVAILABLE Compressed: NO Tag: TAG20160720T103250 Piece Name: /backup/ARC/ORCL12/backupset/2016_07_20/o1_mf_nnndf_TAG20160720T103250_crxo62v6_.bkp List of Datafiles in backup set 74 File LV Type Ckp SCN Ckp Time Name ---- -- ---- ---------- --------- ---- 12 Full 4744425 20-JUL-16 +DATA/ORCL12/DATAFILE/ts_backup_test.413.917692055
4. 테이블스페이스 삭제
SQL> drop tablespace TS_BACKUP_TEST including contents and datafiles; Tablespace dropped.
5. TSPITR방법으로 복구를 시도합니다.
RMAN> recover tablespace TS_BACKUP_TEST until scn 4744425 auxiliary destination '/u01/auxiliary_dest'; Starting recover at 20-JUL-16 current log archived using channel ORA_DISK_1 List of tablespaces expected to have UNDO segments Tablespace SYSTEM Tablespace UNDOTBS1 Creating automatic instance, with SID='bnls' initialization parameters used for automatic instance: db_name=ORCL12 db_unique_name=bnls_pitr_ORCL12 compatible=12.1.0.2.0 db_block_size=8192 db_files=xxx diagnostic_dest=/u01/app/oracle _system_trig_enabled=FALSE sga_target=xxxM processes=xxx db_create_file_dest=/u01/auxiliary_dest log_archive_dest_1='location=/u01/auxiliary_dest' enable_pluggable_database=true _clone_one_pdb_recovery=true #No auxiliary parameter file used ..... media recovery complete, elapsed time: 00:00:08 Finished recover at 20-JUL-16 database opened ... executing Memory Script sql statement: alter tablespace TS_BACKUP_TEST read only sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/u01/auxiliary_dest'' sql statement: create or replace directory TSPITR_DIROBJ_DPDIR as ''/u01/auxiliary_dest'' Performing export of metadata... EXPDP> WARNING: Oracle Data Pump operations are not typically needed when connected to the root or seed of a container database. EXPDP> Starting "SYS"."TSPITR_EXP_bnls_wcCm": ... EXPDP> Datafiles required for transportable tablespace TS_BACKUP_TEST: EXPDP> /u01/auxiliary_dest/ORCL12/datafile/o1_mf_ts_backu_crxo9ghp_.dbf EXPDP> Job "SYS"."TSPITR_EXP_bnls_wcCm" successfully completed at Wed Jul 20 10:35:35 2016 elapsed 0 00:00:25 Export completed contents of Memory Script: { # shutdown clone before import shutdown clone abort } executing Memory Script Oracle instance shut down Performing import of metadata... IMPDP> WARNING: Oracle Data Pump operations are not typically needed when connected to the root or seed of a container database. IMPDP> Master table "SYS"."TSPITR_IMP_bnls_yvAd" successfully loaded/unloaded IMPDP> Starting "SYS"."TSPITR_IMP_bnls_yvAd": ... IMPDP> Job "SYS"."TSPITR_IMP_bnls_yvAd" successfully completed at Wed Jul 20 10:35:47 2016 elapsed 0 00:00:03 Import completed ... sql statement: alter tablespace TS_BACKUP_TEST read write sql statement: alter tablespace TS_BACKUP_TEST offline sql statement: begin dbms_backup_restore.AutoBackupFlag(TRUE); end; Removing automatic instance Automatic instance removed ... auxiliary instance file tspitr_bnls_96302.dmp deleted Finished recover at 20-JUL-16
좀 보시기 복잡하실거같은데 간단하게 말씀드리면
auxiliary destination으로 지정한 디렉토리에
백업된 정보로 임시 데이터베이스 기동한후 -> expdp / impdp를 이용하여 테이블스페이스의 내용을 원래 DB에 복구 -> 임시 DB down 및 임시파일 삭제
의 순으로 진행됩니다.
이제 복구가 되었으니 조회를 해볼께요.
SQL> select tablespace_name from dba_tablespaces where tablespace_name ='TS_BACKUP_TEST'; TABLESPACE_NAME ------------------------------ TS_BACKUP_TEST SQL> select segment_name from dba_segments where tablespace_name = 'TS_BACKUP_TEST'; SEGMENT_NAME ------------------------------ BACKUP_TEST_1 SQL> select * from system.BACKUP_TEST_1; select * from system.BACKUP_TEST_1 * ERROR at line 1: ORA-00376: file 13 cannot be read at this time ORA-01110: data file 13: '/u01/auxiliary_dest/ORCL12/datafile/o1_mf_ts_backu_crxo9ghp_.dbf'
조회가 안되어 확인해보니 해당 테이블스페이스는 현재 offline상태네요.
테이블스페이스를 online으로 전환하고 조회해보니 정상조회됩니다.
SQL> select TABLESPACE_NAME,STATUS from dba_tablespaces where tablespace_name = 'TS_BACKUP_TEST'; TABLESPACE_NAME STATUS ------------------------------ --------- TS_BACKUP_TEST OFFLINE SQL> alter tablespace TS_BACKUP_TEST online; Tablespace altered. SQL> select * from system.BACKUP_TEST_1; NO NAME ---------- ---------- 1 AAA 2 BBB
아주 쉽게 잘 처리되었습니다.
그러나 간과하지 말하야 할것은 전체 데이터의 사이즈입니다. 제가 테스트하는 환경은 말그대로 TEST여서 데이터가 거의 없습니다.
그랬기때문에 아무 디렉토리나 지정하여 처리하여도 아무 문제가 없었으나 복구해야할 데이터의 사이즈가 크다면 시간은 얼마나 걸릴지 장담할수 없습니다.
그리고 디스크도 준비가 되어있어야겠네요. 또한 복구시 백업된 아카이브로그도 적용하므로 적용해야할 로그가 많은 경우는 그만큼 시간이 늘어납니다.
그러나 무엇보다도 drop에 대한 권한을 잘 관리하는게 중요하다고 생각됩니다.