Oracle 恢复测试-控制文件篇(三)

来源:互联网 发布:matlab寻找矩阵有几行 编辑:程序博客网 时间:2024/05/01 05:44

 使用旧的控制文件备份来恢复

1、备份控制文件

  1. SQL> alter database backup controlfile to 'D:/data_backup/controlfile.bak';
  2. 数据库已更改。
2、模拟一系列的数据库操作
  1. SQL> create table tt ( id number,name varchar2(100));
  2. 表已创建。
  3. SQL> insert into tt select rownum, 'test...........' from dba_objects;
  4. 已创建52103行。
  5. SQL> commit;
  6. 提交完成。
  7. SQL> alter system switch logfile;
  8. 系统已更改。
  9. SQL> insert into tt select rownum, 'test...........' from dba_objects;
  10. 已创建52103行。
  11. SQL> /
  12. 已创建52103行。
  13. SQL> /
  14. 已创建52103行。
  15. SQL> commit;
  16. 提交完成。
  17. SQL> alter system switch logfile;
  18. 系统已更改。
  19. SQL> delete from tt;
  20. 已删除208412行。
  21. SQL> commit;
  22. 提交完成。
  23. SQL> alter system switch logfile;
  24. 系统已更改。
  25. SQL> insert into tt select rownum, 'test...........' from dba_objects;
  26. 已创建52103行。
  27. SQL> commit;
  28. 提交完成。
  29. SQL> 

3、shutdown数据库,然后将备份的控制文件替换现有的控制文件,模拟控制文件损坏并恢复

  1. SQL> shutdown immediate
  2. 数据库已经关闭。
  3. 已经卸载数据库。
  4. ORACLE 例程已经关闭。
  5. SQL> startup
  6. ORACLE 例程已经启动。
  7. Total System Global Area  167772160 bytes
  8. Fixed Size                  1247900 bytes
  9. Variable Size              71304548 bytes
  10. Database Buffers           92274688 bytes
  11. Redo Buffers                2945024 bytes
  12. 数据库装载完毕。
  13. ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

4、我们备份控制文件并不会记录联机重做日志文件和数据文件的SCN,因此在恢复的时候并不会使用
联机重做日志文件,并因此而把数据文件假设成一个无穷大的SCN,因此,需要resetlogs

  1. SQL> alter database open resetlogs;
  2. alter database open resetlogs
  3. *
  4. 第 1 行出现错误:
  5. ORA-01113: 文件 1 需要介质恢复
  6. ORA-01110: 数据文件 1: 'C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/SYSTEM01.DBF'

5、在此,我们发现,检查到当前数据文件头的开始SCN和控制文件的结束SCN不一致需要进行恢复

  1. SQL> recover database using backup controlfile;
  2. ORA-00279: 更改 2810649 (在 11/08/2008 10:10:33 生成) 对于线程 1 是必需的
  3. ORA-00289: 建议: C:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORCL/ARCHIVELOG/2008_11_08/O1_MF_1_33_
  4. ORA-00280: 更改 2810649 (用于线程 1) 在序列 #33 中
  5. 指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
  6. ORA-00308: 无法打开归档日志 'C:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORCL/ARCHIVELOG/2008_11_08
  7. ORA-27041: 无法打开文件
  8. OSD-04002: 无法打开文件
  9. O/S-Error: (OS 2) The system cannot find the file specified.

6、恢复失败。此处有两种处理方式,一是重建控制文件(Oracle 恢复测试-控制文件篇(一)) ,二是强制应用
重做日志文件

  1. SQL> select * from v$logfile;
  2.     GROUP# STATUS  TYPE    MEMBER                                                                                       
  3. ---------- ------- ------- -------------------------------------------------------------------------
  4.          1 STALE   ONLINE  C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO01.LOG                                             
  5.          3 STALE   ONLINE  C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO03.LOG                                             
  6.          2         ONLINE  C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG                                             
  7. SQL> recover database using backup controlfile;
  8. ORA-00279: 更改 2810649 (在 11/08/2008 10:10:33 生成) 对于线程 1 是必需的
  9. ORA-00289: 建议: C:/ORACLE/PRODUCT/10.2.0/FLASH_RECOVERY_AREA/ORCL/ARCHIVELOG/2008_11_08/O1_MF_1_33_
  10. ORA-00280: 更改 2810649 (用于线程 1) 在序列 #33 中
  11. 指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
  12. C:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG
  13. 已应用的日志。
  14. 完成介质恢复。
  15. SQL> alter database open;
  16. alter database open
  17. *
  18. 第 1 行出现错误:
  19. ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
  20. SQL> alter database open resetlogs;
  21. 数据库已更改。
  22. SQL> select count(*) from tt;
  23.   COUNT(*)
  24. ----------
  25.      52103

问题?使用这种方法能保证数据不会出现讹误吗?

原创粉丝点击