用不完全恢复找回被误删除表空间(二)

这个不完全恢复表空间的案例 和 上一篇 http://blog.itpub.net/12238525/viewspace-1211078/ 对比。
有NEWTS表空间的备份,这一点是相同的。区别在 备份的控制文件没有NEWTS表空间的记录
换句话说,备份控制文件时,没有NEWTS表空间。 NEWTS表空间时之后创建的。创建过后,该表空间有单独做备份。
之后, 该表空间被 drop tablespace。 现在想用不完全恢复找回该表空间。


点击(此处)折叠或打开

  1. sys@BJDB>select tablespace_name from dba_tablespaces;    -- 备份前,没有NEWTS表空间

  2. TABLESPACE_NAME
  3. ------------------------------
  4. SYSTEM
  5. SYSAUX
  6. TEMPTS1
  7. TS_ASSM
  8. SMALL_UNDO

  9. sys@BJDB>@/home/oracle/scripts/hot_backup.sql            -- 备份脚本备份所以的数据文件 和 控制文件(注意 这时没有NETS表空间)

创建NEWTS 表空间

点击(此处)折叠或打开

  1. sys@BJDB>create tablespace newts datafile \'/oradata/BJDB/newts01.dbf\' size 50M;          -- 创建NEWTS表空间

  2. Tablespace created.

  3. sys@BJDB>create table scott.tab_newts                                                      -- NEWTS表空间下 创建一个测试表
  4.   2 tablespace newts
  5.   3 as select * from scott.dept;
对NEWTS表空间做热备份

点击(此处)折叠或打开

  1. sys@BJDB>alter tablespace newts begin backup;

  2. Tablespace altered.

  3. sys@BJDB>! cp /oradata/BJDB/newts01.dbf /u02/backup/BJDB/hot/

  4. sys@BJDB>alter tablespace newts end backup;

  5. Tablespace altered.
该表空间被误删除

点击(此处)折叠或打开

  1. sys@BJDB>select current_scn from v$database;                           -- drop tablespace 前的一个SCN号,通常需要做日志挖掘来获取

  2. CURRENT_SCN
  3. -----------
  4.     8488121

  5. sys@BJDB>drop tablespace newts including contents and datafiles;       -- 删除NEWTS表空间 连同数据文件

  6. Tablespace dropped
  7. sys@BJDB>select * from scott.tab_newts;                                -- 该表空间下的测试表已经不存在了
  8. select * from scott.tab_newts
  9.                     *
  10. ERROR at line 1:
  11. ORA-00942: table or view does not exist


处理:
1, 先把实例启动到 nomount状态。
2,转储备份的控制文件,然后 加载数据库

点击(此处)折叠或打开

  1. [oracle@Redhat55 hot]$ cp /u02/backup/BJDB/hot/control.backup /oradata/BJDB/control01.ctl
  2. [oracle@Redhat55 hot]$ cp /u02/backup/BJDB/hot/control.backup /oradata/BJDB/control02.ctl

  3. sys@BJDB>alter database mount;

  4. Database altered.

  5. sys@BJDB>select name from v$tablespace;         -- 注意 用来备份的控制文件还是无法识别到 NEWTS表空间。因为备份控制文件时,NEWTS不存在

  6. NAME
  7. --------------------------------------------------
  8. SYSTEM
  9. SYSAUX
  10. TS_ASSM
  11. SMALL_UNDO
  12. TEMPTS1

  13. sys@BJDB>select name from v$datafile;              -- 相应的数据文件 /oradata/BJDB/newts01.dbf 也不存在

  14. NAME
  15. --------------------------------------------------
  16. /oradata/BJDB/system01.dbf
  17. /oradata/BJDB/sysaux01.dbf
  18. /oradata/BJDB/ts_assm01.dbf
  19. /oradata/BJDB/small_undo01.dbf
3, 开始做不完全恢复

点击(此处)折叠或打开

  1. sys@BJDB>recover database until change 8488121 using backup controlfile;   -- 8488121是drop tablespace前的一个scn 这用了备份控制文件
  2. ORA-00279: change 8487645 generated at 07/06/2014 22:33:56 needed for thread 1
  3. ORA-00289: suggestion : /u02/backup/BJDB/disk1/1_4_852244426.dbf
  4. ORA-00280: change 8487645 for thread 1 is in sequence #4


  5. Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
  6. auto
  7. ORA-00283: recovery session canceled due to errors
  8. ORA-01244: unnamed datafile(s) added to control file by media recovery
  9. ORA-01110: data file 3: \'/oradata/BJDB/newts01.dbf\'                  -- 恢复的过程中出错,找不到 数据文件 /oradata/BJDB/newts01.dbf


  10. ORA-01112: media recovery not started

查看一下

点击(此处)折叠或打开

  1. sys@BJDB>select name from v$tablespace;                         -- 恢复的过程中 NEWTS表空间被识别出来了

  2. NAME
  3. ----------------------------------------------------------
  4. SYSTEM
  5. SYSAUX
  6. NEWTS
  7. TS_ASSM
  8. SMALL_UNDO
  9. TEMPTS1

  10. 6 rows selected.

  11. sys@BJDB>select name from v$datafile;

  12. NAME
  13. ----------------------------------------------------------
  14. /oradata/BJDB/system01.dbf
  15. /oradata/BJDB/sysaux01.dbf
  16. /u01/app/oracle/product/11.2.0/dbhome_1/dbs/UNNAMED00003            -- NEWTS的数据文件未被识别
  17. /oradata/BJDB/ts_assm01.dbf
  18. /oradata/BJDB/small_undo01.dbf

3, 转储所有的数据文件。包括 NEWTS下的数据文件

点击(此处)折叠或打开

  1. [oracle@Redhat55 hot]$ cp /u02/backup/BJDB/hot/*.dbf /oradata/BJDB/
  2. [oracle@Redhat55 hot]$ ls /oradata/BJDB/newts01.dbf
  3. /oradata/BJDB/newts01.dbf

4, 把当前控制文件(注:这里的控制文件是 步骤2 转储的 备份控制文件)导出到trace文件

点击(此处)折叠或打开

  1. sys@BJDB>alter database backup controlfile to trace;                              

  2. Database altered.

  3. sys@BJDB>select value from v$diag_info where name = \'Default Trace File\';

  4. VALUE
  5. --------------------------------------------------------------------------
  6. /u01/app/oracle/diag/rdbms/proddb/Beijing/trace/Beijing_ora_28350.trc            -- 包含重建控制文件语句的 trace 文件名
脚本的内容

点击(此处)折叠或打开

  1. STARTUP NOMOUNT
  2. CREATE CONTROLFILE REUSE DATABASE \"BJDB\" NORESETLOGS FORCE LOGGING ARCHIVELOG
  3.     MAXLOGFILES 21
  4.     MAXLOGMEMBERS 5
  5.     MAXDATAFILES 100
  6.     MAXINSTANCES 1
  7.     MAXLOGHISTORY 584
  8. LOGFILE
  9.   GROUP 1 \'/oradata/BJDB/redo01a.log\' SIZE 100M BLOCKSIZE 512,
  10.   GROUP 2 \'/oradata/BJDB/redo02a.log\' SIZE 100M BLOCKSIZE 512,
  11.   GROUP 3 \'/oradata/BJDB/redo03a.log\' SIZE 100M BLOCKSIZE 512,
  12.   GROUP 4 \'/oradata/BJDB/redo04.log\' SIZE 100M BLOCKSIZE 512
  13. -- STANDBY LOGFILE
  14. DATAFILE
  15.   \'/oradata/BJDB/system01.dbf\',
  16.   \'/oradata/BJDB/sysaux01.dbf\',
  17.   \'/u01/app/oracle/product/11.2.0/dbhome_1/dbs/UNNAMED00003\', -- 注意:重建控制文件时,把这个数据文件名改成 /oradata/BJDB/newts01.dbf
  18.   \'/oradata/BJDB/ts_assm01.dbf\',
  19.   \'/oradata/BJDB/small_undo01.dbf\'
  20. CHARACTER SET ZHS16GBK
  21. ;
  22. ALTER TABLESPACE TEMPTS1 ADD TEMPFILE \'/oradata/BJDB/temp01.dbf\' REUSE;   -- 重建控制文件,临时文件要重新添加

5, 重建控制文件


点击(此处)折叠或打开

  1. sys@BJDB>startup nomount force;
  2. ORACLE instance started.

  3. Total System Global Area 1068937216 bytes
  4. Fixed Size 2235208 bytes
  5. Variable Size 662701240 bytes
  6. Database Buffers 398458880 bytes
  7. Redo Buffers 5541888 bytes
  8. CREATE CONTROLFILE REUSE DATABASE \"BJDB\" NORESETLOGS FORCE LOGGING ARCHIVELOG
  9.     MAXLOGFILES 21
  10.   3 MAXLOGMEMBERS 5
  11.   4 MAXDATAFILES 100
  12.   5 MAXINSTANCES 1
  13.   6 MAXLOGHISTORY 584
  14.   7 LOGFILE
  15.   8 GROUP 1 \'/oradata/BJDB/redo01a.log\' SIZE 100M BLOCKSIZE 512,
  16.   9 GROUP 2 \'/oradata/BJDB/redo02a.log\' SIZE 100M BLOCKSIZE 512,
  17.  10 GROUP 3 \'/oradata/BJDB/redo03a.log\' SIZE 100M BLOCKSIZE 512,
  18.  11 GROUP 4 \'/oradata/BJDB/redo04.log\' SIZE 100M BLOCKSIZE 512
  19.  12 -- STANDBY LOGFILE
  20.  13 DATAFILE
  21.  14 \'/oradata/BJDB/system01.dbf\',
  22.  15 \'/oradata/BJDB/sysaux01.dbf\',
  23.  16 \'/oradata/BJDB/newts01.dbf\',       -- 这里把数据文件名改过来了,原来显示 /u01/app/oracle/product/11.2.0/dbhome_1/dbs/UNNAMED00003
  24.  17 \'/oradata/BJDB/ts_assm01.dbf\',
  25.  18 \'/oradata/BJDB/small_undo01.dbf\'
  26.  19 CHARACTER SET ZHS16GBK
  27.  20 ;

  28. Control file created.

  29. sys@BJDB>select name from v$datafile;

  30. NAME
  31. ----------------------------------------------------------
  32. /oradata/BJDB/system01.dbf
  33. /oradata/BJDB/sysaux01.dbf
  34. /oradata/BJDB/newts01.dbf                                     -- 数据文件名 被改回来了
  35. /oradata/BJDB/ts_assm01.dbf
  36. /oradata/BJDB/small_undo01.dbf

6,再做不完全恢复。对比 步骤3 这里不报错了 : ORA-01110: data file 3: '/oradata/BJDB/newts01.dbf' 

点击(此处)折叠或打开

  1. sys@BJDB>recover database until change 8488121 using backup controlfile;
  2. ORA-00279: change 8487592 generated at 07/06/2014 22:35:24 needed for thread 1
  3. ORA-00289: suggestion : /u02/backup/BJDB/disk1/1_4_852244426.dbf
  4. ORA-00280: change 8487592 for thread 1 is in sequence #4


  5. Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
  6. auto
  7. ORA-00279: change 8488114 generated at 07/06/2014 22:42:23 needed for thread 1
  8. ORA-00289: suggestion : /u02/backup/BJDB/disk1/1_5_852244426.dbf
  9. ORA-00280: change 8488114 for thread 1 is in sequence #5
  10. ORA-00278: log file \'/u02/backup/BJDB/disk1/1_4_852244426.dbf\' no longer needed for this recovery


  11. ORA-00279: change 8488118 generated at 07/06/2014 22:42:29 needed for thread 1
  12. ORA-00289: suggestion : /u02/backup/BJDB/disk1/1_6_852244426.dbf
  13. ORA-00280: change 8488118 for thread 1 is in sequence #6
  14. ORA-00278: log file \'/u02/backup/BJDB/disk1/1_5_852244426.dbf\' no longer needed for this recovery


  15. Log applied.
  16. Media recovery complete.
7, 用resetlogs的方式打开数据库。添加临时文件。

点击(此处)折叠或打开

  1. sys@BJDB>alter database open resetlogs;

  2. Database altered.
  3. sys@BJDB>ALTER TABLESPACE TEMPTS1 ADD TEMPFILE '/oradata/BJDB/temp01.dbf' REUSE;   -- 重建控制文件后,临时文件需要重新添加
  4. Tablespace altered.

8, 验证恢复效果

点击(此处)折叠或打开

  1. sys@BJDB>select tablespace_name from dba_tablespaces;     

  2. TABLESPACE_NAME
  3. ------------------------------
  4. SYSTEM
  5. SYSAUX
  6. TEMPTS1
  7. TS_ASSM
  8. SMALL_UNDO
  9. NEWTS                                                  -- NEWTS被找回

  10. 6 rows selected.

  11. sys@BJDB>select file_name from dba_data_files;

  12. FILE_NAME
  13. ----------------------------------------------------------------------------------------------------------------------------------------------------------------
  14. /oradata/BJDB/small_undo01.dbf
  15. /oradata/BJDB/ts_assm01.dbf
  16. /oradata/BJDB/newts01.dbf                              -- NEWTS的数据文件
  17. /oradata/BJDB/sysaux01.dbf
  18. /oradata/BJDB/system01.dbf

  19. sys@BJDB>select * from scott.tab_newts;                -- NEWTS表空间下的表被找回

  20.     DEPTNO DNAME LOC
  21. ---------- -------------- -------------
  22.         10 ACCOUNTING NEW YORK
  23.         20 RESEARCH DALLAS
  24.         30 SALES CHICAGO
  25.         40 OPERATIONS BOSTON

















请使用浏览器的分享功能分享到微信等